Scrivi un programma che genera sempre "2012", anche se modificato!


116

Questa idea non è mia, anche se non so da dove sia nata. L'ho incontrato una volta in un concorso di programmazione molto tempo fa (1998, se ricordo bene). Il compito è scrivere un programma nella tua lingua preferita che produca 2012 e solo 2012 . Il problema è che il programma deve ancora essere emesso 2012dopo che uno dei suoi caratteri è stato modificato. La modifica può essere inserimento, cancellazione o sostituzione. Naturalmente, la modifica sarà tale che il programma è ancora sintatticamente valido.

Dato che non conosco tutti i linguaggi di programmazione, devo chiedere al pubblico di aiutarmi e testare le risposte inviate.

Aggiunto: molti hanno commentato che la mia definizione di modifiche accettabili è troppo vaga. Ecco il mio secondo tentativo: le modifiche consentite lasceranno il programma sintatticamente valido e non causeranno l'arresto anomalo. Lì, penso che dovrebbe coprire tutti gli errori di compilazione, tempo di collegamento e tempo di esecuzione. Anche se sono sicuro che ci sarà comunque un caso strano in qualche lingua, quindi quando verrà fuori lo vedremo individualmente.


Che ne dici di errori di runtime come la lettura di un indirizzo probabilmente non valido?
aaaaaaaaaaaa

@PeterTaylor - Ci sono già 3 risposte, quella in C con pesanti revisioni. Puoi cercare ispirazione lì.
Vilx-

2
Qualcuno ha capito se questo è impossibile in APL o GolfScript o in modo analogo?
Jeff Burdges,

14
Questo mi ha fatto pensare al DNA, alla ridondanza e al potenziale per i raggi cosmici di capovolgere i miei programmi. Roba interessante
Jon Purdy

11
... Hai bisogno di dormire.
Vilx-

Risposte:


65

C, 53 caratteri

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

Un po 'più lungo del linguaggio di scripting risponde e segue lo stesso principio di base. Si basa sul fatto che a causa dei vincoli della sintassi di C, le uniche lettere che sarebbe possibile modificare senza rendere il programma non valido sono all'interno delle stringhe!

Modifica: rasato 4 caratteri.

Reedit: robustezza aumentata, rasata da un personaggio.

Ri-redit: più lungo, ma più robusto. Prova il tuo &adesso! (Corretto questa volta).

Aggiornamento: abbreviato un po '; sconfigge la maggior parte degli approcci visti finora.

Aggiornamento: modificato da vuoto a int; dovrei sconfiggere l'ultimo possibile approccio per romperlo a cui riesco a pensare.

Aggiornamento: ho pensato a un altro approccio; sostituendo l'ultimo a(può marcire) con 0; l'uso di nomi di due lettere dovrebbe risolvere questo problema.

Aggiornamento: ultimo aggiornamento revocato; presupponendo che le modifiche che causano errori di runtime non siano consentite; afunzionerà bene.

Aggiornamento: backtracking ancora; tentare di dereferenziare *asarà anche segfault; pertanto voidnon è necessario utilizzare per eliminare un errore di compilazione.

Aggiornamento: e un accorciamento finale; che si basa sul fatto che la stringa "2012"viene posizionata su un solo indirizzo (che è comune); e che le stringhe letterali sono di sola lettura (anche comuni).

Aggiornamento: mi è costato due personaggi, ma ho sconfitto il tuo scaltro punto e virgola!


2
@PaulR: ora cambiato in register void; L' registerè lì per prevenire &; il voidè quello di evitare *.
Williham Totland,

6
OK ... correggimi se questo non è C valido, ma ha funzionato sul mio VS2010. Inserisci una ;tra putse (.
Vilx-

39
+1, Congratulazioni, penso che tu l'abbia inchiodato. Ho scritto un semplice cablaggio di prova che ha cercato di compilare ed eseguire tutte le possibili variazioni di un carattere del codice e ognuna di esse non è stata compilata, bloccata o stampata 2012! (Ho usato solo caratteri ASCII stampabili per i test di inserimento e sostituzione, ma dubito che l'espansione del repertorio sarebbe di aiuto.)
Ilmari Karonen,

