Strahlungsdetektor!

26

Ein strahlungsgehärtetes Programm ist ein Programm, bei dem, wenn ein Zeichen des Codes entfernt wird, das Programm immer noch dasselbe funktioniert. Für diese Frage schreiben wir ein Programm, das erkennt, wann es bestrahlt wird.

Schreiben Sie ein Programm oder eine Funktion, die beim Entfernen eines einzelnen Bytes dieses Byte und nur dieses Byte ausgibt. ( Sie können dieses Byte mehrmals ausgeben, solange Sie kein anderes Byte ausgeben. )

Regeln:

  • Das Programm muss mindestens 2 verschiedene Bytes enthalten. (Keine Lösungen von nur 0s;)
  • Es ist egal, was das ursprüngliche Programm macht
  • Kein Lesen Ihres eigenen Quellcodes.
  • Der Code wird anhand der Anzahl der unterschiedlichen Bytes bewertet, bei denen der höchste Betrag gewinnt. Zum Beispiel, abc= 3 Punkte, ababba= 2 Punkte, abcgewinnt.
    • Tie-Breaker ist die kleinere Byteanzahl, gefolgt von der früheren Übermittlungszeit

Viel Glück!

Scherzen
quelle
Sandbox Post (gelöscht) Verbunden , verwandt , verwandt
Jo King
Ich habe diese Zeile verpasst. Schande über mich!
Mego
5
"Der Code wird anhand der Anzahl unterschiedlicher Zeichen gewertet, bei denen der höchste Betrag gewinnt." Ich gehe davon aus, dass die meisten (wenn nicht alle) Lösungen irgendwo eine Form von Zeichenfolge haben, die sie einfach mit beliebigen Zeichen auffüllen können, ohne die Lösung tatsächlich zu ändern. .
Martin Ender
3
... Der Sandkasten ist nicht perfekt. :( / Sie können nur "verschiedene Bytes" anstelle von "verschiedenen Zeichen" messen, da Zeichen mit der Codierung und anderen Problemen zusammenhängen.
user202729
1
Kann das Programm irgendwelche Eingaben machen?
gggg

Antworten:

15

05AB1E , 9 7 Bytes (Ergebnis von 3)

22'''rr

Probieren Sie es online!

A. Entfernen '

Wenn eine 'entfernt wird, 22''rrist 22 die erste Sache auf dem Stapel und eine 'letzte Sache auf dem Stapel, was bei zweimaliger Umkehrung zur Folge hat '.

Entfernen eines r

Wenn eine rentfernt wird, ist 22'''r22 die erste Sache auf dem Stapel, eine 'zweite Sache auf dem Stapel und eine rletzte Sache auf dem Stapel. Diesem rging jedoch ein vorangestelltes Zeichen voraus ', das es zur Literalzeichenfolge "r"(im Gegensatz zum Befehl reverse stack) macht, die implizit gedruckt wird.

A. Entfernen 2

Wenn etwas 2entfernt wird, 2'''rrist 2es das Erste auf dem Stapel, 'das Zweite auf dem Stapel und schließlich rdas Letzte auf dem Stapel, was, wenn es einmal umgekehrt wird, zur Folge hat 2.

Daher ist diese Antwort gültig. Wenn nichts entfernt ist, gibt es etwas aus ', was irrelevant ist. Dies funktioniert auch für eine andere Nummer als 2.


Erstellt eine Gültigkeitsprüfung, mit der Sie in 05AB1E * antreten können.

* Ich bin mir nicht hundertprozentig sicher, wie viele Lösungen in 05AB1E überhaupt möglich sind ...


Gültigere Lösungen, die schlechter oder gleich sind

  • 1 Punkt (ungültig)
  • 2-Punkt
    • '''''''VV, '''''''XXoder'''''''<any command that pops a without pushing>x2
    • Beliebige ungerade Anzahl von 'über 3, gefolgt von einer geraden Anzahl von süber 1 (EG '''''''''ssss).
    • '''..mit einer beliebigen Anzahl von Perioden über 1 und einer beliebigen ungeraden Anzahl von Perioden 'über 2.
  • 3-Punkt
    • '\\'''rr- gleiche Idee wie 22'''rraber \wird ‚entfernen letzten Stapel Punkt‘.
Magische Kraken-Urne
quelle
'Wie Sie sagen, ist die normale Ausgabe von für die Regeln irrelevant. Aber es macht das nominelle Ziel der Aufdeckung von Anomalien ungültig, was ein bisschen lustig ist.
gggg
1
@gggg Ich bin mir ziemlich sicher, dass mindestens EINE meiner Alternativen nichts druckt, lol.
Magic Octopus Urn
1
@MagicOctopusUrn Gern geschehen. Dachte nur, ich könnte es genauso gut bearbeiten, anstatt es zu kommentieren.
Boboquack
@boboquack hat mein ursprüngliches Tag (@boboquack) funktioniert oder haben Sie es gefunden, indem Sie den Beitrag erneut angesehen haben? Ich versuche herauszufinden, wie Tags funktionieren, wenn der Benutzer lol nie kommentiert.
Magic Octopus Urn
@boboquack Ich meinte, hast du eine Benachrichtigung von meinem "Dankeschön" bekommen? Außerdem sollten wir diesen Thread wahrscheinlich bis zu meiner +1 für Ihr "Gern geschehen" löschen.
Magic Octopus Urn
9

Brainfuck, Score 3

Ist möglicherweise nicht konkurrierend, da die Ausgabe nur über einen Speicherauszug angezeigt wird.

+++++++++++++++++++++++++++++++++++++++++++++,-

Angenommen, die Eingabe ist leer und EOF lässt die Zelle unverändert. Verwendet einen Interpreter, der den Speicher auf einen Ausgang wie diesen kopiert .

Entfernen Sie ein Pluszeichen und der Speicher ist der Unicode-Wert für "+", ansonsten der Unicode-Wert für ",". Es ist jedoch eher eine Regel als eine Antwort. So ziemlich das gleiche mit "-". Missbrauch der Tatsache, dass diese drei Zeichen im Unicode-Zeichensatz nacheinander stehen.

Håvard Nygård
quelle
Smart, um ganz ehrlich zu sein, glaube nicht, dass es eine Lücke ist.
Magic Octopus Urn
Sie gehen davon aus, dass EOF die Zelle unverändert lässt, ja?
Jo King
Ja, und solange es keine Eingabe gibt, sollte es in Ordnung sein 😊
Håvard Nygård
Ich bin dies zu ermöglichen versucht, aber Sie haben einen Dolmetscher, der ein Speicherabbild hat das würde nur ausgegeben veränderte Zellen und verläßt die Zelle unverändert auf EOF?
Jo King
1
copy.sh/brainfuck Dieser sollte gut funktionieren. Führen Sie es einfach aus und klicken Sie auf "Speicher anzeigen".
Håvard Nygård
9

Ein Birnbaum, 256 verschiedene Bytes, 975 Bytes

Leider erfordert die Frage so ziemlich eine optimale Lösung, um irgendwo ein NUL-Byte zu enthalten (da es irgendwo alle 256 Bytes enthalten muss). Dies bedeutet, dass a) ich Ihnen keinen TIO-Link geben kann (weil TIO NUL in Programmen nicht mag, oder zumindest nicht herausgefunden habe, wie mein Browser damit umgehen kann) und b) ich kann das Programm nicht wörtlich in Stack Exchange einfügen. Stattdessen habe ich einen xxdumkehrbaren Hexdump hinter dem "Code Snippet" -Link platziert.

Erläuterung

Dieses Programm besteht aus drei identischen Teilen. (Die Verkettung mehrerer identischer Teile eines Programms ist für mich in Programmen ein Thema .) Jeder Birnbaum benötigt eine Prüfsumme, um dem Interpreter mitzuteilen, welche Teile des Programms ausgeführt werden sollen. Es dreht jeden Teil des Programms, für den die Prüfsumme erfolgreich ausgeführt wurde, bis zum Start (oder druckt, a partridgewenn keine Prüfsumme übereinstimmt). In diesem Fall haben wir eine Prüfsumme für jedes der drei Teile, und somit bewegt sich ein nicht bestrahlter Teil zum Start. Wir können also davon ausgehen, dass das Programm aus einem unveränderten Teil besteht, gefolgt von zwei weiteren Teilen (von denen einer möglicherweise geändert wurde).

Jeder Teil beginnt mit einer neuen Zeile und fährt dann mit dem folgenden Code fort (ich habe Leerzeichen und Kommentare unten hinzugefügt):

$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

Danach folgt eine Kopie von jedem Oktett, das bisher nicht im Programm verwendet wurde (nur um die Partitur hochzufahren), und schließlich die Prüfsumme. (Es gibt keinen abschließenden Zeilenumbruch. Teile beginnen mit einem Zeilenumbruch, enden jedoch nicht mit einem.)

Hier gibt es drei verschiedene Fälle:

  • Ein anderes Zeichen als eine neue Zeile wurde gelöscht . In diesem Fall wird es im zweiten und dritten Teil ungerade oft vorkommen. Das heißt, es wird %zmehrmals hinzugefügt und / oder entfernt und landet schließlich in der Hash-Tabelle. Tatsächlich wird es der einzige Schlüssel in der Hash-Tabelle sein (da die Zeichenfolge von der Newline des zweiten Teils bis zum Ende des dritten Teils läuft und die Hash-Tabelle mit nur einer Newline beginnt). Ich werde nur alleine ausgedruckt.
  • Die erste oder dritte Zeile wurde gelöscht . In diesem Fall wird das Programm so gedreht, dass der dritte der Zeilenumbrüche fehlt, wodurch der zweite und der dritte Teil effektiv zu einer einzigen Zeile zusammengeführt werden. Das String-Literal, auf das über zugegriffen wird, <DATA>enthält jedes Zeichen eine gerade Anzahl von Malen, sodass die Hash-Tabelle ihren ursprünglichen Inhalt, eine einzelne neue Zeile, enthält und gedruckt wird.
  • Die zweite Zeile wurde gelöscht . In diesem Fall wird das Programm nicht gedreht (da der erste Teil eine gültige Prüfsumme hat), sodass der zweite Teil in dieselbe Zeile verschoben wird wie der erste Teil. <DATA>Beginnt erst ab der Zeile darunter zu lesen __DATA__, sodass nur der dritte Teil angezeigt wird. Dies hat mehr als fünf Zeichen, die ungerade oft vorkommen, sodass der Sonderfall ausgelöst wird, dass eine neue Zeile gedruckt wird.

Nachprüfung

Eine letzte Sache, die für so ziemlich jedes strahlungsgehärtete A Pear Tree-Programm überprüft werden muss, ist, ob eine Löschung zufällig dazu führt, dass ein unerwünschter Codeabschnitt die Prüfsumme korrekt summiert und den Code an die falsche Stelle dreht. Angesichts der Verwendung von 32-Bit-Prüfsummen ist dies unwahrscheinlich, aber nicht unmöglich. Ich habe das folgende Brute-Force-Skript verwendet, um sicherzustellen, dass dies bei keiner Löschung passiert:

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!";

Das Überprüfungsskript bestätigt, dass dieses Programm ordnungsgemäß funktioniert.

ais523
quelle
7

Stax , 11 Bytes (Ergebnis von 4)

'''cc'~~'dd

