Tulis program yang selalu menghasilkan "2012" - bahkan jika itu diubah!


116

Ide ini bukan milik saya, meskipun saya tidak tahu dari mana asalnya. Saya pernah bertemu di kontes pemrograman sangat lama (1998, jika saya ingat dengan benar). Tugasnya adalah menulis sebuah program dalam bahasa favorit Anda yang 2012 hanya menghasilkan dan2012 . Tangkapannya adalah bahwa program harus tetap menampilkan 2012setelah salah satu karakternya dimodifikasi. Modifikasi dapat berupa penyisipan, penghapusan atau penggantian. Tentu saja, modifikasi akan sedemikian rupa sehingga program tersebut masih valid secara sintaksis.

Karena saya tidak tahu semua bahasa pemrograman, saya harus meminta hadirin untuk membantu saya dan menguji jawaban yang diajukan.

Ditambahkan: Banyak yang berkomentar bahwa definisi saya tentang modifikasi yang dapat diterima terlalu kabur. Inilah upaya kedua saya: Modifikasi yang diizinkan akan membuat program Anda valid secara sintaksis dan tidak akan menyebabkannya macet. Di sana, saya pikir itu harus mencakup semua kesalahan waktu kompilasi, waktu tautan, dan waktu berjalan. Meskipun saya yakin bahwa akan ada beberapa kasus tepi aneh dalam beberapa bahasa, jadi ketika itu muncul kita akan melihatnya secara individual.


Bagaimana dengan kesalahan runtime seperti membaca alamat yang kemungkinan besar tidak valid?
aaaaaaaaaaaa

@PeterTaylor - Sudah ada 3 jawaban, jawaban C dengan revisi berat. Anda bisa mencari inspirasi di sana.
Vilx-

2
Adakah yang tahu jika ini tidak mungkin di APL atau GolfScript atau dengan cara yang sama?
Jeff Burdges

14
Ini membuat saya berpikir tentang DNA dan redundansi dan potensi sinar kosmik untuk membalik bit dalam program saya. Hal yang menarik.
Jon Purdy

11
... Kamu butuh tidur.
Vilx-

Jawaban:


65

C, 53 karakter

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

Sedikit lebih lama dari jawaban bahasa scripting, dan mengikuti prinsip dasar yang sama. Bergantung pada kenyataan bahwa karena kendala sintaks C, satu-satunya huruf yang mungkin dapat diubah tanpa membuat program tidak valid adalah dalam string!

Sunting: Memotong 4 karakter.

Reedit: Robustness meningkat, mencukur satu karakter.

Redit: Lebih lama, tetapi lebih kuat. Coba saja &sekarang! (Benar kali ini).

Pembaruan: Diperpendek sedikit; mengalahkan sebagian besar pendekatan yang terlihat sejauh ini.

Pembaruan: Diubah ke membatalkan; harus mengalahkan pendekatan terakhir yang mungkin untuk mematahkannya yang bisa saya pikirkan.

Pembaruan: Saya menemukan pendekatan lain; mengganti yang terakhir a(semoga busuk) dengan 0; menggunakan nama dua huruf harus mengatasi masalah itu.

Pembaruan: Pembaruan terakhir dicabut; dengan asumsi perubahan yang menyebabkan kesalahan runtime tidak diizinkan; aakan bekerja dengan baik.

Pembaruan: Mundur beberapa lagi; upaya untuk mereduksi *ajuga akan memisahkan; jadi menggunakan voiduntuk menggoda kesalahan kompilasi dari itu seharusnya tidak perlu.

Pembaruan: Dan pemendekan akhir; yang bergantung pada string "2012"yang ditempatkan di tetapi satu alamat (yang umum); dan bahwa string literal hanya-baca (juga umum).

Update: Harganya dua karakter, tapi saya mengalahkan semi-colon kecil Anda!


2
@ PaulR: Sekarang diubah menjadi register void; Ada di registersana untuk mencegah &; yang voidada untuk mencegah *.
Williham Totland