3
@IlmariKaronen: Heh, è ​​un grande sforzo; grazie per aver passato tutto questo. :)
Williham Totland

1
@Titus: Se vuoi dire la commutazione ==per !=la ternario, che si porta da nessuna parte; invece di emetterlo aora genera output "2012".
Williham Totland,

38

Haskell, 19 anni

(\xx@2012->xx)$2012

o, come programma completo,

29

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


Per un po 'più di divertimento:

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


Per ottenerne uno che non può essere modificato in modo tale da generare semplicemente un errore di runtime, possiamo codificare le informazioni in lunghezze di elenchi che non possono essere modificate utilizzando solo cambiamenti di un carattere, ad es.

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

Per renderlo più modificabile (in modo sicuro), possiamo anche usare il numero stesso come elemento dell'elenco - basta solo renderlo stringhe per impedire lo scambio di virgole per il plus ':

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

Dato che questa stringa è solo il risultato dell'espressione, possiamo anche sostituirla con quella - non è un problema grazie alla pigrizia di Haskell

64 72

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

Qui si initcomporta come "meno uno, ma non negativo".


Possiamo anche includere il sistema di tipi nello schema di ridondanza e quindi scrivere il numero in un modo che potrebbe essere modificato con modifiche di un carattere ...

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

Ora potresti cambiare uno qualsiasi uin pviceversa, ma ciò rovinerebbe sempre la profondità degli stack di elenchi nel secondo elemento tupla e in tal modo innescerebbe un errore di compilazione.

Questa idea potrebbe essere ampliata ulteriormente in modo tale che interi testi possano essere codificati in modo compatto, facili da leggere e modificare, e comunque al sicuro dalla modifica di singoli caratteri.


E ancora un altro ...

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
Temo che queste compilazioni siano state ben modificate, anche se al momento dell'esecuzione viene generata un'eccezione .
Jeff Burdges,

3
@JeffBurdges: certo, prendo questo per essere incluso in "e non causerà il crash".
cessò di girare in senso antiorario il

1
Per la a=map(head.show.length)[[a,a],[],[a],[a,a]]soluzione, inserire atra []. Mi piace molto questo post, però! Soluzioni molto intelligenti.
Dillon Cower il

9
Ho verificato che tutte le 5825 varianti del tuo programma di 29 caratteri (sostituzione o inserimento di caratteri ASCII 32-126) funzionano come previsto. Ecco lo script di test che ho usato . Può essere facilmente modificato per testare altri programmi, comprese altre lingue. Avvertenza: il mio laptop ha impiegato quasi 1 ora :)
Hammar

1
[a]-> []nella soluzione a 64 caratteri
John Dvorak,

14

JavaScript

Credo che questo sia a prova di errore di runtime, ogni singola modifica dovrebbe comportare un errore di compilazione o un singolo avviso che dice 2012.

Modifica: il codice commetterebbe un errore di runtime su qualcosa del genere if("alert(2012 "==r), ho spostato la sezione di prova per gestirlo.

Edit: Nice Vilx-, ma risolvibile :-) Ora c'è una parentesi errata tra parentesi per l'inserimento di quel punto e virgola.

Modifica: Ma poi una virgola potrebbe fare la stessa cosa del punto e virgola, che è una miriade di opzioni, penso di averlo corretto, ma adesso c'è un sacco di codice.

Modifica: un po 'semplificato.

Modifica: un altro in una serie infinita di correzioni di bug.

Modifica: questo tipo sembra più lungo e complicato che a prova di proiettile, ma dovrebbe almeno prendersi cura di ~evale !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
Perché ad esempio q-")"ritorna NaN, che eval converte in "NaN"prima di valutarlo, che semplicemente lo riporta in NaN. Strana cosa da fare, ma tecnicamente legittima, in modo che non invochi la cattura.
aaaaaaaaaaaa

