Schreiben Sie ein Programm, das immer „2012“ ausgibt - auch wenn es geändert wurde!


116

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, 2012nachdem 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.


Wie wäre es mit Laufzeitfehlern wie dem Lesen einer höchstwahrscheinlich ungültigen Adresse?
aaaaaaaaaaa

@PeterTaylor - Es gibt bereits 3 Antworten, die C eine mit starken Überarbeitungen. Sie können dort nach Inspiration suchen.
Vilx

2
Hat jemand herausgefunden, ob dies in APL oder GolfScript oder ähnlich knapp ist?
Jeff Burdges

14
Dies hat mich dazu gebracht, über DNA und Redundanz nachzudenken und über das Potenzial der kosmischen Strahlung, Bits in meinen Programmen umzukehren. Interessantes Zeug.
Jon Purdy

11
... Du brauchst etwas Schlaf.
Vilx

Antworten:


65

C, 53 Zeichen

main(){register*a="2012";(puts("2012"==a?a:"2012"));}

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 Letzten a(möge es verrotten) durch 0; 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. awird gut funktionieren.

Update: Backtracking etwas mehr; Der Versuch der Dereferenzierung *aführt ebenfalls zu einem Fehler. so mit voideinem 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!


2
@PaulR: Jetzt geändert in register void; Das registergibt es zu verhindern &; das voidgibt es zu verhindern *.
Williham Totland

6
OK ... korrigiere mich, wenn dies ungültiges C ist, aber es funktionierte nur auf meinem VS2010. Fügen Sie ein ;zwischen putsund ein (.
Vilx

39
+1, Glückwunsch, ich denke du hast es geschafft. Ich habe ein einfaches Testkit geschrieben, mit dem versucht wurde, jede mögliche Ein-Zeichen-Variante Ihres Codes zu kompilieren und auszuführen, und jede einzelne davon hat entweder nicht kompiliert, ist abgestürzt oder wurde nicht gedruckt 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.)
Ilmari Karonen

3
@IlmariKaronen: Heh, das ist viel Mühe; Danke, dass du das alles durchgemacht hast. :)
Williham Totland

1
@Titus: Wenn Sie meinen Schalen ==für !=im ternären, die Sie nirgendwo bekommt; anstatt auszugeben a, wird jetzt ausgegeben "2012".
Williham Totland

38

Haskell, 19

(\xx@2012->xx)$2012

oder, als volles Programm,

29

main=print$(\xx@2012->xx)2012


Für ein bisschen mehr Spaß:

(\l@(_:_:t:[])->t:l)['0'..'2']


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

map(head.show.length)[[(),()],[],[()],[(),()]]

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. ':

map(head.show.length)[["2012","2012"],[],["2012"],["2012","2012"]]

Da diese Zeichenfolge nur das Ergebnis des Ausdrucks ist, können wir sie auch wieder damit ersetzen - dank Haskells Faulheit kein Problem

64 72

a=map(head.show.length.init)[[a,a,a],[a],[a,a],[a,a,a]]
main=putStrLn a

Das initwirkt 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 ...

u :: Enum a => (a,[b])->(a,b)
u(a,[b]) = (succ a , b)
p :: (a,b)->(a,[b])
p(a,b) = (a,[b])

ι :: (Int,())           -- Integral type to make sure you can't make it 0/0
ι = (\n -> (n-n,()))0

twothousandandtwelve = map(head.show.fst) [ u.p.u.p$ι , ι , u.p$ι , u.p.u.p$ι ]

( GHCi> twothousandandtwelve≡> "2012")

Sie können jetzt einen beliebigen Wert uin den pumgekehrten 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 ...

