Ihre Herausforderung ist einfach: schreiben , so lange von einem ursprünglichen Programm wie möglich in der Sprache Ihrer Wahl nur einzigartiges Bytes verwenden. (Die vollständige Definition eines unberührten Programms, kopiert von diesem Link, ist am Ende dieser Frage.)
Das ist richtig, keine Bedingungen geknüpft. Ihr Code muss überhaupt nichts tun, nur fehlerfrei ausgeführt werden, die Anforderungen für ein makelloses Programm (siehe oben) erfüllen und keine doppelten Bytes in die von Ihnen verwendete Codierung einbeziehen.
Für die Zwecke der obigen Erläuterung und der damit verbundenen Definition von "makellosem Programm" wird ein Fehler als alles definiert, was dazu führt, dass das Programm nach einer begrenzten Zeit entweder nicht mehr ausgeführt wird oder mit einem Exit-Code ungleich Null endet.
Da dies Code-Bowling ist , gewinnt der längste , nicht der kürzeste Code (gemessen an der Byteanzahl). Die theoretisch maximal mögliche Punktzahl beträgt 256, da 256 verschiedene Bytes möglich sind. Bei einem Gleichstand gewinnt die erste Antwort mit der höchsten Punktzahl.
Hier ist die vollständige Definition eines unberührten Programms, kopiert aus dem obigen Link:
Definieren wir ein unberührtes Programm als ein Programm, das selbst keine Fehler aufweist, das jedoch fehlerhaft ist, wenn Sie es ändern, indem Sie zusammenhängende Teilzeichenfolgen mit N Zeichen entfernen
1 <= N < program length
.Zum Beispiel das dreistellige Python 2-Programm
`8`
ist ein unberührtes Programm, da alle Programme, die aus dem Entfernen von Teilzeichenfolgen der Länge 1 resultieren, Fehler verursachen (Syntaxfehler in der Tat, aber jede Art von Fehler reicht aus):
8` `` `8
und auch alle Programme, die aus dem Entfernen von Teilzeichenfolgen der Länge 2 resultieren, verursachen Fehler:
` `
Wenn zum Beispiel
`8
ein fehlerfreies Programm gewesen`8`
wäre, wäre es nicht makellos, da alle Ergebnisse der Entfernung der Teilzeichenfolgen fehlerhaft sein müssen.
quelle
JMP <address outside of the program's memory>
in der Montage. Im Prinzip kann es auf einem echten Computer eine Endlosschleife geben oder mit einem Fehler ungleich Null beendet werden, aber normalerweise stürzt es spektakulär ab.Antworten:
Jelly ,
253 254256 BytesProbieren Sie es online! oder Überprüfen Sie es!
Es stellte sich heraus, dass Golfsprachen ...
‘
.Jetzt nur«»
noch nicht benutzt«»
. Jetzt haben Sie die optimale Punktzahl!Wie?
Das entscheidende Merkmal von Jelly, das dies ermöglicht, ist, dass die Anfangs - und Endzeichen für Zeichenfolgenliterale nicht mit denen in fast allen anderen Sprachen identisch sind.
Die Programmstruktur ist wie folgt:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
findet die Indizes seines Arguments, die auf maximale Elemente verweisen. Alles, was zählt, ist, dass Jelly ohne Argument für dieses Programm0
den Ketten- und Jelly-Fehlern zuordnet , wenn sieM
angewendet werden0
.Um zu verhindern
M
, dass0
im gesamten Programm weitergearbeitet wird, verwenden wir den¡
Schnellzugriff,M
der mehrmals angewendet wird. Dies wird durch das Ergebnis des unmittelbar davor stehenden Links bestimmt. In diesem Fall ist dieser Link<239 character long string> L»«’Ɗạ‘}237$¤
.L
Nimmt die Länge dieser Zeichenkette (239) und»«’Ɗ
dekrementiert sie auf 238. Der»«
Teil macht nichts anderes alsƊ
(die letzten drei Links als Monade), so dass ein Fehler auftritt, wenn sie gelöscht werden. Nimmtạ
dann den absoluten Unterschied zwischen dem Ergebnis»«’Ɗ
und der‘}237$
auf die Saite angewendeten Monade .‘
Schritte und ist eine Monade, aber die}
Windungen dieses in eine Dyade und wendet sie auf das rechte Argument ist,237
und ergibt238
. Damitạ
ergibt sich0
im vollen Programm.¤
Links zurück zu dem String-Literal, das einen Nil bildet. Das Ergebnis ist0
, dassM
es überhaupt nicht angewendet wird, um Fehler zu vermeiden.Mögliche Unterprogramme:
<string>..¤
wird, ist er ungleich Null undM
wird angewendet0
, wodurch ein Fehler verursacht wird.L»«’Ɗạ‘}237$
entferntM
wird, wird entweder auf angewendet,0
oder es werden Operationen zwischen der Zeichenfolge und einer Zahl ausgeführt, was zu a führtTypeError
.¤¡
entfernt wird,M
wird auf angewendet0
.”
und beide’‘
entfernt bekommen und“
nicht, alles nachM
verwandelt sich in einen String , soM
wird auf handeln0
.”
und’
entfernt wird und“
nicht, wird alles zwischen”
und‘
in eine Liste von ganzen Zahlen umgewandelt.M
alleine entfernt wird, gibt es ein "EOFError
weil", das¡
einen Link vor dem vorhergehenden "Nilad" erwartet.M“
und eine beliebige Anzahl von Zeichen nach dem Entfernen vorhanden ist, wird eine angezeigt,EOFError
da¤
nach einem Nullpunkt gesucht wird, dieser jedoch nicht gefunden wird.238
zählt nicht, weil es Teil einer Monade ist.Das deckt so ziemlich alles ab.
Ich hatte es zuvor nicht verwendet,
«»‘
da die beiden letzteren nicht in die Zeichenfolge aufgenommen werden können, da sie mit dem“
Zeichen übereinstimmen , um andere Dinge als Zeichenfolgen zu bilden. Ich«
kann auch nicht in einer“”
Saite sein, aber ich weiß nicht warum.quelle
Haskell ,
3945505260 BytesDer Bezeichner
main
muss einen TypIO a
für einen Typ a haben. Wenn das Programm ausgeführt wird, wird die Berechnungmain
ausgeführt und das Ergebnis verworfen. In diesem Fall ist sein TypIO ((a,b)->a)
.Das Ergebnis ist eine Anwendung der Funktion
(λ a b c d e f → return fst)
, einer Konstantenfunktion mit sechs Argumenten, die die Funktion fst (die das erste Element eines 2-Tupels ergibt) zurückgibt, die in die E / A-Monade injiziert wird. Die sechs Argumente sindLT
(Enum für weniger als),EQ
(ENUM für Gleichheit), leere Liste[]
,3
,2
und1
.Leerzeichen werden durch eindeutige Zeichen ersetzt, die als Leerzeichen gelten: ein Tabulator, ein nicht unterbrechendes Leerzeichen, ein Formularvorschub, ein vertikaler Tabulator, eine OGHAM-LEERTASTE, ein reguläres Leerzeichen, ein Zeilenumbruch und ein Zeilenumbruch. Wenn eine dieser Angaben fehlt, ist die Anzahl der Argumente nicht übereinstimmend. Die Parameternamen werden als drei- oder vier-Byte-UTF-8-Zeichen ausgewählt,
𤶸陸ⵙ商ߜ新
wobei Zeichen sorgfältig ausgewählt werden, die nicht zu doppelten Bytes führen.Vielen Dank an @BMO für seine wertvollen Beiträge.
Hex-Dump:
Probieren Sie es online!
quelle
'\109999'
scheint zumindest in GHC 8.2.2 gültig zu sein.'\10999a'
erzeugt einen lexikalischen Fehler.
erzeugt auch einen lexikalischen Fehler.maxBound :: Char
, dh'\1114111'
. Hinweis: Die Zahlen sind standardmäßig dezimal. Wenn Sie also hexadezimal schreiben möchten, müssen Sie einx
nach dem\
, z'\x10999a'
.\x10ffff
funktioniert einwandfrei und\x110000
liefert einen Fehler außerhalb des Bereichs, wie zu erwarten war.Python 2 ,
20 21 33 39 4550 BytesNun sehr eine gemeinsame Anstrengung!
+2 dank Aidan F. Pierce (ersetzen
sorted({0})
durchmap(long,{0})
)+8 dank dylnan (Verwendung von
\
und newline, um Leerzeichen zu ersetzen; Vorschläge, um von0
einem mathematischen Ausdruck zu wechseln ; Ersetzen-1
durch-True
; Verwendung von hexadezimal)+11 danke an Angs (
4*23+~91
->~4836+9*1075/2
dann später~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Probieren Sie es online! Oder sehen Sie sich die Bestätigungssuite an
0xDEAdFBCbc
ist hexadezimal und ergibt59775106236
.~
Ist bitweise Ergänzung also zu~875
bewerten-876
.%
Wird der Modulo-Operator also zu0xDEAdFBCbc%1439
ausgewertet293
./
Ist die Ganzzahldivision so wird0xDEAdFBCbc%1439/2
ausgewertet146
.*
ist die Multiplikation soxDEAdFBCbc%1439/2*6
wertet auf876
.+
ist nebenbei so zu~875+xDEAdFBCbc%1439/2*6
bewerten0
.... wertet auch keine abgespeckte Version aus
0
.{0}
ist einset
Element, das ein einzelnes Element enthält0
.Wenn Sie
sorted
mit aset
als Argument aufrufen, erhalten Sie eine Liste, in die Sie mit indexieren können[...]
.Ohne
sorted
den Code({0})
würde nur das ergebenset
und dieser kann nicht in gleicher Weise indiziert werden,if({0})[-True]:q
würde einTypeError
.Indexieren in Python ist 0-basiert und ermöglicht negativen Indexieren von der Rückseite und
True
entspricht1
dahersorted({0})[-True]
das Element findet0
, währendsorted({0})[True]
wird eine erhöhenIndexError
, als Willesorted({})[-True]
undsorted({0})[]
ist ungültig Syntax.Die ,
0
die gefunden wird , ist Falsey so den Körper desif
,q
wird, nie jedoch ausgeführt, wenn es es ein aufwerfen würde ,NameError
daq
nicht definiert wurde.Da eine nicht leere Liste der Wahrheit entspricht, können wir auch nicht darauf eingehen
if[-1]:q
.In der Bestätigungssuite finden Sie folgende Informationen : Bestätigung, dass die Bytes eindeutig sind; alle Fehler; und der Erfolg des Codes selbst.
quelle
C (tcc) , x86_64,
2931333940 BytesGibt 0 zurück . Vielen Dank an @feersum für das Vorschlagen von Hex-Ziffern in Großbuchstaben.
Probieren Sie es online!
Wie es funktioniert
Die Zuweisung schreibt zwei Ints ( 184 und 49664 ) in den Speicherort von main . Bei 32-Bit-Ints und Little-Endian-Bytereihenfolge sind die genauen Bytes
b8 00 00 00 00 c2 00 00
.Da tcc das definierte Array nicht als .data deklariert (die meisten Compiler würden dies tun), führt das Springen zu main den Maschinencode aus, auf den es verweist.
b8 00 00 00 00
(mov eax, imm32
) speichert die int 0 im eax-Register.c2 00 00
(ret imm16
) entfernt 0 zusätzliche Bytes aus dem Stapel und gibt sie zurück. (Der Wert im eax-Register ist der Funktionsrückgabewert).quelle
> <> 122 Bytes
Probieren Sie es online!
Tut nichts. Basiert auf dem gleichen Format wie bei der Programmierung einer unberührten Welt .
Zuerst prüfen wir, ob der Code 122 lang ist und ob er fehlerhaft ist.
><>
Programme können nicht ohne die Verwendung des;
Befehls beendet werden. Befindet sich dieser Befehl jedoch im Programm, können wir einfach alles vorhergehende entfernen, um das Programm sofort zu beenden. Um dem entgegenzuwirken, verwenden wir denp
Befehl, um zur;
Laufzeit ein in den Code einzufügen. Dazu subtrahieren wir 6A
und setzen sie nach diep
.Ich werde wahrscheinlich die meisten anderen Werte über 127 addieren, sobald ich die richtigen Zwei-Byte-Werte herausgefunden habe. Die fehlenden 5 Werte sind
v^;
und die zwei Zeilenumbrüche.Von den 7502 Unterprogrammen sind 7417 aufgrund ungültiger Anweisungen fehlerhaft, 72 aufgrund von Speichermangel und 13 aufgrund von Speichermangel.
quelle
JavaScript, 42 Bytes
i
,f
oderif
wird verursachenSyntaxError: missing ; before statement
;田
wird verursachenSyntaxError: expected expression, got end of script
;田
bewirktInvalid or unexpected token
;田
Code-Snippet anzeigen
quelle
Brain-Flak , 2 Bytes
Probieren Sie es online!
Alternativ
[]
,{}
oder()
. Durch Entfernen einer der beiden Halterungen wird die andere Halterung nicht mehr angepasst.Beweisen Sie, dass dies die optimale Lösung ist:
Ein Brain-Flak-Programm besteht aus Niladen (ein Paar Klammern für sich) oder Monaden (ein Paar Klammern, die 1 oder mehr Niladen enthalten). Eine Monade kann nicht in einem unberührten Programm enthalten sein, da Sie einfach eine oder mehrere der Niladen entfernen können. Ebenso können Sie nicht mehr als einen Nullpunkt im Programm haben, da Sie einen davon entfernen können, ohne das Programm zu unterbrechen.
Daher ist dies möglicherweise die am wenigsten optimale Sprache für makellose oder eindeutige Programmierung.
quelle
Ada, 110 Bytes (latin1)
Wahrscheinlich die beste Antwort, die Sie aus einer in der Industrie verwendeten Sprache ziehen können?
Hexdump:
Kompilieren Sie, indem Sie in einer beliebigen Datei speichern, die auf "" endet
.ads
und ausgeführt wirdgcc -c <filename>
. Erzeugt eine ausführbare Datei, die nichts tut. (TIO-Link kann nicht bereitgestellt werden, da TIO Code in eine.adb
Datei schreibt undgcc
standardmäßig versucht, eine passende Spezifikation für diese zu finden.)Deklariert grundsätzlich ein Paket mit einem Namen, der Groß- / Kleinschreibung in lateinischen Buchstaben1 missbraucht. Benötigt für jedes Leerzeichen ein anderes Leerzeichen, daher werden Leerzeichen, CR, LF und TAB verwendet.
So sieht es in der VIM-Version aus:
Wie es funktioniert
In Ada können sogar Specs kompiliert werden. Specs ähneln den Header-Dateien von c, sind jedoch umfangreicher und können einige grundlegende Codes kompilieren. Um gültig zu sein, muss jede Spezifikation das Format haben:
package <NAME> is ... end <NAME>;
with<NAME>
matching. Das Schöne an Ada ist, dass die Groß- und Kleinschreibung nicht berücksichtigt wird. So lange Ihr Name aus Groß- und Kleinbuchstaben besteht, können Sie loslegen!Das Schwierige war, eine kompilierbare Einheit zu bekommen. Normalerweise haben Ada-Programme eine 'Haupt'-Prozedur oder -Funktion, die außerhalb eines Pakets liegt, das zur endgültigen ausführbaren Datei wird. Leider erfordern Prozeduren das
begin
Schlüsselwort, was zu zu vielene
s führt (nur 2 Fälle bekannt), während Funktionen dasreturn
Schlüsselwort erfordern , was zu zu vielenn
s führt. Also musste ich einfach ein Paket zusammenstellen.quelle
C 8 Bytes
Tut nichts.
Probieren Sie es online!
quelle
main(){short x;}
main(){short;}
kompiliert nur mit awarning: useless type name in empty declaration
. Ich denke, C99 und C ++ erfordern einen expliziten Rückgabetyp, alsoint main
(oder vielleichtunsigned main
) könnte es funktionieren, aber nicht mit gcc, das nur warnt, sogar mit-std=c11
.return 0;
ist möglicherweise mit C89 möglich, wo esreturn 0
am Ende keine Implizite gibtmain
. Das Beenden mit einem Status ungleich Null kann anderen Antworten zufolge als Fehlschlag gewertet werden. Zählt das Hinzufügen von Compiler-Flags wie-Werror
zum Beispiel beim Code-Bowling in guter Weise zur Punktzahl? Weil die strikte Durchsetzung von C11-Verstößen ein viel längeres Programm ermöglichen könnte. Hmm,#include<>
etwas und dann benutze es; Sie können nicht sowohl include als auch usage entfernen, und wenn es ohne einen Prototyp oder eine Makro-Def abstürzt, gewinnen Sie.main
undinclude
beide enthalteni
, so dass Sie nicht beide haben können. Ähnlich zum Deklarieren und Verwenden einer Funktion. Auch mitreturn
überhaupt nicht zu denken.int main
kann natürlich nicht funktionieren.JavaScript, 22 Byte
Probieren Sie es online!
Mögliche Fehler
Bei Änderung wird einer der folgenden Fehler ausgegeben 1 :
1. Die genaue Anzahl der unterschiedlichen Fehler hängt vom Motor ab. Diese Liste wurde mit SpiderMonkey (Firefox) erstellt.
quelle
Python 3 + Flask-Env ,
7131417 BytesKein TIO, weil es nicht hat
flask-env
.Es wurde der längste Modulname gefunden, der keine Kreuzung mit hat
import
und am Ende des Namens keine Zahlen enthält._sha256
ist länger, aber256
alleine macht es keinen Fehler. Ich habe eine Bibliothek gefunden,b3j0f.sync
die ein Byte länger ist, aber ich konnte sie nicht richtig importieren.import
mit\<newline>
. Das Herausnehmen von einem oder beiden führt zu einem Fehler.Möglicherweise gibt es noch längere Optionen als
flask_env
, ich habe nicht wirklich gründlich gesucht, aber ich habe ~ 70.000 Module durchgesehen. Offen für Vorschläge.quelle
256
läuft ohne Fehler.import *[hawkey]
und ähnlich, aber leider nicht funktioniert ...R , 14 Bytes
Probieren Sie es online!
Dies kann in R die längste Zeit sein. Das Aufrufen einer Funktion ist zum Scheitern verurteilt, da Sie bis auf den Funktionsnamen alles entfernen können, was nur zum Ausdrucken des Funktionsquellcodes führt. Dies ist das am längsten benannte Objekt im Standard-R-Setup, bei dem keine doppelten Zeichen und kein Objektname übrig bleiben, wenn zusammenhängende Zeichen entfernt werden.
Dieser erste Versuch hat nicht funktioniert, aber ich habe viel gelernt, indem ich versucht habe!
dontCheck({family;NROW})
quelle
Perl 5, 3 Bytes
=>
ist das "fette Komma", das das Barewort auf der linken Seite zitiert. Das ist also äquivalent zuwas nix macht.
Ohne das fette Komma
y
wird der Transliterationsoperator, der ungültig ist, ohne drei gleiche Zeichen später wiederholt.Das fette Komma alleine ist ebenfalls ungültig, so wie es ist
=
und>
alleine.quelle
Brainfuck , 2 Bytes
Probieren Sie es online!
Inspiriert von Jo King's Brain-Flak-Antwort . Dies ist optimal, da der einzige Fehler beim Brainfuck unvergleichliche Klammern sind. (Nochmals vielen Dank an Jo King für diese Info.)
quelle
Ruby , 28 Bytes
Probieren Sie es online!
Überprüfen Sie es!
quelle
Standard-ML , 22 Bytes
Probieren Sie es online!
op-(a,b)
ist die entzuckerte Form vona-b
.~
bezeichnet das unäre Minus, also rechnen wir tatsächlich765+324
. Dieser Ausdruck ist in der Konstante musterangepasst1089
. Dieses Match ist erfolgreich, wenn das Programm nicht manipuliert wurde und dies auch tut - naja, nichts.Wenn die Übereinstimmung nicht erfolgreich ist, weil einige Ziffern entfernt wurden, erhält man eine
unhandled exception: Bind
. Das Entfernenop-
führt zu einem Typfehler, da ein Tupel mit einem übereinstimmtint
. Alle anderen Entfernungen sollten zu einem Syntaxfehler führen.quelle
Schnelle 4 , 19 Bytes
Probieren Sie es online!
Alle möglichen Fehler, die ich gefunden habe, sind:
[
,]
,{
oder}
ist in einem Syntaxfehler ergeben[].
führt zuUse of unresolved identifier 'contains'
.
führt zuConsecutive statements on a line must be separated by ';'
[]
führt zuReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
führt zuExpression resolves to an unused function
1 !=␊0
führt zuMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
führt zuMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
führt zuClosure expression is unused
Einige andere interessante Programme sind (eines in jeder Zeile):
quelle
a
sTcl , 6 Bytes
Probieren Sie es online!
Tcl , 3 Bytes
Probieren Sie es online!
Tcl , 2 Bytes
Probieren Sie es online!
quelle
Batch, 7 Bytes
Ein schöner Start
quelle
Retina , 2 Bytes
Es würde mich nicht wundern, wenn das optimal ist ...
Probieren Sie es online!
Der reguläre Ausdruck enthält eine leere Gruppe. Das Entfernen einer der beiden Klammern führt aufgrund nicht übereinstimmender Klammern zu einem Analysefehler.
Andere Lösungen sind:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
quelle
a]
Fehler nicht.C (gcc) ,
73 bis75 BytesProbieren Sie es online!
Basierend auf der Antwort von @Steadybox, danke an @Angs für die Erkennung schwerwiegender Fehler.
Ja, es ist ein schmutziger Hack (weil er tatsächlich ein
#define
with-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
und verwendet-Dg=return
), aber ich sehe keine Regel, die eine solche Compiler-Option verbietet.quelle
-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
+-Dg=return
, ich würde so argumentieren dass diese verwenden einen erfundenen Sprache , die speziell für die Herausforderung entwickelt , die standardmäßig verboten ist.-1
ohne dass es fehlerhaft ist