Napisz program, który zawsze wyświetla „2012” - nawet jeśli jest zmodyfikowany!


116

Ten pomysł nie jest mój, choć nie wiem, skąd się wziął. Kiedyś spotkałem go w konkursie programistycznym bardzo dawno (1998, jeśli dobrze pamiętam). Zadanie polega na napisaniu programu w swoim ulubionym języku, który będzie generował 2012 i tylko 2012 . Problem polega na tym, że program musi nadal generować dane wyjściowe 2012po zmodyfikowaniu jednego z jego znaków. Modyfikacja może polegać na wstawieniu, usunięciu lub zastąpieniu. Oczywiście modyfikacja będzie taka, że ​​program będzie nadal poprawny pod względem składniowym.

Ponieważ nie znam wszystkich języków programowania, muszę poprosić odbiorców o pomoc i przetestować przesłane odpowiedzi.

Dodano: Wielu skomentowało, że moja definicja akceptowalnych modyfikacji jest zbyt niejasna. Oto moja druga próba: dozwolone modyfikacje sprawią, że Twój program będzie ważny pod względem składniowym i nie spowoduje awarii. Tam myślę, że powinno to obejmować wszystkie błędy czasu kompilacji, łącza i czasu wykonywania. Chociaż jestem pewien, że i tak będzie jakiś dziwny przypadek w jakimś języku, więc kiedy to się pojawi, przyjrzymy się temu indywidualnie.


Co z błędami środowiska wykonawczego, takimi jak odczyt najprawdopodobniej nieprawidłowego adresu?
aaaaaaaaaaaa

@PeterTaylor - Istnieją już 3 odpowiedzi, w tym C z ciężkimi poprawkami. Możesz tam szukać inspiracji.
Vilx

2
Ktoś zorientował się, czy jest to niemożliwe w APL lub GolfScript lub podobnie zwięźle?
Jeff Burdges

14
To zmusiło mnie do myślenia o DNA i redundancji oraz o potencjale, że promienie kosmiczne mogą przełamać bity w moich programach. Interesujące rzeczy.
Jon Purdy

11
... Potrzebujesz trochę snu.
Vilx

Odpowiedzi:


65

C, 53 znaki

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

Nieco dłużej niż odpowiada język skryptowy i jest zgodny z tą samą podstawową zasadą. Opiera się na fakcie, że ze względu na ograniczenia składni C jedyne litery, które można zmienić bez unieważnienia programu, znajdują się w łańcuchach!

Edycja: Ogolono 4 znaki.

Reedit: Zwiększono wytrzymałość, ogolono jedną postać.

Re-redit: Dłuższy, ale bardziej wytrzymały. Po prostu spróbuj &teraz! (Tym razem poprawnie).

Aktualizacja: nieco skrócona; pokonuje większość dotychczasowych podejść.

Aktualizacja: Zmieniono int na void; powinienem pokonać ostatnie możliwe podejście, aby je przełamać.

Aktualizacja: Mam ochotę na inne podejście; zamieniając ostatni a(może gnić) na 0; używanie dwuliterowych nazw powinno rozwiązać ten problem.

Aktualizacja: ostatnia aktualizacja odwołana; zakładanie, że zmiany powodujące błędy w czasie wykonywania są niedozwolone; abędzie działać dobrze.

Aktualizacja: Cofanie trochę; próba wyłuskiwania *arównież spowoduje segregację; więc użycie voiddo dokuczenia błędu kompilacji nie powinno być konieczne.

Aktualizacja: I ostateczne skrócenie; który polega na umieszczeniu ciągu "2012"pod jednym adresem (co jest wspólne); i że dosłowne ciągi znaków są tylko do odczytu (również wspólne).

Aktualizacja: Kosztowało mnie to dwie postacie, ale pokonałem twoją nędzną średnicę!


2
@PaulR: Teraz zmieniono na register void; registerJest tam, aby zapobiec &; voidjest tam, aby zapobiec *.
Williham Totland