main = print N2012
data Counter = Τv |Πy |Υj |Cε |Ho |Φϑ |Ωm |Sg |Πl |Pt |Yϑ |Γσ |Km |Φz |Εα |Av |Ζρ |Ηρ |Εv |Κs |Rζ |Γϑ |Οc |Dι |Rυ |Λd |Bγ |Wt |Xε |Ωη |Ιa |Hζ |Ed |Qj |Wπ |Κw |Qu |Γο |Oι |Mσ |Ωκ |Yg |Kυ |Aj |Du |Λζ |Nζ |Θτ |Pε |Yf |Βa |Τγ |Qx |Jη |Pδ |Iq |Ωn |Fv |Kl |Ψη |Δj |Θσ |Hd |Θq |Υs |Ht |Fρ |Jh |Lζ |Hμ |Υι |Ρζ |Ρv |Dυ |Wo |Iχ |Iζ |Γy |Kr |Sσ |Iμ |Μο |Xw |Εμ |Cσ |Yξ |Aq |Jf |Hσ |Oq |Hq |Nυ |Lo |Jκ |Ρz |Οk |Θi |Θα |Αη |Gh |Lξ |Jm |Ων |Zu |Μc |Qη |Κγ |Αψ |Χζ |Hρ |Γρ |Uϑ |Rj |Χγ |Rw |Mω |Πζ |Θρ |Ωd |Υh |Nt |Tη |Qψ |Θω |Εχ |Iw |Σx |Ηn |Mτ |Xt |Yx |Φε |Hh |Wη |Mf |Ψχ |Νγ |Βξ |Aϑ |Qp |Τϑ |Φm |Uy |Gy |Cd |Bχ |Λl |Οτ |Εa |Df |Li |Aι |Yi |Νκ |Vc |Γx |Φρ |Φp |Nξ |Kf |Tw |Λξ |Φn |Λa |Oψ |Υχ |Fψ |Xω |Τq |Οσ |Σj |Θψ |Το |Νr |Ιπ |Τi |Dτ |Φf |Μn |Χm |Ηε |Wa |Αχ |Uδ |Λf |Ρu |Qk |Wα |Uρ |Τζ |Lg |Qy |Τν |Jϑ |Βδ |Mε |Μι |Πβ |Bη |Eκ |Κz |Ηh |Fδ |Σp |Εγ |Qφ |Μτ |Νχ |Ψν |Pw |Χz |Εϑ |We |Nπ |Tυ |Wg |Bh |Tρ |Ζν |Λm |Ag |Dσ |Πι
                |Oη |Nν |Χl |Χp |Sξ |Πt |Οϑ |Wο |Yη |Cp |Tm |Ξs |Εβ |Ιb |Ρρ |Fs |Um |Ep |Jλ |Rρ |Ρξ |Ua |Οq |Γξ |Zη |Nη |Qτ |Nc |Ez |Xσ |Yφ |Ρy |Yε |Ετ |Φκ |Λω |Ωα |Μκ |Φw |Mt |Tk |Sf |Ηξ |Οb |Νπ |Κε |Mι |Kz |Vi |Ξx |Ψs |Αο |Qδ |Kt |Aσ |Οm |Ψδ |Λγ |Ακ |Hα |Wϑ |Τμ |Γγ |Jδ |Ικ |Ηϑ |Μp |Zo |Κn |Qz |Δe |Pe |Jο |Qι |Tu |Jν |Ξμ |Πω |Αm |Θw |Nε |Dy |Zξ |Υα |Dβ |Hο |Χv |Gr |Ωl |Jb |Σl |Vζ |Ξ  |Nx |Qs |Βh |Qg |Νx |Co |Rσ |Νυ |Χg |Ρt |Wy |Ηκ |Οa |Yμ |Uj |Uξ |Op |Μr |Ζα |Ξw |Mυ |Ar |Ργ |Zζ |Sv |Vy |Βo |Κι |Vϑ |Ξι |Uζ |Fμ |Su |Ιξ |Fϑ |Hi |Hw |Mv |Χχ |Θg |Sν |Pp |Mπ |Pk |Bκ |Lυ |Ρλ |Ιr |Uλ |Νo |Κο |Nh |Lε |Sw |Ξλ |Zυ |Mr |Bv |Κπ |Aγ |Dv |Pd |Ξσ |Μg |Oπ |Χξ |Nj |Kψ |Ξπ |Mκ |Gn |Ωe |Gγ |Pν |Yz |Nl |Οο |Ic |Pz |Ξf |Νω |Υμ |Ηq |Nw |Θm |Μx |Jε |Φy |Οz |Ξz |Ti |Οψ |Φγ |Tψ |Oγ |Zϑ |Ιk |Σw |Rf |Υi |Ωp |Vr |Υτ |Xl |Οβ |Πb |Δν |Οu |Jα |Ττ |Κl |Pf |Iκ |Gk |Πe |Σu |Δβ |Ωh |Nλ |Ξt |My |Πs |Βr |Mγ |Δω |Le |Zρ |Θv |Σs |Ηd |
               Bn |Κu |Δξ |Pτ |Ηα |Δu |Πμ |Ρh |Bω |Τλ |Gt |Αρ |Sh |Aο |Θδ |Δπ |Wq |Tφ |Γo |Γf |Λβ |Xυ |Mη |Δw |Qυ |Vν |Βτ |Γα |Μm |Μπ |Κζ |Θd |Fε |Ρτ |Οn |Αs |Wu |Ξh |Μz |Αν |Aε |Yq |Τε |Cz |Ωu |Ec |Ds |Wρ |Θϑ |Κp |Τδ |Mδ |Ηy |Go |Sb |Rξ |Σϑ |Yο |Jg |Vh |Kσ |Nδ |Ηψ |Γh |Rk |Eο |Μk |Ζk |Ψο |Ψμ |Zσ |Pβ |Ρd |Us |Hυ |Βi |Mχ |Σr |Βι |Sχ |Zγ |Δα |Sτ |Γp |Ns |Sn |Νn |Pξ |Νa |Sω |Σi |Τφ |Xο |Eδ |Ba |To |Vj |Sl |Κκ |Δh |Τχ |Gυ |Ρϑ |Bs |Dh |Μσ |Vd |Iϑ |Kg |Νμ |Dμ |Σγ |Πg |Γg |Εt |Fa |Ψn |Ρx |Αj |Mβ |Kλ |Ξψ |Fω |Qζ |Θj |Kπ |Gf |Oe |Yυ |Κk |Wω |Bδ |Lο |Cβ |Nf |Ol |Σo |Fn |Τβ |Βω |Dn |Ha |Πλ |Ss |Σy |Kϑ |Lp |Dδ |Dψ |Ωo |Xγ |Χk |Ωσ |Δa |Sκ |Jμ |Κt |Rc |Ηc |Lχ |Oε |Μλ |Cs |Il |Tι |Ra |Zα |Ωr |Ob |Wβ |Ον |Γν |St |Xλ |Kv |No |Rε |Kd |Mν |Np |Ωc |Δζ |Nβ |Zπ |Ok |Vι |Tδ |Vδ |Γz |Χα |Μs |Βυ |Xc |Xo |Vp |Γχ |Υf |Θπ |Πj |Pi |Γj |By |Φk |Υq |Ny |Rο |Γd |Ωj |Αy |Εo |Κy |Uc |Rm |Ph |Αδ |Ιl |Ιx |Δτ |Zt |Nq |Ct |Φi |Uv |Eπ
                |Κm |Rλ |Vu |Χσ |Τn |Μe |Φη |Ξβ |Εz |Σω |Bb |Ψε |Sε |Ρm |Δο |Vξ |Φo |Ωε |Zb |Σc |Dζ |Ξp |Rη |Ιψ |Δσ |Χη |Kj |Eμ |Qν |Ri |Ip |La |Νξ |Αγ |As |Nr |Δi |Oν |Ζx |Xκ |Pr |Ελ |Λb |Ψk |Ωβ |Pl |Ιy |Cμ |Ζc |Αg |Σρ |Dw |Ρq |Ιη |Pζ |Σa |Uq |Ρμ |Lω |Fh |Ζδ |Αd |Cψ |Κσ |It |Qκ |Fν |Αb |Ηg |Ιν |Ls |Jr |Ow |Je |Zx |Ld |Jl |Ζd |Μo |Χτ |Kα |Μβ |Mo |Σλ |Xρ |Μq |Ψb |Νd |Ρβ |Wδ |Μf |Κρ |Ηb |Ξτ |Qα |Λv |Zψ |Φt |Sδ |Εh |Rκ |Rμ |Χι |Κυ |Ηj |Pχ |Pη |Jσ |Ρσ |Ιχ |Kζ |Εδ |Nω |Iψ |Γμ |Vσ |Ψρ |Χυ |Αw |Kn |Al |Gj |Zj |Αc |Aζ |Ζi |Bz |Vπ |Πw |Αu |Qf |Bf |Ξo |Ρε |Λy |En |Ey |Wi |Σχ |Τc |Dχ |Fg |Ρo |Zm |Ψω |Fq |Μa |Ηt |Wc |Kε |Κτ |Χψ |Κβ |Λφ |Κq |Υm |Πx |Pj |Mi |Δy |Κχ |Lϑ |Wτ |Lη |Nd |Ωk |Iπ |Tα |Bο |Uε |Lc |Rp |Θx |Ρη |Lu |Μζ |Εd |Gρ |Χμ |Vγ |Ιζ |Πυ |El |Uk |Hc |Ξξ |Λx |Ιο |Μy |Ζm |Jw |Iε |Σφ |Αk |Σf |Ac |Ab |Αq |Δf |Θκ |Υa |Ζτ |Jc |Xμ |Sι |Κv |Ζj |Ει |Oω |Ηδ |Φv |Dα |Fτ |Ko |Et |Ψζ |Jx |Mk |Th |Βλ |Λχ |Οo |Υπ |
               Cζ |Θy |Λk |Γδ |Iυ |Σξ |Υϑ |Cι |Cχ |Εσ |Βψ |Iα |Τη |Eυ |Lφ |Lδ |Υw |Ξο |Uσ |Δb |Nϑ |Ζγ |Δz |Cο |Mb |Ξy |Γυ |Εk |Αζ |Vα |Τυ |Ιω |Wυ |Cτ |Ιγ |Yω |Ωy |Ηp |Ψψ |Ah |Dq |Βv |Ιw |Ox |Ξv |Οζ |Tχ |Πψ |Qb |Rδ |Aψ |Zμ |Ζg |Ψφ |Nφ |Δρ |Χe |Vχ |Ηυ |Ml |Σσ |Ζμ |Sz |Πκ |Sγ |Kq |Dη |Υk |Dt |Ξe |Sc |Νs |Μv |Ev |Ji |Rχ |Xπ |Αo |Lμ |Gδ |Fσ |Λϑ |Λe |Σb |Id |Hb |Γι |Βz |Sβ |Tg |Ζο |Δk |Dl |Λσ |Κϑ |Aw |Uγ |Lx |Uψ |Hs |Ωχ |Δφ |Wσ |Π  |Εe |Ro |Λο |Ud |Fχ |Δψ |Νh |Θμ |Zd |Kb |Οδ |Ex |Να |Φσ |Φω |Pm |Λυ |Xq |Si |Σδ |Gα |Bu |Βw |Eχ |Ρι |Gβ |Vο |Yh |Σε |Χq |Hι |Re |Zχ |Ζp |Eρ |Ωγ |Bξ |Hδ |Oξ |Γc |Μγ |Wφ |Πη |Wj |Ιq |Γs |Πο |Κj |Un |Rι |Dφ |Τl |Ωz |Pμ |Wr |Gω |Gi |Εu |Σq |Ρl |Iν |Zy |Rb |Νk |Ky |Uκ |Ησ |Hy |Ir |Tp |Εc |Bw |Εο |Cm |Εw |Ψf |Yχ |Ιρ |Hβ |Ιz |Vλ |Εj |Oδ |Qρ |Θν |Aρ |Ov |Zω |Gψ |Ij |Ξη |Ps |Φh |Οg |Dp |Ta |Ty |Οe |Uο |Rγ |Οr |Θp |Hλ |Νι |Vk |Νz |Tl |Ψi |Λs |Hη |Ζκ |Rz |Hx |Fξ |Ξn |Φe |Sπ |Ηw |Dκ |Ζω
                |Sr |Vψ |Ντ |Vω |Lv |Νg |Fκ |Jψ |Ζs |Oβ |Υζ |Δg |Fυ |Yκ |Χd |Zf |Φμ |Lt |Ξd |Oφ |Τp |Κh |Ψx |Vυ |Qπ |Θφ |Nψ |Ρχ |Rx |Υz |Ξκ |Ξχ |Qn |Pu |Υψ |Az |Xj |Σd |Φξ |Ws |Xα |Βm |Βf |Lh |Hv |Aω |Hν |Kχ |Ρψ |Aδ |Χx |Sη |Φx |Cκ |Jz |Dr |Xu |Ηζ |Ξζ |Gτ |Ca |Af |Aν |Bι |Mc |Ψg |Ωv |Ωs |Qω |Mψ |Lλ |Μα |Kμ |Vl |Yσ |Οι |Ve |Dν |Eg |Ιυ |Xι |Zν |Xϑ |Νζ |Ni |Sφ |Se |Ζa |Xδ |Νv |Wι |Jv |Jt |Ιh |Υv |Cη |Τd |Ψι |Τu |Ge |Πc |Bυ |Mϑ |Χλ |Δλ |Σψ |Μϑ |Απ |Vg |Κα |Sψ |Ζz |Λδ |Aκ |Λκ |Ga |Κb |Db |Jo |Τa |Fw |Τs |Βϑ |Eτ |Wk |Ξu |Ψl |Αι |Νψ |Δι |Qμ |Υn |Bτ |Ηs |Yw |Ye |Iο |Dο |Γe |Rβ |Qv |Xs |Ηη |Yo |Χj |Dω |Οπ |Uβ |Mλ |Qh |Fο |Βd |Ζr |Οv |Zφ |Αi |Dλ |Pb |Οx |Rv |Uz |Εν |Ψτ |Na |Aη |Βu |Ιd |Ηm |Υd |Wn |Qσ |Οp |Αr |Ηλ |Σι |Br |Cu |Ωζ |Θγ |Qo |Bρ |Bψ |Zβ |Πφ |Ρκ |Qϑ |Bj |Vε |Zz |Ζϑ |Za |Θt |Τψ |Ρο |Jq |Πf |Jφ |Τα |Xχ |Χn |Vo |Αt |Bg |Gs |Bi |Rϑ |Nι |Ρa |Υr |Υν |Λo |Γφ |Δo |Yρ |Χc |Ξα |Gq |Γm |Ωμ |Ζυ |Wζ |At |Mw |
               Cf |Επ |Fo |Οh |Tσ |Ηv |Sα |Ζq |Dk |Jπ |Ιm |Mj |Oi |Ψa |Qγ |Rn |Dξ |De |Γk |Ψm |Lα |Cl |Θο |Γq |Λc |Tx |Nm |Ki |Υο |Χr |Φs |Κi |Φλ |Vq |Αω |Ch |Tμ |Xb |Ζπ |Ym |Ζn |Eω |Ξj |Υκ |Τg |Uo |Ai |Sy |Τe |Ητ |Tτ |Λg |Bp |Δq |Χo |Pπ |Dγ |Δγ |Yπ |Ys |Ωδ |Ψσ |Sζ |Πξ |Rφ |Hj |Uf |Td |Ξk |Xψ |Οj |Cx |Φπ |Gλ |Φδ |Ej |Yψ |Ae |Φφ |Jγ |Qχ |Ξγ |Δp |Σg |Is |Eσ |Λπ |Cδ |Ιe |Cυ |Oh |Hm |Tb |Qi |Οl |Bε |Eψ |Hn |Ja |Σν |Γr |Ηu |Ζξ |Ζb |Nu |Θξ |Κd |Qο |Lq |Λw |Ηf |Kξ |Ευ |Rr |Τm |Εξ |Ψp |Χh |Ξi |Fπ |Μφ |Fu |Cξ |Aα |Pγ |Sk |Cω |Ηr |Αp |Ββ |Bx |Fp |Tζ |Pω |Λp |Lm |Jp |Bl |Φc |Vf |Τz |Εy |Λμ |Rd |Νf |Πρ |Ηx |Μψ |Γη |Bα |Συ |Iσ |Γt |Κξ |Io |Ζφ |Γl |Θf |Γλ |Υγ |Ψh |Xg |Tn |Iu |Bφ |Πχ |Λq |Χπ |Bϑ |Εm |Κφ |Λt |Ιu |Ρs |Ιβ |Ωg |Yν |Lσ |Ζι |Eι |Aτ |Φa |Pα |Θz |Ψκ |Θs |Θη |Ηl |Φζ |Bt |Ρυ |On |Ξε |Tf |Gp |Mα |Μi |Kβ |Σο |Ωξ |Νl |Iz |Fk |Dj |Bπ |Nz |Xr |Mp |Χω |Sϑ |Hu |Αμ |Js |Βn |If |Τw |Ηz |Σz |Po |Yj |Ημ |Yβ |Σm |Do
                |Ηχ |Κg |Θo |Ζh |Ψj |Ψu |Ωφ |Δμ |Γa |Bν |Ιε |Oz |Νq |Υp |Qλ |Υc |Υy |Kc |Kh |Ew |Wγ |Νβ |Ωλ |Οξ |Zι |Yr |Sυ |Γπ |Bm |Μj |Pa |Os |Χδ |Κδ |Εx |Iγ |Eη |Fλ |Tγ |Yλ |Hξ |Φq |Τξ |Ql |Δn |Zn |Ot |Sa |Φψ |Nμ |Ξr |Ξc |Φj |Gl |Oλ |Rπ |Am |Mο |Gx |Fd |Cg |Χu |Lι |Wv |Ζt |Jυ |Pσ |Σκ |Wκ |Pv |Ιg |Ωι |Δx |Φl |Eb |Δυ |Cr |Nχ |Ογ |Νφ |Gu |Ασ |Λi |Rτ |Eh |Xη |Md |Wm |Tt |Πα |Υe |Βk |Ju |Dρ |Χβ |Οs |Γi |Kι |Κe |Mm |Χf |Oκ |Vb |Γβ |Οy |Vv |Νϑ |Hl |Λα |Wξ |Om |Βφ |Ρp |Φβ |Βb |Αυ |Υδ |Χφ |Pλ |Νρ |Υλ |Ul |Kγ |Qc |Νm |Πz |Hφ |Es |Ψπ |Xm |Xξ |Tν |Eλ |Ao |Ak |Ka |Ζη |Xk |Γψ |Βπ |Fβ |Βρ |Xx |Βζ |Iτ |Pϑ |Εb |Ψγ |Τk |Gm |Yn |Xν |Νu |Hϑ |Εr |Τπ |Uw |Mh |Og |Μυ |Tj |Λν |Qm |Xn |Ην |Νi |Kη |Zv |Ιι |Ση |Yk |Dx |Aχ |Ou |Fy |Cα |Θl |Γκ |Ax |Vκ |Cn |Cλ |Ξϑ |Wε |Υl |Ψt |Ωa |Θe |Ξω |Ηo |Ll |Bζ |Kw |Αβ |Δc |Oυ |Βj |Jβ |Νε |Eϑ |Ξg |Tz |Cc |Ry |Sρ |Ψz |Yα |Pq |Υg |Jn |Vμ |Σk |Ck |Ωt |Zg |Pι |Hω |Λλ |Aμ |Wλ |Ιλ |Βc |Ξa |
               Jk |Πϑ |Ιt |Εψ |Hε |Ωϑ |Εη |Ie |Κω |Yc |Iβ |Ου |Hg |Θr |Nn |Uμ |Ζv |Ζχ |Jρ |Pο |Ng |Be |Δv |Fζ |Ρe |Qe |Cq |Κf |Θλ |Tϑ |Ξq |Me |Βq |Oα |Θc |Qr |Δt |Dm |Yu |Ru |Σh |Λr |Yy |Εε |Μχ |Mφ |Δδ |Kφ |Cγ |Ζσ |Iω |Au |Wb |Κc |Πq |Ωω |Pυ |Γn |Nγ |Cv |Βχ |Φg |Gο |Ug |Kο |Βκ |Wμ |Hτ |Hχ |Ue |Οw |Sμ |Sm |Υω |Yb |Χa |Ιi |Κν |Πu |Κψ |Uτ |Lβ |Fj |Pn |Εf |Τσ |Qε |Ψo |Λρ |Oϑ |Πν |Ts |Ηο |Μρ |Ff |Ψβ |Ne |Nκ |Bλ |Bσ |Mx |Πp |Υσ |Ιn |Αz |Fz |Ηa |Uν |Mζ |Δϑ |Yι |Ζe |Ψα |Tο |Βg |Lπ |Ζf |Αλ |Em |Θh |Gπ |Γω |Kω |Tξ |Σn |So |Im |Φυ |Ξb |Ii |Λι |Xz |Kδ |Μω |Uυ |Wf |Χb |Sλ |Lγ |Οη |Ιs |Xβ |Pκ |Bc |Ιp |Od |Αn |Va |Tω |Ζw |Ιτ |Θε |Ρi |Gι |Τh |Υx |Nτ |Δη |Εφ |Kx |Xa |Gν |Ft |Yt |Qd |Gσ |Ξυ |Εs |Nσ |Νc |Λj |Υu |Ρc |Ψξ |Δm |Qβ |Μu |Υb |Nk |Ωτ |Κr |Δd |Iλ |Πa |Ωρ |Χν |Μh |Jξ |Μμ |Fc |Iφ |Zr |Ux |Φb |Πo |Gd |Eζ |Αα |Νν |Λz |Vη |Pψ |Ωf |Lρ |Cb |Ν |Α |Χ |Ω |Zτ |Τκ |Αε |Bβ |Uι |Fi |Ui |Βx |Ωq |Βp |Λh |Uu |Ωw |Xp |Ζβ |Λτ
 | N2012 deriving(Enum); instance Show Counter where show = show . fromEnum

