Diese Idee ist nicht meine, obwohl ich nicht weiß, woher sie stammt. Ich habe es vor langer Zeit einmal in einem Programmierwettbewerb getroffen (1998, wenn ich mich richtig erinnere). Die Aufgabe besteht darin, ein Programm in Ihrer Lieblingssprache zu schreiben, das 2012
nur ausgibt und2012
. Der Haken ist, dass das Programm immer noch ausgegeben werden muss, 2012
nachdem eines seiner Zeichen geändert wurde. Die Änderung kann entweder Einfügen, Löschen oder Ersetzen sein. Natürlich wird die Modifikation so sein, dass das Programm noch syntaktisch gültig ist.
Da ich nicht alle Programmiersprachen beherrsche, muss ich das Publikum bitten, mir zu helfen und die eingereichten Antworten zu testen.
Hinzugefügt: Viele haben kommentiert, dass meine Definition akzeptabler Modifikationen zu vage ist. Hier ist mein zweiter Versuch: Durch die zulässigen Änderungen bleibt Ihr Programm syntaktisch gültig und stürzt nicht ab. Dort denke ich, dass alle Kompilierungs-, Link-Zeit- und Laufzeitfehler abgedeckt sein sollten. Obwohl ich mir sicher bin, dass es in manchen Sprachen auch einen Sonderfall geben wird, schauen wir uns das dann einzeln an.
Antworten:
C, 53 Zeichen
Ein bisschen länger als die Skriptsprache antwortet und folgt dem gleichen Grundprinzip. Beruht auf der Tatsache, dass aufgrund der Einschränkungen der C-Syntax die einzigen Buchstaben, die geändert werden könnten, ohne das Programm ungültig zu machen, in den Zeichenfolgen enthalten sind!
Bearbeiten: Abgeschnitten von 4 Zeichen.
Reedit: Die Robustheit wurde erhöht, ein Charakter wurde abgeschabt.
Erneutes Wiederherstellen: Länger, aber robuster. Probieren Sie es
&
jetzt aus! (Richtig dieses Mal).Update: etwas verkürzt; besiegt die meisten Ansätze bisher gesehen.
Update: Geändert von int zu void; sollte den letztmöglichen Ansatz besiegen, um ihn zu brechen, den ich mir vorstellen kann.Update: Ich habe mir einen anderen Ansatz ausgedacht; Ersetzen des Letztena
(möge es verrotten) durch0
; Die Verwendung von Namen mit zwei Buchstaben sollte dieses Problem lösen.Update: Letztes Update widerrufen; Angenommen, Änderungen, die Laufzeitfehler verursachen, sind nicht zulässig.
a
wird gut funktionieren.Update: Backtracking etwas mehr; Der Versuch der Dereferenzierung
*a
führt ebenfalls zu einem Fehler. so mitvoid
einem Compiler - Fehlern herauszukitzeln es sollte nicht notwendig sein.Update: Und eine letzte Verkürzung; Dies
"2012"
hängt davon ab, dass die Zeichenfolge nur an einer Adresse platziert wird (was üblich ist). und dass wörtliche Zeichenfolgen schreibgeschützt sind (auch häufig).Update: Es hat mich zwei Charaktere gekostet, aber ich habe dein kleines Semikolon besiegt!
quelle
register void
; Dasregister
gibt es zu verhindern&
; dasvoid
gibt es zu verhindern*
.;
zwischenputs
und ein(
.2012
! (Ich habe nur druckbare ASCII-Zeichen für die Einfüge- und Substitutionstests verwendet, aber ich bezweifle, dass eine Erweiterung des Repertoires helfen würde.)==
für!=
im ternären, die Sie nirgendwo bekommt; anstatt auszugebena
, wird jetzt ausgegeben"2012"
.Haskell, 19
oder, als volles Programm,
29
Für ein bisschen mehr Spaß:
Um eine zu erhalten, die nicht so modifiziert werden kann, dass nur ein Laufzeitfehler auftritt, können wir die Informationen in die Längen von Listen kodieren, die nicht mit nur einer Zeichenänderung modifiziert werden können, d. H
Um die Änderung (sicherer) zu machen, können wir auch die Zahl selbst als Listenelement verwenden - Sie müssen sie nur als Zeichenfolge definieren, um den Austausch von Kommas gegen Pluszeichen zu verhindern. ':
Da diese Zeichenfolge nur das Ergebnis des Ausdrucks ist, können wir sie auch wieder damit ersetzen - dank Haskells Faulheit kein Problem
6472Das
init
wirkt hier als "minus eins, aber nicht negativ".Wir können das Typensystem auch in das Redundanzschema aufnehmen und die Zahl dann so schreiben, dass sie durch Änderungen mit einem Zeichen geändert werden kann ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Sie können jetzt einen beliebigen Wert
u
in denp
umgekehrten Wert ändern , dies würde jedoch immer die Tiefe der Listenstapel im zweiten Tupelelement durcheinander bringen und dadurch einen Fehler bei der Kompilierung auslösen.Diese Idee könnte weiter ausgebaut werden, sodass ganze Texte kompakt codiert, leicht lesbar und bearbeitbar sind und trotzdem keine einzelnen Zeichen verändert werden können.
Und noch eine ...
quelle
a=map(head.show.length)[[a,a],[],[a],[a,a]]
Lösunga
zwischen[]
. Ich mag diesen Beitrag wirklich! Sehr clevere Lösungen.[a]
->[]
in der 64-Zeichen-LösungJavaScript
Ich bin der Meinung, dass dies zur Laufzeit fehlersicher ist. Jede einzelne Änderung sollte entweder zu einem Kompilierungsfehler oder zu einem einzelnen Alert führen, der 2012 anzeigt.
Bearbeiten: Code würde einen Laufzeitfehler auf etwas machen
if("alert(2012 "==r)
, ich habe den Try-Bereich verschoben, um damit umzugehen.Edit: Nice one Vilx-, aber fixable :-) Jetzt gibt es eine Klammerung für das Einfügen dieses Semikolons.
Bearbeiten: Aber dann könnte ein Komma das Gleiche tun wie das Semikolon, das ist eine Vielzahl von Optionen, ich glaube, ich habe es behoben, aber es gibt jetzt eine Menge Code.
Edit: Ein bisschen vereinfacht.
Bearbeiten: Eine weitere in einer unendlichen Reihe von Bugfixes.
Edit: Die irgendwie fühlt sich eher lang und kompliziert als kugelsicher, aber es sollte zumindest kümmern
~eval
und!eval
.quelle
q-")"
zurückNaN
, in die eval konvertiert wird,"NaN"
bevor es ausgewertet wird, und die es einfach wieder zurückgibtNaN
. Seltsame Sache zu tun, aber technisch legitim, so dass der Haken nicht aufruft.;
zwischeneval
und ein(
.~
vor daseval
Symbol setze, wird es2012
zweimal statt einmal wiedergegeben. Ich bin mir nicht sicher, ob das gegen die Regeln verstößt oder nicht: P!
Aftereval(
bricht es ab.Perl, 49 Zeichen
Basierend auf der Antwort von JB , aber diese erfüllt tatsächlich die Spezifikation . Eine ausführliche Prüfung zeigt an, dass bei jedem Löschen, Einfügen oder Ersetzen von einem Zeichen die Ausgabe unverändert bleibt oder das Programm abstürzt, wenn es ausgeführt wird (dies wird durch einen Rückgabewert ungleich Null angezeigt und an stderr ausgegeben), mindestens so lange wie Einfügungen und Ersetzungen sind auf druckbare ASCII-Zeichen beschränkt.
(Ohne die Einschränkung ist die Aufgabe in Perl nicht möglich: Eine wenig bekannte Funktion des Perl-Parsers besteht darin, dass er stoppt, wenn er auf ein Strg-D- oder ein Strg-Z-Zeichen stößt und somit eines der Zeichen vor einer beliebigen Dateirunde einfügt es in ein gültiges Perl-Programm, das nichts tut.)
Edit: abrasiert ein weiteres Zeichen durch den Ersatz
1==print
mit0-print
.quelle
print
die Rückkehr beginnt'true'
print
in einer beliebigen Version von Perl 5 zu ändern , auch wenn dies nicht ausdrücklich dokumentiert ist .)Brainfuck
Ich versuche mich davon zu überzeugen, dass dies möglich ist, und ich bin mir ziemlich sicher, dass ich es ein bisschen zu weit gedehnt habe. Ich habe einige Annahmen über meine Umgebung gemacht:
Leider fürchte ich, dass dies unmöglich sein wird, wenn Sie strenger werden. Hier ist meine Lösung:
Grundsätzlich können Sie den Ausgabecode oder den Bestätigungscode ändern, jedoch nicht beide. Einer von ihnen funktioniert garantiert. Wenn einer von ihnen es nicht tut, wird es "abstürzen".
quelle
Python2
Ich musste Rays Testskript ein wenig ändern , um dies zu testen, da die stdout-Umleitung dies verhinderte. Durch die Übergabe leerer Befehle an exec wird vermieden, dass der Namespace verschmutzt wird
quelle
Brain-Flak , 44 + 3 = 47 Bytes [Nicht konkurrierend]
Dies verwendet das Brain-Flak-
-A
Flag und gibt die Zeichen2012
an STDOUT ausProbieren Sie es online!
Alternative, 50 Bytes
Probieren Sie es online!
Erläuterung
Jede einzelne Zeichenänderung an einem der obigen Codes führt zu einem Fehler des Programms.
quelle
Sisi , nicht konkurrierend
Endlich denke ich, dass ich eine meiner Sprachen gefunden habe, die funktioniert. Es ist entsetzlich lang und die Sprache ist neuer als die Frage, aber es fühlt sich immer noch wie eine Errungenschaft an.
Über Sisi
Sisi ist eine von Assembly und QBasic inspirierte Spielzeugsprache. Es ist gut für diese Herausforderung, weil seine Syntax extrem begrenzt ist.
set
,print
,jump
, undjumpif
.set
Anweisungen zulässig . Sie können (höchstens) eine Operation enthalten, die binär sein muss. Insbesondere: Das Ändern vonprint xx
zuprint -xx
ist ein Syntaxfehler.Das Programm
Der Kern des Programms ist dieser Teil:
Wir speichern
2012
inxx
, testen dann, ob dies erfolgreich war und speichern das Testergebnis iny
. Wenn dies dery
Fall ist, springen Sie zu Zeile 55. (Springt zu nicht vorhandenen Zeilennummern und spult einfach zur nächsten Zeile vor.)Strahlungshärten
y
ist sie falsch, der Sprung findet nicht statt und Zeile 4 wirdxx
auf 2012 gesetzt.xx
Wird auf 2012 gesetzt, ob wir den Sprung machen oder nicht.print
früher oder später in Zeile 955 angezeigt. Mit einer Änderung ist es nicht möglich, rückwärts (Erstellen einer Schleife) oder nach dem Ende des Programms zu springen.0
werden. Eine Änderung wieprint ax
ist also kein Fehler. Die hässliche aber effektive Lösung sind die Zeilen 828-954, die jeder möglichen Variablen mit einem Editierabstand von 1 ab 2012 zuordnenxx
. Auf diese Weise wird sichergestellt, dass Änderungen am Finaleprint xx
weiterhin für 2012 gedruckt werden.xx
erneut zuzuweisen .quelle
Python
Ein wenig ausführlich (jetzt mit einer Korrektur für das lästige Semikolon zwischen
print
und(
!):quelle
pop()
Das leere Set ist an sich kein Fehler, aber es löst einen 'Fehler' aus.pop
Ausgaben<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
quelle
Ich habe ein Python-Skript erstellt, um alle Python-Lösungen zu beurteilen. Das Skript unterbricht die erste und dritte Python-Lösung mit vielen verschiedenen Methoden.
Und die zweite Lösung, mit Lambda sich zu schützen, ist unzerbrechlich.Die zweite Python-Lösung ist in Python 3. Ich habe es in das Python 2-Format geändert und dann beurteilt, dass das Programm es kaputt gemacht hat.Hier ist das Richterskript.
quelle
p2
Wirft immer eine Ausnahme für Python2. Die Ausgabe ist nie 2012. Ihr Richterprogramm wird nicht unter Python3 ausgeführt, da es print-Anweisungen verwendet.p2
ist in Python 3.Mathematica, 23 Zeichen
Hinweis: "/." bedeutet "ersetzen"
quelle
/.
zu//
(Postfix-Form).Javascript -
68, 77, 84, 80 ZeichenHier ist eine Lösung, die dieses Jahr funktionieren sollte :)
Hier ist die Testgeige .
Update 1: Problem behoben, bei dem eval (+ a) es kaputt machte (dank eBusiness).
Update 2: Behoben für das '|' Fall (nochmals vielen Dank eBusiness).
Update 3: Behoben für den '>' Fall (nochmals vielen Dank eBusiness). Und für den '1'-Fall pleite :(
quelle
eval(+a)
und viele andere Modifikationen laufen einwandfrei, machen aber nicht viel.eval(+a)
Fall, der jetzt behoben werden sollte. Außerdem konnte ich keinen der Änderungsfälle finden, in denen es gut läuft, aber 2012 nicht ausgegeben wird. Geben Sie mir daher bitte ein Beispiel.eval(0)
undeval(-a)
tut zum Beispiel das Gleiche.||
mit|
.alert
in ändernaler=
.Ruby 1,9 - 43 Zeichen
Nicht getestet, also abbrechen.
quelle
Excel, 14 Zeichen (leicht betrogen):
Jede gültige Änderung des Arrays wirkt sich auf den Inhalt beider Zellen aus, und der Versuch, nur eine Zelle zu ändern, löst eine Fehlermeldung aus.
Dies bricht natürlich zusammen, wenn Sie der Ansicht sind, dass es sich tatsächlich nur um eine Formel handelt, im Gegensatz zu zwei Formeln, deren Identität eingeschränkt ist.
quelle
Java 7
Erläuterung:
a
der Wert von zurückgegeben2012
).a
in irgendeiner Weise geändert wird, wird der folgende Pfad verwendet: 1 → 3 → 5 (und es wirdb
der unveränderte Wert von zurückgegeben2012
).b
auf irgendeine Weise geändert wird, wird der folgende Pfad verwendet: 1 → 3 → 4 (und es wird zurückgegebena
der unveränderte Wert von zurückgegeben2012
).a.equals(b)
on @ 1 in, geänderta.equals(a)
wirdb.equals(b)
, oder!a.equals(b)
es wird weiterhin derselbe Pfad verwendet: 1 → 2 (und es wirda
der unveränderte Wert von zurückgegeben2012
).a
on @ 2 in geändertb
wird, wird der folgende Pfad beibehalten: 1 → 2 (und derb
unveränderte Wert von wird zurückgegeben2012
).a
oderb
in den Zeilen 3, 4 oder 5 auf das Gegenteil geändert wird, wird der folgende Pfad beibehalten: 1 → 2 (und dera
unveränderte Wert von wird zurückgegeben2012
)a
den unveränderten Wert von zurück.2012
)M
inclass M
odera
inmain(String[]a)
einem anderen gültigen Zeichen können ohne Änderung der Funktionalität des Codes vorgenommen werden.Probieren Sie alle diese Änderungen hier aus, um zu überprüfen, ob sie alle noch 2012 drucken.
Wenn Sie einen Weg finden, dies gemäß den Regeln von OP zu brechen, würde ich gerne wissen, also kann ich mir etwas überlegen, um das Problem zu beheben.
Anders als bei den meisten ähnlichen Fragen, bei denen ein einzelnes Zeichen geändert wird, kann bei dieser Frage die Grundstruktur der fraglichen Programmiersprache intakt bleiben, sodass Java endlich
mit einerEingabekonkurrierenkann (seien wir ehrlich, Java wird so gut wie nie etwas gewinnen) diese SE xD).quelle
a
? Wird das Programm weiterhin 2012 ausgeben oder wird es -2012 ausgeben?-
vor dema
oder einfügenb
. Hier ist ein Screenshot des Kompilierungsfehlers.Ruby 1.9
Ich erstelle dieses kurze, aber einfache Programm, zu dessen Beendigung Sie nach den oben genannten Regeln aufgefordert werden. Ich konnte nicht einmal eine Position finden, an der die Ausgabe geändert wurde (ohne den Code zu
#
unterbrechen ), wenn a eingefügt wurde, um den Rest der Zeile auszukommentieren.quelle
irb
Hinzufügen eines Minus vor demrx
Ergebnis ein gültiges Programm, das Folgendes ausgibt-2012
:puts
aufputc
ändern, wird?
in Ruby 1.9 ein ausgegeben .Scala, 95
(oder 54, wenn nicht relevante Teile übersprungen werden)
quelle
(...),("2012")
schien es aber zu brechen.C #
Sicher ist es nicht so einfach, oder? ...
Ok was ich vermisse
quelle
if (result += "2012")
damit sie ausgegeben wird20122012
?if
Anweisung, keine Zeichenfolge.;
Afterelse
hinzufügen, wird es zweimal ausgegeben.PHP, 30
quelle
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Setzen Sie den gesamten Code in einen Kommentar. Lösung dagegen: Fügen Sie eine neue Zeile nach ein$i=2012
.Taxi , 396 Bytes
Für Menschen formatiert, das ist:
Nach dem Lesen anderer Antworten scheint die Lösung darin zu bestehen, eine fragile Sprache auszuwählen, den Wert festzulegen, den Wert zu überprüfen und den Wert auszudrucken.
quelle
SmileBASIC
Erstens aktivieren wir den strikten Modus. Dies zwingt Sie, alle Variablen zu deklarieren, bevor Sie sie verwenden, und verhindert, dass Dinge wie? A $ zu? B $ geändert werden.
Als Nächstes wird eine Zeichenfolgenvariable mit dem Namen "A $" erstellt und der Wert auf "@ 2012" festgelegt. Um sicherzustellen, dass der Wert von A $ nicht verfälscht wurde, versucht das Programm, zu einem Label zu springen, und das einzige Label im Programm ist @ 2012.
Jetzt ist A $ definitiv "@ 2012", aber vor dem Drucken muss das @ entfernt werden. SHIFT () entfernt das erste Element in einem String oder Array (genau wie pop (), jedoch vom anderen Ende). Um den von SHIFT zurückgegebenen Wert zu verwerfen, wird er an einen IF / THEN-Block übergeben, der nichts tut. Nur für den Fall, dass jemand versucht, diese Zeile zu kommentieren, deklarieren wir eine Variable "B", die später verwendet wird. Wenn die VAR auskommentiert ist, wird in der letzten Zeile ein undefinierter Variablenfehler ausgegeben.
Jetzt wird A $ gedruckt und es gibt eine weitere VAR, um Kommentare zu verhindern. Die letzte Zeile stellt nur sicher, dass die Variablen B und C deklariert wurden.
quelle
?-A$VAR C
- Könnte diese Ausgabe-2012
??B$VAR C
? :)Haskell, 65
Perl, 84
Fehlgeschlagener Ansatz:
quelle
$&
wie mit etwas$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
könnte für die Haskell-Lösung sicher sein.use English
in Perl vergessen , das wird es beheben. Ich denke, dass einige Korrekturen für Haskell funktionieren, einschließlich des Wechsels zu Strings.print
mit*rint
,prin:
,p:int
oder#rint
Voranstellen=
auf der ersten Zeile oder sogar ersetzts/.*/
mits/./
odery/.*/
(was durch die Initialisierung festgelegt werden würde ,$ARG
um2012
zu beginnen). Auch Ihr$SUBSEP
Trick schützt noch nicht vor dem Einfügen eines*
vor dem letzten Semikolon, aber eine viel einfachere Lösung besteht darin, nur das unnötige Semikolon zu entfernen.PHP,
4348quelle
-
zwischen?
und$a
bewirkt,-2012
dass gedruckt wird.date()
, aber das Programm muss auch über 2012 hinaus funktionieren. ;)-
zwischen die einfügen ? und die abs. ;-)Rubin (
5736)EDIT Und noch eine in 36 Zeichen.
Ich denke, die Verwendung von Strings ist ziemlich ausfallsicher, weil das Minus-Ding nicht mehr funktioniert.
EDIT nächster Versuch (36 Zeichen) [geschweige denn, das Hinzufügen eines
-
nachp
Ergebnissen in-2012
]p [2012, 2012] .find (2012) .first || 2012Dieser wird nur in diesem Jahr funktionieren, aber auch für ähnliche Wettbewerbe in der Zukunft :) (15.chars)
Beachten Sie, dass diese Ersetzung auch funktioniert:
57 Zeichen. Wenn Sie die Zeilenumbrüche mitzählen, sind es allerdings auch 76 Zeichen.
quelle
#
am Anfang der Zeile ein hinzu. Letzte Lösung - geben Sie vorher eine neue Zeile einp
. (Hinweis - Ich kenne Ruby selbst nicht, also irre ich mich vielleicht).$><<
oderputs
stattdessen verwenden. Was auch immer, ich werde es nicht mehr versuchen, ich habe aufgegeben :)Q, 23
.
usw
quelle
-
) hinzufügen ? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
für so etwas wie;1;
oder ausschaltet;x;
.Hmm .. lass es mich versuchen:
128 Zeichen ohne Leerzeichen.
quelle
System.out.println(-i)
(für den ersten Druck). Auch defekt durch zB Ersetzen der erstenprintln(i)
durch zBprintln(1)
. Kann auch durch Änderni == j
voni += j
(oder - = usw.) beschädigt werden.PHP
Ich hoffe es ist unzerbrechlich :)
quelle
echo(printf("%s",$a)==4)?die(3
und ich bekomme20123
.."2012"
zu."FAIL"
. :)Groovy: 26
quelle
x=2012;print x^2012?2012:-x
-
?-
Versuchen Sie, Ihren Code mit einem Zeichen so zu ändern, dass er nicht mehr funktioniert.x=2012;print x^=2012?2012:x
(Ändern^
auf^=
) ändert die Ausgabe auf 0.Lua
quelle
-
Zeichen löschen ?2012
in etwas anderes ändern , wird die Behauptung einen Fehler auslösen. Hmm ... naja, ich denke du verdienst kreative Punkte, wenn du die Regeln missbrauchst. Aber im Ernst, so war es nicht gemeint.