Online ausführen und debuggen!

Es ist mir eine Ehre, die erste (chronologisch) Antwort auf diese Herausforderung mit einer Punktzahl größer oder gleich 4 zu haben. Vielleicht kann die Punktzahl sogar noch höher sein.

In Stax, einen Stringliteral , die aus einem einzigen Zeichen bestehen geschrieben , mit ', so '', 'c, 'd, '~sind alle Stringliterale. Die entsprechenden Befehle für c dund ~Mittel duplizieren den oberen Rand des Hauptstapels, legen den oberen Rand des Hauptstapels ab und legen den oberen Rand des Hauptstapels ab und drücken auf den Eingabestapel. Für diese Herausforderung hat Eingabestapel nicht ausgegeben beeinflussen und ist nicht wichtig, daher können wir sagen , dund ~sind identisch.

Erläuterung

Es ist am besten, den Code in mehrere Teile zu unterteilen und diese getrennt zu betrachten.

Wenn es nicht manipuliert wird, werden '''ccein Literal 'und ein Literal cauf den Hauptstapel verschoben und der obere Stapel wird dupliziert, so dass der Stapel (von unten nach unten) ist c,c,'.

Wenn nicht manipuliert, wird '~~das Literal ~verschoben und dann geöffnet (und zum Eingabestapel verschoben), was im Grunde genommen ein No-Op für den Hauptstapel ist.

Wenn nicht manipuliert, 'dddrückt er das Literal dund öffnet es, ein weiteres No-Op für den Hauptstapel.

Da am Ende des Programms keine explizite Ausgabe erfolgt, wird implizit die Oberseite des Hauptstapels ausgedruckt.

Wenn das Programm so ausgeführt wird, wie es ist, ist der letzte Stapel noch vorhanden c,c,'und wird ausgegeben c.

Wenn der erste Teil wird ''cc, dann haben wir ein Literal 'und zwei Kopieranweisungen, der letzte Stapel wird ',','. Vorausgesetzt, die beiden anderen Teile sind No-Op, wird das Ergebnis sein '.

Wenn der erste Teil wird '''c, ist das Ergebnis im Grunde das gleiche wie dasjenige ohne Manipulation, aber das cwird nicht dupliziert. So wird der Stapel sein c,'. Nach zwei No-Ops ist die Spitze des Stapels c.