6
OK ... popraw mnie, jeśli jest to nieprawidłowe C, ale po prostu działało na moim VS2010. Wstaw ;pomiędzy putsi (.
Vilx

39
+1, Gratulacje, myślę, że to przybiliście. Napisałem prostą uprząż testową, która próbowała skompilować i uruchomić każdą możliwą jednoznakową odmianę kodu, a każda z nich nie kompilowała się, nie uległa awarii ani nie wydrukowała 2012! (Użyłem tylko drukowalnych znaków ASCII do testów wstawiania i podstawiania, ale wątpię, czy poszerzenie repertuaru pomogłoby.)
Ilmari Karonen

3
@IlmariKaronen: Heh, to dużo wysiłku; dzięki za przejrzenie tego wszystkiego. :)
Williham Totland

1
@Titus: Jeśli masz na myśli zamianę ==na trójkę !=, to nigdzie cię to nie zaprowadzi ; zamiast wypisywać ato teraz wypisuje "2012".
Williham Totland

38

Haskell, 19 lat

(\xx@2012->xx)$2012

lub jako pełny program

29

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


Dla trochę więcej zabawy:

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


Aby uzyskać taki, którego nie można zmodyfikować w sposób powodujący jedynie błąd czasu wykonania, możemy zakodować informacje w długości list, których nie można modyfikować przy użyciu zmian tylko jednego znaku, tj.

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

Aby uczynić go bardziej modyfikowalnym (bezpiecznie), możemy również użyć samego numeru jako elementu listy - wystarczy wprowadzić ciągi znaków, aby zapobiec zamianie przecinków na plus ':

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

Ponieważ ten ciąg jest tylko wynikiem wyrażenia, możemy go również ponownie zastąpić tym - bez problemu dzięki lenistwu Haskella

64 72

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

Te initakty jako „jeden minus, ale nie negatywne” tutaj.


Możemy również włączyć system typów do schematu redundancji, a następnie zapisać liczbę w sposób, który można zmodyfikować za pomocą zmian jednoznakowych ...

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

Możesz teraz zmienić dowolną una podwrotnie, ale to zawsze zepsułoby głębokość układania list w drugim elemencie krotkowym, a tym samym spowodowało błąd kompilacji.

Pomysł ten może być dalej rozwijany w taki sposób, że całe teksty mogą być kodowane w sposób zwarty, łatwy do odczytu i edycji, a jednocześnie bezpieczny przed modyfikowaniem pojedynczych znaków.


I jeszcze jeden ...

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
Obawiam się, że kompiluje się dobrze zmodyfikowana, chociaż w czasie wykonywania zgłaszany jest wyjątek .
Jeff Burdges

3
@JeffBurdges: jasne, biorę to pod uwagę w „i nie spowoduje awarii”.
przestał się obracać przeciwnie do zegara

1
Dla a=map(head.show.length)[[a,a],[],[a],[a,a]]rozwiązania wstaw apomiędzy []. Jednak naprawdę podoba mi się ten post! Bardzo sprytne rozwiązania.
Dillon Cower

9
Sprawdziłem, czy wszystkie 5825 odmian twojego 29-znakowego programu (zastępując lub wstawiając znaki ASCII 32-126) działają zgodnie z oczekiwaniami. Oto skrypt testowy, którego użyłem . Można go łatwo dostosować do testowania innych programów, w tym innych języków. Ostrzeżenie: Uruchomienie mojego laptopa zajęło prawie godzinę :)
hammar

1
[a]-> []w rozwiązaniu 64-znakowym
John Dvorak

14

JavaScript

Uważam, że jest to dowód na błędy w czasie wykonywania, każda pojedyncza zmiana powinna albo skutkować błędem kompilacji, albo pojedynczym alertem z informacją 2012.

Edycja: Kod popełniłby błąd w czasie wykonywania na czymś takim if("alert(2012 "==r), przesunąłem sekcję try, aby sobie z tym poradzić.

Edycja: Nicea Vilx-, ale możliwa do naprawienia :-) Teraz występuje niedopasowanie nawiasów kwadratowych do wstawiania średnika.

Edycja: Ale przecinek może zrobić to samo, co średnik, czyli wiele opcji, myślę, że to naprawiłem, ale teraz jest strasznie dużo kodu.

Edycja: nieco uproszczona.

Edycja: jeszcze jeden w nieskończonej serii poprawek błędów.

Edycja: Ten rodzaj wydaje się bardziej długi i skomplikowany niż kuloodporny, ale powinien przynajmniej zająć się ~evali !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
Ponieważ na przykład q-")"zwraca NaN, do którego eval konwertuje się "NaN"przed ewaluacją, co po prostu odwraca NaN. Dziwna rzecz do zrobienia, ale technicznie uzasadniona, aby nie wywoływała połowu.
aaaaaaaaaaaa