4
Stessa cosa della soluzione C: inserire una ;tra evale (.
Vilx-

1
Per i lettori di commenti, la vulnerabilità del punto e virgola è stata risolta, credo che il codice sia pulito ora.
aaaaaaaaaaaa

4
Non sono sicuro se questo conta o meno, ma mettendo un ~davanti alle evalcause fa eco 2012 due volte anziché una volta. Non sono sicuro che ciò non rispetti le regole: P
mellamokb,

2
L'aggiunta di un !after lo eval(interrompe.
jimmy23013,

13

Perl, 49 caratteri

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

Basato sulla risposta di JB , ma questo in realtà soddisfa le specifiche . Un controllo esaustivo indica che ogni cancellazione, inserimento o sostituzione di un carattere lascia invariato l'output o provoca l'arresto anomalo del programma durante l'esecuzione (come indicato da un valore di ritorno diverso da zero e l'output su stderr), almeno fino a quando inserimenti e le sostituzioni sono limitate ai caratteri ASCII stampabili.

(Senza la restrizione, l'attività in Perl è impossibile: una caratteristica poco nota del parser Perl è che si ferma quando incontra un carattere Ctrl-D o Ctrl-Z, quindi inserendo uno di quelli davanti a ogni giro di file in un programma Perl valido che non fa nulla.)

Modifica: rasato un altro carattere sostituendolo 1==printcon 0-print.


Si rompe con Perl 5.28 dove printinizia a tornare 'true'invece di 1 :-P
JB

3
@JB: Beh, puoi ridimensionarlo quando succede. :) (A beneficio di altri lettori, questo è uno scherzo. Per quanto ne so, non ci sono piani per modificare il valore di ritorno printin nessuna versione di Perl 5, anche se non è esplicitamente documentato .)
Ilmari Karonen,

12

Brainfuck

Sto cercando di convincermi che questo è possibile, e sono abbastanza certo di averlo allungato un po 'troppo. Ho formulato alcune ipotesi sul mio ambiente:

  1. Un loop infinito è considerato un "crash". Una condizione simile potrebbe essere raggiunta decrementando lo zero passato o alla sinistra della posizione di memoria zero in alcuni interpreti. Molti interpreti sono difficili da arrestare in fase di esecuzione. Evito il problema dell'arresto usando solo il ciclo infinito più semplice, più ovvio.
  2. Le parentesi quadre senza pari sono considerate un errore di compilazione.
  3. Funzionerà solo in un ambiente in cui l'output del programma viene reindirizzato al proprio input. Lo uso per verificare che abbia effettivamente prodotto "2012". Questo è l'unico modo in cui potrei aggirare semplicemente cancellando uno dei caratteri di output.

Sfortunatamente, se diventi più severo, temo che sarà impossibile. Ecco la mia soluzione:

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

Fondamentalmente, è possibile modificare il codice di output o il codice di verifica, ma non entrambi. Uno di questi è garantito per funzionare. Se uno di loro non lo fa, si "schianterà".


5
Uff, brainfuck! L'avresti dovuto, vero? XD
Vilx-

8
avresti preferito invece usare spazi bianchi?
NRGdallas,

7

python2

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

Ho dovuto cambiare leggermente lo script di test di Ray per testarlo mentre il reindirizzamento stdout lo stava interrompendo. Il passaggio di dicts vuoti per exec evita di inquinare lo spazio dei nomi

exec(prog, {}, {})

Grande! Tu lo fai!
Ray

6

Brain-Flak , 44 + 3 = 47 byte [non competitivo]

Questo usa la -Abandiera di Brain-Flak e trasmette i personaggi 2012a STDOUT

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

Provalo online!

Alternativa, 50 byte

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

Provalo online!

Spiegazione