So können wir im ersten Teil Strahlung nachweisen.

Der zweite Teil und der dritte Teil funktionieren genauso. Ich werde den dritten Teil als Beispiel nehmen.

Wenn der dritte Teil manipuliert wird, bleiben die ersten beiden Teile wie sie sind und der Stapel, bevor der dritte Teil ausgeführt wird c,c,'

Wenn der dritte Teil wird 'd, wird ein Literal dan die Spitze des Hauptstapels verschoben, und es wird nichts weiter unternommen. Das oberste Ende des Hauptstapels ist nun ddas, was ausgegeben wird.

Wenn der dritte Teil wird dd, werden zwei Elemente aus dem Hauptstapel entfernt und jetzt wird der obere Teil des Stapels 'ausgegeben.

Somit können wir im dritten Teil Strahlung nachweisen. Aus dem gleichen Grund können wir im zweiten Teil Strahlung nachweisen.

Weijun Zhou
quelle
5

05AB1E , Score 2, 6 Bytes

„"""„„

Druckt manchmal doppelt so viele Zeichen wie entfernt. Enthält nicht '.

Wie es funktioniert:

Erstes entfernen

"""„„

Probieren Sie es online!

Zuerst legen wir ein leeres String-Literal auf den Stack. Dann drücken wir „„, was implizit gedruckt wird.

