Napisz program, który będzie ważny po cyklicznym przesunięciu znaków

17

Potencjalnie bardzo trudne, ale widziałem niesamowite rzeczy z tej strony.

Celem jest napisanie programu w dowolnym języku, który robi wszystko, co chcesz. Problem polega na tym, że program musi być ważny po każdym okrągłym przesunięciu znaków.

Okrągłe przesunięcie znaków jest bardzo podobne do przesunięcia kołowego . Kilka przykładów moich jasnych rzeczy.

Do programu int main() { return 0; }

przesunięcie w lewo o 6 znaków daje: in() { return 0; }int ma

przesunięcie w lewo o 1 znak daje: nt main() { return 0; }i

przesunięcie w prawo o 10 znaków daje: eturn 0; }int main() { r

Jednak ten program oczywiście nie jest zgodny z zasadami.

Zasady

  • Dowolny język
  • Zwycięzca jest wybierany na podstawie liczby głosów w górę
  • Rozwiązania, które robią to samo lub całkowicie różne rzeczy dla każdej rotacji, otrzymają 100 wirtualnych głosów na ich wynik.

AKTUALIZACJA Myślę, że to trwało wystarczająco długo. Zwycięzcą z największą liczbą głosów (w tym głosów wirtualnych) jest Mark Byers. Dobra robota!

Gryf
źródło
5
Istnieje kilka bardzo nudnych potencjalnych odpowiedzi w językach, w których literał int jest poprawnym programem. Czy otrzymują wirtualny -100?
Peter Taylor
1
@PeterTaylor Zakładam, że nudne odpowiedzi otrzymają mniej głosów.
Griffin
„Potencjalnie bardzo trudny” Zawsze dobrze jest zapoznać się z wieloma dziwnymi językami, zanim wypowiesz tego rodzaju zdanie w sposób ogólny. Trudne w C lub Java, jasne, ale w językach z 1 znakowymi poleceniami i prostymi składniami? Nie tak bardzo.
dmckee
@dmckee stąd „Potencjalnie” ...
Griffin
@PeterTaylor również w wielu językach pusty program jest poprawnym programem
jk.

Odpowiedzi:

31

Użyj właściwego języka dla zadania. W tym przypadku to Befunge .

Ten język naturalnie dopuszcza rotacje, ponieważ:

  • Wszystkie polecenia są jednym znakiem.
  • Sterowanie zawija się, gdy osiąga koniec programu, zaczynając od początku od początku.

Ten program Befunge drukuje dokładnie takie same dane wyjściowe („Cześć”) bez względu na liczbę używanych „okrągłych przesunięć znaków”:

86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p645**2-00p645**2-00p

Działa na Befungee . Wymaga zwiększenia planszy (nie domyślnego 80 znaków). Można go uruchomić w następujący sposób:

python befungee.py -w400 hello.bef

Działa najpierw dynamicznie generując i przechowując program, który wypisuje „Cześć”, a następnie nadpisując pierwszy bajt, aby przekierować sterowanie do nowo napisanego programu. Program jest zapisywany dwukrotnie, więc jeśli bajt nie zostanie poprawnie zapisany za pierwszym razem, zostanie poprawiony za drugim razem.

Pomysł można rozszerzyć, aby stworzyć dowolny program o dowolnej złożoności.

Mark Byers
źródło
Bardzo fajny wpis!
ChristopheD
22

Brainf * ck

Wybierz odpowiednie narzędzie do pracy - powiedzenie, które nigdy nie było bardziej odpowiednie niż ta praca tutaj!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+.>++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++.++++++++++++++.>++++++++++.+

Widoczny tutaj nieprzesunięty program po prostu drukuje SHIFT(plus nowy wiersz). Przesunięcia cykliczne w trybie arytmetycznym będą generować różne inne dane wyjściowe, chociaż zawsze będą generować sześć znaków ASCII.

chlebak
źródło
Przeczytałem pytanie i pomyślałem: Brainfuck, to jest bilet, ale pobiłeś mnie.
jmoreno
12

Commodore 64 BASIC

?jest skrótem od PRINTi :jest separatorem instrukcji, więc:

?1:?2:?3:          // prints 1, 2, and 3
:?1:?2:?3          // prints 1, 2, and 3
3:?1:?2:?          // adds a program line 3 :PRINT1:PRINT2:PRINT
?3:?1:?2:          // prints 3, 1, and 2
:?3:?1:?2          // prints 3, 1, and 2
2:?3:?1:?          // adds a program line 2 :PRINT3:PRINT1:PRINT
?2:?3:?1:          // prints 2, 3, and 1
:?2:?3:?1          // prints 2, 3, and 1
1:?2:?3:?          // adds a program line 1 :PRINT2:PRINT3:PRINT

Możliwe są oczywiście dłuższe odmiany:

?1:?2:?3:?4:?5:?6:?7:?8:?9:?10:?11:

itp...

Danko Durbić
źródło
11

Golfscript

Ten program wypisuje cyfry, które zawsze sumują się do 2, niezależnie od tego, jak program jest przesunięty:

10 2 base
0 2 base1
 2 base10
2 base10 
 base10 2
base10 2 
ase10 2 b
se10 2 ba
e10 2 bas

Drukuje się pierwsza linia 1010(10 w systemie binarnym), drukowana jest druga linia 02i wszystkie pozostałe linie 2.

Aktualizacja:

Program można przetestować tutaj . Pamiętaj, że dodałem ns na końcu każdego wiersza tylko w celu sformatowania wyjścia; można je usunąć, a program nadal działa.

Cristian Lupascu
źródło
10

Ruby, prawdopodobnie jedno z najkrótszych możliwych rozwiązań:

p

I jeszcze jeden nieco dłuższy i bardziej interesujący:

;;p";p;";p
Jon
źródło
9

x86 16 bitów binarnych

Ręcznie wykonana za pomocą tych ( 1 2 ), stoły, NASMa i NDISASM. To zawsze powróci bez awarii lub nieskończonej pętli, ponieważ żadne bajty nie są skokami ani nie zmieniają stosu i są wypełnione NOP, aby retw każdym przypadku zakończyć się instrukcją jednobajtową .

W większości przypadków spowoduje to wyjście FOOlub jego podłańcuch. Jeśli AXjest zepsuty, wywoła to losowe int 10 (to zmieniło szybkość migania kursora w jednym z moich testów), ale zwykle nie powoduje awarii.

Aby wypróbować, umieść xxd -r foo.hex > foo.comzrzut heksowy w pliku i użyj go , a następnie uruchom w środowisku dos (użyłem dosbox).

Oto zrzut heksowy tego pliku:

0000000: b846 0d90 90fe c490 9090 bb05 0090 9043  .F.............C
0000010: 43cd 1090 b84f 0d90 90fe c490 9090 bb05  C....O..........
0000020: 0090 9043 43cd 1090 b84f 0d90 90fe c490  ...CC....O......
0000030: 9090 bb05 0090 9043 43cd 1090 9090 c3    .......CC......

I kilka interesujących zdemontowanych przesunięć:

+0

00000000  B8420D            mov ax,0xd42
00000003  90                nop
00000004  90                nop
00000005  FEC4              inc ah
00000007  90                nop
00000008  90                nop
00000009  90                nop
0000000A  BB0500            mov bx,0x5
0000000D  90                nop
0000000E  90                nop
0000000F  43                inc bx
00000010  43                inc bx
00000011  CD10              int 0x10
00000013  90                nop
00000014  B84F0D            mov ax,0xd4f
00000017  90                nop
00000018  90                nop
00000019  FEC4              inc ah
0000001B  90                nop
0000001C  90                nop
0000001D  90                nop
0000001E  BB0500            mov bx,0x5
00000021  90                nop
00000022  90                nop
00000023  43                inc bx
00000024  43                inc bx
00000025  CD10              int 0x10
00000027  90                nop
00000028  B84F0D            mov ax,0xd4f
0000002B  90                nop
0000002C  90                nop
0000002D  FEC4              inc ah
0000002F  90                nop
00000030  90                nop 
00000031  90                nop
00000032  BB0500            mov bx,0x5
00000035  90                nop
00000036  90                nop
00000037  43                inc bx
00000038  43                inc bx
00000039  CD10              int 0x10
0000003B  90                nop
0000003C  90                nop
0000003D  90                nop
0000003E  C3                ret

(w poniższych przykładach reszta pliku binarnego jest nadal ważna)

+1

00000000  42                inc dx
00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+2

00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+6

00000000  C4909090          les dx,[bx+si-0x6f70]
00000004  BB0500            mov bx,0x5
00000007  90                nop
00000008  90                nop
00000009  43                inc bx
0000000A  43                inc bx
0000000B  CD10              int 0x10

+11

00000000  050090            add ax,0x9000
00000003  90                nop
00000004  43                inc bx
00000005  43                inc bx
00000006  CD10              int 0x10

+12

00000000  00909043          add [bx+si+0x4390],dl
00000004  43                inc bx
00000005  CD10              int 0x10

+18

00000000  1090B84F          adc [bx+si+0x4fb8],dl
00000004  0D9090            or ax,0x9090
00000007  FEC4              inc ah
00000009  90                nop

(inne przesunięcia to tylko powtórzenia powyższego)

+58

00000000  10909090          adc [bx+si-0x6f70],dl
00000004  C3                ret
Kopiuj
źródło
7

Unary Odpowiedź:

000000 ... 00000

^ 44391 Zera

Program dla kotów. Bez względu na to, jak się obracasz, jest to ten sam program.

walpen
źródło
6

PHP

Proszę, poprawny program PHP:

Is this still funny?
smutny koleś
źródło
2
powinieneś użyć słowa takiego jak „zjadł” (jestem pewien, że są dłuższe), aby każda zmiana znaku była nadal prawdziwym słowem.
Peter
10
Nie jestem pewien, czy dać +1, czy -1 to
Lie Ryan
6

Scala

Zagnieżdżone cytaty:

""""""""""""""""""""""""""""""""

C ++ / Java / C # / Scala

Komentarz:

///////////////////////////////////

Puste polecenie:

;;;;;;;;;;;;;;;

Grzmotnąć

Kombinacja wbudowanych komentarzy, białych znaków i powłoki:

#

:

Sed

Autonomiczne prawidłowe polecenia:

p P n N g G d D h H

Połączenie powyższych:

p;P;n;N;g;G;d;D;h;H;

AWK

Aby wydrukować każdą linię pliku:

1

lub

//

Nic nie drukuj:

0

Perl

abcd
Książę John Wesley
źródło
Wydaje mi się, że SED zawiódłby przy jakimkolwiek dziwnym obrocie? Jest ;P;n;N;g;G;d;D;h;Hważny?
captncraig
@CMP: tak, jest poprawny.
Prince John Wesley
5

jot

Najpierw skrypt sprawdzający poprawne obroty programu s:

check =: 3 :'((<;(". :: (''Err''"_)))@:(y |.~]))"0 i.#y'

Na przykład program +/1 5(suma 1 i 5) daje:

 check '+/1 5'
┌───────┬───┐
│┌─────┐│6  │
││+/1 5││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││/1 5+││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││1 5+/││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││ 5+/1││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││5+/1 ││   │
│└─────┘│   │
└───────┴───┘

Następnie nudny, prawidłowy program:

check '1x1'
┌─────┬───────┐
│┌───┐│2.71828│ NB. e^1
││1x1││       │
│└───┘│       │
├─────┼───────┤
│┌───┐│       │ NB. Value of variable x11
││x11││       │ 
│└───┘│       │
├─────┼───────┤
│┌───┐│11     │ NB. Arbitrary precision integer
││11x││       │
│└───┘│       │
└─────┴───────┘
Eelvex
źródło
2

dc

Programy DC są z łatwością ważne w dowolnym obrocie. Na przykład:

4 8 * 2 + p  # 34
8 * 2 + p 4  # stack empty / 10
...
Eelvex
źródło
1

Kod maszynowy

Co powiesz na kod maszynowy Z80 / Intel 8051 dla NOP .

Pewnie, że nie wykonuje żadnej operacji, ale zajmuje cykl lub dwa ... możesz mieć ich tyle lub tak mało, jak chcesz.

I nie zgadzam się z powyższą odpowiedzią Ruby - myślę, że jeden bajt 00h jest krótszy niż Ruby p.

Richard Le Mesurier
źródło
1

k

.""

Ocenia pusty ciąg

"."

Zwraca znak kropki

"".

Zwraca częściowe zastosowanie „.” (forma dyaniczna) do pustej listy znaków.

skeevey
źródło
1

sh, bash

cc
cc: no input files

Obrócona cc jest znowu cc, ale nie jest zbyt przyjazna, jeśli nazywa się ją tak nagą.

dh 
dh: cannot read debian/control: No such file or directory
hd 

dh debhelper też nie bardzo współpracuje, podczas gdy hexdump tylko czeka na dane wejściowe.

gs
sg 

Ghostscript uruchamia tryb interaktywny, podczas gdy grupa przełączników wyświetla komunikat o użyciu - tutaj również jest ważne rozwiązanie, imho.

A oto skrypt do wyszukiwania kandydatów na takie programy:

#!/bin/bash
for name in /sbin/* /usr/sbin/* /bin/* /usr/bin/*
do 
    len=${#name}
    # len=3 => 1:2 0:1, 2:1 0:2
    # len=4 => 1:3 0:1, 2:2 0:2, 3:1 0:3
    for n in $(seq 1 $((len-1)))
    do
        init=${name:n:len-n}
        rest=${name:0:n}
        # echo $init$rest
        which /usr/bin/$init$rest 2>/dev/null >/dev/null && echo $name $init$rest $n
    done 
done

Jeśli znajdzie dłuższe sekwencje, takie jak (arj, jar) lub (luatex, texlua), które nie są ważne po każdej zmianie, ale tylko po pewnych przesunięciach, które błędnie odczytałem na początku, ale jest kilka, więc jest to łatwe aby je odfiltrować ręcznie.

nieznany użytkownik
źródło
Przykłady więcej niż dwóch liter są nieprawidłowe; PO stwierdził, że „program musi być ważny po każdej zmianie cyklicznej”. Tak więc, arj/ jarnie jest poprawny, ponieważ nie ma rjapolecenia (chociaż podoba mi się ten przykład). +1 za scenariusz - bardzo fajny pomysł :)
Cristian Lupaşcu
Ponieważ nie byłem pewien i nie jestem rodzimym językiem angielskim, zajrzałem do słownika, w którym uznałem, że jest on dwuznaczny, albo wredny every, albo wredny a random one. Przykład z shift left by 6, left by 1i right by 10zapewnił mnie w interpretacji, że po prostu trzeba znaleźć jedną możliwość zmiany biegów.
użytkownik nieznany
To nie jest dwuznaczne. Jeśli program musi być poprawny po pewnym losowym przesunięciu, musi być również ważny dla każdej możliwej zmiany.
Griffin
@Griffin: Dobra - napisałeś pytanie. Usunąłem dłuższe przykłady; na szczęście w Uniksie jest wystarczająco dużo crptc abbrv prgnms, takich jak gs i sg. :) Btw .: Czy jesteś native speakerem języka angielskiego? W poprzednim zdaniu napisałeś ... in any language ... - moje rozwiązanie działa tylko w bash (i sh, zsh, ash i kilka innych), ale wszystkie inne rozwiązania również biorą nazwy programów.
użytkownik nieznany
0

Przykład ciekawego Pythona:

"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z""";print

Można wielokrotnie przesuwać trzy znaki, aby odsłonić coraz więcej alfabetu.

walpen
źródło
Przepraszam, powinienem był wyjaśnić moje pytanie. Każda zmiana musi wytworzyć prawidłowy program. Zaktualizowałem pytanie.
Griffin
0

Pyton

123456789.0

Po prostu oceń niektóre liczby

MrD
źródło
0

dc jest już używane, ale następujący program zawsze wyświetla to samo , bez względu na obrót: D

d

wyjścia

dc: stack empty
daniero
źródło