1
Ich befürchte, dies kompiliert nur fein modifiziert, obwohl zur Laufzeit eine Ausnahme geworfen wird .
Jeff Burdges

3
@ JeffBurdges: sicher, ich nehme an, dass dies in "enthalten ist und es nicht zum Absturz bringt".
hörte am

1
Fügen Sie für die a=map(head.show.length)[[a,a],[],[a],[a,a]]Lösung azwischen []. Ich mag diesen Beitrag wirklich! Sehr clevere Lösungen.
Dillon Cower

9
Ich habe überprüft, ob alle 5825 Variationen Ihres 29-stelligen Programms (Ersetzen oder Einfügen von ASCII-Zeichen 32-126) wie erwartet funktionieren. Hier ist das Testskript, das ich verwendet habe . Es kann leicht optimiert werden, um andere Programme, einschließlich anderer Sprachen, zu testen. Achtung: Es hat fast 1 Stunde
gedauert

1
[a]-> []in der 64-Zeichen-Lösung
John Dvorak

14

JavaScript

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 ~evalund !eval.

var q="alert(2012 "
var p=1
try{
    if("alert(2012 "==q){
        if(eval(((p=5,q+")")||alert(2012)))){
            if(p!==5){
                alert(2012)
            }
        }
    }
    else{
        alert(2012)
    }
}
catch(e){
    alert(2012)
}