A. Entfernen "

„""„„

Probieren Sie es online!

Zuerst schieben wir uns ""mit der 2-char stringAnweisung zum Stapel . Dann versuchen wir, eine weitere 2-stellige Zeichenfolge zu erhalten, aber diese wird abgebrochen (ich weiß nicht genau warum) und die ""wird gedruckt.

Entfernen der zweiten oder dritten

„"""„

Probieren Sie es online!

Zuerst schieben wir uns ""mit der 2-char stringAnweisung zum Stapel . Dann drücken wir , was implizit gedruckt wird.

Boboquack
quelle
5

Gelee , 5 Bytes, Punktzahl 2

”””ḷḷ

Probieren Sie es online!

Bei entferntem:

””ḷḷ

Probieren Sie es online!

Das Zeichen beginnt mit einem Ein-Byte-Zeichen-Literal. Dieses Programm beginnt mit dem, ””was den String ergibt . Die Dyade nimmt ihren linken Streit. Die Zeichenfolge wird nur durch die beiden Instanzen von übergeben .

Bei entferntem:

”””ḷ

Probieren Sie es online!

In diesem Programm ””ergibt das Zeichen dann ”ḷdas Zeichen und nur dieses wird ausgegeben.


Andere Lösungen

  • Viele andere Charaktere wie aoder ohätten für diese Einreichung gearbeitet.
  • ⁾⁾⁾⁾FFF. Dies funktioniert auf ähnliche Weise. ist wie, aber es beginnt ein Zwei- Byte-String-Literal. Die "bestrahlten" Programme geben das gelöschte Byte zweimal aus, was in den Kommentaren als gültig befunden wurde.

Hier ist eine (viel weniger ausgefallene) Jelly-Version des Gültigkeitsprüfers von Magic Octopus Urn. Die linke Spalte der Ausgabe ist das gelöschte Zeichen und die rechte Spalte ist die Ausgabe des resultierenden Programms.

dylnan
quelle
Mein Gültigkeitsprüfer ist nichts Besonderes . Bei der anderen geposteten Lösung schlägt dies fehl;).
Magic Octopus Urn