4
To samo co rozwiązanie C - wstaw ;pomiędzy evali (.
Vilx

1
W przypadku czytników komentarzy usterka średnika została naprawiona. Uważam, że kod jest teraz czysty.
aaaaaaaaaaaa

4
Nie jestem pewien, czy to się liczy, czy nie, ale umieszczenie ~przed nimi evalpowoduje, że echo 2012 dwukrotnie zamiast raz. Nie jestem pewien, czy to nie
zgadza się

2
Dodanie !po eval(powoduje jego przerwanie.
jimmy23013

13

Perl, 49 znaków

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

Na podstawie odpowiedzi JB , ale ta faktycznie spełnia specyfikację . Wyczerpująca kontrola wskazuje, że każde jednoznakowe usunięcie, wstawienie lub zamiana pozostawia wyjście niezmienione lub powoduje awarię programu po uruchomieniu (jak wskazuje niezerowa wartość zwrotna i wyjście do stderr), przynajmniej tak długo, jak wstawienia i zamienniki są ograniczone do drukowalnych znaków ASCII.

(Bez ograniczenia zadanie to nie jest możliwe w Perlu: mało znana funkcja parsera Perla polega na tym, że zatrzymuje się, gdy napotka znak Ctrl-D lub Ctrl-Z, więc wstawianie jednego z nich przed dowolną kolejnością plików w prawidłowy program Perla, który nic nie robi.)

Edycja: Ogoliłem jeszcze jeden znak, zastępując 1==printgo 0-print.


Zrywa z Perlem 5.28, gdzie printzaczyna wracać 'true'zamiast 1 :-P
JB

3
@JB: Cóż, możesz głosować, kiedy to się stanie. :) (Z korzyścią dla innych czytelników jest to żart. O ile mi wiadomo, nie ma planów zmiany wartości zwracanej printw żadnej wersji Perla 5, nawet jeśli nie jest to wyraźnie udokumentowane .)
Ilmari Karonen,

12

Brainfuck

Próbuję się przekonać, że jest to możliwe, i jestem całkiem pewien, że mogłem to trochę za daleko posunąć. Podjąłem kilka założeń dotyczących mojego środowiska:

  1. Nieskończoną pętlę uważa się za „awarię”. Podobny warunek można prawdopodobnie osiągnąć poprzez zmniejszenie wartości powyżej zera lub na lewo od miejsca pamięci zero w niektórych interpretatorach. Wielu tłumaczy ustnych trudno jest zawiesić w czasie wykonywania. Unikam problemu zatrzymania, używając tylko najprostszej, najbardziej oczywistej nieskończonej pętli.
  2. Niedopasowane nawiasy kwadratowe są uważane za błąd kompilacji.
  3. Działa to tylko w środowisku, w którym wyjście programu jest przesyłane z powrotem do własnych danych wejściowych. Używam tego, aby sprawdzić, czy rzeczywiście wydało „2012”. Jest to jedyny sposób, w jaki mogłem się obejść, po prostu usuwając jeden z znaków wyjściowych.

Niestety obawiam się, że będzie to trudniejsze. Oto moje rozwiązanie:

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

Zasadniczo możesz zmienić kod wyjściowy lub kod weryfikacyjny, ale nie jedno i drugie. Jedna z nich gwarantuje, że zadziała. Jeśli któryś z nich tego nie zrobi, nastąpi „awaria”.


5
Ugh, bzdura! Po prostu MUSISZ, prawda? XD
Vilx

8
wolałbyś zamiast tego użyć białych znaków?
NRGdallas,

7

Python2

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

Musiałem nieco zmienić skrypt testowy Raya, aby to przetestować, ponieważ standardowe przekierowanie go zrywało. Przekazywanie pustych dykt do exec pozwala uniknąć zanieczyszczenia przestrzeni nazw

exec(prog, {}, {})

Wspaniały! Zrobiłeś to!
Ray

6

Brain-Flak , 44 + 3 = 47 bajtów [Nie konkuruje]

Wykorzystuje -Aflagę Brain-Flak i wysyła znaki 2012do STDOUT

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

Wypróbuj online!

Alternatywnie, 50 bajtów

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

Wypróbuj online!

Wyjaśnienie

Każda modyfikacja jednego z powyższych znaków w jednym znaku spowoduje błąd programu.


3
Ha! Właściwy język dla wyzwania.
DLosc

4

Sisi , niekonkurujący

Wreszcie myślę, że znalazłem jeden z moich języków, który działa. Jest strasznie długi, a język jest nowszy od pytania, ale nadal wydaje się osiągnięciem.

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

O Sisi

Sisi to język zabawek inspirowany asemblerem i QBasic. Jest dobry na to wyzwanie, ponieważ jego składnia jest bardzo ograniczona.

  • Ma tylko cztery polecenia: set, print, jump, i jumpif.
  • Wszystkie polecenia mają stały arity.
  • Wszystkie linie muszą mieć numery linii, które ściśle się zwiększają.
  • Wyrażenia są dozwolone tylko w setinstrukcjach. Mogą zawierać (najwyżej) jedną operację, która musi być binarna. W szczególności: zmiana print xxna print -xxto błąd składniowy.
  • Nazwy zmiennych muszą składać się z małych liter.
  • Co najważniejsze: nie ma składni komentarzy !

Program

Rdzeniem programu jest ta część:

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

Przechowujemy 2012w xx, a następnie sprawdzamy, czy to się udało, i zapisujemy wynik testu y. Jeśli yto prawda, przejdź do wiersza 55. (Przeskakuje do nieistniejących numerów wierszy, po prostu szybko przewiń do następnej linii).

Hartowanie radiacyjne

  • Jeśli przypisanie w wierszu 1 zostanie zmodyfikowane, wówczas ynastąpi falsey, skok nie nastąpi, a wiersz 4 ustawi się xxna 2012 rok.
  • Jeśli przypisanie w linii 2 lub warunek skoku w linii 3 zostanie zmodyfikowany, nie obchodzi nas to: xxustawi się na 2012, niezależnie od tego, czy wykonamy skok, czy nie.
  • Cel skoku w linii 3 można zmienić na tak mały jak 5 lub tak duży jak 955. Każda możliwa modyfikacja powoduje, że printprędzej czy później trafi on na linię 955. Nie jest możliwe, aby jedna modyfikacja skoczyła do tyłu (tworząc pętlę) lub przekroczyła końca programu.
  • Jeśli przydział w linii 4 zostanie zmodyfikowany, nie obchodzi nas to: przydział linii 1 będzie poprawny i przeskoczymy obok linii 4.
  • Jeśli linia 955 zostanie zmodyfikowana, możemy mieć problem. Jedyną niefortunną rzeczą w Sisi jest to, że niezainicjowane zmienne domyślnie są 0ustawione, więc taka modyfikacja print axnie jest błędem. Brzydkim, ale skutecznym rozwiązaniem są linie 828-954, które przypisują 2012 do każdej możliwej zmiennej z odległością edycji 1 od xx. Zapewnia to, że wszelkie modyfikacje do wersji ostatecznej print xxbędą nadal drukowane w 2012 roku.
  • Jeśli numer linii zostanie zmodyfikowany, albo: 1) będzie niedziałający i będzie to błąd składniowy, lub 2) nie wpłynie to na przebieg programu. Główna modyfikacja, o którą moglibyśmy się martwić - zmiana linii 4 na 94, a tym samym wstawienie jej po skoku do 55 - nie ma znaczenia, ponieważ wszystko, co robi, to przypisanie 2012 roku xxponownie.

