Her zaman “2012” çıktısı alan bir program yazın - değiştirilmiş olsa bile!


116

Bu fikir benim değil, nereden geldiğini bilmiyorum. Bir keresinde çok uzun zaman önce bir programlama yarışmasında tanıştım (1998, doğru hatırlıyorsam). Görev, en sevdiğiniz dilde 2012 ve yalnızca çıktı veren bir program yazmaktır 2012. Yakala, programın karakterlerinden 2012herhangi biri değiştirildikten sonra hala çıkması gerektiğidir . Değişiklik ekleme, silme veya değiştirme olabilir. Elbette, değişiklik, programın sözdizimsel olarak hala geçerli olacağı şekilde olacaktır.

Tüm programlama dillerini bilmediğimden, izleyiciden bana yardım etmelerini ve gönderilen cevapları test etmelerini istemek zorundayım.

Eklendi: Birçok kişi kabul edilebilir değişiklik tanımımın çok belirsiz olduğunu belirtti. İşte ikinci denemem: İzin verilen değişiklikler programınızı sözdizimsel olarak geçerli bırakacak ve çökmesine neden olmayacak. Orada tüm derleme zamanı, bağlantı zamanı ve çalışma zamanı hatalarını kapsaması gerektiğini düşünüyorum. Zaten bazı dillerde bazı garip bir durum olacağından emin olmama rağmen, bu ortaya çıktığında bireysel olarak inceleyeceğiz.


En muhtemel geçersiz adresleri okumak gibi çalışma zamanı hataları hakkında ne düşünüyorsunuz?
aaaaaaaaaaaa

@PeterTaylor - Halen 3 cevap var, C ağır revize edilmiş. Orada ilham arayabilirsin.
Vilx

2
APL'de veya GolfScript'te veya benzer şekilde vecede bunun imkansız olup olmadığını anlayan var mı?
Jeff Burdges,

14
Bu, beni DNA ve artıklık ve kozmik ışınların programlarıma çevirme potansiyeli hakkında düşündürdü. İlginç şeyler.
Jon Purdy

11
... biraz uyumalısın.
Vilx -

Yanıtlar:


65

C, 53 karakter

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

Yazı dilinden biraz daha uzun cevaplar ve aynı temel prensibi izler. C'nin sözdiziminin kısıtlamaları nedeniyle, programı geçersiz kılmaksızın değiştirilebilecek tek harflerin karakter dizileri içinde olduğuna güveniyor!

Düzenleme: 4 karakter kapalı.

Reedit: Sağlamlık arttı, bir karakter traş oldu.

Yeniden denetleme: Daha uzun, ancak daha sağlam. Sadece &şimdi dene ! (Doğru bu sefer).

Güncelleme: Biraz kısaltıldı; Şimdiye kadar görülen çoğu yaklaşımı yener.

Güncelleme: geçersiz kılmak için int değiştirildi; düşünebildiğim kırmak için mümkün olan son yaklaşımı yenmeliyim.

Güncelleme: Başka bir yaklaşıma daldım; sonuncuyu değiştirmek a(çürümesi mümkün) 0; İki harfli isimler kullanarak bu problemi çözmelisiniz.

Güncelleme: Son güncelleme iptal edildi; çalışma zamanı hatalarına neden olan değişikliklerin kabul edilmediğini varsayarak; asadece iyi çalışacak.

Güncelleme: Biraz daha geriye gitme; *acaydırmaya teşebbüs etmek ayrıca farklılaşacaktır; bu nedenle void, derleme hatasını düzeltmek için kullanmak gerekli olmamalıdır.

Güncelleme: Ve son bir kısalma; bu "2012", ancak bir adrese yerleştirilen dizgiye dayanır (yaygın olan); ve bu değişmez dizgiler salt okunurdur (ayrıca yaygındır).

Güncelleme: Bana iki karaktere mal oldu, ama cılız yarı kolonunu yendim!


2
@PaulR: Şimdi register void; registerEngellenmesi için yerleştirilmiştir &; voidönlemek için vardır *.
Williham Totland,

6
Tamam ... bu geçersiz C ise beni düzelt, ama sadece VS2010'umda çalıştı. Bir ekleme ;arasındaki putsve (.
Vilx -