6
OK ... koreksi saya jika ini tidak valid C, tetapi itu hanya bekerja pada VS2010 saya. Masukkan ;antara putsdan (.
Vilx-

39
+1, Selamat, saya pikir Anda sudah berhasil. Saya menulis test harness sederhana yang mencoba untuk mengkompilasi dan menjalankan setiap variasi satu-char yang mungkin dari kode Anda, dan setiap satu dari mereka tidak mengkompilasi, crash atau dicetak 2012! (Saya hanya menggunakan karakter ASCII yang dapat dicetak untuk tes penyisipan dan subtitusi, tapi saya ragu memperluas repertoar akan membantu.)
Ilmari Karonen

3
@IlmariKaronen: Heh, itu banyak usaha; terima kasih sudah melalui semua itu. :)
Williham Totland

1
@Itus: Jika Anda bermaksud pindah ==ke !=ternary, itu tidak membawa Anda ke mana-mana; bukannya keluaran asekarang keluaran "2012".
Williham Totland

38

Haskell, 19

(\xx@2012->xx)$2012

atau, sebagai program lengkap,

29

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


Untuk sedikit lebih menyenangkan:

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


Untuk mendapatkan satu yang tidak dapat dimodifikasi sedemikian rupa sehingga hanya menghasilkan kesalahan runtime, kita dapat menyandikan informasi dalam panjang daftar yang tidak dapat dimodifikasi hanya dengan menggunakan satu karakter-perubahan, yaitu

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

Untuk membuatnya lebih dapat dimodifikasi (aman), kita juga dapat menggunakan nomor itu sendiri sebagai elemen daftar - hanya perlu membuatnya string untuk mencegah pertukaran koma dengan plus ':

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

Karena string ini hanyalah hasil dari ekspresi, kita juga dapat menggantikannya dengan itu - bukan masalah berkat kemalasan Haskell

64 72

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

The initbertindak sebagai "minus satu, tetapi non-negatif" di sini.


Kami juga dapat memasukkan sistem tipe dalam skema redundansi dan kemudian menulis nomornya dengan cara yang dapat dimodifikasi dengan perubahan satu karakter ...

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

Anda sekarang dapat mengubah siapa saja umenjadi psebaliknya, tetapi itu akan selalu mengacaukan kedalaman susunan daftar di elemen tuple kedua dan dengan demikian memicu kesalahan waktu kompilasi.

Gagasan ini dapat diperluas lebih lanjut sedemikian rupa sehingga seluruh teks dapat dikodekan secara kompak, mudah dibaca dan diedit, dan masih aman dari pengubahan karakter tunggal.


Dan satu lagi ...

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
Saya khawatir kompilasi ini dimodifikasi dengan baik, meskipun ada pengecualian saat runtime .
Jeff Burdges

3
@JeffBurdges: tentu, saya menganggap ini untuk dimasukkan dalam "dan tidak akan menyebabkannya crash".
Berhenti berputar balik pada

1
Untuk a=map(head.show.length)[[a,a],[],[a],[a,a]]solusinya, masukkan di aantara []. Saya sangat suka posting ini! Solusi yang sangat pintar.
Dillon Cower

9
Saya telah memverifikasi bahwa semua 5825 variasi program 29 karakter Anda (mengganti atau menyisipkan karakter ASCII 32-126) berfungsi seperti yang diharapkan. Inilah skrip uji yang saya gunakan . Dapat dengan mudah diubah untuk menguji program lain, termasuk bahasa lain. Peringatan: Butuh waktu hampir 1 jam untuk berjalan di laptop saya :)
hammar

1
[a]-> []dalam solusi 64-char
John Dvorak

14

JavaScript

Saya percaya ini adalah bukti kesalahan runtime, setiap perubahan harus menghasilkan kesalahan kompilasi atau peringatan tunggal yang mengatakan 2012.

Sunting: Kode akan membuat kesalahan runtime pada sesuatu seperti if("alert(2012 "==r), saya memindahkan bagian coba untuk menghadapinya.

Sunting: Bagus satu Vilx-, tapi bisa diperbaiki :-) Sekarang ada ketidakcocokan braket untuk memasukkan titik koma itu.

Sunting: Tapi kemudian koma bisa melakukan hal yang sama dengan titik koma, yaitu sejumlah opsi, saya pikir saya telah memperbaikinya, tetapi ada banyak sekali kode sekarang.

Sunting: Sedikit disederhanakan.

Sunting: Satu lagi dalam serangkaian perbaikan bug yang tak terbatas.

