Was haben wir vergessen?

31

Ihre Aufgabe ist es, ein nicht leeres Computerprogramm zu schreiben, das aus einer Folge von Bytes besteht. Wenn wir ein bestimmtes Byte im Programm auswählen und alle Instanzen davon aus dem Programm entfernen, sollte das geänderte Programm das entfernte Byte ausgeben.

Zum Beispiel wenn unser Programm wäre

aabacba

Dann bcbwürde ausgeben a, aaacamüsste ausgeben bund aababawürde ausgeben c.

Es ist egal, was das unveränderte Programm macht.

Die Antworten werden in Bytes gewertet, wobei das Ziel darin besteht, die Anzahl der Bytes zu minimieren.

Weizen-Assistent
quelle
4
Da diese Herausforderung nicht quine markiert ist, können wir unseren eigenen Quellcode lesen?
Dennis
1
@ Tennis Sicher. Seien Sie mein Gast
Wheat Wizard
2
Wenn alle Bytes in unserem Programm Ziffern darstellen, können wir sie über den Exit-Code ausgeben?
Mr. Xcoder
15
Ich denke, dies wäre besser als eine Code-Herausforderung, bei der Sie die Anzahl der verwendeten diskreten Zeichen maximieren müssen.
Notts90
2
Sollte mehr als 1 Byte anstelle von nicht leer angegeben haben : P. Oder was Notts90 gesagt hat.
Magic Octopus Urn

Antworten:

70

zsh, 603 594 566 561 548 440 415 399 378 370 Bytes

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Hängt von coreutils + ab dc.

Probieren Sie es online!

Das war ... eine Reise.

Diese Antwort besteht aus drei Teilen. Die ersten 4 Zeilen behandeln bestimmte Sonderfälle, um den folgenden Code zu vereinfachen. Die nächsten beiden Zeilen und die letzte Zeile bewirken im Wesentlichen dasselbe, aber genau eine Zeile wird mit einer bestimmten Zeichenentfernung ausgeführt. Sie sind mit meist komplementären Zeichensätzen geschrieben, sodass das Entfernen von Zeichen höchstens einen Zeichensatz unterbricht und der andere weiterhin funktioniert.

Mit Blick auf den ersten Teil beschäftigen wir uns zuerst

  • Zeilenumbruch mit ec\nho \\n
  • Leerzeichen entfernen mit ca t<<<$'\x20'(gefolgt von exi t, um zu vermeiden, dass späterer Code ausgeführt wird, was zu einer überflüssigen Ausgabe führen würde)
  • $Entfernung mit d$c -e8BC6P( 8BC6= 9226ist 36*256 + 10, und 36 und 10 sind die Bytewerte der $Zeichen und der Zeilenumbruchzeichen; wir verwenden hexadezimale Ziffern, um zu vermeiden, dass sie in den großen Kommentar in Zeile 6 aufgenommen werden müssen.)
  • 0Entfernen mit d0c -eKp( Kerhält die 0Standard- Dezimalgenauigkeit )

Im nächsten Teil werden als einzige Zeichen (außer dem Müll am Ende der zweiten Zeile) $'\01234567v;Leerzeichen und Zeilenumbrüche verwendet. Davon wurden vier berücksichtigt, sodass der Rest ( '\1234567v) nicht in der letzten Zeile vorkommen kann. Wenn Sie die oktalen Escapes erweitern ( $'\123'entspricht dem ASCII-Zeichen mit dem Wert 123 8 ), erhalten Sie:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

Die erste Zeile durchläuft alle im Programm verwendeten Zeichen und sucht nach jedem Zeichen im eigenen Quellcode ( $0ist der Dateiname des ausgeführten Skripts). Dabei werden alle Zeichen ausgegeben, die nicht gefunden wurden.

Die zweite Zeile sieht ein wenig seltsam aus und scheint dasselbe zu tun wie exitmit ein paar Nops. Die Codierung exitals Oktal führt jedoch direkt dazu $'\145\170\151\164', dass 2oder nicht enthalten ist 3. Wir müssen dies tatsächlich weniger widerstandsfähig gegenüber Umzügen machen. Dies liegt daran, dass, wenn eines von '\014567ventfernt wird, die erste und die zweite Zeile unterbrochen werden, so dass der Rest des Codes ausgeführt werden kann. Es muss jedoch auch unterbrochen werden, wenn 2oder 3entfernt werden, damit die Zeilen 3 und 4 ausgeführt werden können. Dies wird durch Einblenden von :und erreicht ;, die eine 2 bzw. 3 in ihrer Oktaldarstellung haben.

Der Müll am Ende von Zeile 2 ist einfach da, um sicherzustellen, dass jedes druckbare ASCII-Zeichen mindestens einmal vorkommt, da dies für die Art und Weise, wie die Prüfung durch Durchlaufen der einzelnen Zeichen erfolgt, erforderlich ist.

Wenn exites im ersten Abschnitt nicht aufgerufen wurde (dh durch das Entfernen eines der '\01234567vZeichen beschädigt wurde ), fahren wir mit dem zweiten fort, in dem wir dasselbe tun müssen, ohne eines dieser Zeichen zu verwenden. Die letzte Zeile ähnelt der decodierten ersten Zeile, mit der Ausnahme, dass wir den Bereich der Schleife verkleinern können, um einige Bytes zu sparen, da wir bereits wissen, dass alle Zeichen mit Ausnahme von '\01234567vabgedeckt wurden. Es hat auch 0# $#vor sich, was es auskommentiert und verhindert, dass es eine fremde Ausgabe erzeugt, wenn 0oder $entfernt wurden.

Türknauf
quelle
5
Wow, sehr beeindruckend, wenn man bedenkt, wie viele verschiedene Charaktere involviert sind! Ich freue mich auf jeden Fall darauf, diese Erklärung zu sehen.
Kevin Cruijssen
3
@ KevinCruijssen hier gehen Sie :)
Türklinke
1
@Doorknob, wenn das nicht Sie gewinnt 548 Internets, ich weiß nicht, was tut. Ehrlich gesagt ist die 603-Byte-Version genauso beeindruckend, hah!
Magic Octopus Urn
3
Die einzig interessante Antwort bisher.
htmlcoderexe
21