39
+1, Tebrikler, çivilenmiş olduğunu düşünüyorum. Kodunuzdaki olası her bir char varyasyonunu derlemeye ve çalıştırmaya çalışan basit bir test cihazı yazdım ve her biri ya derlemedi, çökmedi ya da yazdırılmadı 2012! (Yerleştirme ve değiştirme testleri için yalnızca yazdırılabilir ASCII karakterleri kullandım, ancak repertuarın genişletilmesinin yardımcı olacağından şüpheliyim.)
Ilmari Karonen

3
@IlmariKaronen: Heh, bu çok fazla çaba; Tüm bunlara katlandığınız için teşekkürler. :)
Williham Totland,

1
@Titus: geçişten demek durumunda ==için !=sizi hiçbir yere götürmez üçlü, içinde; çıktı almak yerine aşimdi çıktı verir "2012".
Williham Totland,

38

Haskell, 19

(\xx@2012->xx)$2012

veya, tam bir program olarak,

29

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


Biraz daha eğlence için:

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


Yalnızca bir çalışma zamanı hatası verecek şekilde değiştirilemeyen birini elde etmek için bilgileri yalnızca bir karakterlik değişiklikler kullanılarak değiştirilemeyen listelerin uzunluklarında kodlayabiliriz.

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

Daha değiştirilebilir hale getirmek için (güvenli bir şekilde), sayının kendisini liste öğesi olarak da kullanabiliriz - sadece virgüllerin birbiriyle değiştirilmesini önlemek için dizeleri yapmanız yeterlidir ':

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

Bu dize sadece ifadenin bir sonucu olduğu için, yine bununla değiştirebiliriz - Haskell'in tembelliği sayesinde sorun değil

64 72

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

Burada init"eksi bir, fakat negatif değil" gibi davranır.


Ayrıca fazlalık düzeni tip sistemini içerir ve daha sonra bir şekilde numarayı yazabilir olabilir tek karakterlik değişikliklerle değiştirilebilir ...

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

Artık herhangi birini değiştirebilecek uiçin ptersi, ama bu ikinci tanımlama grubu elemanı daima pisliği liste istiflere derinliklerini olur ve böylece bir derleme zamanı hatası tetikler.

Bu fikir, bütün metinlerin kompakt bir şekilde kodlanabileceği, okunması ve düzenlenmesi kolay olduğu ve tek karakterlerin değiştirilmesinden korunabileceği şekilde genişletilebilir.


Ve bir tane daha ...

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
Maalesef, çalışma zamanında bir istisna atılsa da, bu derleme sadece iyi bir şekilde değiştirildi .
Jeff Burdges

3
@JeffBurdges: Elbette, buna "dahil olmasına ve çarpmasına neden olmayacak" dedim.
counterclockwis'i

1
İçin a=map(head.show.length)[[a,a],[],[a],[a,a]]bir çözüm, eklemek aarasında []. Yine de bu yazıyı çok beğendim! Çok akıllıca çözümler.
Dillon Cower,

9
29 karakterli programınızın tüm 5825 varyasyonunun (ASCII karakterleri 32-126 değiştirmek veya eklemek) beklendiği gibi çalıştığını doğruladım. İşte kullandığım test betiği . Diğer dilleri de içeren diğer programları test etmek için kolayca ayar yapılabilir. Uyarı: Dizüstü bilgisayarımda çalışması neredeyse 1 saat sürdü :)
Hammar

1
[a]-> []64-char çözümünde
John Dvorak

14

JavaScript

Bunun çalışma zamanının hatasız olduğuna inanıyorum, herhangi bir değişiklik derleme hatasıyla sonuçlanmalı ya da 2012'yi söyleyen tek bir uyarıyla sonuçlanmalı.

Düzenleme: Kod gibi bir konuda çalışma zamanı hatası yapardı if("alert(2012 "==r), bununla başa çıkmak için deneme bölümünü taşıdım.

Düzenleme: Güzel bir Vilx-, ancak sabitlenebilir :-) Şimdi bu noktalı virgül eklemek için bir dirsek uyuşmazlığı var.

Düzenleme: Ama sonra bir virgül noktalı virgül ile aynı şeyi yapabilir, bu bir çok seçenek var, sanırım çözdüm, ama şimdi çok fazla kod var.

Düzenleme: Biraz basitleştirilmiş.

Düzenleme: Sonsuz bir dizi hata düzeltmesinde bir tane daha.