1
Denn zum Beispiel gibt es q-")"zurück NaN, in die eval konvertiert wird, "NaN"bevor es ausgewertet wird, und die es einfach wieder zurückgibt NaN. Seltsame Sache zu tun, aber technisch legitim, so dass der Haken nicht aufruft.
aaaaaaaaaaa

4
Das Gleiche wie bei der C-Lösung: Fügen Sie ein ;zwischen evalund ein (.
Vilx

1
Für die Kommentar-Leser ist die Semikolon-Sicherheitslücke behoben, ich glaube der Code ist jetzt sauber.
aaaaaaaaaaa

4
Ich bin mir nicht sicher, ob dies zählt oder nicht, aber wenn ich ein ~vor das evalSymbol setze, wird es 2012 zweimal statt einmal wiedergegeben. Ich bin mir nicht sicher, ob das gegen die Regeln verstößt oder nicht: P
mellamokb

2
Hinzufügen eines !After eval(bricht es ab.
Jimmy23013

13

Perl, 49 Zeichen

  do{
use strict;$_=2012;;2012==$_&&0-print||die}

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==printmit 0-print.


Bricht mit Perl 5.28, wobei anstelle von 1 :-P printdie Rückkehr beginnt'true'
JB

3
@JB: Nun, Sie können es ablehnen, wenn das passiert. :) (Für andere Leser ist dies ein Witz. Soweit ich weiß, gibt es keine Pläne, den Rückgabewert printin einer beliebigen Version von Perl 5 zu ändern , auch wenn dies nicht ausdrücklich dokumentiert ist .)
Ilmari Karonen

12

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:

  1. Eine Endlosschleife wird als "Absturz" betrachtet. Eine ähnliche Bedingung könnte möglicherweise durch Dekrementieren nach Null oder links vom Speicherplatz Null in bestimmten Interpretern erreicht werden. Viele Interpreter sind zur Laufzeit schwer zum Absturz zu bringen. Ich vermeide das Problem des Anhaltens, indem ich nur die einfachste, offensichtlichste Endlosschleife verwende.
  2. Nicht übereinstimmende eckige Klammern gelten als Kompilierungsfehler.
  3. Dies funktioniert nur in einer Umgebung, in der die Programmausgabe zurück zur eigenen Eingabe geleitet wird. Ich benutze das, um zu überprüfen, ob es tatsächlich "2012" ausgegeben hat. Nur so kann ich umgehen, indem ich eines der ausgegebenen Zeichen lösche.

Leider fürchte ich, dass dies unmöglich sein wird, wenn Sie strenger werden. Hier ist meine Lösung:

++++++++++++++++++++++++++++++++++++++++++++++++++
.--.+.+.
,--------------------------------------------------[]
,------------------------------------------------[]
,-------------------------------------------------[]
,--------------------------------------------------[]
,[]EOF = 0

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".


5
Ugh, Brainfuck! Sie mussten nur, nicht wahr? XD
Vilx

8
Hättest du es vorgezogen, stattdessen Leerzeichen zu verwenden?
NRGdallas

7

Python2

import sys;xx='2012';(
1/(sys.stdout.write(xx=='2012' and xx or 2012)==None))

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

exec(prog, {}, {})

Toll! Du machst es!
Ray

6

Brain-Flak , 44 + 3 = 47 Bytes [Nicht konkurrierend]

Dies verwendet das Brain-Flak- -AFlag und gibt die Zeichen 2012an STDOUT aus

((((((((()()()){}){}){}()){})[()])[()])()())

Probieren 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.


3
Ha! Die richtige Sprache für die Herausforderung.
DLosc

4

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.

1 set xx 2012
2 set y xx=2012
3 jumpif y 55
4 set xx 2012
828 set x xx
829 set ax xx
830 set xa xx
831 set axx xx
832 set xax xx
833 set xxa xx
834 set bx xx
835 set xb xx
836 set bxx xx
837 set xbx xx
838 set xxb xx
839 set cx xx
840 set xc xx
841 set cxx xx
842 set xcx xx
843 set xxc xx
844 set dx xx
845 set xd xx
846 set dxx xx
847 set xdx xx
848 set xxd xx
849 set ex xx
850 set xe xx
851 set exx xx
852 set xex xx
853 set xxe xx
854 set fx xx
855 set xf xx
856 set fxx xx
857 set xfx xx
858 set xxf xx
859 set gx xx
860 set xg xx
861 set gxx xx
862 set xgx xx
863 set xxg xx
864 set hx xx
865 set xh xx
866 set hxx xx
867 set xhx xx
868 set xxh xx
869 set ix xx
870 set xi xx
871 set ixx xx
872 set xix xx
873 set xxi xx
874 set jx xx
875 set xj xx
876 set jxx xx
877 set xjx xx
878 set xxj xx
879 set kx xx
880 set xk xx
881 set kxx xx
882 set xkx xx
883 set xxk xx
884 set lx xx
885 set xl xx
886 set lxx xx
887 set xlx xx
888 set xxl xx
889 set mx xx
890 set xm xx
891 set mxx xx
892 set xmx xx
893 set xxm xx
894 set nx xx
895 set xn xx
896 set nxx xx
897 set xnx xx
898 set xxn xx
899 set ox xx
900 set xo xx
901 set oxx xx
902 set xox xx
903 set xxo xx
904 set px xx
905 set xp xx
906 set pxx xx
907 set xpx xx
908 set xxp xx
909 set qx xx
910 set xq xx
911 set qxx xx
912 set xqx xx
913 set xxq xx
914 set rx xx
915 set xr xx
916 set rxx xx
917 set xrx xx
918 set xxr xx
919 set sx xx
920 set xs xx
921 set sxx xx
922 set xsx xx
923 set xxs xx
924 set tx xx
925 set xt xx
926 set txx xx
927 set xtx xx
928 set xxt xx
929 set ux xx
930 set xu xx
931 set uxx xx
932 set xux xx
933 set xxu xx
934 set vx xx
935 set xv xx
936 set vxx xx
937 set xvx xx
938 set xxv xx
939 set wx xx
940 set xw xx
941 set wxx xx
942 set xwx xx
943 set xxw xx
944 set yx xx
945 set xy xx
946 set yxx xx
947 set xyx xx
948 set xxy xx
949 set zx xx
950 set xz xx
951 set zxx xx
952 set xzx xx
953 set xxz xx
954 set xxx xx
955 print xx

Über Sisi

Sisi ist eine von Assembly und QBasic inspirierte Spielzeugsprache. Es ist gut für diese Herausforderung, weil seine Syntax extrem begrenzt ist.

  • Es hat nur vier Befehle: set, print, jump, und jumpif.
  • Alle Befehle haben eine feste Arität.
  • Alle Zeilen müssen Zeilennummern haben, die streng ansteigen.
  • Ausdrücke sind nur in setAnweisungen zulässig . Sie können (höchstens) eine Operation enthalten, die binär sein muss. Insbesondere: Das Ändern von print xxzu print -xxist ein Syntaxfehler.
  • Variablennamen müssen aus Kleinbuchstaben bestehen.
  • Am wichtigsten: Es gibt keine Kommentarsyntax !

Das Programm

Der Kern des Programms ist dieser Teil:

1 set xx 2012
2 set y xx=2012
3 jumpif y 55
4 set xx 2012
955 print xx

Wir speichern 2012in xx, testen dann, ob dies erfolgreich war und speichern das Testergebnis in y. Wenn dies der yFall ist, springen Sie zu Zeile 55. (Springt zu nicht vorhandenen Zeilennummern und spult einfach zur nächsten Zeile vor.)

Strahlungshärten

  • Wenn die Zuweisung in Zeile 1 geändert wird, dann yist sie falsch, der Sprung findet nicht statt und Zeile 4 wird xxauf 2012 gesetzt.
  • Wenn die Zuweisung in Zeile 2 oder die Sprungbedingung in Zeile 3 geändert wird, ist es uns egal: xxWird auf 2012 gesetzt, ob wir den Sprung machen oder nicht.
  • Das Sprungziel in Zeile 3 kann auf 5 oder 955 geändert werden. Bei jeder möglichen Änderung wird es printfrü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.
  • Wenn die Zuweisung in Zeile 4 geändert wird, ist es uns egal: Die Zuweisung in Zeile 1 ist korrekt und wir springen über Zeile 4 hinaus.
  • Wenn Zeile 955 geändert wird, liegt möglicherweise ein Problem vor. Das Unglückliche an Sisi ist, dass nicht initialisierte Variablen standardmäßig verwendet 0werden. Eine Änderung wie print axist 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 zuordnen xx. Auf diese Weise wird sichergestellt, dass Änderungen am Finale print xxweiterhin für 2012 gedruckt werden.
  • Wenn eine Zeilennummer geändert wird, gilt Folgendes: 1) Es ist nicht in Ordnung und es liegt ein Syntaxfehler vor, oder 2) Der Programmablauf wird nicht beeinflusst. Die Hauptänderung, über die wir uns Sorgen machen könnten - Ändern von Zeile 4 in 94 und dadurch Einfügen nach dem Sprung auf 55 - spielt keine Rolle, da alles, was es tut, darin besteht, 2012 xxerneut zuzuweisen .