Sunting: Ini agak terasa lebih panjang dan rumit daripada antipeluru, tetapi setidaknya harus mengurus ~evaldan !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
Karena misalnya q-")"mengembalikan NaN, yang dikonversi oleh "NaN"sebelum evaling, yang hanya mengubahnya kembali NaN. Hal yang aneh untuk dilakukan, tetapi secara teknis sah, sehingga tidak menarik tangkapan.
aaaaaaaaaaaa

4
Hal yang sama dengan solusi C - masukkan ;antara evaldan (.
Vilx-

1
Bagi para pembaca komentar, kerentanan titik koma sudah diperbaiki, saya yakin kode itu sudah bersih sekarang.
aaaaaaaaaaaa

4
Tidak yakin apakah ini diperhitungkan atau tidak, tetapi menempatkan tanda ~di depan evalmenyebabkannya bergema 2012 dua kali, bukan sekali. Tidak yakin apakah itu melanggar aturan atau tidak: P
mellamokb

2
Menambahkan !setelah eval(istirahat
jimmy23013

13

Perl, 49 karakter

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

Berdasarkan jawaban JB , tetapi yang ini benar-benar memenuhi spesifikasi . Pemeriksaan lengkap menunjukkan bahwa setiap penghapusan satu karakter, penyisipan atau penggantian baik meninggalkan output tidak berubah atau menyebabkan program macet saat dijalankan (seperti yang ditunjukkan oleh nilai balik dan output non-nol ke stderr), setidaknya selama penyisipan dan penggantian dibatasi untuk karakter ASCII yang dapat dicetak.

(Tanpa batasan, tugas tidak mungkin di Perl: fitur yang sedikit diketahui dari parser Perl adalah berhenti ketika bertemu dengan karakter Ctrl-D atau Ctrl-Z, jadi menyisipkan salah satu dari mereka di depan setiap perubahan file itu menjadi program Perl yang valid yang tidak melakukan apa-apa.)

Sunting: Memangkas satu char lagi dengan menggantinya 1==printdengan 0-print.


Breaks dengan Perl 5.28 di mana printmulai kembali dan 'true'bukan 1 :-P
JB

3
@ JK: Ya, Anda bisa downvote ketika itu terjadi. :) (Untuk kepentingan pembaca lain, ini adalah lelucon. Sejauh yang saya tahu, tidak ada rencana untuk mengubah nilai balik printdalam versi Perl 5 apa pun, bahkan jika itu tidak didokumentasikan secara eksplisit .)
Ilmari Karonen

12

Brainfuck

Saya mencoba meyakinkan diri sendiri bahwa ini mungkin, dan saya cukup yakin saya mungkin telah merentangkannya terlalu jauh. Saya telah membuat beberapa asumsi tentang lingkungan saya:

  1. Loop tak terbatas dianggap sebagai 'crash'. Kondisi serupa mungkin dapat dicapai dengan mengurangi nol masa lalu atau di sebelah kiri lokasi memori nol pada penerjemah tertentu. Banyak penerjemah sulit untuk crash saat runtime. Saya menghindari masalah terputus-putus dengan hanya menggunakan loop tak terbatas yang paling sederhana dan paling jelas.
  2. Kawat gigi persegi yang tidak cocok dianggap sebagai kesalahan kompilasi.
  3. Ini hanya akan bekerja di lingkungan di mana output program disalurkan kembali ke inputnya sendiri. Saya menggunakannya untuk memverifikasi bahwa itu memang menghasilkan '2012'. Ini adalah satu-satunya cara saya bisa berkeliling hanya dengan menghapus salah satu karakter keluaran.

Sayangnya, jika Anda mendapatkan lebih ketat saya khawatir ini tidak mungkin. Ini solusinya:

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

Pada dasarnya, Anda dapat mengubah kode output, atau kode verifikasi, tetapi tidak keduanya. Salah satunya dijamin bekerja. Jika salah satunya tidak 'crash'.


5
Ugh, brengsek! Anda HARUS melakukannya, bukan? XD
Vilx-

8
apakah Anda lebih suka dia menggunakan spasi putih saja?
NRGdallas

7

Python2

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

Saya harus mengubah sedikit script tes Ray untuk menguji ini karena pengalihan stdout melanggar itu. Melewati dikte kosong ke exec menghindari mencemari namespace

exec(prog, {}, {})

Bagus! Kamu berhasil!
Ray

6

Brain-Flak , 44 + 3 = 47 byte [Tidak Bersaing]

Ini menggunakan -Aflag Brain-Flak dan menampilkan karakter 2012ke STDOUT

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

Cobalah online!

Alternatif, 50 byte

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

Cobalah online!

Penjelasan

Setiap modifikasi karakter tunggal ke salah satu kode di atas akan menyebabkan kesalahan program.


3
Ha! Bahasa yang tepat untuk tantangan.
DLosc

4

Sisi , tidak bersaing

Akhirnya saya pikir saya menemukan salah satu bahasa saya yang berfungsi. Itu sangat panjang, dan bahasanya lebih baru dari pertanyaan, tapi rasanya masih seperti prestasi.

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

Tentang Sisi

Sisi adalah bahasa mainan yang terinspirasi oleh perakitan dan QBasic. Baik untuk tantangan ini karena sintaksnya sangat terbatas.

  • Ini hanya memiliki empat perintah: set, print, jump, danjumpif .
  • Semua perintah memiliki arity tetap.
  • Semua baris harus memiliki nomor baris, yang semakin meningkat.
  • Ekspresi hanya diperbolehkan dalam setpernyataan. Mereka hanya dapat berisi (paling banyak) satu operasi, yang harus bersifat biner. Secara khusus: mengubah print xxke print -xxadalah kesalahan sintaksis.
  • Nama variabel harus terdiri dari huruf kecil.
  • Yang paling penting: tidak ada sintaks komentar !

Program

Inti dari program ini adalah bagian ini:

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

Kami menyimpan 2012di xx, kemudian menguji apakah itu berhasil dan menyimpan hasil tes dalam y. Jikay benar, lompat ke baris 55. (Melompat ke nomor baris yang tidak ada, cukup maju cepat ke baris berikutnya.)

Pengerasan radiasi

  • Jika penugasan di baris 1 diubah, maka yitu falsey, lompatan tidak terjadi, dan baris 4 ditetapkan xxke 2012.
  • Jika penugasan di baris 2 atau kondisi lompat di baris 3 diubah, kami tidak peduli: xxakan ditetapkan ke 2012, apakah kami melakukan lompatan atau tidak.
  • Target lompatan pada baris 3 dapat diubah menjadi sekecil 5 atau sebesar 955. Modifikasi apa pun yang mungkin, dapatkan ke jalur printon 955 cepat atau lambat. Tidak mungkin dengan satu modifikasi untuk melompat mundur (membuat loop) atau melewati akhir program.
  • Jika tugas di baris 4 diubah, kami tidak peduli: tugas baris 1 akan benar dan kami akan melewati baris 4.
  • Jika saluran 955 dimodifikasi, kami mungkin memiliki masalah. Satu hal yang kurang menguntungkan tentang Sisi adalah variabel yang tidak diinisialisasi default untuk 0, jadi modifikasi seperti print axbukan kesalahan. Solusi jelek tapi efektif adalah baris 828-954, yang menetapkan 2012 untuk setiap variabel yang mungkin dengan jarak sunting 1 dari xx. Ini memastikan bahwa setiap modifikasi ke finalprint xx masih akan mencetak 2012.
  • Jika nomor baris diubah, baik: 1) itu akan rusak dan menjadi kesalahan sintaks, atau 2) itu tidak akan mempengaruhi aliran program. Modifikasi utama yang mungkin kita khawatirkan - mengubah baris 4 ke 94, dengan demikian memasukkannya setelah melompat ke 55 - tidak masalah karena semua yang dilakukannya adalah menetapkan 2012 ke xxlagi.