Düzenleme: Bu tür kurşun geçirmez daha uzun ve karmaşık hissediyor, ama en azından ~evalve dikkat etmeli !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
Çünkü mesela hangi değerlendirmenin değerlendirmeden önce dönüştüğü, q-")"geri döndüğü için döndürür . Yapması gereken garip bir şey, ama teknik olarak okunaklı, bu yüzden yakalamak yakalamak değil. NaN"NaN"NaN
aaaaaaaaaaaa

4
C çözümüyle aynı şey - ve ;arasını ekleyin . eval(
Vilx

1
Yorum okuyucuları için, noktalı virgül güvenlik açığı sabittir, kodun şimdi temiz olduğuna inanıyorum.
aaaaaaaaaaaa

4
Bunun sayılıp sayılmadığından emin değiliz ama nedenlerin ~önüne bir kez koymak, bir kez değil iki kezeval yankılanmasına neden olur . Bunun kurallara 2012
uyup

2
Bir ekleme !sonra eval(sonları o.
jimmy23013

13

Perl, 49 karakter

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

Dayanarak JB cevabı , ama bu aslında spec karşılar . Kapsamlı bir kontrol, her bir karakter silme, ekleme veya değiştirme işleminin ya çıktıyı değiştirmeden bıraktığını veya çalıştırıldığında programın çökmesine neden olduğunu (sıfır olmayan bir dönüş değeri ile belirtildiği ve stderr çıktısı), en azından ekler ve değiştirmeler yazdırılabilir ASCII karakterleriyle sınırlıdır.

(Kısıtlama olmadan, Perl'de görev imkansızdır: Perl ayrıştırıcısının az bilinen bir özelliği , bir Ctrl-D veya Ctrl-Z karakteriyle karşılaştığında durmasıdır. hiçbir şey yapmadan geçerli bir Perl programına girer.)

Düzenleme:1==print ile değiştirerek bir daha char char Tıraş0-print .


Perl 5.28 ile molalar , 1 :-P yerine printgeri dönmeye başlar'true'
JB

3
@JB: Bu gerçekleştiğinde oy veremezsiniz. :) (Diğer okuyucuların yararına, bu bir şakadır. Bildiğim kadarıyla, açıkça belgelenmemişprint olsa bile, Perl 5'in herhangi bir sürümünün geri dönüş değerini değiştirme planı yoktur .)
Ilmari Karonen

12

brainfuck

Kendimi bunun mümkün olduğuna ikna etmeye çalışıyorum ve bunu çok fazla uzatmış olabileceğime oldukça eminim. Çevrem hakkında birkaç varsayımda bulundum:

  1. Sonsuz bir döngü 'çökme' olarak kabul edilir. Bazı tercümanlarda sıfırı düşürerek veya hafıza konumu sıfırın soluna düşürerek benzer bir koşul elde edilebilir. Birçok tercümanın çalışma zamanında çökmesi zordur. Durma problemini sadece en basit, en açık sonsuz döngüyü kullanarak önlüyorum.
  2. Eşsiz köşeli parantezler bir derleme hatası olarak kabul edilir.
  3. Bu, yalnızca programın çıktısının kendi girişine geri gönderildiği bir ortamda çalışacaktır. Bunu gerçekten '2012' çıktısı yaptığını doğrulamak için kullanıyorum. Bu, çıktı karakterlerinden birini silmeyi başarabilmemin tek yolu.

Ne yazık ki, daha sertleşirse korkarım bu imkansız olacak. İşte benim çözümüm:

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

Temel olarak, çıkış kodunu veya doğrulama kodunu değiştirebilirsiniz, ancak ikisini birden değil. Bunlardan biri çalışması garantilidir. Bunlardan biri olmazsa 'çarpacaktır'.


5
Ahh, beyinsiz! Sen sadece HAD yaptın, değil mi? XD
Vilx

8
onun yerine boşluk kullanmasını tercih eder miydin?
NRGdallas

7

Python2

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

Stdout yönlendirmesi kırılırken bunu test etmek için Ray'in test komut dosyasını biraz değiştirmek zorunda kaldım . Çalıştırmak için boş işaretler geçmek, ad alanını kirletmekten kaçınır

exec(prog, {}, {})

Harika! Yaparsın!
Ray

6

Brain-Flak , 44 + 3 = 47 bayt [Rekabet Etmeyen]

Bu Brain-Flak'ın -Abayrağını kullanır ve karakterleri 2012STDOUT'a çıkarır

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

Çevrimiçi deneyin!

Alternatif, 50 bayt

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

Çevrimiçi deneyin!

açıklama

Yukarıdaki kodlardan herhangi birinde yapılan tek karakter değişikliği, programın hata yapmasına neden olur.


3
Ha! Meydan okuma için doğru dil.
DLosc

4

Sisi , rakipsiz

Sonunda çalışan dillerimden birini buldum. Korkunç derecede uzun ve dil sorudan daha yeni, ancak yine de bir başarı gibi geliyor.

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

Sisi hakkında

Sisi, meclis ve QBasic'ten ilham alan bir oyuncak dilidir. Bu zorluk için iyidir çünkü sözdizimi son derece sınırlıdır.

  • Sadece dört komutları vardır: set, print, jump, vejumpif .
  • Tüm komutların sabit durumu vardır.
  • Tüm satırların kesinlikle artan satır numaralarına sahip olması gerekir.
  • İfadelere yalnızca setifadelerde izin verilir . İkili olması gereken (en fazla) yalnızca bir işlem içerebilirler. Özellikle: Değişen print xxiçinprint -xx bir yazım hatasıdır.
  • Değişken isimleri küçük harflerden oluşmalıdır.
  • En önemlisi: yorum sözdizimi yok !

Program

Programın özü bu kısım:

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

Biz saklamak 2012içinde xxo başarılı olup olmadığını test etmek ve test sonucunu saklamak, y. Eğery truthy olduğunu 55'e satır atlama (varolmayan satır numaraları sonraki satıra sadece hızlı ileri atlar.)

Radyasyon sertleştirme

  • 1. satırdaki atama değiştirilmişse, o yzaman falsey, atlama olmaz ve 4. satır ayarlanır.xx 2012'ye .
  • 2. satırdaki atama veya 3. satırdaki atlama koşulu değiştirilirse, umursamayız: xxatlama yapıp yapmamamız 2012'ye ayarlanır.
  • Satır 3'teki atlama hedefi, 5 kadar küçük veya 955 kadar büyük olarak değiştirilebilir. print 955 veya daha sonra on line üzerine . Bir değişiklik yapıldığında geriye doğru atlamak (bir döngü oluşturmak) veya programın sonundan geçmek mümkün değildir.
  • 4. satırdaki atama değiştirilirse, umrumda değil: 1. satırın ataması doğru olacak ve 4. satırı geçeceğiz.
  • Satır 955 değiştirilirse, bir sorunumuz olabilir. Sisi ile ilgili talihsiz olan tek şey, başlatılmamış değişkenlerin varsayılan olarak ayarlandığı 0, yani benzeri bir değişiklik print axbir hata değildir. Çirkin ama etkili çözüm, 1'den bir düzenleme mesafesi olan her olası değişkeni 2012'ye atanan 828-954 çizgileridir xx. Bu, finalde herhangi bir değişiklik yapılmasını sağlarprint xx yapılacak 2012'yi basmasını sağlayacaktır.
  • Bir satır numarası değiştirilirse: 1) sıra dışı olacak ve bir sözdizimi hatası olabilir veya 2) program akışını etkilemeyecektir. Endişelenebileceğimiz ana değişiklik - satır 4 ila 94 arasında değişmek, böylece 55 atlamadan sonra eklemek - farketmez, çünkü tüm yaptığı 2012'yi xxtekrar atamaktır .

İyi bir! Bunu atlatmanın bir yolunu düşünemiyorum. Benden çaba için "A", bu kesin! :)
Vilx