Dobry! Nie mogę wymyślić sposobu na obejście tego. „A” za wysiłek ode mnie, to na pewno! :)
Vilx-

3

Pyton

Mały pełny (teraz z poprawką dla tego nieznośnego średnika między printi (!):

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

@Jeff Burdges: Tak, w tym przypadku ja również polegam na niedopuszczaniu błędów w czasie wykonywania. :)
Dillon Cower

Obawiam się, że nadal jest poprawna składniowo, jeśli przecięcie zwróci pusty zestaw, a pop zgłosi błąd czasu wykonywania . Dodaj więcej 2012s po obu stronach.
Jeff Burdges

@DC: Powiedziałbym, że wyjątek nie jest tym samym, co błąd czasu wykonywania, chociaż wydaje się, że wyjątki w Pythonie nazywane są błędami. pop()wprowadzenie pustego zestawu nie jest samo w sobie błędem, ale powoduje „błąd”.
Williham Totland

1
Wyjątek staje się błędem, gdy nie zostanie złapany.
Ilmari Karonen

1
wstawianie przecinka po popwynikach<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')

Co to jest dialekt SQL? Wygląda jak Transact-SQL (inaczej SQL Server), ale ma do tego niepoprawną składnię.
Vilx

@ Vilx-: Sam testowałem go w SQL Server 2008, kiedy próbowałem go złamać, i działało dobrze.
mellamokb