Bagus Saya tidak bisa memikirkan cara untuk menghindari ini. "A" untuk usaha dari saya, itu pasti! :)
Vilx-

3

Python

Sedikit verbose (sekarang dengan perbaikan untuk titik koma sial antara printdan (!):

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

@Jeff Burdges: Ya, dengan yang ini saya menggunakan kesalahan runtime juga tidak diizinkan. :)
Dillon Cower

Saya khawatir itu masih benar secara sintaksis jika persimpangan menghasilkan set kosong dan pop melempar kesalahan runtime . Tambahkan lebih banyak 2012 di kedua sisi.
Jeff Burdges

@ DC: Saya akan mengatakan bahwa pengecualian tidak sama dengan kesalahan runtime, meskipun sepertinya pengecualian disebut kesalahan dalam Python. pop()ing set kosong bukanlah kesalahan dalam dan dari dirinya sendiri, tetapi itu menimbulkan 'Kesalahan'.
Williham Totland

1
Pengecualian menjadi kesalahan saat tidak tertangkap.
Ilmari Karonen

1
menyisipkan koma setelah popkeluaran<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')

Apa dialek SQL ini? Sepertinya Transact-SQL (alias SQL Server), tetapi memiliki sintaks yang tidak valid untuk itu.
Vilx-