Guter! Ich kann mir keine Möglichkeit vorstellen, dies zu umgehen. "A" für Mühe von mir, das ist sicher! :)
Vilx

3

Python

Ein wenig ausführlich (jetzt mit einer Korrektur für das lästige Semikolon zwischen printund (!):

a=[0]
(lambda x:print(
set(['2012']).intersection(set(["2012"])).pop()))(
*a)

@ Jeff Burdges: Ja, mit diesem hier setze ich darauf, dass Laufzeitfehler ebenfalls nicht zugelassen werden. :)
Dillon Cower

Ich fürchte, es ist immer noch syntaktisch korrekt, wenn die Schnittmenge die leere Menge ergibt und pop einen Laufzeitfehler auslöst. Fügen Sie auf beiden Seiten weitere 2012 hinzu.
Jeff Burdges

@DC: Ich würde sagen, dass eine Ausnahme nicht mit einem Laufzeitfehler identisch ist, obwohl es den Anschein hat, dass Ausnahmen in Python als Fehler bezeichnet werden. pop()Das leere Set ist an sich kein Fehler, aber es löst einen 'Fehler' aus.
Williham Totland

1
Eine Ausnahme wird zu einem Fehler, wenn sie nicht abgefangen wird.
Ilmari Karonen

1
Einfügen eines Kommas nach popAusgaben<built-in method pop of set object at 0xb6fe93ac> ()
gnibbler