@mellamokb - To dziwne. To jest dokładnie to, co zrobiłem i narzekałem, że nie możesz przypisać wartości domyślnej do zmiennej (potrzebujesz osobnej instrukcji SET) i nie ma IIF (tylko CASE).
Vilx

1
@ Vilx-: Ach, masz rację. Teraz zdaję sobie sprawę, że faktycznie testowałem na SQL Azure. Z SQL Server 2008 dostaję te same błędy, co ty. Wygląda jednak na to, że działa dobrze w SQL Server 2012 / Azure. Oto wersja demonstracyjna z SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

OK, gratulacje, nie mogę znaleźć żadnego oczywistego sposobu na złamanie tego! :) To nie znaczy, że nie ma żadnych. ;)
Vilx

3

Stworzyłem skrypt Pythona, aby oceniać wszystkie rozwiązania Pythona. Skrypt psuje pierwsze i trzecie rozwiązanie Pythona na wiele różnych sposobów. Drugie rozwiązanie wykorzystujące lambda do obrony, jest niezniszczalne. Drugie rozwiązanie Pythona jest w języku Python 3. Zmodyfikowałem go do formatu Python 2, a następnie program oceniający go zepsuł.

Oto skrypt sędziego.

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) 

chłodny! moja odpowiedź jest do kitu i ciosów jednocześnie
gnibbler

p2zawsze zgłasza wyjątek dla Python2. Wynikiem nigdy nie jest 2012. Twój program oceniający nie będzie działał pod Python3, ponieważ używa instrukcji print.
gnibbler

@gnibbler Nie zauważyłem, że p2jest w Pythonie 3.
Ray

Mam opracowali nową odpowiedź na python2 która przechodzi swój skrypt
gnibbler


2

JavaScript - 68, 77, 84 , 80 znaków

Oto rozwiązanie, które powinno zadziałać w tym roku :)

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

Oto skrzypce testowe .

Aktualizacja 1: Naprawiono problem, w którym eval (+ a) go zepsuł (dzięki eBiznesowi).

Aktualizacja 2: Naprawiono dla „|” sprawa (dzięki jeszcze raz eBiznes).

