Detektor promieniowania!


26

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, abcwygrywa.
    • Tie-breaker to mniejsza liczba bajtów, po której następuje wcześniejszy czas przesyłania

Powodzenia!



Przegapiłem tę linię. Wstydź się!
Mego

5
„Kod zostanie oceniony na podstawie liczby różnych znaków, w których wygrywa najwyższa liczba”. Oczekuję, że większość (jeśli nie wszystkie) rozwiązania będą miały gdzieś jakiś ciąg znaków, który mogą po prostu uzupełnić dowolnymi znakami bez faktycznej zmiany rozwiązania (więc sprowadza się to tylko do tego, czy Twój język jest ograniczony do ASCII, rozszerzonego ASCII czy Unicode) .
Martin Ender

3
... Piaskownica nie jest idealna. :( / Możesz po prostu zmierzyć „odrębne bajty” zamiast „odrębnych znaków”, ponieważ znaki są związane z kodowaniem i innymi problemami.
user202729 29.01.2018

1
Czy program może przyjąć jakieś dane?
gggg

Odpowiedzi:


15

05AB1E , 9 7 bajtów (wynik 3)

22'''rr

Wypróbuj online!

Usuwanie a '

Po 'usunięciu 22''rrspowoduje , że 22 będzie pierwszą rzeczą na stosie i 'będzie ostatnią rzeczą na stosie, co spowoduje dwukrotne odwrócenie '.

Usuwanie an r

Po rusunięciu 22'''rpowoduje, że 22 jest pierwszą rzeczą na stosie, 'drugą rzeczą na stosie i rostatnią rzeczą na stosie. rPoprzedziło to jednak to, 'co czyni go literalnym ciągiem "r"(w przeciwieństwie do polecenia reverse stack), który jest domyślnie drukowany.

Usuwanie a 2

Po 2usunięciu 2'''rrspowoduje , że będzie 2pierwszą rzeczą na stosie, 'drugą rzeczą na stosie i wreszcie rostatnią rzeczą na stosie, co po odwróceniu spowoduje jeden raz 2.

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

  • 1 punkt (nieprawidłowy)
  • 2-punktowy
    • '''''''VV, '''''''XXlub'''''''<any command that pops a without pushing>x2
    • Dowolny # nieparzysty 'powyżej 3, a następnie dowolny parzysty # spowyżej 1 (EG '''''''''ssss).
    • '''..z dowolną liczbą okresów powyżej 1 i dowolną liczbą nieparzystą 'powyżej 2.
  • 3-punktowy
    • '\\'''rr- ten sam pomysł, 22'''rrale \„usuwa ostatni element stosu”.

'Jak mówisz, normalne wyjście nie ma znaczenia dla reguł. Ale to unieważnia nominalny cel wykrywania anomalii, co jest nieco śmieszne.
gggg

1
@gggg Jestem całkiem pewien, że przynajmniej JEDNA z moich alternatyw nie drukuje nic lol.
Magic Octopus Urn

1
@MagicOctopusUrn Nie ma za co. Pomyślałem, że równie dobrze mogę edytować zamiast komentować.
Boboback

@ boboquack czy mój oryginalny tag (@ boboquack) zadziałał, czy znalazłeś go, oglądając post ponownie? Próbuję dowiedzieć się, jak działają tagi, gdy użytkownik nigdy nie skomentował lol.
Magic Octopus Urn

@ Boboquack Miałem na myśli, czy otrzymałeś powiadomienie z mojego „dziękuję”? Powinniśmy też prawdopodobnie usunąć ten wątek, aż do mojej +1 dla Twojego „Nie ma za co”.
Magic Octopus Urn

9

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.


Inteligentny, szczerze mówiąc, nie myśl, że to luka.
Magic Octopus Urn

Zakładasz, że EOF pozostawia komórkę bez zmian, tak?
Jo King

Tak, i dopóki nie ma żadnych danych wejściowych, powinno być w porządku 😊
Håvard Nygård

Kusi mnie, aby umożliwić to, ale czy ma tłumacza, który ma zrzut pamięci, że wynik byłby tylko zmienione komórki i pozostawia niezmienioną komórka na EOF?
Jo King

1
copy.sh/brainfuck To powinno działać dobrze. Wystarczy go uruchomić i nacisnąć „zobacz pamięć”.
Håvard Nygård

9

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 xxdodwracalny zrzut heksowy ukryty za linkiem „fragment kodu” poniżej.

Wyjaśnienie

Ten program składa się z trzech identycznych części. (Łączenie wielu identycznych części programu jest dla mnie tematem w programach .) 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 partridgejeś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):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

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:

  • Znak inny niż nowy wiersz został usunięty . W takim przypadku pojawi się nieparzysta liczba razy w drugiej i trzeciej części. Oznacza to, że będzie dodawany i / lub usuwany z %znieparzystej 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.
  • Pierwszy lub trzeci znak nowej linii został usunięty . W takim przypadku program zostanie obrócony w taki sposób, że brakuje trzeciej trzeciej linii, skutecznie łącząc drugą i trzecią część w jedną linię. Dosłowny ciąg znaków, do którego można uzyskać dostęp, <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.
  • Drugi nowy wiersz został usunięty . W takim przypadku program nie zostanie obrócony (ponieważ pierwsza część ma prawidłową sumę kontrolną), więc druga część zostanie przeniesiona do tej samej linii co pierwsza część. <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:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Skrypt weryfikacyjny potwierdza, że ​​ten program działa poprawnie.


7

Stax , 11 bajtów (wynik 4)

'''cc'~~'dd

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 polecenia c di ~ś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ć di ~są identyczne.

Wyjaśnienie

Najlepiej jest podzielić kod na kilka części i rozważyć je osobno.

Gdy nie zostanie zmieniony, '''ccdosuwa literał 'i literał cdo 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 'ddzmieniony , przesuwa literał, da 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 generowany c.

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, ale cnie jest powielany. Tak będzie stos c,'. Po dwóch „no-op” górna część stosu to c.

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łownie dzostanie zepchnięty na szczyt głównego stosu i nic więcej nie zostanie zrobione. Na górze głównego stosu znajduje się teraz dwyjś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.


5

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 z 2-char stringinstrukcją. 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 z 2-char stringinstrukcją. Następnie naciskamy , co jest drukowane niejawnie.


5

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

  • Wiele innych znaków, takich jak alub obył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.


Mój moduł sprawdzania ważności nie jest fantazyjny. Nie udaje się w przypadku innego opublikowanego rozwiązania;).
Magic Octopus Urn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.