@ Vilx-: Saya mengujinya di SQL Server 2008 sendiri ketika saya mencoba untuk memecahkannya, dan itu berhasil dengan baik.
mellamokb

@ellamokb - Aneh. Ini persis seperti yang saya lakukan, dan mengeluh bahwa Anda tidak dapat menetapkan nilai default ke variabel (Anda memerlukan pernyataan SET terpisah), dan tidak ada IIF (hanya KASUS).
Vilx-

1
@ Vilx-: Ah, Anda benar. Saya menyadari sekarang saya benar-benar menguji SQL Azure. Dengan SQL Server 2008 saya mendapatkan kesalahan yang sama seperti Anda. Namun, tampaknya berfungsi dengan baik di SQL Server 2012 / Azure. Berikut ini adalah demo dengan SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

Oke, selamat, saya tidak dapat menemukan cara yang jelas untuk memecahkan ini! :) Itu tidak berarti tidak ada. ;)
Vilx-

3

Saya telah membuat skrip python untuk menilai semua solusi python. Script memecah solusi python pertama dan ketiga, dengan banyak metode berbeda. Dan solusi kedua menggunakan lambda untuk menjaga dirinya sendiri, tidak bisa dipecahkan. Solusi python kedua adalah dalam python 3. Saya memodifikasinya menjadi format python 2 dan kemudian menilai program memecahnya.

Ini skrip hakimnya.

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) 

keren! jawaban saya menyebalkan dan sekaligus meledak
gnibbler

p2selalu melempar pengecualian untuk Python2. Outputnya tidak pernah 2012. Program juri Anda tidak akan berjalan di bawah Python3 karena menggunakan pernyataan cetak.
gnibbler

@gnibbler Saya tidak memperhatikan bahwa itu p2adalah dalam python 3.
Ray

Saya telah menemukan jawaban baru untuk Python2 yang melewati skrip Anda
gnibbler

3

Mathematica, 23 karakter

Catatan: "/." berarti "ganti"

2012/.Except@2012->2012

2
Ini mungkin semacam jawaban / kekalahan yang lemah, tetapi berubah /.menjadi //(bentuk postfix).
Dillon Cower

@DillonCower Tangkapan bagus!
Dr. belisarius

2

Javascript - 68, 77, 84 , 80 karakter

Inilah solusi yang seharusnya berhasil tahun ini :)

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

Ini tes biola .

Pembaruan 1: Memperbaiki masalah ketika eval (+ a) memecahkannya (terima kasih eBusiness).

Pembaruan 2: Diperbaiki untuk '|' case (terima kasih lagi eBusiness).