Aktualizacja 3: Naprawiono przypadek „>” (jeszcze raz dziękuję eBiznesowi). I zepsułem przypadek „1” :(


Nie strzegłeś swojej ewaluacji. eval(+a)i wiele innych modyfikacji działa idealnie, ale nie robi wiele.
aaaaaaaaaaaa

@eBusiness: Dziękujemy za wskazanie eval(+a)sprawy, którą należy teraz naprawić. Ponadto nie udało mi się znaleźć jednego z przypadków modyfikacji, w których działałby dobrze, ale nie wyświetla danych wyjściowych 2012, więc czy możesz podać mi przykład?
Briguy37

eval(0)i eval(-a)na przykład robi to samo.
aaaaaaaaaaaa

Po edycji można go przynajmniej zepsuć, zastępując ||go |.
aaaaaaaaaaaa

5
Zrywa, jeśli zmienisz pierwszy alertna aler=.
jimmy23013

2

Ruby 1.9 - 43 znaki

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

Nie testowane, więc zerwij.


2

Excel, 14 znaków (lekkie oszukiwanie):

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

Każda poprawna zmiana w tablicy wpłynie na zawartość obu komórek, a próba zmiany tylko jednej komórki spowoduje wyświetlenie komunikatu o błędzie.

Oczywiście to się psuje, jeśli weźmiesz pod uwagę, że tak naprawdę jest to tylko jedna formuła, w przeciwieństwie do 2 formuł, które muszą być identyczne.


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

Wyjaśnienie:

  1. Bez zmiany niczego przyjmie następującą ścieżkę: 1 → 2 (i zwróci awartość 2012).
  2. Jeśli treść ciągu azostanie zmodyfikowana w jakikolwiek sposób, przyjmie następującą ścieżkę: 1 → 3 → 5 (i zwróci bniezmienioną wartość 2012).
  3. Jeśli treść ciągu bzostanie zmodyfikowana w jakikolwiek sposób, przyjmie następującą ścieżkę: 1 → 3 → 4 (i zwróci aniezmienioną wartość 2012).
  4. Jeśli a.equals(b)na @ 1 zostanie zmieniony na a.equals(a), b.equals(b)lub !a.equals(b)nadal będzie podążał tą samą ścieżką: 1 → 2 (i zwróci aniezmienioną wartość 2012).
  5. Jeśli azmieni się na @ 2, bto nadal będzie podążał następującą ścieżką: 1 → 2 (i zwróci bniezmienioną wartość 2012).
  6. Jeśli albo w linii 3, 4 lub 5 zostanie zmieniony na alub bprzeciwnie, nadal będzie podążał następującą ścieżką: 1 → 2 (i zwróci aniezmienioną wartość z 2012)
  7. Jeśli treść ciągu @ 3 zostanie zmodyfikowana w jakikolwiek sposób, nadal będzie podążać następującą ścieżką: 1 → 2 (i zwróci aniezmienioną wartość 2012)
  8. Zmiana Mw class Mlub aw main(String[]a)innej ważnej charakteru można zrobić bez żadnych zmian w funkcjonalności kodu.
  9. Każda inna zmiana spowoduje błąd kompilacji (wyłączając niektóre znaki / białe znaki, które można usunąć / dodać).

Wypróbuj wszystkie te modyfikacje tutaj, aby sprawdzić, czy nadal drukują 2012.

Jeśli potrafisz znaleźć sposób na złamanie go zgodnie z zasadami OP, chciałbym wiedzieć, żebym mógł coś wymyślić.
W przeciwieństwie do większości podobnych pytań, w których modyfikowany jest pojedynczy znak, pytanie to pozwala na zachowanie podstawowej struktury języka programowania, aby Java mogła w końcu konkurować jednym wprowadzeniem (spójrzmy prawdzie w oczy, Java prawie nigdy nie wygra niczego na ten SE xD).


Co to jest znak ujemny wstawiany do ścieżki 4 przed a? Czy program będzie nadal generował rok 2012, czy też wyda -2012?
Krowy szarlatan

@KritixiLithos Jest to ciąg znaków, więc nie można wstawić -przed alub b. Oto zrzut ekranu błędu kompilacji.
Kevin Cruijssen

1

Ruby 1.9

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

Buduję ten krótki, ale prosty program, który możesz złamać zgodnie z powyższymi zasadami. Nie mogłem nawet znaleźć pozycji, w której dane wyjściowe zostałyby zmienione (bez złamania kodu), jeśli #wstawiono a, aby skomentować resztę wiersza.


stawia (r = 2012) == 2012? -r: 2012.send (: abs) drukuje „-2012”
Joanis

@ M.Joanis Ale potrzebujesz dwóch dodatkowych znaków: spacji i minusa. Sam minus nie zadziała.
Howard

Ach, masz rację! Błąd kompilacji. Nic nie wiem o Ruby, powinienem być bardziej ostrożny. Przepraszam!
Joanis

1
Zgodnie z irbdodaniem minusa przed rxwynikiem w prawidłowym programie, który wyświetla dane wyjściowe -2012
Konrad Rudolph

2
Zmiana putsna putcpowoduje, że wyświetla to a ?w Ruby 1.9.
histocrat 12.12.12

1

Scala, 95

(lub 54, jeśli pominą nieistotne części)

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

Obawiam się, że nie wiem wystarczająco dużo o Scali, żeby znaleźć jakieś wady. :( Czy inni ludzie mogą popatrzeć?
Vilx-

Na tym poziomie nie jest trudno. Większość twardości Scali wynika ze złożoności systemu typów (którego wciąż nie mogę w pełni zrozumieć: D)
Sarge Barszcz

Nie znam Scali, ale (...),("2012")chyba to złamałem.
jimmy23013

1

DO#

Z pewnością nie jest to takie proste, prawda? ...

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

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

Ok, za czym tęsknię?


1
Co się stanie, jeśli zmienisz 8. linię na „Console.WriteLine (-result);”?
Glenn Randers-Pehrson

Nie ma tutaj kompilatora w języku C #, ale czy nie należy zmieniać wiersza 7, aby if (result += "2012")uzyskać wynik 20122012?
Philipp

hmmmm ... nie myślałem o tym ... z powrotem na desce kreślarskiej
Wojna

@Philipp - Nie, to by się nie skompilowało. Potrzebujesz wartości logicznej jako wartości ifinstrukcji, a nie ciągu.
Vilx-

6
Dodanie ;po elsepowoduje, że wyświetla dwa razy.
jimmy23013

1

PHP, 30

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

Witamy w PPCG! Miły pierwszy post! Czy możesz również dodać wyjaśnienie?
Rɪᴋᴇʀ

2
A oto jak to <?=$i=2012;$i==2012?-$i:2012;?>
pokonam

@ Vilx- Fajnie, nie myślałem o tym.
jsa

Słaba porażka dla dowolnego jedno PHP linii: wstaw cały kod w komentarz <?#$i=2012;$i==2012?$i:2012;?>Rozwiązanie przeciwko temu: wstaw nowy wiersz po $i=2012.
Titus

1

Taxi , 396 bajtów

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.

Sformatowany dla ludzi, to jest:

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.

Po przeczytaniu innych odpowiedzi wydaje się, że rozwiązaniem jest wybranie delikatnego języka, ustawienie wartości, sprawdzenie wartości, wydrukowanie wartości.


1

SmileBASIC

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

Po pierwsze, włączamy tryb ścisły. Zmusza to do zadeklarowania wszystkich zmiennych przed ich użyciem i uniemożliwia takie rzeczy jak zmiana? A $ na? B $.

Następnie tworzona jest zmienna łańcuchowa o nazwie „A $”, a wartość jest ustawiana na „@ 2012”. Aby upewnić się, że wartość A $ nie została zmieniona, program spróbuje przeskoczyć do etykiety, a jedyną etykietą w programie jest @ 2012.

Teraz $ to zdecydowanie „@ 2012”, ale przed wydrukowaniem @ należy usunąć. SHIFT () usuwa pierwszy element z łańcucha lub tablicy (podobnie jak pop (), ale z drugiego końca). Aby odrzucić wartość zwróconą przez SHIFT, jest ona przekazywana do bloku IF / THEN, który nic nie robi. Na wypadek, gdyby ktoś próbował skomentować ten wiersz, deklarujemy zmienną „B”, która jest używana później. Jeśli VAR zostanie skomentowane, ostatni wiersz zgłosi błąd Niezdefiniowana zmienna.

Teraz drukowane jest $ i istnieje kolejna zmienna VAR, aby zapobiec komentarzom. Ostatni wiersz tylko upewnia się, że zmienne B i C zostały zadeklarowane.


OK ... Nic nie wiem o SmileBASIC, więc jest to tylko zgadywanie: ?-A$VAR C- czy to wyjście -2012?
Vilx

To nie zadziała, ponieważ A $ jest ciągiem.
maja 21

Czekaj, mam pomysł! Co z ?B$VAR C:? :)
Vilx-

To spowoduje błąd, ponieważ „B $” nie zostało zadeklarowane.
maja 21

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;

Nieudane podejście:

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

Twoje rozwiązanie Perla można zepsuć, zastępując pierwszy $&czymś takim $0.
Howard

A Haskell zepsuje się, jeśli zastąpisz przecinek znakiem plus. Jednak dzielna próba.
Jeff Burka

Myślę, że nub$filter(\x->x==2012||x==2012)(2012:[2012])może być bezpieczne dla rozwiązania Haskell.
Jeff Burka

Zapomniałem use Englishperla, który to naprawi. Myślę, że kilka poprawek działa dla Haskell, w tym przełączanie na ciągi.
Jeff Burdges

1
Rozwiązanie Perla jest nadal dość kruche. Kilka sposobów, aby go złamać (znaleziono podczas testowania moje własne odpowiedzi ) obejmują zastąpienie printz *rint, prin:, p:intlub #rint, poprzedzenie =do pierwszej linii, lub nawet zastąpienie s/.*/z s/./lub y/.*/(która będzie ustalona przez inicjowanie $ARGaby 2012zacząć). Ponadto twoja $SUBSEPsztuczka nadal nie chroni przed wstawieniem *średnika przed końcowym średnikiem, ale o wiele łatwiejszym rozwiązaniem jest usunięcie tego niepotrzebnego średnika.
Ilmari Karonen

0

PHP, 43 48

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

Wstawianie -między ?i $awyniki -2012są drukowane.
Gareth,

Urocza próba z date(), ale program musi działać również po 2012 roku. ;)
Vilx