Qualsiasi modifica di un singolo carattere a uno dei codici sopra causa errori nel programma.


3
Ha! La lingua giusta per la sfida.
DLosc,

4

Sisi , non competitiva

Alla fine penso di aver trovato una delle mie lingue che funziona. È orrendamente lungo e la lingua è più recente della domanda, ma sembra ancora un risultato.

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

A proposito di Sisi

Sisi è un linguaggio giocattolo ispirato al montaggio e QBasic. È utile per questa sfida perché la sua sintassi è estremamente limitata.

  • Ha solo quattro comandi: set, print, jump, e jumpif.
  • Tutti i comandi hanno arity fisso.
  • Tutte le righe devono avere numeri di riga, che sono in costante aumento.
  • Le espressioni sono consentite solo nelle setdichiarazioni. Possono contenere (al massimo) una sola operazione, che deve essere binaria. In particolare: la modifica print xxin print -xxè un errore di sintassi.
  • I nomi delle variabili devono essere composti da lettere minuscole.
  • Ancora più importante: non c'è sintassi di commento !

Il programma

Il nucleo del programma è questa parte:

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

Archiviamo 2012in xx, quindi verificare se questo era successo e memorizzare il risultato del test in y. Se yè vero, passa alla riga 55. (Passa ai numeri di riga inesistenti semplicemente avanzando rapidamente alla riga successiva.)

Tempra da radiazione

  • Se l'assegnazione nella riga 1 viene modificata, allora yè falso, il salto non si verifica e la riga 4 viene impostata xxsu 2012.
  • Se l'assegnazione nella riga 2 o la condizione di salto nella riga 3 viene modificata, non ci interessa: xxverrà impostato su 2012 indipendentemente dal fatto che eseguiamo il salto o meno.
  • Il target di salto nella linea 3 può essere modificato da un minimo di 5 a un massimo di 955. Qualsiasi possibile modifica lo porta alla printlinea 955 prima o poi. Con una modifica non è possibile saltare all'indietro (creando un loop) o oltre la fine del programma.
  • Se l'assegnazione nella riga 4 viene modificata, non ci interessa: l'assegnazione della riga 1 sarà corretta e passeremo oltre la riga 4.
  • Se la riga 955 viene modificata, potremmo avere un problema. L'unica cosa spiacevole di Sisi è che le variabili non inizializzate sono predefinite 0, quindi una modifica come print axnon è un errore. La brutta ma efficace soluzione sono le linee 828-954, che assegnano il 2012 a ogni possibile variabile con una distanza di modifica di 1 da xx. Questo assicura che qualsiasi modifica alla finale print xxcontinuerà a stampare nel 2012.
  • Se viene modificato un numero di riga: 1) sarà fuori servizio e costituirà un errore di sintassi, oppure 2) non influenzerà il flusso del programma. La modifica principale di cui potremmo essere preoccupati - cambiare la linea da 4 a 94, inserendola quindi dopo il salto a 55 - non importa perché tutto ciò che fa è assegnare di xxnuovo il 2012 .

Buona! Non riesco a pensare a un modo per aggirare questo. "A" per lo sforzo da parte mia, questo è certo! :)
Vilx-

3

Pitone

Un po 'prolisso (ora con una correzione per quel fastidioso punto printe virgola tra e (!):

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

@Jeff Burdges: Sì, con questo sto sbagliando anche gli errori di runtime. :)
Dillon Cower il

Temo che sia ancora sintatticamente corretto se l'intersezione produce l'insieme vuoto e il pop genera un errore di runtime . Aggiungi altri 2012 su entrambi i lati.
Jeff Burdges,

@DC: Direi che un'eccezione non è la stessa di un errore di runtime, anche se sembra che le eccezioni siano chiamate errori in Python. pop()il set vuoto non è di per sé un errore, ma genera un "Errore".
Williham Totland,

1
Un'eccezione diventa un errore quando non viene rilevata.
Ilmari Karonen,