3

piton

Biraz ayrıntılı (şimdi printve (! Arasındaki sinir bozucu noktalı virgül için bir düzeltme ile ):

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

@Jeff Burdges: Evet, bununla çalışma zamanı hataları için de izin verilmiyor. :)
Dillon Cower,

Korkarım , kesişme boş kümeyi verirse ve pop bir çalışma zamanı hatası verirse, sözdizimsel olarak doğru olur . Her iki tarafa daha fazla 2012 ekleyin.
Jeff Burdges

@DC: İstisnaların çalışma zamanı hatasıyla aynı olmadığını söyleyebilirim, buna rağmen Python'da istisnalar deniyor. pop()boş kümeyi oluşturmak kendi başına bir hata değildir, ancak bir 'Hata' oluşturur.
Williham Totland,

1
Bir istisna, yakalanmadığında hata olur.
Ilmari Karonen

1
popçıkışlardan sonra virgül ekleme<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')

Hangi SQL lehçesi bu? Transact-SQL'e (aka SQL Server) benziyor, ancak bunun için geçersiz sözdizimi var.
Vilx

@ Vilx-: Onu kırmaya çalışırken SQL Server 2008'de kendim denedim ve gayet iyi çalıştı.
mellamokb

@ mellamokb - Bu garip. Aynen öyle yaptım ve değişkene varsayılan bir değer atayamayacağınızdan (ayrı bir SET deyimine ihtiyacınız var) ve IIF (sadece CASE) olmadığından şikayet etti.
Vilx