3

T-SQL 2012, 55

DECLARE @n CHAR(4)='2012'PRINT IIF(@n='2012',@n,'2012')

Welcher SQL-Dialekt ist das? Sieht aus wie Transact-SQL (auch bekannt als SQL Server), hat jedoch eine ungültige Syntax dafür.
Vilx

@ Vilx-: Ich habe es in SQL Server 2008 selbst getestet, als ich versuchte, es zu brechen, und es hat einwandfrei funktioniert.
Mellamokb

@ Mellamokb - Das ist seltsam. Genau das habe ich getan und es wurde beanstandet, dass Sie der Variablen keinen Standardwert zuweisen können (Sie benötigen eine separate SET-Anweisung) und dass es keine IIF gibt (nur CASE).
Vilx

1
@ Vilx-: Ah, du hast recht. Mir ist klar, dass ich gerade auf SQL Azure getestet habe. Mit SQL Server 2008 erhalte ich dieselben Fehler wie Sie. Es scheint jedoch in SQL Server 2012 / Azure einwandfrei zu funktionieren. Hier ist eine Demo mit SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

OK, Glückwunsch, ich kann keine offensichtlichen Wege finden, dies zu brechen! :) Das heißt nicht, dass es keine gibt. ;)
Vilx

3

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.

from StringIO import StringIO
import sys

def run(prog, atexp=True):
    stdout = sys.stdout
    fakeOut = StringIO()
    try:
        sys.stdout = fakeOut
        # exec prog # running exec directly will break some solutions by mistake
        exec(prog, {}, {}) 
        return fakeOut.getvalue().rstrip() == '2012'
    except:
        return atexp
    finally:
        sys.stdout = stdout
    return True

def judge(prog):
    RED = '\x1b[31m'
    WHITE = '\x1b[37m'
    ans = True
    chars = """abcdefghijklmnopqABCDEFGHIJKLMNOP`~1234567890!@#$%^&*()_+-=[]{};:'"<>,./?"""
    # attack by replace
    if not run(prog):
        print "Are you joking...This program don't print 2012 itself."
        return False
    p = list(prog)
    for i in xrange(len(prog)):
        for c in chars:
            p[i] = c
            r = run(''.join(p))
            if not r:
                print 'Attack by replace success'
                print 'origin:\n'+prog
                print 'modified:\n'+''.join(p[:i])+RED+c+WHITE+''.join(p[i+1:])
                ans = False
        p[i] = prog[i]
    # attack by delete
    for i in xrange(len(prog)):
        p = prog[:i]+prog[i+1:]
        r = run(''.join(p))
        if not r:
            print 'Attack by delete success'
            print 'origin:\n'+prog
            print 'modified:\n'+''.join(p[:i])+RED+'{|}'+WHITE+''.join(p[i:])
            ans = False
    # attack by insert
    for i in xrange(len(prog)+1):
        p = list(prog)
        p.insert(i, ' ')
        for c in chars:
            p[i] = c
            r = run(''.join(p))
            if not r:
                print 'Attack by insert success'
                print 'origin:\n'+prog
                print 'modified:\n'+''.join(p[:i])+RED+c+WHITE+''.join(p[i+1:])
                ans = False
    if ans: 
        print 'Amazing! judgement passed'
    return ans

p1="""xx='2012'
print(xx if xx=='2012' else
'2012')
"""
p2="""import sys
a=[0]
(lambda x:sys.stdout.write(
set(['2012']).intersection(set(["2012"])).pop()))(
*a)
"""

p3="""print sorted(['2012',
'2012','2012']).__getitem__(1)
"""
p4="""print 2012
"""
judge(p3) 

cool! Meine Antwort saugt und bläst gleichzeitig
gnibbler

p2Wirft immer eine Ausnahme für Python2. Die Ausgabe ist nie 2012. Ihr Richterprogramm wird nicht unter Python3 ausgeführt, da es print-Anweisungen verwendet.
Gnibbler

@ Gnibbler Ich habe nicht bemerkt, dass p2ist in Python 3.
Ray

Ich habe eine neue Antwort für Python2 ausgearbeitet, die Ihr Skript besteht
Gnibbler

3

Mathematica, 23 Zeichen

Hinweis: "/." bedeutet "ersetzen"

2012/.Except@2012->2012

2
Dies könnte eine Art schwache Antwort / Niederlage sein, aber ändern Sie /.zu //(Postfix-Form).
Dillon Cower

@ DillonCower Guter Fang!
Dr. Belisarius

2

Javascript - 68, 77, 84 , 80 Zeichen

Hier ist eine Lösung, die dieses Jahr funktionieren sollte :)