1
inserendo una virgola dopo le popuscite<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')

Che dialetto SQL è questo? Sembra Transact-SQL (aka SQL Server), ma ha una sintassi non valida per questo.
Vilx-

@ Vilx-: l'ho provato io stesso in SQL Server 2008 quando stavo cercando di romperlo, e ha funzionato bene.
mellamokb,

@mellamokb - È strano. È esattamente quello che ho fatto e mi sono lamentato del fatto che non è possibile assegnare un valore predefinito alla variabile (è necessaria un'istruzione SET separata) e non esiste IIF (solo CASE).
Vilx-

1
@ Vilx-: Ah, hai ragione. Ora mi rendo conto che stavo effettivamente testando su SQL Azure. Con SQL Server 2008 ottengo quegli stessi errori. Tuttavia, sembra funzionare correttamente in SQL Server 2012 / Azure. Ecco una demo con SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

OK, congratulazioni, non riesco a trovare alcun modo ovvio per romperlo! :) Questo non vuol dire che non ce ne sono. ;)
Vilx-

3

Ho realizzato uno script Python per giudicare tutte le soluzioni Python. Lo script rompe la prima e la terza soluzione Python, con molti metodi diversi. E la seconda soluzione usa lambda per proteggersi, è infrangibile. La seconda soluzione Python è in Python 3. L'ho modificata nel formato Python 2 e poi il programma Judge l'ha rotta.

Ecco la sceneggiatura del giudice.

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) 

freddo! la mia risposta fa schifo e soffia allo stesso tempo
gnibbler

p2genera sempre un'eccezione per Python2. L'output non è mai il 2012. Il programma del giudice non verrà eseguito in Python3 poiché utilizza istruzioni di stampa.
Gnibbler,

@gnibbler Non ho notato che p2è in Python 3.
Ray

Ho elaborato una nuova risposta per Python2 che passa la tua sceneggiatura
gnibbler il

3

Mathematica, 23 caratteri

Nota: "/." significa "sostituisci"

2012/.Except@2012->2012

2
Potrebbe trattarsi di una risposta / sconfitta debole, ma passare /.a //(modulo postfisso).
Dillon Cower

@DillonCower Buona cattura!
Dr. belisarius

2

Javascript - 68, 77, 84 , 80 caratteri

Ecco una soluzione che dovrebbe funzionare quest'anno :)

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

Ecco il violino di prova .

Aggiornamento 1: risolto il problema per cui eval (+ a) lo aveva rotto (grazie a eBusiness).

Aggiornamento 2: risolto per "|" caso (grazie ancora eBusiness).

Aggiornamento 3: risolto il caso ">" (grazie ancora eBusiness). E si è rotto per il caso '1' :(


Non hai custodito il tuo giudizio. eval(+a)e molte altre modifiche funzionano perfettamente ma non fanno molto.
aaaaaaaaaaaa

@eBusiness: grazie per aver segnalato il eval(+a)caso, che ora dovrebbe essere risolto. Inoltre, non sono stato in grado di trovare uno dei casi di modifica in cui funziona correttamente ma non produce il 2012, quindi per favore mi fai un esempio?
Briguy37,

eval(0)e eval(-a)per esempio fa la stessa cosa.
aaaaaaaaaaaa,

Dopo la modifica, puoi almeno romperlo sostituendolo ||con |.
aaaaaaaaaaaa

5
Si interrompe se si cambia il primo alertin aler=.
jimmy23013,

2

Rubino 1.9 - 43 caratteri

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

Non testato, quindi rompi.


2

Excel, 14 caratteri (barare leggermente):

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

Qualsiasi modifica valida all'array influirà sul contenuto di entrambe le celle e il tentativo di modificare solo una cella attiva un messaggio di errore.

Naturalmente, ciò si interrompe se si considera che in realtà è solo una formula, al contrario di 2 formule che sono vincolate ad essere identiche.


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());
  }
}

