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!
źródło
Odpowiedzi:
Użyj właściwego języka dla zadania. W tym przypadku to Befunge .
Ten język naturalnie dopuszcza rotacje, ponieważ:
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”:
Działa na Befungee . Wymaga zwiększenia planszy (nie domyślnego 80 znaków). Można go uruchomić w następujący sposób:
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.
źródło
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.źródło
Commodore 64 BASIC
?
jest skrótem odPRINT
i:
jest separatorem instrukcji, więc:Możliwe są oczywiście dłuższe odmiany:
itp...
źródło
Golfscript
Ten program wypisuje cyfry, które zawsze sumują się do 2, niezależnie od tego, jak program jest przesunięty:
Drukuje się pierwsza linia
1010
(10 w systemie binarnym), drukowana jest druga linia02
i wszystkie pozostałe linie2
.Aktualizacja:
Program można przetestować tutaj . Pamiętaj, że dodałem
n
s na końcu każdego wiersza tylko w celu sformatowania wyjścia; można je usunąć, a program nadal działa.źródło
Ruby, prawdopodobnie jedno z najkrótszych możliwych rozwiązań:
I jeszcze jeden nieco dłuższy i bardziej interesujący:
źródło
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
ret
w każdym przypadku zakończyć się instrukcją jednobajtową .W większości przypadków spowoduje to wyjście
FOO
lub jego podłańcuch. JeśliAX
jest 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.com
zrzut heksowy w pliku i użyj go , a następnie uruchom w środowisku dos (użyłem dosbox).Oto zrzut heksowy tego pliku:
I kilka interesujących zdemontowanych przesunięć:
+0
(w poniższych przykładach reszta pliku binarnego jest nadal ważna)
+1
+2
+6
+11
+12
+18
(inne przesunięcia to tylko powtórzenia powyższego)
+58
źródło
Unary Odpowiedź:
^ 44391 Zera
Program dla kotów. Bez względu na to, jak się obracasz, jest to ten sam program.
źródło
PHP
Proszę, poprawny program PHP:
źródło
Scala
Zagnieżdżone cytaty:
C ++ / Java / C # /ScalaKomentarz:
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:
lub
Nic nie drukuj:
Perl
źródło
;P;n;N;g;G;d;D;h;H
ważny?jot
Najpierw skrypt sprawdzający poprawne obroty programu
s
:Na przykład program
+/1 5
(suma 1 i 5) daje:Następnie nudny, prawidłowy program:
źródło
dc
Programy DC są z łatwością ważne w dowolnym obrocie. Na przykład:
źródło
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
.źródło
k
Ocenia pusty ciąg
Zwraca znak kropki
Zwraca częściowe zastosowanie „.” (forma dyaniczna) do pustej listy znaków.
źródło
sh, bash
Obrócona cc jest znowu cc, ale nie jest zbyt przyjazna, jeśli nazywa się ją tak nagą.
dh debhelper też nie bardzo współpracuje, podczas gdy hexdump tylko czeka na dane wejściowe.
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:
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.
źródło
arj
/jar
nie jest poprawny, ponieważ nie marja
polecenia (chociaż podoba mi się ten przykład). +1 za scenariusz - bardzo fajny pomysł :)every
, albo wrednya random one
. Przykład zshift left by 6
,left by 1
iright by 10
zapewnił mnie w interpretacji, że po prostu trzeba znaleźć jedną możliwość zmiany biegów.... 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.Przykład ciekawego Pythona:
Można wielokrotnie przesuwać trzy znaki, aby odsłonić coraz więcej alfabetu.
źródło
Pyton
Po prostu oceń niektóre liczby
źródło
dc jest już używane, ale następujący program zawsze wyświetla to samo , bez względu na obrót: D
wyjścia
źródło