Pembaruan 3: Diperbaiki untuk kasus '>' (terima kasih lagi eBusiness). Dan bangkrut untuk kasus '1' :(


Anda tidak menjaga eval Anda. eval(+a)dan banyak modifikasi lainnya berjalan dengan baik tetapi tidak melakukan banyak hal.
aaaaaaaaaaaa

@eBusiness: Terima kasih telah menunjukkan eval(+a)kasusnya, yang sekarang harus diperbaiki. Juga, saya tidak dapat menemukan salah satu kasus modifikasi di mana ia berfungsi dengan baik tetapi tidak menghasilkan 2012, jadi tolong beri saya contoh?
Briguy37

eval(0)dan eval(-a)misalnya melakukan hal yang sama.
aaaaaaaaaaaa

Posting edit itu setidaknya dapat rusak dengan mengganti ||dengan |.
aaaaaaaaaaaa

5
Istirahat jika Anda mengubah yang pertama alertke aler=.
jimmy23013

2

Ruby 1,9 - 43 karakter

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

Tidak diuji, jadi lepaskan diri.


2

Excel, 14 karakter (sedikit curang):

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

Setiap perubahan yang valid ke array akan memengaruhi konten kedua sel, dan mencoba mengubah hanya satu sel memicu pesan kesalahan.

Tentu saja, ini rusak jika Anda melihat bahwa itu benar-benar hanya satu rumus, berbeda dengan 2 rumus yang dibatasi menjadi identik.


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

Penjelasan:

  1. Tanpa mengubah apa pun itu akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikan anilai 2012).
  2. Jika konten String adimodifikasi dengan cara apa pun, maka akan mengambil jalur berikut: 1 → 3 → 5 (dan itu akan mengembalikan bnilai tidak berubah dari 2012).
  3. Jika konten String bdiubah dengan cara apa pun, maka akan mengambil jalur berikut: 1 → 3 → 4 (dan itu akan mengembalikan anilai tidak berubah dari 2012).
  4. Jika a.equals(b)pada @ 1 dimodifikasi menjadi a.equals(a),, b.equals(b)atau !a.equals(b)masih akan mengambil jalur berikut yang sama: 1 → 2 (dan itu akan mengembalikan anilai tidak berubah dari2012 ).
  5. Jika apada @ 2 diubah ke bitu masih akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikan bnilai tidak berubah dari 2012).
  6. Jika salah satu aatau bdiubah ke kebalikan pada baris 3, 4 atau 5 masih akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikan anilai tidak berubah dari 2012)
  7. Jika konten String pada @ 3 dimodifikasi dengan cara apa pun, ia masih akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikan anilai tidak berubah dari 2012)
  8. Mengubah Mdi class Matau adimain(String[]a) karakter lain yang valid dapat dilakukan tanpa perubahan apapun pada fungsi kode.
  9. Perubahan lain apa pun akan menghasilkan kesalahan-Kompilasi (tidak termasuk beberapa ruang masuk / spasi putih, yang dapat dihapus / ditambahkan).

Coba semua modifikasi ini di sini, untuk memverifikasi semuanya masih mencetak 2012.

Jika Anda dapat menemukan cara untuk melanggarnya dengan mengikuti aturan OP yang ingin saya ketahui, maka saya dapat memikirkan sesuatu untuk memperbaikinya.
Tidak seperti kebanyakan pertanyaan serupa di mana satu karakter diubah, pertanyaan ini memungkinkan struktur dasar dari bahasa pemrograman yang bersangkutan menjadi utuh, sehingga Java akhirnya dapat bersaing dalam satu entri (mari kita hadapi itu, Java tidak akan pernah memenangkan apapun pada SE xD ini).


Apa tanda negatif yang dimasukkan di jalur 4 sebelum a? Apakah program masih menampilkan 2012, atau akankah output -2012?
Kritixi Lithos

@KritixiLithos It's a String, jadi Anda tidak bisa memasukkan -sebelum aatau b. Ini adalah screenshot kesalahan Kompilasi.
Kevin Cruijssen

1

Ruby 1.9

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

Saya membangun program singkat tapi sederhana ini yang Anda diundang untuk melanggar sesuai dengan aturan di atas. Saya bahkan tidak bisa menemukan posisi di mana output diubah (tanpa melanggar kode) jika a #dimasukkan untuk berkomentar di luar baris.


put (r = 2012) == 2012? -r: 2012.send (: abs) mencetak "-2012"
Joanis

@ M. Joanis Tapi Anda membutuhkan dua karakter tambahan: karakter spasi dan minus. Suatu minus saja tidak akan bekerja.
Howard

Ah, kamu benar! Kesalahan kompilasi. Saya tidak tahu apa-apa tentang Ruby, saya harus lebih berhati-hati. Maaf!
Joanis

1
Menurut irb, menambahkan minus sebelum rxhasil dalam program yang valid yang menghasilkan -2012...
Konrad Rudolph

2
Mengubah putsuntuk putcpenyebab ini untuk output ?di Ruby 1.9.
histokrat

1

Scala, 95

(atau 54 jika melewati bagian yang tidak berarti)

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