Spiegazione:

  1. Senza cambiare nulla, prenderà il seguente percorso: 1 → 2 (e restituirà ail valore di 2012).
  2. Se il contenuto di String aviene modificato in qualche modo, prenderà il seguente percorso: 1 → 3 → 5 (e restituirà bil valore invariato di 2012).
  3. Se il contenuto di String bviene modificato in qualche modo, prenderà il seguente percorso: 1 → 3 → 4 (e restituirà ail valore invariato di 2012).
  4. Se a.equals(b)il @ 1 viene modificato a a.equals(a), b.equals(b)o !a.equals(b)sarà ancora adottare lo stesso percorso seguente: 1 → 2 (e rinvierà a's valore immutata 2012).
  5. Se asu @ 2 viene modificato b, continuerà a seguire il seguente percorso: 1 → 2 (e restituirà bil valore invariato di 2012).
  6. Se uno ao bè cambiato al contrario sulle linee 3, 4 o 5 prenderà comunque il seguente percorso: 1 → 2 (e restituirà ail valore invariato di 2012)
  7. Se il contenuto della stringa su @ 3 viene modificato in qualche modo, prenderà comunque il seguente percorso: 1 → 2 (e restituirà ail valore invariato di 2012)
  8. La modifica Min class Mo ain main(String[]a)un altro carattere valido può essere fatto senza alcuna modifica alla funzionalità del codice.
  9. Qualsiasi altra modifica comporterà un errore di compilazione (esclusi alcuni degli spazi / spazi bianchi, che possono essere rimossi / aggiunti).

Prova tutte queste modifiche qui, per verificare che siano ancora tutte stampate nel 2012.

Se riesci a trovare un modo per romperlo seguendo le regole di OP, mi piacerebbe sapere, quindi posso pensare a qualcosa per risolverlo.
A differenza della maggior parte delle domande simili in cui un singolo carattere viene modificato, questa domanda consente di mantenere intatta la struttura di base del linguaggio di programmazione in questione, in modo che Java possa finalmente competere in un solo uno (ammettiamolo, Java - quasi - non vincerà mai nulla su questo SE xD).


Che cos'è un segno negativo inserito nel percorso 4 prima del a? Il programma produrrà ancora il 2012 o produrrà -2012?
Kritixi Lithos,

@KritixiLithos È una stringa, quindi non puoi inserire una -prima del ao b. Ecco uno screenshot dell'errore Compile.
Kevin Cruijssen,

1

Ruby 1.9

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

Costruisco questo programma breve ma semplice che sei invitato a infrangere secondo le regole di cui sopra. Non riuscivo nemmeno a trovare una posizione in cui l'output viene modificato (senza interrompere il codice) se #viene inserito un per commentare il resto della riga.


mette (r = 2012) == 2012? -r: 2012.send (: abs) stampa "-2012"
Joanis il

@ M.Joanis Ma hai bisogno di altri due personaggi: uno spazio e uno negativo. Un meno da solo non funzionerà.
Howard,

Ah, hai ragione! Errore di compilazione. Non so nulla di Ruby, dovrei stare più attento. Scusate!
Joanis,

1
Secondo l' irbaggiunta di un segno meno prima dei rxrisultati in un programma valido che produce -2012...
Konrad Rudolph

2
Passando putsa putcquesto si ottiene un output ?in Ruby 1.9.
istocratico,

1

Scala, 95

(o 54 se salta parti non significative)

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

Temo di non conoscere abbastanza Scala per trovare difetti. :( Altre persone, per favore, possono dare un'occhiata?
Vilx

Non è difficile a questo livello. La maggior parte della durezza Scala è dovuta alla complessità del suo sistema di tipi (che non riesco ancora a comprendere appieno: D)
Sarge Borsch,

Non conosco Scala, ma (...),("2012")sembrava romperlo.
jimmy23013,

1

C #

Sicuramente non è così semplice, vero? ...

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

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

Ok cosa mi manca?


1
Cosa succede se si modifica l'ottava riga in "Console.WriteLine (-result);"?
Glenn Randers-Pehrson,

Nessun compilatore C # qui, ma non dovrebbe cambiare la linea 7 per if (result += "2012")renderlo in uscita 20122012?
Philipp,

hmmmm ... non ci avevo pensato ... tornando al tavolo da disegno
Guerra

@Philipp - No, non sarebbe compilabile. È necessario un valore booleano come valore per ifun'istruzione, non una stringa.
Vilx-

6
L'aggiunta di un ;after elserende l'uscita due volte.
jimmy23013,

1

PHP, 30

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

Benvenuti in PPCG! Bel primo post! Puoi aggiungere anche una spiegazione?
Rɪᴋᴇʀ

2
Ed ecco come lo sconfiggerei:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-

@ Vilx- Bello, non ci avevo pensato.
jsa,

Una sconfitta sbagliata per qualsiasi soluzione PHP a una riga: metti l'intero codice in un commento <?#$i=2012;$i==2012?$i:2012;?>Soluzione contro quella: inserisci una nuova riga dopo $i=2012.
Tito

1

Taxi , 396 byte

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.

Formattato per l'uomo, questo è:

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.

Dalla lettura di altre risposte, la soluzione sembra essere quella di scegliere un linguaggio fragile, impostare il valore, controllare il valore, stampare il valore.


1

SmileBASIC

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

Innanzitutto, abilitiamo la modalità rigorosa. Questo ti costringe a dichiarare tutte le variabili prima di usarle e impedisce cose come la modifica da? A $ a? B $.

Successivamente, viene creata una variabile di stringa denominata "A $" e il valore viene impostato su "@ 2012". Per assicurarsi che il valore di A $ non sia stato rovinato, il programma proverà a passare a un'etichetta e l'unica etichetta nel programma è @ 2012.

Ora, A $ è sicuramente "@ 2012", ma prima di stamparlo è necessario rimuovere @. SHIFT () rimuove il primo elemento in una stringa o matrice (proprio come pop (), ma dall'altra estremità). Per scartare il valore restituito da SHIFT, viene passato a un blocco IF / THEN, che non fa nulla. Nel caso in cui qualcuno cerchi di commentare quella riga, dichiariamo una variabile "B", che verrà utilizzata in seguito. Se il VAR viene commentato, l'ultima riga genererà un errore variabile non definito.

Ora viene stampato A $ e c'è un altro VAR per impedire i commenti. L'ultima riga si assicura solo che le variabili B e C siano state entrambe dichiarate.


OK ... Non so nulla di SmileBASIC, quindi questa è puramente un'ipotesi: ?-A$VAR C- potrebbe questa uscita -2012?
Vilx-

Non funzionerà perché A $ è una stringa.
12Me21

Aspetta, ho un'idea! Che dire di ?B$VAR C:? :)
Vilx-

Ciò attiverà un errore perché "B $" non è stato dichiarato.
12Me21

0

Haskell, 65 anni

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;

Approccio fallito:

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

La soluzione Perl può essere interrotta sostituendo la prima $&con qualcosa di simile $0.
Howard,

E quello di Haskell si rompe se si sostituisce la virgola con un segno più. Tentativo coraggioso però.
Jeff Burka,

Penso che nub$filter(\x->x==2012||x==2012)(2012:[2012])potrebbe essere sicuro per la soluzione Haskell.
Jeff Burka,

Ho dimenticato in use Englishin perl, che lo risolverà. Penso che diverse correzioni funzionino per Haskell, incluso il passaggio alle stringhe.
Jeff Burdges,

1
La soluzione Perl è ancora piuttosto fragile. Alcuni modi per romperlo (trovati durante il test la mia risposta personale ) comprendono la sostituzione printcon *rint, prin:, p:into #rint, anteponendo =alla prima linea, o addirittura la sostituzione s/.*/con s/./o y/.*/(che verrebbe fissato inizializzando $ARGper 2012per cominciare). Inoltre, il tuo $SUBSEPtrucco non protegge ancora dall'inserimento di un *punto e virgola finale, ma una soluzione molto più semplice è quella di rimuovere quel punto e virgola non necessario.
Ilmari Karonen,

0

PHP, 43 48

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

Inserendo una -tra il ?e il $arisultato nella -2012stampa.
Gareth,

Simpatico tentativo con date(), ma il programma deve funzionare anche oltre il 2012. ;)
Vilx

@Gareth - hmm :)
The Coder

1
@ Vilx- "Il compito è scrivere un programma nella tua lingua preferita che produce il 2012" dove dice che deve funzionare oltre il 2012? :)
The Coder,