1
@ Vilx-: Ah, haklısın. Şimdi fark ettim ki aslında SQL Azure üzerinde test yapıyordum. SQL Server 2008 ile aynı hataları size alıyorum. Ancak, SQL Server 2012 / Azure'de iyi çalışıyor gibi görünüyor. İşte SQL 2012 ile bir demo: sqlfiddle.com/#!6/d41d8/27
mellamokb

Tamam, tebrikler, bunu kırmanın bariz yollarını bulamıyorum! :) Bu olmadığını söylemek değil. ;)
Vilx

3

Tüm python çözümlerini değerlendirmek için bir python betiği hazırladım. Senaryo, birinci ve üçüncü python çözümlerini, birçok farklı yöntemle kırar. Ve ikinci çözelti kendini korumak için lambda kullanır, kırılmazdır. İkinci python çözeltisi python 3'tür. Python 2 formatına dönüştürdüm ve sonra yargı programı onu kırdı.

İşte hakim senaryosu.

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) 

güzel! cevabım aynı anda berbat ve aynı zamanda esiyor
gnibbler

p2her zaman Python2 için bir istisna atar. Çıktı hiçbir zaman 2012 değildir. Hakim programınız, basılı ifadeleri kullandığı için Python3 altında çalıştırılmayacaktır.
gnibbler

@gnibbler Bunun p2python 3'te olduğunu fark etmedim .
Ray

Bir dışarı çalıştık yeni cevap Senaryonu geçer Python2 için
gnibbler

3

Mathematica, 23 karakter

Not: "/." "değiştir" anlamına gelir

2012/.Except@2012->2012

2
Bu zayıf bir cevap / yenilginin tür olabilir ama değişebilir /.için //(sonek formu).
Dillon Cower,

@DillonCower İyi yakala!
Dr. Belisarius

2

Javascript - 68, 77, 84 , 80 karakter

İşte bu yıl çalışması gereken bir çözüm :)

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

İşte test keman .

Güncelleme 1: eval (+ a) 'nın kırdığı sorun giderildi (eBusiness sayesinde).

Güncelleme 2: '|' için düzeltildi durumda (tekrar teşekkürler eBusiness).