Saya khawatir saya tidak cukup tahu tentang Scala untuk menemukan kekurangan. :( Bisakah orang lain melihatnya?
Vilx-

Tidak sulit di level ini. Sebagian besar kekerasan Scala adalah karena kompleksitas sistem tipenya (yang saya masih belum mengerti sepenuhnya: D)
Sarge Borsch

Saya tidak tahu Scala, tetapi (...),("2012")sepertinya mematahkannya.
jimmy23013

1

C #

Tentunya ini tidak sesederhana ini, kan? ...

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

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

Ok apa yang saya rindukan?


1
Apa yang terjadi jika Anda mengubah baris ke-8 menjadi "Console.WriteLine (-result);"?
Glenn Randers-Pehrson

Tidak ada kompiler C # di sini, tetapi tidak boleh mengubah baris 7 untuk if (result += "2012")membuatnya output 20122012?
Philipp

hmmmm ... saya tidak memikirkan itu ... kembali ke papan gambar
Perang

@ Pilip - Tidak, itu tidak akan dikompilasi. Anda membutuhkan boolean sebagai nilai untuk ifpernyataan, bukan string.
Vilx-

6
Menambahkan ;setelah elsemembuatnya menghasilkan dua kali.
jimmy23013

1

PHP, 30

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

Selamat datang di PPCG! Posting pertama yang bagus! Bisakah Anda menambahkan penjelasan juga?
Rɪᴋᴇʀ

2
Dan inilah cara saya mengalahkannya:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-

@ Vilx- Bagus, saya belum memikirkan hal itu.
jsa

Kekalahan lumpuh untuk solusi PHP satu baris: masukkan seluruh kode dalam komentar <?#$i=2012;$i==2012?$i:2012;?>Solusi melawan itu: masukkan baris baru setelah $i=2012.
Titus

1

Taksi , 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.

Diformat untuk manusia, yaitu:

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.

Dari membaca jawaban lain, solusinya adalah memilih bahasa yang rapuh, mengatur nilainya, memeriksa nilainya, mencetak nilainya.


1

SmileBASIC

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

Pertama, kami mengaktifkan mode ketat. Ini memaksa Anda untuk mendeklarasikan semua variabel sebelum menggunakannya, dan mencegah hal-hal seperti mengubah? A $ menjadi? B $.

Selanjutnya, variabel string yang disebut "A $" dibuat, dan nilainya diatur ke "@ 2012". Untuk memastikan nilai A $ belum dikacaukan, program akan mencoba untuk beralih ke label, dan satu-satunya label dalam program ini adalah @ 2012.

Sekarang, A $ sudah pasti "@ 2012", tetapi sebelum mencetaknya, @ harus dihapus. SHIFT () menghapus item pertama dalam string atau array (seperti pop (), tetapi dari ujung lainnya). Untuk membuang nilai yang dikembalikan oleh SHIFT, itu diteruskan ke blok IF / THEN, yang tidak melakukan apa-apa. Untuk berjaga-jaga jika seseorang mencoba mengomentari baris itu, kami mendeklarasikan variabel "B", yang digunakan kemudian. Jika VAR dikomentari, baris terakhir akan menampilkan kesalahan variabel Tidak terdefinisi.

Sekarang, $ A dicetak, dan ada VAR lain untuk mencegah komentar. Baris terakhir hanya memastikan variabel B dan C keduanya telah dideklarasikan.


OK ... Saya tidak tahu apa-apa tentang SmileBASIC, jadi ini murni dugaan: ?-A$VAR C- dapatkah output ini -2012?
Vilx-

Itu tidak akan berhasil karena A $ adalah string.
12Me21

Tunggu, saya punya ide! Bagaimana dengan ?B$VAR C:? :)
Vilx-

Itu akan memicu kesalahan karena "B $" belum dinyatakan.
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;

Pendekatan gagal:

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

Solusi You Perl dapat dipecahkan dengan mengganti yang pertama $&dengan sesuatu seperti $0.
Howard

Dan Haskell rusak jika Anda mengganti koma dengan tanda tambah. Upaya berani sekalipun.
Jeff Burka

Saya pikir nub$filter(\x->x==2012||x==2012)(2012:[2012])mungkin aman untuk solusi Haskell.
Jeff Burka

Saya lupa use Englishperl, itu akan memperbaikinya. Saya pikir beberapa perbaikan berfungsi untuk Haskell, termasuk beralih ke string.
Jeff Burdges

