Program utwardzany promieniowaniem to program, w którym, jeśli jakikolwiek znak kodu zostanie usunięty, program nadal będzie działał tak samo. W przypadku tego pytania napiszemy program, który wykryje, kiedy zostanie napromieniowany.
Napisz program lub funkcję, która po usunięciu dowolnego bajtu wyświetli ten bajt i tylko ten bajt. ( Możesz wyprowadzić ten bajt wiele razy, o ile nie wyprowadzasz żadnego innego bajtu )
Zasady:
- Program musi zawierać co najmniej 2 różne bajty. (Brak rozwiązań tylko 0;)
- Nie ma znaczenia, co robi oryginalny program
- Brak czytania własnego kodu źródłowego.
- Kod zostanie oceniony na podstawie liczby odrębnych bajtów, w których wygrywa najwyższa ilość. Na przykład
abc
= 3 punkty,ababba
= 2 punkty,abc
wygrywa.- Tie-breaker to mniejsza liczba bajtów, po której następuje wcześniejszy czas przesyłania
Powodzenia!
code-challenge
radiation-hardening
Jo King
źródło
źródło
Odpowiedzi:
05AB1E ,
97 bajtów (wynik 3)Wypróbuj online!
Usuwanie a
'
Po
'
usunięciu22''rr
spowoduje , że 22 będzie pierwszą rzeczą na stosie i'
będzie ostatnią rzeczą na stosie, co spowoduje dwukrotne odwrócenie'
.Usuwanie an
r
Po
r
usunięciu22'''r
powoduje, że 22 jest pierwszą rzeczą na stosie,'
drugą rzeczą na stosie ir
ostatnią rzeczą na stosie.r
Poprzedziło to jednak to,'
co czyni go literalnym ciągiem"r"
(w przeciwieństwie do poleceniareverse stack
), który jest domyślnie drukowany.Usuwanie a
2
Po
2
usunięciu2'''rr
spowoduje , że będzie2
pierwszą rzeczą na stosie,'
drugą rzeczą na stosie i wreszcier
ostatnią rzeczą na stosie, co po odwróceniu spowoduje jeden raz2
.Dlatego ta odpowiedź jest poprawna. Bez niczego usuwane są dane wyjściowe
'
, co jest nieistotne. Działa to również dla dowolnej liczby innej niż 2.Utworzono moduł sprawdzania poprawności, którego można użyć do konkurowania w 05AB1E *.
* Nie jestem w 100% pewien, ile rozwiązań jest możliwych w 05AB1E ...
Bardziej prawidłowe rozwiązania, które są gorsze lub takie same
'
powyżej 2 będzie działać ...'''''''VV
,'''''''XX
lub'''''''<any command that pops a without pushing>x2
'
powyżej 3, a następnie dowolny parzysty #s
powyżej 1 (EG'''''''''ssss
).'''..
z dowolną liczbą okresów powyżej 1 i dowolną liczbą nieparzystą'
powyżej 2.'\\'''rr
- ten sam pomysł,22'''rr
ale\
„usuwa ostatni element stosu”.źródło
'
Jak mówisz, normalne wyjście nie ma znaczenia dla reguł. Ale to unieważnia nominalny cel wykrywania anomalii, co jest nieco śmieszne.Brainfuck, wynik 3
Może nie być konkurencyjny, ponieważ dane wyjściowe są widoczne tylko przez zrzut pamięci.
Zakładając, że dane wejściowe są puste, a EOF pozostawia komórkę bez zmian. Używa interpretera, który zrzuca pamięć do wyjścia, takiego jak ten .
Usuń plus, a pamięć to wartość Unicode dla „+”, w przeciwnym razie jest to wartość Unicode dla „,”. Jest to jednak bardziej giętka reguł niż odpowiedź. Prawie tak samo z „-”. Nadużywa faktu, że te trzy znaki są po sobie w zestawie znaków Unicode.
źródło
Grusza, 256 różnych bajtów, 975 bajtów
Niestety, pytanie prawie wymaga optymalnego rozwiązania, aby zawierać gdzieś bajt NUL (ponieważ musi zawierać gdzieś wszystkie 256 bajtów). Oznacza to, że a) nie mogę podać linku TIO (ponieważ TIO nie lubi NUL w programach, a przynajmniej nie znalazłem sposobu na wpisanie go, z którym mogłaby sobie poradzić moja przeglądarka), oraz b) I nie można wkleić programu dosłownie do Stack Exchange. Zamiast tego umieściłem
xxd
odwracalny zrzut heksowy ukryty za linkiem „fragment kodu” poniżej.Pokaż fragment kodu
Wyjaśnienie
Ten program składa się z trzech identycznych części. (Łączenie wielu identycznych części programu jest dla mnie tematem w programach wzmacniających promieniowanie .) Każde drzewo gruszy wymaga gdzieś sumy kontrolnej, aby poinformować tłumacza, które części programu uruchomić; obraca dowolną część programu, dla której suma kontrolna zaczyna się przed uruchomieniem (lub drukuje,
a partridge
jeśli suma kontrolna nie jest zgodna). W takim przypadku mamy sumę kontrolną na każdej z trzech części, a zatem część nienapromieniowana przejdzie na początek. Możemy więc założyć, że program składa się z niezmodyfikowanej części, po której następują dwie inne części (z których jedna mogła zostać zmodyfikowana).Każda część zaczyna się od nowej linii, a następnie przechodzi do następującego kodu (dodałem białe znaki i komentarze poniżej):
Potem przychodzi kopia każdego oktetu, który do tej pory nie był używany w programie (tylko po to, by zwiększyć wynik), a na końcu suma kontrolna. (Nie ma końca nowej linii; części zaczynają się od nowej linii, ale nie kończą się na jednej).
Istnieją tutaj trzy różne przypadki:
%z
nieparzystej liczby razy, aż w końcu znajdzie się w tabeli skrótów. W rzeczywistości będzie to jedyny klucz w tabeli skrótów (ponieważ ciąg znaków biegnie od nowego wiersza drugiej części do końca trzeciej części, a tabela skrótów zaczyna się od jednej nowej linii), więc „ Zostanę wydrukowany sam.<DATA>
zawiera każdą parzystą liczbę razy, więc tabela haszująca będzie miała swoją oryginalną treść, pojedynczy znak nowej linii i zostanie wydrukowana.<DATA>
zaczyna tylko czytać od linii poniżej__DATA__
, więc zobaczy tylko trzecią część. Ma więcej niż pięć znaków, które pojawiają się nieparzystą liczbę razy, więc uruchomi specjalny przypadek, aby wydrukować nowy wiersz.Weryfikacja
Ostatnią rzeczą, którą należy sprawdzić w przypadku praktycznie zahartowanego na promieniowanie programu Grusza, jest to, czy usunięcie przypadkowo spowoduje, że niechciana sekcja kodu poprawnie sumy kontrolnej i obróci kod w niewłaściwe miejsce; biorąc pod uwagę, że używamy 32-bitowych sum kontrolnych, jest to mało prawdopodobne, ale nie niemożliwe. Użyłem następującego skryptu brute-force, aby upewnić się, że tak się nie stanie w przypadku usunięcia:
Skrypt weryfikacyjny potwierdza, że ten program działa poprawnie.
źródło
Stax , 11 bajtów (wynik 4)
Uruchom i debuguj online!
Mam zaszczyt mieć pierwszą (chronologicznie) odpowiedź na to wyzwanie z wynikiem wyższym lub równym 4. Być może wynik może być jeszcze wyższy.
W Stax zapisuje się literał łańcuchowy składający się z jednego znaku
'
, podobnie'', 'c, 'd, '~
jak wszystkie literały łańcuchowe. Odpowiednie poleceniac
d
i~
środki duplikują górę stosu głównego, otwierają górę stosu głównego i otwierają górę stosu głównego i przesuwają odpowiednio do stosu wejściowego. W przypadku tego wyzwania stos wejściowy nie wpływa na wynik i nie jest ważny, dlatego możemy powiedziećd
i~
są identyczne.Wyjaśnienie
Najlepiej jest podzielić kod na kilka części i rozważyć je osobno.
Gdy nie zostanie zmieniony,
'''cc
dosuwa literał'
i literałc
do głównego stosu i kopiuje górę, tak aby stos był (od dołu)c,c,'
.Gdy nie zostanie
'~~
zmieniony , popycha literał,~
a następnie wyskakuje (i przesuwa się do stosu wejściowego), co w zasadzie nie jest możliwe dla głównego stosu.Gdy nie zostanie
'dd
zmieniony , przesuwa literał,d
a następnie wyskakuje, co stanowi kolejny brak opozycji dla głównego stosu.Pod koniec programu, ponieważ nie jest wykonywane żadne jawne wyjście, górna część głównego stosu zostanie domyślnie wydrukowana.
Jeśli program działa tak, jak jest, końcowy stos jest nadal
c,c,'
i będzie generowanyc
.Jeśli pierwsza część stanie się
''cc
, mamy literał'
i dwie instrukcje kopiowania, końcowy stos będzie',','
. Biorąc pod uwagę, że dwie pozostałe części nie działają, wynik będzie'
.Jeśli pierwsza część staje się
'''c
, wynik jest w zasadzie taki sam jak w przypadku części niezakłóconej, alec
nie jest powielany. Tak będzie stosc,'
. Po dwóch „no-op” górna część stosu toc
.Możemy więc wykryć promieniowanie w pierwszej części.
Druga część i trzecia część działają dokładnie w ten sam sposób. Weźmię trzecią część jako przykład.
Jeśli trzecia część zostanie zmieniona, wówczas dwie pierwsze części zostaną zachowane bez zmian, a stos przed uruchomieniem trzeciej części zostanie zachowany
c,c,'
Jeśli trzecia część się stanie
'd
, dosłownied
zostanie zepchnięty na szczyt głównego stosu i nic więcej nie zostanie zrobione. Na górze głównego stosu znajduje się terazd
wyjście.Jeśli trzecia część staje się
dd
, dwa elementy są wyskakujące z głównego stosu, a teraz górna część stosu jest'
i jest wyprowadzana.Stąd możemy wykryć promieniowanie w trzeciej części. Z tego samego powodu możemy wykryć promieniowanie w drugiej części.
źródło
05AB1E , wynik 2, 6 bajtów
Czasami drukuje dwukrotnie usunięty znak. Nie zawiera
'
.Jak to działa:
Usuwanie pierwszego
„
Wypróbuj online!
Najpierw wsuwamy pusty stos literału do stosu. Następnie naciskamy
„„
, co jest drukowane niejawnie.Usuwanie a
"
Wypróbuj online!
Najpierw pchamy
""
na stos z2-char string
instrukcją. Następnie próbujemy uzyskać kolejny 2-znakowy ciąg, ale jest on przerywany (nie jestem pewien, dlaczego) i""
jest drukowany.Usuwanie drugiego lub trzeciego
„
Wypróbuj online!
Najpierw pchamy
""
na stos z2-char string
instrukcją. Następnie naciskamy„
, co jest drukowane niejawnie.źródło
Galaretka , 5 bajtów, wynik 2
Wypróbuj online!
Po
”
usunięciu:Wypróbuj online!
Znak
”
zaczyna literał jednobajtowy. Ten program zaczyna się od,””
który zwraca ciąg”
.ḷ
Dyad bierze go za lewy argument. Ciąg”
przechodzi właśnie przez dwa wystąpieniaḷ
.Po
ḷ
usunięciu:Wypróbuj online!
W tym programie
””
daje znak,”
a następnie”ḷ
znakḷ
i tylko to jest wyprowadzane.Inne rozwiązania
a
lubo
byłoby, by zastąpićḷ
to przesłanie.⁾⁾⁾⁾FFF
. Działa to w podobny sposób.⁾
jest podobny”
, ale uruchamia dwa bajtowy ciąg dosłownym. „Napromieniowane” programy wysyłają dwukrotnie usunięty bajt, co uznano za ważne w komentarzach.Oto (znacznie mniej fantazyjna) wersja Jelly sprawdzania ważności Magic Octopus Urn. Lewa kolumna wyniku to znak usunięty, a prawa kolumna to wynik programu wynikowego.
źródło