1
@TheCoder Ok, ora inserirò il mio -tra i? e gli addominali. ;-)
Gareth,

0

Rubino ( 57 36)

EDIT E un altro su 36 caratteri.

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

Immagino che usare le stringhe sia abbastanza sicuro perché quella cosa negativa non funziona più.


EDIT next try (36 chars) [non importa, aggiungendo un -after pin -2012]

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


Questo funzionerà solo quest'anno, ma anche per concorsi simili in futuro :) (15.chars)

p Time.now.year

Si noti che questa sostituzione funziona anche:

p Time.new.year

57 caratteri. Se conti le nuove righe, però, sono 76 caratteri.

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


Prime due soluzioni: aggiungi #a all'inizio della riga. Ultima soluzione: inserisci una nuova riga prima p. (Nota: non conosco neanche Ruby, quindi forse sbaglio).
Vilx-

accidenti :) hai ragione
Patrick Oscity,

Stampa "2012" per me. Le virgolette non sono conformi, vero?
utente sconosciuto

Si hai ragione. Puoi usare $><<o putsinvece. Comunque sia, non ci proverò più, ho rinunciato :)
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

eccetera


E aggiungendo un negativo ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi,

q){$[-2012~m:2012;m;2012]}` 2012q){$[2012~m:-2012;m;2012]}` 2012q){$[2012~m:2012;m;-2012]}` 2012
esce

Questo può essere sconfitto cambiando ;m;per qualcosa come ;1;o ;x;.
streetster,

0

Hmm .. fammi provare:

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 caratteri senza spazi bianchi.

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
Rotto inserendo "-", ovvero System.out.println(-i)(per la prima stampa). Anche rotto per esempio sostituendo il primo println(i)con es println(1). Anche potenzialmente rotto cambiando i == jin i += j(o - =, ecc.).
TLW

0

PHP

Spero sia infrangibile :)

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

Aggiungo un personaggio alla fine di questa riga: echo(printf("%s",$a)==4)?die(3e ottengo 20123.
Vilx-

Hmm… PHP 5.4.7 funziona correttamente con die (3
Stanislav Yaglo,

Hai ragione. Colpa mia. Continuando la ricerca ...
Vilx

PHP 5.3.3 - anche corretto. die () genera solo stringhe, non produce numeri.
Stanislav Yaglo,

Aspetta, DUH, l'ho trovato! Passa ."2012"a ."FAIL". :)
Vilx-

0

Groovy: 26

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

Non conosco molto Groovy, ma funzionerebbe? x=2012;print x^2012?2012:-x
Vilx-

a cosa serve -?
Armand,

@Alison Il -è provare a modificare il codice con un carattere in modo che non funzioni più.
Gareth,

1
x=2012;print x^=2012?2012:x(cambiando ^in ^=) cambia l'output a 0.
histocrat

0

Lua

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

1
Cosa succede se si elimina uno di quei -segni?
Vilx-

Oh, e se cambi uno di quelli 2012in qualcos'altro, l'asserzione genererà un errore. Hmm ... beh, immagino che meriti punti di creatività per aver abusato delle regole. Ma sul serio, non è così che si intendeva.
Vilx-
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.