Ihr Ziel : Schreiben Sie einen Code, der das klassische Ergebnis von "Hallo Welt!" auf STDOUT oder gleichwertig gedruckt werden.
Regeln : Code muss vollständig im ASCII-Format gedruckt werden. Jeder Code muss funktionsfähig sein - das Entfernen eines einzelnen Zählzeichens muss das Ergebnis verändern oder den Code funktionsunfähig machen. Alle Variablen müssen nach der Zuweisung verwendet werden. Zeichen- und Zeichenkettenliterale müssen für die Ausgabe erforderlich sein. Das Ersetzen von Zeichenliteralen oder Zeichen in einem Zeichenkettenliteral durch ein anderes Zeichen muss das Ergebnis ändern können (und nicht durch die Auswirkung der Escape-Sequenz - Ersetzen von Zeichen durch Backslash) oder gleichwertig)
(HINWEIS: Die endgültige Regel wurde in bearbeitet.)
Wertung : Hier wird es interessant. Die höchste Punktzahl wird durch die Anzahl der Zeichen gemäß den typischen Regeln für das Code-Bowling bestimmt. Die wiederholte Verwendung von Zeichen führt jedoch zu Punktabzügen. Speziell...
- Die wiederholte Verwendung eines alphanumerischen Zeichens (az, AZ, 0-9) führt zu einem Abzug von 3 Punkten pro Wiederholung (die erste Verwendung führt nicht zu einem Abzug).
- Die wiederholte Verwendung der grundlegenden Interpunktion ([!? .-, ": ';]) - einschließlich der Klammern - führt zu einem Abzug von 2 Punkten pro Wiederholung.
- Die wiederholte Verwendung anderer ASCII-Zeichen {`~ @ # $% ^ & * _ + = | \ /> <} - einschließlich der geschweiften Klammern - führt zu einem Abzug von 4 Punkten pro Wiederholung.
- Die wiederholte Verwendung von Leerzeichen, Tabulatoren und Zeilenumbrüchen führt zu einem Abzug von 1 Punkt pro Wiederholung. Dies bedeutet, dass nur die erste Verwendung eines Leerzeichens, Tabulators oder einer neuen Zeile für Ihre Gesamtsumme berücksichtigt wird.
Hinweis: Kommentare zählen nicht zur Gesamtsumme, obwohl die Zeichen, die den Anfang / das Ende eines Kommentars markieren, dies tun. In C / C ++ /* This is a comment */
werden zum Beispiel zwei Schrägstriche und zwei Sternchen gezählt, aber nichts dazwischen.
Einige Beispiele (Hinweis: Verwenden von Julia als Beispielsprache) ...
print("Hello, world!");
Insgesamt sichtbare Zeichen: 22
Enthält
Leerzeichen : +1 Wiederholte alphanumerische Zeichen: -12 für llor
Wiederholte Interpunktion: -2 für "
Endpunktzahl: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Gesamtanzahl der Zeichen: 43 (zählt keine Zeichen nach #, dem Kommentarzeichen)
Enthält
Leerzeichen : +1 Wiederholte alphanumerische Zeichen: -18 für rr1008
Wiederholte Interpunktion: -24 für () "" "" ,,,,,
Final Punktzahl: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Insgesamt sichtbare Zeichen: 37
Enthält Newline: +1
Enthält
Leerzeichen : +1 Wiederholte alphanumerische Zeichen: -18 für Xyllor
Wiederholte Interpunktion: -4 für ",
Wiederholte andere ASCII-Zeichen: -4 für =
Endpunktzahl: 37 + 1 + 1-18-4 -4 = 13
Ein paar ungültige Code-Teile ...
x=2;print("Hello,world!")
Problem: x
wird zugewiesen, aber nicht verwendet.
print("Hello,"*" world!")
Problem: *
ist unnötig, das Ergebnis wird ohne dasselbe sein.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Problem: Der zweite print
Befehl wird nicht ausgeführt. Auch das Entfernen von Zeichen in Anführungszeichen im zweiten print
Befehl ändert die Ausgabe nicht.
x="Hello, world!";
print(x)
Problem: Das Entfernen einer neuen Zeile ändert weder das Ergebnis noch den Fehler (in Julia ist ein Semikolon nur erforderlich, wenn sich mehrere Befehle in derselben Zeile befinden, andernfalls wird nur der Rückgabewert unterdrückt).
print("Hellos\b, world!")
Problem: Das s
Zeichen hat keinen Einfluss auf das Ergebnis, da es von gelöscht wird \b
. Dies ist akzeptabel, wenn dies über code ( "Hello",char(100),"\b, world!"
) erfolgt, jedoch nicht über Zeichenkettenliterale oder Zeichenliterale.
Praktischer Score-Rechner - http://jsfiddle.net/4t7qG/2/ - dank Doorknob
Antworten:
Perl - 96
(Ziemlich gut, angesichts der theoretischen Höchstpunktzahl von 97)
(Beachten Sie, dass die zweite Zeile mit einem tatsächlichen
\t
Tabulatorzeichen beginnt. )Der Code ist 98 Zeichen lang und enthält jedes ASCII-Zeichen genau einmal sowie ein zusätzliches
-
.98-2 = 96
Es gibt keine String - Literale hier, aber die Entfernung von jedem einzelnen Zeichen bricht das Programm ab .
Deobfuscation
Es gibt 3 Anweisungen in diesem Programm (nun, eigentlich 2, aber ich habe sie
+
als eine Art Anweisungstrennzeichen missbraucht )s{}[Hel0o, w3$=d!]
Dies ist ein sehr ausgedehnter Fall des sed-Operators. Es wird allgemeiner als
s/a/b/
oder geschriebens:a:b:
, aber Perl lässt hier viel mehr Fantasie zu:s(a)(b)
s(a)^b^
s(a)[b]
und sogars qaqbq
.Ersetzt eine leere Zeichenfolge (innen
{}
) durchHel0o w360d!
(innen[]
) ($=
interpoliert60
standardmäßig auf). Aufgrund des Fehlens eines~=
Bedieners arbeitet es weiter$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Dies ist ebenfalls ein sehr ausgedehnter Fall, jedoch eines
tr
Operators, der auch alsy
(y< >( )
) bezeichnet wird.Schauen wir uns die Ersetzungstabelle an:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
Ich habe einige Zeichen verschoben, damit die vorhandene Zeichenfolge nicht beschädigt wird. Der einzige Teil, der hier tatsächlich funktioniert, ist
/-9
->k-u
. Es ersetzt0
mitl
,3
mito
und6
mitr
.Da der
~=
Operator nicht vorhanden ist, wird er ausgeführt.$_
Jetzt haben wir also die vollständige Phrase in der
$_
Variablen.print
Fehlen Argumente, wird nur die
$_
Variable ausgegeben.quelle
/-9
undk-u
werden tatsächlich zum Transformieren der Zeichenfolge verwendet. Der Rest ist ein gleich großer Müll. Wenn Sie nur ein Zeichen entfernen, werden die Sätze falsch ausgerichtet und das Programm gibt nicht "Hallo Welt!" nicht mehr.<...> removal of any single counting character must change the result or cause the code to not function.
Entfernen von 1 Zeichen wird es an einer beliebigen Stelle unterbrochen. Sie können es schaffen, indem Sie 2 Zeichen entfernen, aber das steht nicht in den Regeln.All code must be functional
. Zumindest verstößt du eindeutig gegen die Regeln. Ich sage nicht "es bricht die Regeln", aber es ist definitiv fraglich.Diese Antwort wurde vor dem Hinzufügen der Regel zu Zeichenfolgenliteralen erstellt und nimmt nicht am Wettbewerb teil.
Es ist völlig legitim. : P Wenn Sie ein Zeichen aus dieser Zeichenfolge entfernen, wird es gedruckt
ello, world!
.quelle
<<
müssen entfernt werden.if 'x'>'w'
Techniken, aber Blöcke "k \ bH" führen zum Beispiel zu "H". Fühlen Sie sich frei, eine zweite Antwort nach der hinzugefügten Einschränkung beizutragen.CJam, 94
Probieren Sie es online! Beachten Sie, dass sich unmittelbar vor dem Zeilenumbruch ein Tabulator befinden sollte. Da SE keine Tabulatoren mag, müssen Sie diese manuell einfügen.
Gesamtpunktzahl: 94
Ich habe den folgenden Code verwendet, um zu überprüfen, ob keines der Zeichen in der Zeichenfolge entfernt werden kann:
Es wird ein Array ausgegeben, das angibt, wie oft Hello, world! würde gedruckt werden, wenn das dem Index entsprechende Zeichen entfernt würde.
quelle
254b
) betrachtet. Das Endergebnis Modul 7 sollte 1 sein, so dass der vorherige Codeblock einmal ausgeführt wird. Ich brauche einen Modul, um jeden Charakter notwendig zu machen.Z
, derT
oder wahrscheinlich einiger anderer Zeichen nichts am Ergebnis.Ruby,
2841Beginnen Sie die Antworten mit einer Lösung im Geiste der Frage:
Wertung (ich glaube, ich habe das richtig verstanden):
orli
)"'
)quelle
.
Eingang3.1
kann problemlos entfernt werden. Wie kann dasx
in0x4
oder das-
in8-5
.PHP, 1 (ja, ein Punkt!)
Verwenden Sie magische Zeichen, um eine Prüfsumme zu generieren, die in binärer Form mit "Hell", "o, w", "orld" und "!" Übereinstimmt.
Normalerweise mag ich es, Lücken zu finden, aber dieses Mal habe ich mich entschieden, nach dem Geist und der Absicht des Wettbewerbs zu spielen. Jedes Zeichen und seine Position ist für die Ausgabe von wesentlicher Bedeutung. Die einzigen Stellen, die Sie ersetzen können, sind Variablennamen, die keine Literalwerte sind, der Leerraum zwischen
php
undforeach
derPHP
als äquivalent behandelt wird, und die Verwendung von'
vs,"
derPHP
als ähnlich behandelt wird.Zu Ihrer Information, dies sind einige andere interessante magische Strings und Hashes:
quelle
\t
,\n
oder den Raum. Kein PHP-Experte, aber auch;
optional.Befunge-98 , 97 Punkte!
Probieren Sie es online!
Die Registerkarte befindet sich zwischen
q
undn
.Verwendet einen ähnlichen Trick wie die vorherige Befunge-Antwort, um die Zeilen mit den verbleibenden Zeichen aufzufüllen, vermeidet jedoch die Verwendung doppelter Zeichen im ausführenden Abschnitt. Das Entfernen eines der nicht ausführbaren Zeichen führt dazu, dass die ausführbaren Teile nicht mehr richtig platziert sind und normalerweise in Endlosschleifen enden oder die falsche Ausgabe drucken.
Wie es funktioniert
In Wirklichkeit sieht der einzige ausführende Teil so aus:
Zuerst wird ein Wrapping-String-Literal zum Hinzufügen
, world!
zum Stack verwendet. Dies vermeidet zwei"
s.Dadurch wird
Hello
der Stapel mithilfe verschiedener Methoden erweitert, um doppelte Zeichen zu vermeiden.$
Löst den überschüssigen Speicherplatz aus, der durch das Zeilenumbruch-Literal verursacht wird.7+
Fügt demh
vom Ende des Strings abgeleiteten Literal 7 hinzu , um das zu erstelleno
.ba*46\%:
berechnet 111, den ASCII-Wert vonl
und dupliziert ihn.'e
Fügt e zum Stapel hinzu.f1g
bekommt das Zeichen bei 1,15 was das istH
Anschließend wird die
,
Zeichenfolge erneut verwendet, um das Ganze auszudruckenHello, world!
. Der Rest ist nur Richtungsänderungen, um zum Ende zu navigieren@
.quelle
Rubin, 78
Mehr Regelmissbrauch, ich glaube nicht genau, was der Patch sein würde. Nimmt eine lange Zeichenfolge und prüft die Summe der Ergebnisse, sodass das Programm beim Löschen oder Ändern fehlschlägt. Könnte wahrscheinlich ein wenig optimiert werden, um die Duplizierung einiger Buchstaben zu entfernen und Whitespace zu erzeugen.
quelle
if
kann entfernt werden.if
eigentlich funktioniert und das Zeug danach noch den Regeln gehorcht.puts('Hello, world!')
Würde einfach funktionieren. Ich denke, die Regeln müssen geklärt werden, ob dies legitim ist.PHP, 2257
Lücke: Der Backslash wurde in den Spezifikationen und im Punkterechner weggelassen!
Dieser Code zählt die Häufigkeit von Backslashes in jeder Zeichenfolge und gibt ein ASCII-Äquivalent aus. Das Ersetzen eines Backslashs durch ein anderes Zeichen oder das Löschen eines Backslashs führt entweder zu einem Analysefehler oder ändert das Ergebnis.
Ein nettes Feature über Backslashes und
PHP
ist, dass sie maskiert werden müssen, damit die Punktzahl automatisch verdoppelt wird! Sie können die Punktzahl verdoppeln, verdreifachen usw., indem Sie die Anzahl der Backslashes multiplizieren, wollten aber nicht gierig sein, und ich denke, dass dies die Grenzen dessen überschreitet, was Sie eingeben können.quelle
Befunge - 87
Die erste Zeile ist aufgrund der Wiederholung vier Punkte wert, die zweite Zeile enthält jedoch keine doppelten Zeichen. Das einzige Zeichenfolgenliteral in diesem Code ist
dlrow ,olleH
, das umgekehrt und als Ausgabe ausgegeben wird. Wenn Sie ein Zeichen entfernen, wird die Verbindung zwischenv
dem Ende der ersten und@
dem Ende der zweiten Zeile unterbrochen, sodass das Programm niemals beendet wird. Wenn dasv
selbst entfernt wird, wird der Code in eine Endlosschleife eingegeben, die die richtige Ausgabe druckt.quelle
Aceto , 3
Endlich geschafft, eine positive Note zu bekommen!
Probieren Sie es online!
quelle
∑
wird nicht gedruckt ASCIIAcc !!, -138 (und ja das ist negativ 138)
Obwohl dies nicht unbedingt die beste Punktzahl ist, die ich jemals in PPCG erzielt habe, bezweifle ich, dass sie in Acc !! höher sein kann.
Probieren Sie es online!
quelle