a="eval(alert(new Date().getFullYear()))" 
a.length==37?eval(a||a||a):alert(2012)

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 :(


Du hast dein Eval nicht bewacht. eval(+a)und viele andere Modifikationen laufen einwandfrei, machen aber nicht viel.
aaaaaaaaaaa

@eBusiness: Danke für den Hinweis auf den 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.
Briguy37

eval(0)und eval(-a)tut zum Beispiel das Gleiche.
aaaaaaaaaaa

Post bearbeiten es zumindest kann durch das Ersetzen gebrochen werden ||mit |.
aaaaaaaaaaa

5
Bricht ab, wenn Sie den ersten alertin ändern aler=.
Jimmy23013

2

Ruby 1,9 - 43 Zeichen

qq=[:p,2012]
b if qq!=[:p,2012]
send(
*qq)

Nicht getestet, also abbrechen.


2

Excel, 14 Zeichen (leicht betrogen):

{=2012} (in a 2x1 array with one cell hidden)

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.


2

Java 7

class M{
  static String c(){
    String a = "2012",
           b = "2012";
    return a.equals(b)           // 1
            ? a                  // 2
            : a.equals("2012")   // 3
               ? a               // 4
               : b;              // 5
  }

  public static void main(String[]a){
    System.out.print(c());
  }
}

Erläuterung:

  1. Ohne irgendetwas zu ändern, wird der folgende Pfad genommen: 1 → 2 (und es wird ader Wert von zurückgegeben 2012).
  2. Wenn der Inhalt von String ain irgendeiner Weise geändert wird, wird der folgende Pfad verwendet: 1 → 3 → 5 (und es wird bder unveränderte Wert von zurückgegeben 2012).
  3. Wenn der Inhalt von String bauf irgendeine Weise geändert wird, wird der folgende Pfad verwendet: 1 → 3 → 4 (und es wird zurückgegebena der unveränderte Wert von zurückgegeben 2012).
  4. Wenn a.equals(b)on @ 1 in, geändert a.equals(a)wird b.equals(b), oder !a.equals(b)es wird weiterhin derselbe Pfad verwendet: 1 → 2 (und es wird ader unveränderte Wert von zurückgegeben2012 ).
  5. Wenn aon @ 2 in geändert bwird, wird der folgende Pfad beibehalten: 1 → 2 (und der bunveränderte Wert von wird zurückgegeben2012 ).
  6. Wenn entweder aoder bin den Zeilen 3, 4 oder 5 auf das Gegenteil geändert wird, wird der folgende Pfad beibehalten: 1 → 2 (und der aunveränderte Wert von wird zurückgegeben2012 )
  7. Wenn der Inhalt des Strings in @ 3 auf irgendeine Weise geändert wird, folgt er weiterhin dem folgenden Pfad: 1 → 2 (und es wird zurückgegeben a den unveränderten Wert von zurück. 2012)
  8. Ändern Min class Moder ainmain(String[]a) einem anderen gültigen Zeichen können ohne Änderung der Funktionalität des Codes vorgenommen werden.
  9. Jede andere Änderung führt zu einem Kompilierungsfehler (mit Ausnahme einiger Eingaben / Leerzeichen, die entfernt / hinzugefügt werden können).

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 einer Eingabe konkurrieren kann (seien wir ehrlich, Java wird so gut wie nie etwas gewinnen) diese SE xD).


Was ist ein negatives Vorzeichen, das in Pfad 4 vor dem eingefügt wird a? Wird das Programm weiterhin 2012 ausgeben oder wird es -2012 ausgeben?
Kühe quaken am

@KritixiLithos Es handelt sich um einen String, daher können Sie keinen -vor dem aoder einfügen b. Hier ist ein Screenshot des Kompilierungsfehlers.
Kevin Cruijssen

1

Ruby 1.9

puts (
rx=2012
)==2012?rx:2012.send(
:abs)

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.


setzt (r = 2012) == 2012? -r: 2012.send (: abs) druckt "-2012"
Joanis

@ M.Joanis Du brauchst aber zwei zusätzliche Zeichen: ein Leerzeichen und ein Minuszeichen. Ein Minus alleine wird nicht funktionieren.
Howard

Ah, du hast recht! Kompilierungsfehler. Ich weiß nichts über Ruby, ich sollte vorsichtiger sein. Es tut uns leid!
Joanis

1
Demnach ergibt das irbHinzufügen eines Minus vor dem rxErgebnis ein gültiges Programm, das Folgendes ausgibt -2012:
Konrad Rudolph

2
Wenn Sie putsauf putcändern, wird ?in Ruby 1.9 ein ausgegeben .
Histokrat

1

Scala, 95

(oder 54, wenn nicht relevante Teile übersprungen werden)

object Main{def main(ar:Array[String]){print(((s:String)=>if(s=="2012")s else"2012")("2012"))}}

Ich fürchte, ich weiß nicht genug über Scala, um Fehler zu finden. :( Können andere Leute bitte einen Blick darauf werfen?
Vilx-

Auf diesem Niveau ist es nicht schwer. Der größte Teil der Scala-Härte ist auf die Komplexität seines Typsystems zurückzuführen (was ich immer noch nicht vollständig verstehe: D)
Sarge Borsch

Ich kenne Scala nicht, (...),("2012")schien es aber zu brechen.
Jimmy23013

1

C #

Sicher ist es nicht so einfach, oder? ...

class program
{
    static void Main()
    {
        var result = "2012";

        if (result == "2012")
            Console.WriteLine(result);
        else
            Console.WriteLine("2012");
    }
}

Ok was ich vermisse


1
Was passiert, wenn Sie die 8. Zeile in "Console.WriteLine (-result);" ändern?
Glenn Randers-Pehrson

Kein C # -Compiler hier, aber sollte Zeile 7 nicht geändert werden, if (result += "2012")damit sie ausgegeben wird 20122012?
Philipp

hmmmm ... daran hatte ich nicht gedacht ... zurück zum Zeichenbrett
Krieg

@Philipp - Nein, das würde nicht kompilieren. Sie benötigen einen Booleschen Wert als Wert für eine ifAnweisung, keine Zeichenfolge.
Vilx

6
Wenn Sie ein ;After elsehinzufügen, wird es zweimal ausgegeben.
Jimmy23013

1

PHP, 30

<?=$i=2012;$i==2012?$i:2012;?>

Willkommen bei PPCG! Schöner erster Beitrag! Können Sie auch eine Erklärung hinzufügen?
22.

2
Und so würde ich es besiegen:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx

@ Vilx- Schön, ich hatte nicht darüber nachgedacht.
jsa

Eine lahme Niederlage für jede einzeilige PHP-Lösung: <?#$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.
Titus

1

Taxi , 396 Bytes

2012 is waiting at Starchild Numerology.2012 is waiting at Starchild Numerology.Go to Starchild Numerology: w 1 r 3 l 2 l 3 l 2 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner: w 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery: n 3 r 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office: n 1 l 1 r.

Für Menschen formatiert, das ist:

2012 is waiting at Starchild Numerology.
2012 is waiting at Starchild Numerology.
Go to Starchild Numerology: w 1 r 3 l 2 l 3 l 2 r.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: w 1 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: n 3 r 1 r 1 r.
Pickup a passenger going to Post Office.
Go to Post Office: n 1 l 1 r.

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.


1

SmileBASIC

OPTION STRICT
VAR A$=@2012
GOTO A$@2012
IF SHIFT(A$)THEN VAR B
?A$VAR C
B=C

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.


OK ... Ich weiß nichts über SmileBASIC, also ist dies nur eine Vermutung: ?-A$VAR C- Könnte diese Ausgabe -2012?
Vilx

Das geht nicht, weil A $ ein String ist.
12. Mai,

Warten Sie, ich habe eine Idee! Was ist mit : ?B$VAR C? :)
Vilx