1
Solusi Perl masih cukup rapuh. Beberapa cara untuk memecahkannya (ditemukan saat uji coba jawaban saya sendiri ) termasuk mengganti printdengan *rint, prin:, p:intatau #rint, mengawali =ke baris pertama, atau bahkan mengganti s/.*/dengan s/./atau y/.*/(yang akan diperbaiki dengan menginisialisasi $ARGuntuk 2012untuk memulai dengan). Selain itu, $SUBSEPtrik Anda masih tidak melindungi dari memasukkan *titik koma akhir, tetapi solusi yang jauh lebih mudah adalah dengan menghapus titik koma yang tidak perlu.
Ilmari Karonen

0

PHP, 43 48

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

Memasukkan -antara ?dan $ahasil dalam -2012cetakan.
Gareth

Upaya yang lucu dengan itu date(), tetapi program ini harus bekerja di luar 2012 juga. ;)
Vilx-

@ Gareth - hmm :)
The Coder

1
@ Vilx- "Tugasnya adalah menulis sebuah program dalam bahasa favorit Anda yang menghasilkan 2012" di mana katanya harus bekerja lebih dari 2012? :)
The Coder

1
@TheCoder Ok, sekarang saya akan memasukkan -antara saya ? dan perutnya. ;-)
Gareth

0

Ruby ( 57 36)

Sunting dan satu lagi dalam 36 karakter.

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

Saya kira menggunakan string cukup gagal karena hal minus tidak berfungsi lagi.


Sunting percobaan berikutnya (36 karakter) [tidak apa-apa, menambahkan hasil -setelah pdalam -2012]

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


Yang ini hanya akan bekerja tahun ini, tetapi juga untuk kontes serupa di masa depan :) (15.chars)

p Time.now.year

Perhatikan bahwa subtitusi ini juga berfungsi:

p Time.new.year

57 karakter. Namun, jika Anda menghitung baris baru, berarti 76 karakter.

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


Dua solusi pertama - tambahkan #pada awal baris. Solusi terakhir - masukkan baris baru sebelumnya p. (Catatan - Saya sendiri tidak mengenal Ruby, jadi mungkin saya salah).
Vilx-

sial :) Anda benar
Patrick Oscity

Mencetak "2012" untuk saya. Kutipan tidak sesuai - bukan?
pengguna tidak diketahui

Ya kamu benar. Anda bisa menggunakan $><<atau putssebagai gantinya. Apa pun, saya tidak akan mencoba ini lagi, saya menyerah :)
Patrick Oscity

0

T, 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

dll


Dan menambahkan negatif ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

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

Ini bisa dikalahkan dengan mengganti ;m;untuk sesuatu seperti ;1;atau ;x;.
streetster

0

Hmm .. coba saya coba:

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 karakter tanpa spasi.

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
Rusak dengan memasukkan "-", yaitu System.out.println(-i)(untuk println pertama). Juga rusak dengan misalnya mengganti yang pertama println(i)dengan misalnya println(1). Juga berpotensi rusak dengan mengubah i == jke i += j(atau - =, dll.).
TLW

0

PHP

Saya harap ini tidak bisa dipecahkan :)

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

Saya menambahkan satu karakter ke akhir baris ini: echo(printf("%s",$a)==4)?die(3dan saya dapatkan 20123.
Vilx-

Hmm ... PHP 5.4.7 bekerja dengan benar dengan die (3.
Stanislav Yaglo

Kamu benar. Salahku. Melanjutkan pencarian ...
Vilx-

PHP 5.3.3 - benar juga. die () hanya menghasilkan string, tidak menghasilkan angka.
Stanislav Yaglo

Tunggu, DUH, temukan! Ubah saja ."2012"ke ."FAIL". :)
Vilx-

0

Groovy: 26

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

Saya tidak terlalu mengenal Groovy, tetapi apakah ini akan berhasil? x=2012;print x^2012?2012:-x
Vilx-

untuk apa -?
Armand

@Alison The -adalah untuk mencoba dan memodifikasi kode Anda dengan satu karakter sehingga tidak lagi berfungsi.
Gareth

1
x=2012;print x^=2012?2012:x(mengubah ^ke ^=) mengubah output ke 0.
histokrat

0

Lua

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

1
Bagaimana jika Anda menghapus salah satu dari -tanda - tanda itu?
Vilx-

Oh, dan jika Anda mengubah salah satunya 2012 menjadi sesuatu yang lain, pernyataan tersebut akan menimbulkan kesalahan. Hmm ... well, saya kira Anda pantas poin kreativitas untuk menyalahgunakan aturan. Tapi serius, bukan itu maksudnya.
Vilx-
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.