@Gareth - hmm :)
The Coder

1
@ Vilx- „Zadaniem jest napisanie programu w swoim ulubionym języku, który wyda rok 2012”, gdzie, jak mówi, musi działać po 2012 roku? :)
The Coder

1
@ TheCoder Ok, teraz zamierzam wstawić mój -między? i abs. ;-)
Gareth,

0

Rubin ( 57 36)

EDYCJA I jeszcze jeden na 36 znaków.

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

Wydaje mi się, że używanie łańcuchów jest dość bezpieczne, ponieważ ta minusowa rzecz już nie działa.


EDYTUJ kolejną próbę (36 znaków) [nieważne, dodanie wyników -po pw -2012]

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


Ten będzie działał tylko w tym roku, ale także w przypadku podobnych konkursów w przyszłości :) (15. znaki)

p Time.now.year

Pamiętaj, że to podstawienie działa również:

p Time.new.year

57 znaków. Jeśli policzysz także nowe wiersze, będzie to również 76 znaków.

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


Pierwsze dwa rozwiązania - dodaj #na początku linii. Ostatnie rozwiązanie - wcześniej wpisz nową linię p. (Uwaga - sam nie znam Ruby, więc może się mylę).
Vilx-

cholera :) masz rację
Patrick Oscity,

Drukuje dla mnie „2012”. Cytaty nie są zgodne - prawda?
użytkownik nieznany