Netzhaut , 1 Byte

1

Probieren Sie es online!

Wenn alle Instanzen des einzelnen Bytes ( 1) entfernt wurden, lautet die Ausgabe 1. Einfach genug.

Conor O'Brien
quelle
6
Ich habe TIO durchsucht, um so etwas zu finden - Sie haben mich geschlagen. Übrigens ist dies ein Polyglott, arbeitet mit Snails
JayCe
IMO, diese Antwort sollte zu einer vielsprachigen Antwort aufgewertet werden (möglicherweise mit einer für immer unvollständigen Liste von Sprachen), und die anderen beiden sollten nicht berücksichtigt werden. Ach ja, und dies auch funktioniert in C .
@Rogem Ich bin nicht sicher, was Sie mit "das funktioniert in C." Haben Sie einen C-Compiler, der 1für das leere Programm ausgibt ? Ungeachtet dessen denke ich, dass die fraglichen Antworten unterschiedliche Ansätze und Verhaltensweisen verwenden. IMO ist eine mehrsprachige Antwort nur dann gerechtfertigt, wenn der Ansatz derselbe bleibt. (Objektiv ist dies kein Polyglot, da der tatsächliche Code für die unten stehenden Antworten unterschiedlich ist.) Sie können frei wählen, wie Sie möchten, aber eine gültige Antwort ist eine gültige Antwort. Ich werde meine Antwort so lassen, wie sie ist, ich möchte keine Sammlung von Antworten darauf unterbringen.
Conor O'Brien
11

Sprache, 216173027061157310 Bytes

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Es gibt 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s und 216173027061157310 - 144115194786755540Leerzeichen.

Die 144115617572598740 #s und Leerzeichen codieren das folgende BF-Programm:

++++++[>++++++<-]>.

Probieren Sie es online!

Die 144115241762960340 $s und Leerzeichen codieren das folgende BF-Programm:

+++++++[>+++++<-]>.

Probieren Sie es online!

Die 144115194786755540 $s und #s codieren das folgende BF-Programm:

++++++++[>++++<-]>.

Probieren Sie es online!

Bearbeiten: 72057832274401770 Bytes dank @Nitrodon gespeichert.

Neil
quelle
Warum nicht Uund Byte 127 verwenden? Probieren Sie es online! Oder auch nur das nul-Byte und soh?
Jo King
@JoKing Ich wusste nicht, dass dies Udas kürzeste druckbare ASCII-Byte ist, das ausgegeben werden kann. Ich wollte keine nicht druckbaren Bytes verwenden.
Neil
Auch ohne das Umbrechen von Zellen oder nicht druckbaren Zeichen ausnutzen zu müssen, können Sie dies auf 216173027061157310 Bytes reduzieren, indem Sie das Leerzeichen als drittes bestimmtes Byte einfügen.
Nitrodon
7
Ich kann nicht anders, als wegen "Bearbeiten: Gespeichert 72057832274401770 Bytes ..." zu verbessern
Herr Lister
10

Gelee , 1 Byte

0

Ganz anders als die Retina-Antwort. pfeift

Probieren Sie es online!

Dennis
quelle
6
Polyglot mit M und Enlist.
Mr. Xcoder
9

Polyglot * , 1 Byte ( auf Bestätigung wartend )

0

Probieren Sie es online! (mit Dreieckigkeit)

*: Dies funktioniert in einer (ziemlich großen) Vielfalt von Sprachen (mit Ausnahme von Esolangs wie 4,> <> und dergleichen und einigen anderen Ausnahmen). Identisch mit der Jelly-Antwort im Quellcode, aber die Methode der E / A ist anders - Die Ausgabe erfolgt über den Exit-Code. Wenn man 0aus dem Quellcode entfernt, bleibt ein leeres Programm übrig, das oft keinen Fehler macht und in den meisten Sprachen den Exit-Code 0 liefert .

Mr. Xcoder
quelle
3

sed , 1 byte



Probieren Sie es online!

Ganz anders als die Retina-Antwort oder die Gelee-Antwort.

tsh
quelle
Ich sehe keinen Code. Wäre das nicht eine 0-Byte-Antwort? Wie funktioniert das?
Mast
15
@Mast Es gibt eine neue Zeile ..... Sie werden Schwierigkeiten haben , in Whitespace geschriebene Programme zu lesen , wenn Sie so weiterdenken .
user202729
3

Unär (nicht konkurrierend), 96 Bytes

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Hier ist xxdMüllhalde.

Eine umfassendere Definition der Unary-Sprache ermöglicht beliebige Zeichen im Quellcode. Aber ich habe keinen Compiler oder Interpreter gefunden, der dafür geeignet wäre. Deshalb habe ich diese Antwort als nicht wettbewerbsfähig markiert. Wenn Sie eine finden, die vor dieser Frage gestellt wurde, werde ich darauf verlinken.

tsh
quelle
4
Dies ist das kleinste Unary-Programm, das ich je gesehen habe.
Draco18s