Güncelleme 3: '>' durumu için düzeltildi (tekrar teşekkürler eBusiness). Ve '1' davası için kırdı :(


Sen değerlendirmeni korumadın. eval(+a)ve pek çok başka modifikasyon da gayet iyi çalışıyor ancak bir sürü şey yapmıyor.
aaaaaaaaaaaa

@ eBusiness: Davayı gösterdiğiniz için teşekkürler eval(+a), şimdi düzeltilmesi gerekiyor. Ayrıca, iyi çalıştığı ancak 2012 çıktısı almayan değişiklik durumlarından birini bulamadım, lütfen bana bir örnek verir misiniz?
Briguy37,

eval(0)ve eval(-a)örneğin aynı şeyi yapar.
aaaaaaaaaaaa,

Mesaj düzenleme en azından değiştirerek kırılabilir ||ile |.
aaaaaaaaaaaa

5
İlk değiştirirseniz Sonları alertiçin aler=.
jimmy23013,

2

Yakut 1.9 - 43 karakter

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

Test edilmedi, bu yüzden ayrılın.


2

Excel, 14 karakter (biraz hile):

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

Dizideki geçerli herhangi bir değişiklik, her iki hücrenin içeriğini etkiler ve yalnızca bir hücreyi değiştirmeye çalışmak bir hata iletisini tetikler.

Tabii ki, özdeş olmakla sınırlı 2 formülün aksine, sadece bir formül olduğu görüşünü alırsanız bu bozuluyor.


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

Açıklama:

  1. Herhangi bir şeyi değiştirmeden aşağıdaki yolu izleyecektir: 1 → 2 (ve adeğerini döndürecektir 2012).
  2. String içeriği aherhangi bir şekilde değiştirilirse, aşağıdaki yolu izleyecektir: 1 → 3 → 5 (ve bdeğeri değişmeden geri dönecektir 2012).
  3. String içeriği bherhangi bir şekilde değiştirilirse, aşağıdaki yolu izleyecektir: 1 → 3 → 4 (ve adeğeri değişmeden geri dönecektir 2012).
  4. Eğer a.equals(b)@ 1 için modifiye edilir a.equals(a), b.equals(b)ya da !a.equals(b)1 2 → (ve döndürür: hala aynı Aşağıdaki yolu alacak a's değişmeden değeri 2012).
  5. Eğer a@ 2 olarak değiştirildi b1 → 2 (ve döndürür: bunun yine de aşağıdaki yolu alacak b's değişmeden değeri 2012).
  6. Eğer 3, 4 veya 5 numaralı hatlardan biri ya ada btam tersi olarak değiştirilirse, yine de aşağıdaki yolu izleyecektir: 1 → 2 (ve adeğeri değişmeden geri dönecektir 2012)
  7. @ 3'teki Dize'nin içeriği herhangi bir şekilde değiştirilirse, aşağıdaki yolu izleyecektir: 1 → 2 (ve adeğeri değişmeden geri dönecektir 2012)
  8. Değişen Miçinde class Mveya aiçinde main(String[]a)başka bir geçerli karakterin kod işlevselliğine herhangi bir değişiklik olmadan yapılabilir.
  9. Başka bir değişiklik, bir Derleme hatasına neden olur (çıkarılabilecek / eklenebilecek giriş / boşlukların bazıları hariç).

Tüm bu değişiklikleri burada deneyin, hepsinin hala 2012'yi yazdırdıklarını doğrulayın.

OP'nin kurallarına uyarak onu kırmanın bir yolunu bulabilirseniz, bilmek isterim, bu yüzden düzeltecek bir şey düşünebilirim.
Tek bir karakterin değiştirildiği çoğu benzer sorudan farklı olarak, bu soru söz konusu programlama dilinin temel yapısının bozulmadan kalmasına izin verir, böylece Java sonunda bir girişte yarışabilir (yüz yüze bakalım, Java hemen hemen hiçbir şey kazanamaz) bu SE xD).


4 yolundan önce eklenmiş negatif işareti nedir a? Program hala 2012 olarak mı çıkacak, yoksa -2012 olarak mı çıkacak?
İnekler,

Bir ekleyemezsiniz, böylece String var @KritixiLithos -önce aveya b. İşte Derleme hatasının bir ekran görüntüsü.
Kevin Cruijssen

1

Yakut 1.9

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

Yukarıdaki kurallara göre kırmaya davet ettiğiniz bu kısa ama basit programı yapıyorum. #Satırın geri kalanını yorumlamak için a eklenmişse , çıkışın değiştiği bir konumu bile bulamadım (kodu kırmadan) .


koyar (r = 2012) == 2012? -r: 2012.send (: abs) "-2012" yazdırıyor
Joanis

@ M.Joanis Fakat iki ek karaktere ihtiyacınız var: boşluk karakteri ve eksi. Yalnız bir eksi işe yaramaz.
Howard

Ah, haklısın! Derleme Hatası. Ruby hakkında hiçbir şey bilmiyorum, daha dikkatli olmalıyım. Üzgünüm!
Joanis

1
Buna göre irb, rxsonuçlara eksi çıktı veren geçerli bir programa ekleyerek -2012
Konrad Rudolph

2
Bunun Ruby 1.9'da bir çıkış putsyapmasına putcneden olarak değiştirilmesi ?.
Histocrat

1

Scala, 95

(veya anlamlı olmayan parçaları atlarsanız 54)

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

Korkarım Scala hakkında herhangi bir kusur bulmak için yeterince bilgim yok. :( Diğer insanlar lütfen bir göz atabilir mi?
Vilx-

Bu seviyede zor değil. Scala sertliğinin çoğu, tür sisteminin karmaşıklığından kaynaklanmaktadır (hala tam olarak anlayamıyorum: D)
Sarge Borsch

Scala'yı tanımıyorum ama (...),("2012")kırmış gibiydi.
jimmy23013

1

C #

Elbette bu kadar basit değil, değil mi? ...

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

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

Tamam, ne özlüyorum?


1
Sekizinci satırı "Console.WriteLine (-result);" olarak değiştirirseniz ne olur?
Glenn Randers-Pehrson

Burada C # derleyicisi yok, ancak satır 7'yi if (result += "2012")çıktı yapmak için değiştirmemeli 20122012mi?
Philipp

hmmmm ... bunu düşünmemiştim ... geri çizim tahtasına dön
Savaş

@Philipp - Hayır, bu derleme olmaz. ifBir dizge için değil, bir deyim için bir değer olarak bir boole gereklidir .
Vilx

6
Bir ekleme ;SONRA elseiki kez verir hale getirir.
jimmy23013

1

PHP, 30

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

PPCG'ye Hoşgeldiniz! Güzel ilk mesaj! Ayrıca bir açıklama ekleyebilir misiniz?
Rɪᴋᴇʀ

2
Ve işte bunu nasıl yeneceğim:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx -

@ Vilx- Güzel, bunu düşünmemiştim.
jsa

Herhangi bir tek satırlık PHP çözümü için topal bir yenilgi: tüm kodu bir yoruma yazın <?#$i=2012;$i==2012?$i:2012;?>Çözüm Buna karşı: yeni bir satır ekleyin $i=2012.
Titus

1

Taksi , 396 bayt

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.

İnsanlar için biçimlendirilmiş, bu:

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.

Diğer cevapları okumak, çözümün kırılgan bir dil seçmek, değeri ayarlamak, değeri kontrol etmek, değeri yazdırmak gibi görünüyor.


1

SmileBASIC

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

İlk önce katı modu etkinleştirdik. Bu, kullanmadan önce tüm değişkenleri bildirmenizi zorlar ve? A $ 'dan? B $' a değiştirmek gibi şeyleri önler.

Ardından, "A $" adlı bir dize değişkeni yaratılır ve değer "@ 2012" olarak ayarlanır. A $ değerinin karıştırılmadığından emin olmak için program bir etikete atlamaya çalışır ve programdaki tek etiket @ 2012'dir.

Şimdi, A $ kesinlikle "@ 2012" dir, ancak yazdırmadan önce @ kaldırılmalıdır. SHIFT (), bir dize veya dizideki ilk öğeyi kaldırır (tıpkı pop () gibi, ancak diğer ucundan). SHIFT tarafından döndürülen değeri silmek için hiçbir şey yapmayan bir IF / THEN bloğuna geçirilir. Birisinin bu hattı yorumlamaya çalışması durumunda, daha sonra kullanılacak olan "B" değişkenini ilan ederiz. VAR yorumlanırsa, son satır Tanımsız bir değişken hatası verir.

Şimdi, A $ yazdırılıyor ve yorumları engellemek için başka bir VAR var. Son satır sadece B ve C değişkenlerinin her ikisinin de bildirilmiş olmasını sağlar.


Tamam ... SmileBASIC hakkında hiçbir şey bilmiyorum, bu yüzden bu tamamen bir tahmin: ?-A$VAR C- bu çıktı olabilir -2012mi?
Vilx

Bu işe yaramaz çünkü A $ bir karakter dizisidir.
12Me21

Bekle, bir fikrim var! Ne hakkında: ?B$VAR C? :)
Vilx-

Bu, "B $" bildirilmediğinden bir hata tetikler.
12Me21

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;

Başarısız yaklaşım:

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

İlk Perl $&gibi bir şeyle değiştirerek Perl çözümü bozulabilir $0.
Howard

Ve virgülün yerini artı işaretiyle değiştirirseniz Haskell kırılır. Valiant girişimi olsa.
Jeff Burka,

nub$filter(\x->x==2012||x==2012)(2012:[2012])Haskell çözümü için güvenli olabileceğini düşünüyorum .
Jeff Burka,

use EnglishPerl'i unuttum, düzeltecek. Bence çok sayıda düzeltme, dizgelere geçiş de dahil olmak üzere Haskell için çalışıyor.
Jeff Burdges,

1
Perl çözümü hala oldukça kırılgan. (Test ederken buldum kırmak için bazı yollar kendi cevap ) değiştirilmesini içermektedir printile *rint, prin:, p:intveya #rint, prepending =ilk satırına, hatta değiştirilmesi s/.*/ile s/./ya da y/.*/(başlatılırken düzeltilebilir hangi $ARGüzere 2012başlamak için). Ayrıca, $SUBSEPpüf noktanız hala *son noktalı virgülün önüne bir tane eklemeyi engellemez , ancak çok daha kolay bir çözüm bu gereksiz noktalı virgülün kaldırılmasıdır.
Ilmari Karonen

0

PHP, 43 48

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

Yazdırılmakta -olan ?ve arasında bir $asonuç ekleme -2012.
Gareth

Şirin girişimde bulunmakla birlikte date(), programın 2012 ötesinde de çalışması gerekiyor. ;)
Vilx

@Gareth - hmm :)
Kodlayıcı,

