Musisz napisać program lub funkcję, która, gdy dali niepusty ciąg S z N znaków ASCII druku † , wyprowadza program, który zakończy się z kodem wyjścia C , gdzie C jest na kod ASCII w pozycji 0 w S . Ten program piszesz dodatkowo wyjście program P , tak, że po uruchomieniu, to wychodzi z kodem wyjścia C " , gdzie C ' jest na kod ASCII w pozycji 1 w S . Program P wygeneruje inny program P ′ . Ten proces powtarza się, dopóki w S nie pozostaną żadne znaki. Po wykonaniu tej czynności nie musisz nic generować, a następnie opcjonalny nowy wiersz; i powinien wyjść z kodem wyjścia 0.
† Znaki pomiędzy 0x20
i 0x7e
włącznie.
Kilka innych zasad:
- Programy samomodyfikujące są niedozwolone: musisz wyprowadzić źródło do STDOUT (lub początkowo zwrócić wartość)
- Nie możesz odczytać własnego kodu źródłowego.
Zwycięży najkrótszy taki program w bajtach.
Do niektórych podstawowych testów można użyć tego skryptu ruby . (Pierwszy argument to sposób wywoływania skryptu, drugi to program, a trzeci to ciąg wejściowy.)
Przykład hipotetyczny
Powiedz, że program jest FOO
. Gdy podano ciąg „ABC”, wyświetla wynik BARA
. Ten program kończy działanie z kodem 65
i wyjściami BARB
. To z kolei kończy się wraz z kodem 66
i wyjściami BARC
. Ten program kończy działanie z kodem 67
i wyjściami BAR!
. To nic nie wyprowadza i kończy działanie wraz z kodem 0
.
0
to sukces. tio.run/nexus/…33 throw
dowolną liczbę. Używasz negatywów dla poziomu systemu operacyjnego, a przesunięcie wynosi -512. Też bardzo nie lubię, ale szukam tutaj: Complang.tuwien.ac.at/forth/gforth/Docs-html/...Odpowiedzi:
Python 2,
12610194 bajtówW trakcie tworzenia okazało się, że kod Pythona nie może zawierać literalnych bajtów NUL.
Wypróbuj online (pokazuje kod zakończenia w informacjach debugowania)
Zauważ, że każdy z niepustych programów poniżej ma końcowy kanał.
Dla danych wejściowych
Hello
powyższe dane wyjściowe:który drukuje
...
który drukuje
który drukuje
który nic nie drukuje (pusty program)
który nic nie drukuje i wychodzi z kodem 0.
źródło
Python 3, 77 bajtów
Ten kod pobiera dane wejściowe ze STDIN i wysyła pierwszy program do STDOUT.
Jeśli dane wejściowe to
ABCDE
, wyniki sągdzie każdy wiersz zawiera kod wyjścia i dane wyjściowe wcześniej wykonanego programu (pierwszy wiersz to pierwszy program).
źródło
Python 3 ,
115108100 bajtówWypróbuj online!
Dla danych wejściowych
Hello
program drukuje:Powyższy program drukuje:
i wychodzi z kodem
72
.Wypróbuj online!
Program powyżej zostanie wydrukowany
i wychodzi z kodem
101
.Wypróbuj online!
Powyższy program drukuje:
i wychodzi z kodem
108
.Wypróbuj online!
Powyższy program drukuje:
i wychodzi z kodem
108
.Wypróbuj online!
Powyższy program nic nie drukuje i wychodzi z kodem
111
.Wypróbuj online!
Pusty program nic nie drukuje i wychodzi z kodem
0
.Wypróbuj online!
źródło
C, 156 bajtów
Wypróbuj online! (Otwórz kartę debugowania, aby zobaczyć kod wyjścia.)
Pobiera dane wejściowe jako argument wiersza poleceń.
W przypadku wejścia „ABC” program jest wyprowadzany
co zwraca 65 i wyprowadza
co zwraca 66 i wyprowadza
co zwraca 67 i wyprowadza
który nic nie zwraca i zwraca 0.
źródło
Python 2, 67 bajtów
Na podstawie tej odpowiedzi , ale zmodyfikowany do używania Python 2, z trywialnym programem,
0
aby nic nie drukować i wyjść.Wypróbuj online
źródło
RPL, 73 bajty
Ze stroną kodową hp8.
Włącz HP48 lub podobny albo uruchom droid48 . Nie zapomnij
-52 SF
o lepszej wizualizacji stosu. Zakładam, że nacisnąłeś już sznurek, np."ABC"
Na stosie. Następnie wprowadź następującą funkcję:(Dla wygody sugeruję dwukrotne naciśnięcie klawisza α przed wpisaniem czegokolwiek, stąd blokowanie trybu wprowadzania alfa. Później wystarczy użyć klawisza DEL, aby anulować automatycznie wstawiane ograniczniki zamykania. Po prostu użyj klawisza ENTER, aby zatwierdzić. Nie zapomnij spacji po znaku operator noża.)
Ta funkcja natychmiast wypycha na stos program do samodzielnej modyfikacji pod postacią listy. (Ale powyższa funkcja się nie modyfikuje). Ponieważ L w RPL oryginalnie oznacza LISP, naciśnięcie klawisza EVAL rzeczywiście oceni ten program. Zwraca kod wyjścia na drugim poziomie stosu i pozostawia się zmodyfikowany (tak, tutaj jest wątpliwe) dla drugiego EVAL. Naciskaj kilkakrotnie EVAL, aż program w końcu zatrzyma się na pierwszym poziomie stosu. Końcowy kod wyjścia 0 pojawia się zatem na poziomie pierwszym, z wcześniejszymi kodami wyjścia powyżej. Jeśli zapomniałeś
-52 SF
, możesz nawigować w stosie po każdym EVAL, naciskając klawisz ▴ (wyjdź z tego trybu nawigacji za pomocą klawisza ON). Powyższa funkcja akceptuje łańcuchy zawierające znaki 0x0 wewnątrz, aby utworzyć takie łańcuchy0 CHR
i+
są twoimi przyjaciółmi. Samodzielna modyfikacja polega na usunięciu użytego znaku z osadzonego łańcucha (SUB 2 SWAP PUT
gałęzi). Dlatego porzucony program jest krótszy po każdym EVAL.4 DROPN
Oddziału zapewnia, że wyjście nic zostaną zablokowani. Na zawsze.instrukcja z PO jest przestrzegana, porzucając między innymi sam program. Oczywiście wszystko to zakłada, że twoja notatka jest-55 SF
biegła. Użytkownicy-55 SF
Zakładam, że istnieje rozwiązanie RPL / 2, które może zawierać prawdziwy kod wyjścia unix, ale afaik RPL / 2 ma ograniczoną introspekcję i nie może oceniać list.
źródło
sed ,
467461 bajtówKody znaków są trudne:
Wypróbuj online!
W przeciwnym razie logika jest raczej prosta: (1) unikaj znaków specjalnych (są dwa), (2) owiń dodatkową
s/^/…/;q\1
warstwę, (3) powtórz.Oto wynik dla
hello
:I mały skrypt, którego użyłem:
źródło
PowerShell,
172156 bajtów.The
h3l}'{l0
wejściowe będą skutkować następnym wyjściemWypróbuj online!
Który z kolei przyniesie wynik
Wypróbuj online!
Ostatnie uruchomienie nic nie wyświetli, a kod wyjścia będzie wynosił 0.
Wypróbuj online!
źródło