Zadanie polega na napisaniu utwardzanego promieniowaniem napromieniacza. Co mam dokładnie na myśli?
Naświetlacz to program, który po podaniu ciągu jako danych wyjściowych wyświetli wszystkie możliwe wersje ciągu z usuniętym jednym znakiem. Na przykład, biorąc pod uwagę dane wejściowe Hello, world!
, program powinien wypisać:
ello, world!
Hllo, world!
Helo, world!
Helo, world!
Hell, world!
Hello world!
Hello,world!
Hello, orld!
Hello, wrld!
Hello, wold!
Hello, word!
Hello, worl!
Hello, world
Naświetlacz musi jednak być chroniony przed jego promieniowaniem, więc napisany przez niego naświetlacz musi również przetrwać po jego przepuszczeniu. Oznacza to, że po usunięciu dowolnego bajtu programu program musi nadal działać poprawnie.
Przypadki testowe
abc -> bc; ac; ab
foo bar -> oo bar:fo bar:fo bar:foobar:foo ar:foo br:foo ba
source -> ource;surce;sorce;souce;soure;sourc;
Dane techniczne
- Możesz przyjmować dane wejściowe dowolną akceptowalną metodą według naszych standardowych zasad We / Wy
- Wynik może być listą ciągów lub listą drukowaną ograniczoną znakiem lub grupą znaków. Końcowy ogranicznik jest dopuszczalny
- Dane wyjściowe mogą być w dowolnej kolejności, o ile zawierają wszystkie możliwe wersje
- Zduplikowane wpisy (takie jak dwa
Helo, world!
w pierwszym przykładzie) mogą zostać odfiltrowane, ale nie jest to konieczne - Ponieważ jest to kod-golf , wygrywa najmniejszy program w bajtach
code-golf
radiation-hardening
TheOnlyMrCat
źródło
źródło
v
wvoid
usuwane nie będzie skompilowaćOdpowiedzi:
05AB1E ,
2926 bajtówWypróbuj online! lub wypróbuj wszystkie napromieniowane wersje .
Najkrótszy naświetlacz, jaki udało mi się znaleźć, to 5 bajtów:
Chodzi o to, aby powtórzyć to 3 razy, a następnie przeprowadzić głosowanie większością głosów:
Å
jest prefiksem dla komend 2-bajtowych, ale nie maÅ`
komendy, dlategoÅ
ignoruje się. Będziemy go jednak potrzebować później.Sortowanie zapewnia, że większość głosów znajduje się na środku tablicy. Zrzucanie, a następnie zamiana przenosi tę wartość na szczyt stosu.
Wszelkie napromieniowanie w części początkowej powoduje jedynie błąd w tablicy globalnej, który zostaje rozwiązany przez głosowanie większością. Napromienianie w ostatnim
{Å`s
fragmencie jest znacznie trudniejsze do uzasadnienia:Å
i tak jest ignorowane, więc można go napromieniowaćJeśli promieniowanie wsteczne zostanie napromieniowane,
Å`s
staje sięÅs
, co jest rozszerzonym poleceniem „pobierz środek tablicy”.Jeśli
{
lubs
są napromieniowane, oznacza to, że nic innego nie jest, więc tablica globalna ma tę samą wartość trzy razy. W takim przypadku nie potrzebujemy sortowania / zamiany, każda wartość będzie działać.źródło
Kod maszynowy 8086 (MS-DOS .COM), 83 bajty
Można go uruchomić w DOSBox lub ulubionym silniku obliczeniowym napędzanym parą. Ciąg do napromieniowania podano jako argument wiersza poleceń.
Dwójkowy:
Czytelny:
Zniszczony
Część aktywna jest powielana, tak że zawsze istnieje część nietknięta przez promieniowanie. Zdrową wersję wybieramy za pomocą skoków. Każdy skok jest krótkim skokiem, a więc ma tylko dwa bajty długości, gdzie drugi bajt to przemieszczenie (tj. Odległość do skoku, ze znakiem określającym kierunek).
Możemy podzielić kod na cztery części, które można napromieniować: skok 1, kod 1, skok 2 i kod 2. Chodzi o to, aby zawsze używać czystej części kodu. Jeśli jedna z części kodu jest napromieniowana, druga musi zostać wybrana, ale jeśli jedna ze skoków zostanie napromieniowana, obie części kodu będą czyste, więc nie będzie miało znaczenia, która zostanie wybrana.
Powodem posiadania dwóch części skoku jest wykrycie napromieniowania w pierwszej części przez przeskoczenie nad nim. Jeśli pierwsza część kodu zostanie napromieniowana, oznacza to, że dotrzemy o jeden bajt od znaku. Jeśli upewnimy się, że takie nieudane lądowanie wybiera kod 2, a prawidłowe lądowanie wybiera kod 1, jesteśmy złoci.
Dla obu skoków duplikujemy bajt przemieszczenia, dzięki czemu każdy skok ma długość 3 bajtów. Zapewnia to, że napromieniowanie jednego z dwóch ostatnich bajtów nadal sprawi, że skok będzie ważny. Napromieniowanie pierwszego bajtu w ogóle zatrzyma skok, ponieważ ostatnie dwa bajty utworzą zupełnie inną instrukcję.
Wykonaj pierwszy skok:
Jeśli jeden z
0x28
bajtów zostanie usunięty, nadal przeskoczy w to samo miejsce. Jeśli0xEB
bajt zostanie usunięty, zamiast tego skończymy naco jest łagodną instrukcją na MS-DOS (inne smaki mogą się nie zgadzać), a następnie przechodzimy do kodu 1, który musi być czysty, ponieważ obrażenia były w skoku 1.
Jeśli skok zostanie wykonany, lądujemy przy drugim skoku:
Jeśli ta sekwencja bajtów jest nienaruszona, a my wylądujemy dokładnie na znaku, oznacza to, że kod 1 był czysty, a instrukcja wraca do tej części. Powielony bajt przemieszczenia gwarantuje to, nawet jeśli jest to jeden z tych bajtów przemieszczenia, który został uszkodzony. Jeśli wylądujemy jeden bajt (z powodu uszkodzonego kodu 1 lub skoku 1) lub
0xEB
bajt jest uszkodzony, dwa pozostałe bajty również tutaj będą łagodne:W każdym przypadku, jeśli wykonamy te dwie instrukcje, wiemy, że albo skok 1, kod 1, albo skok 2 zostały napromieniowane, co sprawia, że przejście do kodu 2 jest bezpieczne.
Testowanie
Poniższy program został użyty do automatycznego utworzenia wszystkich wersji pliku .COM. Tworzy również plik BAT, który można uruchomić w środowisku docelowym, w którym działa każdy napromieniowany plik binarny, i przekazuje dane wyjściowe do osobnych plików tekstowych. Porównywanie plików wyjściowych do sprawdzenia jest dość łatwe, ale DOSBox nie ma
fc
, więc nie został dodany do pliku BAT.źródło