1
@ Vilx- "Görev, 2012'yi çıkaran en sevdiğiniz dilde bir program yazmaktır" nerede 2012'nin ötesinde çalışması gerektiğini söylüyor? :)
Kodlayıcı,

1
@TheCoder Tamam, şimdi arasımı ekleyeceğim -? ve abs. ;-)
Gareth

0

Yakut ( 57 36)

EDIT 36 karakterde bir tane daha.

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

Sanırım dizeleri kullanmak oldukça başarısız oluyor çünkü eksi olayı artık işe yaramıyor.


Bir sonraki denemeyi EDIT yapın (36 karakter) [boşver, -sonra bir psonuç ekleyerek -2012]

p [2012, 2012]. bul (2012). ilk || 2012


Bu sadece bu yıl çalışacak, aynı zamanda gelecekteki benzer yarışmalar için de :)

p Time.now.year

Bu ikame işleminin de çalıştığını unutmayın:

p Time.new.year

57 karakter. Eğer newlines sayılırsa, yine de 76 karakter.

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


İlk iki çözüm - #satırın başına bir a ekleyin . Son çözüm - önce yeni bir satır girin p. (Not - Ruby'yi kendim tanımıyorum, bu yüzden belki de yanılıyorum).
Vilx

kahretsin :) haklısın
Patrick Oscity