Das löst einen Fehler aus, weil "B $" nicht deklariert wurde.
12. Mai,

0

Haskell, 65

import Data.List
nub$filter(\x->x==2012||x==2012)([2012]++[2012])

Perl, 84

use strict;use English;$ARG=
2032;s/.*/2012/unless$ARG eq 2012;$SUBSEP=2012;print;

Fehlgeschlagener Ansatz:

use strict;use English;"2012 2012"=~
/2012|2012|2012/;print$MATCH||$MATCH;

Sie Perl - Lösung kann durch Ersetzen des ersten gebrochen werden , $&wie mit etwas $0.
Howard

Und die Haskell geht kaputt, wenn Sie das Komma durch ein Pluszeichen ersetzen. Trotzdem ein tapferer Versuch.
Jeff Burka

Ich denke, nub$filter(\x->x==2012||x==2012)(2012:[2012])könnte für die Haskell-Lösung sicher sein.
Jeff Burka

Ich habe das use Englishin Perl vergessen , das wird es beheben. Ich denke, dass einige Korrekturen für Haskell funktionieren, einschließlich des Wechsels zu Strings.
Jeff Burdges

1
Die Perl-Lösung ist immer noch ziemlich zerbrechlich. Einige Möglichkeiten , um sie zu brechen (gefunden beim Testen meine eigene Antwort ) umfassen das Ersetzen printmit *rint, prin:, p:intoder #rintVoranstellen =auf der ersten Zeile oder sogar ersetzt s/.*/mit s/./oder y/.*/(was durch die Initialisierung festgelegt werden würde , $ARGum 2012zu beginnen). Auch Ihr $SUBSEPTrick 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.
Ilmari Karonen

0

PHP, 43 48

 $a='2012';echo($a==date('Y')?abs($a):date('Y'));

Das Einfügen eines -zwischen ?und $abewirkt, -2012dass gedruckt wird.
Gareth

Netter Versuch mit dem date(), aber das Programm muss auch über 2012 hinaus funktionieren. ;)
Vilx

@ Gareth - hmm :)
Der Coder

1
@ Vilx- "Die Aufgabe ist es, ein Programm in Ihrer Lieblingssprache zu schreiben, das 2012 ausgibt", wo steht, dass es nach 2012 funktionieren muss? :)
Der Coder

1
@TheCoder Ok, jetzt werde ich meine -zwischen die einfügen ? und die abs. ;-)
Gareth

0

Rubin ( 57 36)

EDIT Und noch eine in 36 Zeichen.

p((x,y='2012','2012';x=='2012'?x:y)) 

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 -nach pErgebnissen in -2012]

p [2012, 2012] .find (2012) .first || 2012


Dieser wird nur in diesem Jahr funktionieren, aber auch für ähnliche Wettbewerbe in der Zukunft :) (15.chars)

p Time.now.year

Beachten Sie, dass diese Ersetzung auch funktioniert:

p Time.new.year

57 Zeichen. Wenn Sie die Zeilenumbrüche mitzählen, sind es allerdings auch 76 Zeichen.

p( 
#
#
#
#
#
#
#
#
#
#
__LINE__.to_s.prepend(
#
#
#
#
#
#
#
__LINE__.to_s))


Die ersten beiden Lösungen: Fügen Sie #am Anfang der Zeile ein hinzu. Letzte Lösung - geben Sie vorher eine neue Zeile ein p. (Hinweis - Ich kenne Ruby selbst nicht, also irre ich mich vielleicht).
Vilx

verdammt :) du hast recht
Patrick Oscity

Druckt "2012" für mich. Die Zitate sind nicht konform - oder?
Benutzer unbekannt

Ja, du hast recht. Sie könnten $><<oder putsstattdessen verwenden. Was auch immer, ich werde es nicht mehr versuchen, ich habe aufgegeben :)
Patrick Oscity

0

Q, 23

{$[2012~m:2012;m;2012]}

.

q){$[2012~m:2012;m;2012]}`
2012
q){$[1012~m:2012;m;2012]}`
2012
q){$[2012~m:1012;m;2012]}`
2012
q){$[2012~m:2012;m;1012]}`
2012
q){$[2012~\m:2012;m;2012]}`
2012
q){$[2012~/m:2012;m;2012]}`
2012
q){$[2012~'m:2012;m;2012]}`
2012

usw


Und ein Negativ ( -) hinzufügen ? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

es gibt noch 2012 q){$[-2012~m:2012;m;2012]}` 2012- q){$[2012~m:-2012;m;2012]}` 2012-q){$[2012~m:2012;m;-2012]}` 2012
tmartin

Dies kann beseitigt werden, indem man das ;m;für so etwas wie ;1;oder ausschaltet ;x;.
Streetster

0

Hmm .. lass es mich versuchen:

class a {
  int i=2012, j=2012;
  public static void main(String[] args){if (i==j)
    {System.out.println(i);}else{System.out.println(i);}
  }
}

128 Zeichen ohne Leerzeichen.

class a{int i=2012, j=2012;public static void main(String[] args){if(i==j){System.out.println(i);}else{System.out.println(i);}}}

1
Gebrochen durch Einfügen von "-", dh System.out.println(-i)(für den ersten Druck). Auch defekt durch zB Ersetzen der ersten println(i)durch zB println(1). Kann auch durch Ändern i == jvon i += j(oder - = usw.) beschädigt werden.
TLW

0

PHP

Ich hoffe es ist unzerbrechlich :)

$a="2012";ob_start();function c(){ob_clean();return"2012";}function ee($s){return crc32($s)+printf($s);}
print(ee($a)==1367825560?die()
:c());

Ich füge ein Zeichen an das Ende dieser Zeile an: echo(printf("%s",$a)==4)?die(3und ich bekomme 20123.
Vilx

Hmm… PHP 5.4.7 funktioniert korrekt mit die (3.
Stanislav Yaglo

Du hast recht. Mein Fehler. Fortsetzung der Suche ...
Vilx

PHP 5.3.3 - auch richtig. die () gibt nur Strings aus, keine Zahlen.
Stanislav Yaglo

Warten Sie, DUH, fand es! Wechseln Sie einfach ."2012"zu ."FAIL". :)
Vilx

0

Groovy: 26

x=2012;print x^2012?2012:x

Ich weiß nicht viel Groovy, aber würde das funktionieren? x=2012;print x^2012?2012:-x
Vilx

Wofür ist das -?
Armand

@Alison -Versuchen Sie, Ihren Code mit einem Zeichen so zu ändern, dass er nicht mehr funktioniert.
Gareth

1
x=2012;print x^=2012?2012:x(Ändern ^auf ^=) ändert die Ausgabe auf 0.
Histokrat

0

Lua

print(- -(function(ab,ba)assert(ab==ba)return- -ab end)(2012,2012))

1
Was ist, wenn Sie eines dieser -Zeichen löschen ?
Vilx

Oh, und wenn Sie eine davon 2012in 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.
Vilx
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.