Tak, masz rację. Możesz użyć $><<lub putszamiast tego. Cokolwiek, nie będę już tego próbował, poddałem się :)
Patrick Oscity

0

P 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

itp


I dodając przeczenie ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

nadal generuje wyniki 2012 q){$[-2012~m:2012;m;2012]}` 2012- q){$[2012~m:-2012;m;2012]}` 2012-q){$[2012~m:2012;m;-2012]}` 2012
tmartin

Można to pokonać, zmieniając opcję ;m;na coś takiego jak ;1;lub ;x;.
streetster

0

Hmm .. pozwól mi spróbować:

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 znaków bez białych znaków.

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
Przerwane przez wstawienie „-”, tj. System.out.println(-i)(Dla pierwszego wydruku). Uszkodzony również przez np. Zastąpienie pierwszego println(i)przez np println(1). Potencjalnie uszkodzony również przez zmianę i == jna i += j(lub - = itd.).
TLW

0

PHP

Mam nadzieję, że jest niezniszczalny :)

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

Dodaję jeden znak na końcu tego wiersza: echo(printf("%s",$a)==4)?die(3i dostaję 20123.
Vilx-

Hmm… PHP 5.4.7 działa poprawnie z
kością

Masz rację. Mój błąd. Kontynuacja wyszukiwania ...
Vilx-

PHP 5.3.3 - również poprawne. die () wyświetla tylko łańcuchy, nie wypisuje liczb.
Stanislav Yaglo

Czekaj, DUH, znalazłem to! Po prostu zmień ."2012"na ."FAIL". :)
Vilx-

0

Groovy: 26

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

Nie znam dużo Groovy, ale czy to zadziała? x=2012;print x^2012?2012:-x
Vilx-

po co -?
Armand

@Alison To -jest próba zmodyfikowania kodu za pomocą jednego znaku, aby przestał działać .
Gareth

1
x=2012;print x^=2012?2012:x(zmiana ^na ^=) zmienia wyjście na 0.
histocrat

0

Lua

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

1
Co jeśli usuniesz jeden z tych -znaków?
Vilx

Aha, a jeśli zmienisz jedną z nich 2012na coś innego, to assert spowoduje błąd. Hmm ... wydaje mi się, że zasługujesz na punkty kreatywności za naruszenie zasad. Ale tak na poważnie, nie tak to miało na myśli.
Vilx-
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.