Benim için "2012" yazdırır. Tırnaklar uygun değil - öyle mi?
kullanıcı bilinmeyen,

Evet haklısın. Kullanabilir $><<ya da putsonun yerine. Her neyse, bunu daha fazla deneyemeyeceğim, pes
ettim

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

vb


Ve bir negatif ( -) ekleyerek ? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

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

Bu, veya ;m;gibi bir şey için kapatılarak yenilebilir . ;1;;x;
streetster

0

Hmm .. deneyeyim:

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

Boşluksuz 128 karakter.

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
"-", yani System.out.println(-i)(ilk baskı için) eklenerek kırılmış . Ayrıca örneğin ilk değiştirerek kırık println(i)ile örn println(1). Ayrıca potansiyel olarak değiştirerek kırık i == jiçin i += j(- =, vs ya da).
TLW

0

PHP

Umarım kırılmazdır :)

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

Bu satırın sonuna bir karakter ekliyorum: echo(printf("%s",$a)==4)?die(3ve anladım 20123.
Vilx

Hmm… PHP 5.4.7 kalıpla doğru çalışıyor (3.
Stanislav Yaglo 27:00

Haklısın. Benim hatam. Aramaya devam ediyor ...
Vilx-

PHP 5.3.3 - de doğru. die () yalnızca karakter dizileri çıkarır, sayı vermez.
Stanislav Yaglo

Bekle, DUH, buldu! Sadece değiştirmek ."2012"için ."FAIL". :)
Vilx

0

Groovy: 26

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

Groovy'yi fazla tanımıyorum, ama bu işe yarar mı? x=2012;print x^2012?2012:-x
Vilx

ne -için
Armand

@Alison Artık -bir daha çalışmaması için kodunuzu bir karakterle değiştirmeye çalışın.
Gareth

1
x=2012;print x^=2012?2012:x(değiştirme ^için ^=0 çıkış değişir)
histocrat

0

Lua

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

1
Ya bu -işaretlerden birini silerseniz ?
Vilx

Oh, ve bunlardan birini 2012başka bir şeye değiştirirseniz, iddia bir hataya yol açar. Hmm ... iyi, sanırım kuralları kötüye kullanmanın yaratıcılık noktalarını hak ediyorsun. Ama cidden, bunun anlamı bu değildi.
Vilx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.