Viết chương trình luôn tạo ra phiên bản 2012 2012 - ngay cả khi nó được sửa đổi!


116

Ý tưởng này không phải của tôi, mặc dù tôi không biết nó bắt nguồn từ đâu. Tôi đã từng gặp nó trong một cuộc thi lập trình cách đây rất lâu (1998, nếu tôi nhớ chính xác). Nhiệm vụ là viết một chương trình bằng ngôn ngữ yêu thích của bạn xuất ra 2012 và duy nhất 2012 . Điều hấp dẫn là chương trình vẫn phải xuất 2012sau khi bất kỳ một ký tự nào của nó được sửa đổi. Việc sửa đổi có thể là chèn, xóa hoặc thay thế. Tất nhiên, việc sửa đổi sẽ sao cho chương trình vẫn còn hiệu lực về mặt cú pháp.

Vì tôi không biết tất cả các ngôn ngữ lập trình, tôi phải yêu cầu khán giả giúp tôi và kiểm tra câu trả lời đã gửi.

Đã thêm: Nhiều người đã nhận xét rằng định nghĩa của tôi về sửa đổi chấp nhận được là quá mơ hồ. Đây là nỗ lực thứ hai của tôi: Các sửa đổi được phép sẽ khiến chương trình của bạn có hiệu lực về mặt cú pháp và sẽ không khiến chương trình bị sập. Ở đó, tôi nghĩ rằng nên bao gồm tất cả các lỗi thời gian biên dịch, thời gian liên kết và thời gian chạy. Mặc dù tôi chắc chắn rằng dù sao cũng sẽ có một số trường hợp kỳ lạ trong một số ngôn ngữ, vì vậy khi xuất hiện, chúng tôi sẽ xem xét riêng.


Làm thế nào về các lỗi thời gian chạy như đọc một địa chỉ không hợp lệ rất có thể?
aaaaaaaaaaaa

@PeterTaylor - Đã có 3 câu trả lời, câu trả lời C có phần ôn tập nặng. Bạn có thể tìm cảm hứng ở đó.
Vilx-

2
Bất cứ ai cũng tìm ra nếu điều này là không thể trong APL hoặc GolfScript hoặc tương tự như vậy?
Jeff Burdges

14
Điều này khiến tôi suy nghĩ về DNA và sự dư thừa và tiềm năng cho các tia vũ trụ lật các bit trong các chương trình của tôi. Công cụ thú vị.
Jon Purdy

11
... Bạn cần ngủ một chút.
Vilx-

Câu trả lời:


65

C, 53 ký tự

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

Dài hơn một chút so với ngôn ngữ kịch bản trả lời, và tuân theo cùng một nguyên tắc cơ bản. Dựa vào thực tế là do các ràng buộc của cú pháp C, các chữ cái duy nhất có thể thay đổi mà không làm cho chương trình không hợp lệ nằm trong chuỗi!

Chỉnh sửa: Cạo sạch 4 ký tự.

Reedit: Mạnh mẽ tăng lên, loại bỏ một nhân vật.

Re-redit: Dài hơn, nhưng mạnh mẽ hơn. Hãy thử &ngay bây giờ! (Đúng vào lúc này).

Cập nhật: Rút ngắn một chút; đánh bại hầu hết các cách tiếp cận nhìn thấy cho đến nay.

Cập nhật: Thay đổi int thành void; Tôi nên đánh bại cách tiếp cận cuối cùng có thể để phá vỡ nó.

Cập nhật: Tôi thunk một cách tiếp cận khác; thay thế cuối cùng a(có thể nó thối) bằng 0; sử dụng tên hai chữ cái sẽ giải quyết vấn đề đó.

Cập nhật: Bản cập nhật cuối cùng bị thu hồi; giả sử thay đổi gây ra lỗi thời gian chạy không được phép; asẽ làm việc tốt

Cập nhật: Quay lại một số chi tiết; cố gắng để thanh toán *acũng sẽ segfault; vì vậy sử dụng voidđể trêu chọc một lỗi biên dịch từ đó là không cần thiết.

Cập nhật: Và rút ngắn cuối cùng; dựa vào chuỗi "2012"được đặt tại nhưng một địa chỉ (phổ biến); và chuỗi ký tự đó là chỉ đọc (cũng phổ biến).

Cập nhật: Tôi mất hai nhân vật, nhưng tôi đã đánh bại dấu chấm phẩy của bạn!


2
@PaulR: Bây giờ đổi thành register void; Có registerđể ngăn chặn &; các voidở đó để ngăn chặn *.
Williham Totland

6
OK ... sửa cho tôi nếu điều này không hợp lệ C, nhưng nó chỉ hoạt động trên VS2010 của tôi. Chèn một ;giữa puts(.
Vilx-

39
+1, Xin chúc mừng, tôi nghĩ bạn đã đóng đinh nó. Tôi đã viết một khai thác thử nghiệm đơn giản cố gắng biên dịch và chạy mọi biến thể một char có thể có của mã của bạn và mỗi một trong số chúng đều không biên dịch, bị lỗi hoặc được in 2012! (Tôi chỉ sử dụng các ký tự ASCII có thể in được cho các bài kiểm tra chèn và thay thế, nhưng tôi nghi ngờ việc mở rộng tiết mục sẽ giúp ích.)
Ilmari Karonen

3
@IlmariKaronen: Heh, đó là rất nhiều nỗ lực; cảm ơn vì đã đi qua tất cả :)
Williham Totland

1
@Titus: Nếu bạn có nghĩa là chuyển đổi ==cho !=trong ternary, mà được bạn đến đâu; thay vì xuất anó bây giờ đầu ra "2012".
Williham Totland

38

Haskell, 19

(\xx@2012->xx)$2012

hoặc, như một chương trình đầy đủ,

29

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


Để vui hơn một chút:

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


Để có được một lỗi không thể sửa đổi theo cách chỉ mang lại lỗi thời gian chạy, chúng ta có thể mã hóa thông tin theo độ dài của danh sách không thể sửa đổi bằng cách chỉ thay đổi một ký tự, nghĩa là

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

Để làm cho nó có thể sửa đổi hơn (một cách an toàn), chúng ta cũng có thể sử dụng chính số đó làm thành phần danh sách - chỉ cần tạo chuỗi để ngăn trao đổi dấu phẩy cho dấu cộng ':

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

Vì chuỗi này chỉ là kết quả của biểu thức, chúng ta cũng có thể thay thế nó bằng chuỗi đó - không phải là vấn đề nhờ vào sự lười biếng của Haskell

64 72

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

Các inithoạt động như "trừ một, nhưng không âm" ở đây.


Chúng tôi cũng có thể bao gồm hệ thống loại trong sơ đồ dự phòng và sau đó viết số theo cách có thể được sửa đổi với các thay đổi một ký tự ...

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

Bây giờ bạn có thể thay đổi bất kỳ cái nào uthành pngược lại, nhưng điều đó sẽ luôn làm rối tung độ sâu của các ngăn xếp danh sách trong phần tử tuple thứ hai và do đó gây ra lỗi thời gian biên dịch.

Ý tưởng này có thể được mở rộng hơn nữa theo cách mà toàn bộ văn bản có thể được mã hóa gọn gàng, dễ đọc và chỉnh sửa và vẫn an toàn khi sửa đổi các ký tự đơn.


Và một cái khác ...

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
Tôi sợ điều này biên dịch chỉ sửa đổi tốt, mặc dù một ngoại lệ được đưa ra trong thời gian chạy .
Jeff Burdges

3
@JeffBurdges: chắc chắn, tôi coi điều này được đưa vào "và sẽ không khiến nó bị sập".
đã ngừng quay ngược chiều

1
Đối với a=map(head.show.length)[[a,a],[],[a],[a,a]]giải pháp, chèn agiữa []. Tôi thực sự thích bài viết này, mặc dù! Giải pháp rất thông minh.
Dillon Cower

9
Tôi đã xác minh rằng tất cả 5825 biến thể của chương trình 29 ký tự của bạn (thay thế hoặc chèn các ký tự ASCII 32-126) hoạt động như mong đợi. Đây là kịch bản thử nghiệm tôi đã sử dụng . Nó có thể dễ dàng được điều chỉnh để kiểm tra các chương trình khác, bao gồm các ngôn ngữ khác. Cảnh báo: Mất gần 1 giờ để chạy trên máy tính xách tay của tôi :)
hammar

1
[a]-> []trong giải pháp 64 char
John Dvorak

14

JavaScript

Tôi tin rằng đây là bằng chứng lỗi thời gian chạy, bất kỳ thay đổi nào cũng sẽ dẫn đến lỗi biên dịch hoặc một cảnh báo duy nhất cho biết năm 2012.

Chỉnh sửa: Mã sẽ gây ra lỗi thời gian chạy trên một cái gì đó như if("alert(2012 "==r), tôi đã di chuyển phần thử để xử lý nó.

Chỉnh sửa: Đẹp một Vilx-, nhưng có thể sửa được :-) Bây giờ có một dấu ngoặc không khớp để chèn dấu chấm phẩy đó.

Chỉnh sửa: Nhưng sau đó một dấu phẩy có thể làm điều tương tự như dấu chấm phẩy, đó là một loạt các tùy chọn, tôi nghĩ rằng tôi đã sửa nó, nhưng hiện tại có rất nhiều mã.

Chỉnh sửa: Đơn giản hóa một chút.

Chỉnh sửa: Một lần nữa trong một loạt các lỗi vô hạn.

Chỉnh sửa: Loại này cảm thấy dài và phức tạp hơn chống đạn, nhưng ít nhất nó nên chăm sóc ~eval!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
Bởi vì, ví dụ q-")"trả về NaN, mà eval chuyển đổi thành "NaN"trước khi trốn tránh nó, mà chỉ đơn giản là quay lại NaN. Điều kỳ lạ để làm, nhưng về mặt kỹ thuật hợp pháp, do đó không gọi được.
aaaaaaaaaaaa

4
Điều tương tự như giải pháp C - chèn một ;giữa eval(.
Vilx-

1
Đối với các độc giả bình luận, lỗ hổng dấu chấm phẩy đã được sửa, tôi tin rằng mã sẽ được sạch ngay bây giờ.
aaaaaaaaaaaa

4
Không chắc chắn nếu điều này được tính hay không, nhưng đặt một ~phía trước các evalnguyên nhân khiến nó lặp lại 2012 hai lần thay vì một lần. Không chắc chắn rằng điều đó có bất tuân các quy tắc hay không: P
mellamokb

2
Thêm một !sau khi eval(phá vỡ nó.
jimmy23013

13

Perl, 49 ký tự

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

Dựa trên câu trả lời của JB , nhưng điều này thực sự thỏa mãn thông số kỹ thuật . Kiểm tra toàn diện chỉ ra rằng mỗi lần xóa, chèn hoặc thay thế một ký tự sẽ khiến đầu ra không thay đổi hoặc khiến chương trình bị sập khi chạy (như được chỉ ra bởi giá trị trả về khác không và đầu ra cho thiết bị lỗi chuẩn), ít nhất là khi chèn và thay thế được giới hạn ở các ký tự ASCII có thể in.

(Không có giới hạn, nhiệm vụ là không thể trong Perl: một tính năng ít được biết đến của trình phân tích cú pháp Perl là nó dừng khi gặp một ký tự Ctrl-D hoặc Ctrl-Z, do đó, chèn một trong hai tệp đó vào trước bất kỳ tệp nào. nó vào một chương trình Perl hợp lệ mà không làm gì cả.)

Chỉnh sửa: Tắt một char nữa bằng cách thay thế 1==printbằng 0-print.


Nghỉ giải lao với Perl 5.28 nơi printbắt đầu quay lại 'true'thay vì 1 :-P
JB

3
@JB: Chà, bạn có thể downvote nó khi điều đó xảy ra. :) (Vì lợi ích của những độc giả khác, đây là một trò đùa. Theo tôi biết, không có kế hoạch thay đổi giá trị trả lại của printbất kỳ phiên bản nào của Perl 5, ngay cả khi nó không được ghi chép rõ ràng .)
Ilmari Karonen

12

Brainfuck

Tôi đang cố gắng thuyết phục bản thân rằng điều này là có thể, và tôi khá chắc chắn rằng tôi có thể đã kéo dài nó quá xa. Tôi đã đưa ra một vài giả định về môi trường của mình:

  1. Một vòng lặp vô hạn được coi là một 'sự cố'. Một điều kiện tương tự có thể có thể đạt được bằng cách giảm quá 0 hoặc sang bên trái của vị trí bộ nhớ bằng 0 trong một số trình thông dịch. Nhiều thông dịch viên rất khó gặp sự cố khi chạy. Tôi tránh vấn đề tạm dừng bằng cách chỉ sử dụng vòng lặp vô hạn đơn giản nhất, rõ ràng nhất.
  2. Niềng răng vuông chưa từng có được coi là một lỗi biên dịch.
  3. Điều này sẽ chỉ hoạt động trong một môi trường nơi đầu ra của chương trình được đưa trở lại đầu vào của chính nó. Tôi sử dụng điều đó để xác minh rằng nó thực sự đã xuất ra '2012'. Đây là cách duy nhất tôi có thể nhận được chỉ bằng cách xóa một trong các ký tự đầu ra.

Thật không may, nếu bạn nhận được bất kỳ nghiêm ngặt hơn, tôi sợ điều này sẽ là không thể. Đây là giải pháp của tôi:

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

Về cơ bản, bạn có thể thay đổi mã đầu ra hoặc mã xác minh, nhưng không phải cả hai. Một trong số họ được đảm bảo để làm việc. Nếu một trong số họ không, nó sẽ 'sụp đổ'.


5
Ugh, cân não! Bạn chỉ cần HAD, phải không? XD
Vilx-

8
thay vào đó bạn sẽ thích anh ấy sử dụng khoảng trắng?
NRGdallas

7

Python2

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

Tôi đã phải thay đổi kịch bản kiểm tra của Ray một chút để kiểm tra điều này vì chuyển hướng xuất sắc đang phá vỡ nó. Vượt qua các ký hiệu trống để thực thi sẽ tránh gây ô nhiễm không gian tên

exec(prog, {}, {})

Tuyệt quá! Bạn làm cho nó!
Ray

6

Brain-Flak , 44 + 3 = 47 byte [Không cạnh tranh]

Cái này sử dụng -Acờ của Brain-Flak và xuất các ký tự 2012thành STDOUT

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

Hãy thử trực tuyến!

Thay thế, 50 byte

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

Hãy thử trực tuyến!

Giải trình

Bất kỳ sửa đổi ký tự đơn nào đối với một trong các mã ở trên sẽ khiến chương trình bị lỗi.


3
Hà! Ngôn ngữ phù hợp cho thử thách.
DLosc

4

Sisi , không cạnh tranh

Cuối cùng tôi nghĩ rằng tôi đã tìm thấy một trong những ngôn ngữ của tôi hoạt động. Nó dài khủng khiếp và ngôn ngữ mới hơn câu hỏi, nhưng nó vẫn cảm thấy như một thành tựu.

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

Về Sisi

Sisi là một ngôn ngữ đồ chơi lấy cảm hứng từ lắp ráp và QBasic. Nó tốt cho thử thách này vì cú pháp của nó cực kỳ hạn chế.

  • Nó chỉ có bốn lệnh: set, print, jump, và jumpif.
  • Tất cả các lệnh có arity cố định.
  • Tất cả các dòng phải có số dòng, đang tăng nghiêm ngặt.
  • Biểu thức chỉ được phép trong setbáo cáo. Chúng chỉ có thể chứa (nhiều nhất) một thao tác, phải là nhị phân. Cụ thể: thay đổi print xxthành print -xxmột lỗi cú pháp.
  • Tên biến phải bao gồm các chữ cái viết thường.
  • Quan trọng nhất: không có cú pháp bình luận !

Chương trình

Cốt lõi của chương trình là phần này:

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

Chúng tôi lưu trữ 2012trong xx, sau đó kiểm tra xem đó là thành công và lưu trữ các kết quả thử nghiệm trong y. Nếu ylà sự thật, hãy nhảy đến dòng 55. (Nhảy tới số dòng không tồn tại chỉ đơn giản là chuyển nhanh sang dòng tiếp theo.)

Làm cứng bức xạ

  • Nếu bài tập trong dòng 1 được sửa đổi, thì đó ylà falsey, bước nhảy không xảy ra và dòng 4 được đặt xxthành năm 2012.
  • Nếu bài tập ở dòng 2 hoặc điều kiện nhảy trong dòng 3 được sửa đổi, chúng tôi không quan tâm: xxsẽ được đặt thành năm 2012 cho dù chúng tôi có thực hiện bước nhảy hay không.
  • Mục tiêu nhảy trong dòng 3 có thể được thay đổi thành nhỏ bằng 5 hoặc lớn bằng 955. Bất kỳ sửa đổi nào cũng có thể đưa nó đến printdòng 955 sớm hay muộn. Không thể có một sửa đổi để nhảy lùi (tạo một vòng lặp) hoặc qua phần cuối của chương trình.
  • Nếu bài tập trong dòng 4 được sửa đổi, chúng tôi không quan tâm: bài tập của dòng 1 sẽ đúng và chúng tôi sẽ nhảy qua dòng 4.
  • Nếu dòng 955 bị sửa đổi, chúng tôi có thể gặp sự cố. Một điều đáng tiếc về Sisi là các biến chưa được khởi tạo mặc định 0, do đó, một sửa đổi như print axkhông phải là một lỗi. Giải pháp xấu nhưng hiệu quả là các dòng 828-954, chỉ định 2012 cho mọi biến có thể có khoảng cách chỉnh sửa là 1 từ xx. Điều này đảm bảo rằng bất kỳ sửa đổi nào cho trận chung kết print xxvẫn sẽ in năm 2012.
  • Nếu một số dòng được sửa đổi, một trong hai: nó sẽ bị lỗi và là một lỗi cú pháp, hoặc 2) nó sẽ không ảnh hưởng đến luồng chương trình. Sửa đổi chính mà chúng tôi có thể lo lắng - thay đổi dòng 4 thành 94, do đó chèn nó sau khi nhảy lên 55 - không thành vấn đề bởi vì tất cả những gì nó làm được chỉ định năm 2012 xxmột lần nữa.

Tốt một! Tôi không thể nghĩ ra cách nào để phá vỡ điều này. "A" cho nỗ lực từ tôi, đó là điều chắc chắn! :)
Vilx-

3

Con trăn

Một chút dài dòng (bây giờ với một sửa chữa cho dấu chấm phẩy phiền phức giữa print(!):

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

@Jeff Burdges: Vâng, với điều này tôi đang ngân hàng về lỗi thời gian chạy cũng không được phép. :)
Dillon Cower

Tôi e rằng nó vẫn đúng về mặt cú pháp nếu giao lộ mang lại tập hợp trống và pop gây ra lỗi thời gian chạy . Thêm nhiều năm 2012 ở cả hai bên.
Jeff Burdges

@DC: Tôi sẽ nói rằng một ngoại lệ không giống như lỗi thời gian chạy, mặc dù có vẻ như ngoại lệ được gọi là lỗi trong Python. pop()trong tập hợp trống không phải là một lỗi trong chính nó, nhưng nó làm tăng 'Lỗi'.
Williham Totland

1
Một ngoại lệ trở thành một lỗi khi nó không bị bắt.
Ilmari Karonen

1
chèn dấu phẩy sau khi popxuất<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')

Phương ngữ SQL này là gì? Trông giống như Transact-SQL (hay còn gọi là SQL Server), nhưng nó có cú pháp không hợp lệ cho điều đó.
Vilx-

@ Vilx-: Tôi đã tự mình kiểm tra nó trong SQL Server 2008 khi tôi cố gắng phá vỡ nó và nó hoạt động rất tốt.
mellamokb

@mellamokb - Thật kỳ quặc. Đó chính xác là những gì tôi đã làm và nó phàn nàn rằng bạn không thể gán giá trị mặc định cho biến (bạn cần một câu lệnh SET riêng) và không có IIF (chỉ CASE).
Vilx-

1
@ Vilx-: Ah, bạn đúng rồi. Tôi nhận ra bây giờ tôi đã thực sự thử nghiệm trên SQL Azure. Với SQL Server 2008, tôi gặp phải những lỗi tương tự như bạn. Tuy nhiên, nó dường như hoạt động tốt trong SQL Server 2012 / Azure. Đây là bản demo với SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

OK, xin chúc mừng, tôi không thể tìm thấy bất kỳ cách rõ ràng nào để phá vỡ điều này! :) Điều đó không có nghĩa là không có. ;)
Vilx-

3

Tôi đã tạo một kịch bản python để đánh giá tất cả các giải pháp python. Kịch bản phá vỡ các giải pháp python đầu tiên và thứ ba, với nhiều phương thức khác nhau. Và giải pháp thứ hai sử dụng lambda để bảo vệ chính nó, là không thể phá vỡ. Giải pháp python thứ hai là trong python 3. Tôi đã sửa đổi nó thành định dạng python 2 và sau đó đánh giá chương trình đã phá vỡ nó.

Đây là kịch bản thẩm phán.

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) 

mát mẻ! câu trả lời của tôi hút và thổi cùng một lúc
gnibbler

p2luôn ném một ngoại lệ cho Python2. Đầu ra không bao giờ là 2012. Chương trình thẩm phán của bạn sẽ không chạy dưới Python3 vì nó sử dụng các câu lệnh in.
gnibbler

@gnibbler Tôi không nhận thấy đó p2là ở python 3.
Ray

Tôi đã tìm ra một câu trả lời mới cho Python2 vượt qua tập lệnh của bạn
gnibbler


2

Javascript - 68, 77, 84 , 80 ký tự

Đây là một giải pháp nên hoạt động trong năm nay :)

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

Đây là fiddle thử nghiệm .

Cập nhật 1: Đã sửa vấn đề trong đó eval (+ a) đã phá vỡ nó (cảm ơn eBusiness).

Cập nhật 2: Đã sửa lỗi cho '|' trường hợp (cảm ơn một lần nữa eBusiness).

Cập nhật 3: Đã sửa lỗi cho trường hợp '>' (cảm ơn một lần nữa về Kinh doanh điện tử). Và đã phá vỡ cho trường hợp '1' :(


Bạn đã không bảo vệ eval của bạn. eval(+a)và rất nhiều sửa đổi khác chạy hoàn toàn tốt nhưng không làm được gì nhiều.
aaaaaaaaaaaa

@eBusiness: Cảm ơn bạn đã chỉ ra eval(+a)trường hợp này, bây giờ sẽ được sửa. Ngoài ra, tôi đã không thể tìm thấy một trong những trường hợp sửa đổi khi nó chạy tốt nhưng không xuất ra năm 2012, vì vậy bạn có thể cho tôi một ví dụ không?
Briguy37

eval(0)eval(-a)ví dụ làm điều tương tự.
aaaaaaaaaaaa

Bài viết chỉnh sửa nó ít nhất có thể bị phá vỡ bằng cách thay thế ||bằng |.
aaaaaaaaaaaa

5
Phá vỡ nếu bạn thay đổi đầu tiên alertđể aler=.
jimmy23013

2

Ruby 1.9 - 43 ký tự

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

Không được kiểm tra, nên phá đi.


2

Excel, 14 ký tự (gian lận một chút):

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

Mọi thay đổi hợp lệ đối với mảng sẽ ảnh hưởng đến nội dung của cả hai ô và việc cố gắng thay đổi chỉ một ô sẽ gây ra thông báo lỗi.

Tất nhiên, điều này sẽ bị phá vỡ nếu bạn cho rằng đó thực sự chỉ là một công thức, trái ngược với 2 công thức bị hạn chế là giống hệt nhau.


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

Giải trình:

  1. Không thay đổi bất cứ điều gì, nó sẽ đi theo đường dẫn sau: 1 → 2 (và nó sẽ trả về agiá trị của2012 ).
  2. Nếu nội dung của Chuỗi ađược sửa đổi theo bất kỳ cách nào, nó sẽ đi theo đường dẫn sau: 1 → 3 → 5 (và nó sẽ trả vềb giá trị không đổi của 2012).
  3. Nếu nội dung của Chuỗi bđược sửa đổi theo bất kỳ cách nào, nó sẽ đi theo đường dẫn sau: 1 → 3 → 4 (và nó sẽ trả vềa giá trị không đổi của 2012).
  4. Nếu a.equals(b)trên @ 1 được sửa đổi thành a.equals(a), b.equals(b)hoặc !a.equals(b)nó vẫn sẽ đi theo cùng một đường dẫn sau: 1 → 2 (và nó sẽ trở lạia giá trị không đổi của2012 ).
  5. Nếu atrên @ 2 được đổi thành bnó vẫn sẽ đi theo đường dẫn sau: 1 → 2 (và nó sẽ trở lạib giá trị không đổi của2012 ).
  6. Nếu một ahoặc bđược thay đổi thành ngược lại trên các dòng 3, 4 hoặc 5, nó vẫn sẽ đi theo đường dẫn sau: 1 → 2 (và nó sẽ trở lạia giá trị không đổi của2012 )
  7. Nếu nội dung của Chuỗi trên @ 3 bị sửa đổi theo bất kỳ cách nào, nó vẫn sẽ đi theo đường dẫn sau: 1 → 2 (và nó sẽ trả về a giá trị không đổi của 2012)
  8. Thay đổi Mtrong class Mhoặc atrongmain(String[]a) một ký tự hợp lệ khác có thể được thực hiện mà không có bất kỳ thay đổi nào đối với chức năng của mã.
  9. Bất kỳ thay đổi nào khác sẽ dẫn đến lỗi Biên dịch (không bao gồm một số nhập / khoảng trắng, có thể được xóa / thêm).

Hãy thử tất cả các sửa đổi ở đây, để xác minh tất cả chúng vẫn in năm 2012.

Nếu bạn có thể tìm mọi cách để phá vỡ nó theo quy tắc của OP mà tôi muốn biết, vì vậy tôi có thể nghĩ ra cách khắc phục.
Không giống như hầu hết các câu hỏi tương tự khi một char duy nhất được sửa đổi, câu hỏi này cho phép cấu trúc cơ bản của ngôn ngữ lập trình được đề cập còn nguyên vẹn, do đó, Java cuối cùng có thể cạnh tranh trong một lần nhập (hãy đối mặt với nó, Java sẽ không bao giờ giành được bất cứ điều gì SE này xD).


Một dấu hiệu tiêu cực được chèn vào đường dẫn 4 trước dấu hiệu là agì? Chương trình vẫn sẽ xuất 2012, hay sẽ xuất -2012?
Bò lang băm

@KritixiLithos Đó là một Chuỗi, vì vậy bạn không thể chèn một chuỗi -trước ahoặc b. Dưới đây là một ảnh chụp màn hình của lỗi Compile.
Kevin Cruijssen

1

Hồng ngọc 1.9

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

Tôi xây dựng chương trình ngắn nhưng đơn giản này mà bạn được mời phá vỡ theo các quy tắc trên. Tôi thậm chí không thể tìm thấy một vị trí nơi đầu ra được thay đổi (mà không phá vỡ mã) nếu a #được chèn để nhận xét phần còn lại của dòng.


đặt (r = 2012) == 2012? -r: 2012.send (: abs) in "-2012"
Joanis

@ M.Joanis Nhưng bạn cần thêm hai nhân vật: một nhân vật không gian và một điểm trừ. Một điểm trừ một mình sẽ không hoạt động.
Howard

À, bạn nói đúng! Dịch lỗi. Tôi không biết gì về Ruby, tôi nên cẩn thận hơn. Lấy làm tiếc!
Joanis

1
Theo irb, thêm dấu trừ trước rxkết quả trong một chương trình hợp lệ mà kết quả đầu ra -2012...
Konrad Rudolph

2
Thay đổi putsđể putcgây ra điều này để tạo ra một ?trong Ruby 1.9.
lịch sử

1

Scala, 95

(hoặc 54 nếu bỏ qua các phần không có ý nghĩa)

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

Tôi sợ rằng tôi không biết đủ về Scala để tìm ra bất kỳ sai sót nào. :( Những người khác có thể, xin vui lòng, hãy xem?
Vilx-

Ở cấp độ này không khó. Hầu hết độ cứng của Scala là do sự phức tạp của hệ thống loại của nó (mà tôi vẫn không thể hiểu đầy đủ: D)
SUND Borsch

Tôi không biết Scala, nhưng (...),("2012")dường như phá vỡ nó.
jimmy23013

1

C #

Chắc chắn nó không đơn giản, phải không? ...

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

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

Ok tôi nhớ cái gì?


1
Điều gì xảy ra nếu bạn thay đổi dòng thứ 8 thành "Console.WriteLine (-result);"?
Glenn Randers-Pehrson

Không có trình biên dịch C # ở đây, nhưng không nên thay đổi dòng 7 để if (result += "2012")làm cho nó xuất ra 20122012?
Philipp

hmmmm ... tôi đã không nghĩ về điều đó ... trở lại bảng vẽ
Chiến tranh

@Philipp - Không, sẽ không biên dịch. Bạn cần một boolean làm giá trị cho một ifcâu lệnh, không phải là một chuỗi.
Vilx-

6
Thêm một ;sau elselàm cho nó xuất ra hai lần.
jimmy23013

1

PHP, 30

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

Chào mừng đến với PPCG! Bài đăng đầu tiên rất hay! Bạn có thể thêm một lời giải thích không?
Rɪᴋᴇʀ

2
Và đây là cách tôi đánh bại nó:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-

@ Vilx- Nice, tôi đã không nghĩ về điều đó.
JSA

Một thất bại khập khiễng cho bất kỳ giải pháp PHP một dòng nào: đặt toàn bộ mã vào một nhận xét <?#$i=2012;$i==2012?$i:2012;?>Giải pháp chống lại điều đó: chèn một dòng mới sau $i=2012.
Tít

1

Taxi , 396 byte

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

Định dạng cho con người, đó là:

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.

Từ việc đọc các câu trả lời khác, giải pháp dường như là chọn một ngôn ngữ dễ vỡ, đặt giá trị, kiểm tra giá trị, in giá trị.


1

SmileBASIC

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

Đầu tiên, chúng tôi kích hoạt chế độ nghiêm ngặt. Điều này buộc bạn phải khai báo tất cả các biến trước khi sử dụng chúng và ngăn chặn những thứ như thay đổi? A $ thành? B $.

Tiếp theo, một biến chuỗi có tên "A $" được tạo và giá trị được đặt thành "@ 2012". Để đảm bảo giá trị của A $ không bị nhầm lẫn, chương trình sẽ cố gắng chuyển sang nhãn và nhãn duy nhất trong chương trình là @ 2012.

Bây giờ, A $ chắc chắn là "@ 2012", nhưng trước khi in, @ cần phải được xóa. SHIFT () xóa mục đầu tiên trong chuỗi hoặc mảng (giống như pop (), nhưng từ đầu kia). Để loại bỏ giá trị được trả về bởi SHIFT, nó được chuyển đến khối IF / THEN, không có gì. Chỉ trong trường hợp ai đó cố gắng nhận xét dòng đó, chúng tôi khai báo một biến "B", được sử dụng sau này. Nếu VAR được nhận xét, dòng cuối cùng sẽ đưa ra lỗi biến không xác định.

Bây giờ, A $ được in và có một VAR khác để ngăn bình luận. Dòng cuối cùng chỉ đảm bảo các biến B và C đều được khai báo.


OK ... Tôi không biết gì về SmileBASIC, vì vậy đây hoàn toàn là một phỏng đoán: ?-A$VAR C- sản phẩm này có thể -2012không?
Vilx-

Điều đó sẽ không hoạt động vì A $ là một chuỗi.
12Me21

Đợi đã, tôi có một ý kiến! Thế còn:?B$VAR C ? :)
Vilx-

Điều đó sẽ gây ra lỗi vì "B $" chưa được khai báo.
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;

Cách tiếp cận thất bại:

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

Giải pháp Perl của bạn có thể bị phá vỡ bằng cách thay thế đầu tiên $&bằng một cái gì đó như $0.
Howard

Và Haskell sẽ bị hỏng nếu bạn thay thế dấu phẩy bằng dấu cộng. Cố gắng dũng cảm mặc dù.
Jeff Burka

Tôi nghĩ rằng nub$filter(\x->x==2012||x==2012)(2012:[2012])có thể an toàn cho giải pháp Haskell.
Jeff Burka

Tôi quên mất use Englishperl, nó sẽ sửa nó. Tôi nghĩ rằng một số bản sửa lỗi hoạt động cho Haskell, bao gồm chuyển sang chuỗi.
Jeff Burdges

1
Giải pháp Perl vẫn còn khá mong manh. Một số cách để phá vỡ nó (tìm thấy trong khi thử nghiệm câu trả lời của riêng tôi ) bao gồm thay thế printvới *rint, prin:, p:inthay #rint, thêm vào trước =vào dòng đầu tiên, hoặc thậm chí thay thế s/.*/với s/./hoặc y/.*/(sẽ được cố định bằng cách khởi $ARGđể 2012bắt đầu với). Ngoài ra, $SUBSEPmẹo của bạn vẫn không bảo vệ chống lại việc chèn *trước dấu chấm phẩy cuối cùng, nhưng một giải pháp dễ dàng hơn nhiều là chỉ cần loại bỏ dấu chấm phẩy không cần thiết đó.
Ilmari Karonen

0

PHP 43 48

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

Chèn một -giữa ?$akết quả -2012được in.
Gareth

Nỗ lực dễ thương với date(), nhưng chương trình cũng phải hoạt động sau năm 2012. ;)
Vilx-

@Gareth - hmm :)
Bộ giải mã

1
@ Vilx- "Nhiệm vụ là viết một chương trình bằng ngôn ngữ yêu thích của bạn xuất ra năm 2012", nơi nó nói nó phải hoạt động sau năm 2012? :)
Bộ giải mã

1
@TheCoder Ok, bây giờ tôi sẽ chèn -giữa tôi ? và cơ bụng. ;-)
Gareth

0

Hồng ngọc ( 57 36)

EDIT Và một số khác trong 36 ký tự.

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

Tôi đoán việc sử dụng các chuỗi là khá không an toàn bởi vì điều đó trừ đi không còn hoạt động nữa.


EDIT thử tiếp theo (36 ký tự) [đừng bận tâm, thêm kết quả -sau pvào -2012]

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


Cái này sẽ chỉ hoạt động trong năm nay, mà còn cho các cuộc thi tương tự trong tương lai :) (15.chars)

p Time.now.year

Lưu ý rằng sự thay thế này cũng đang hoạt động:

p Time.new.year

57 ký tự. Tuy nhiên, nếu bạn đếm các dòng mới, thì đó là 76 ký tự.

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


Hai giải pháp đầu tiên - thêm một #ở đầu dòng. Giải pháp cuối cùng - nhập một dòng mới trước p. (Lưu ý - Bản thân tôi không biết Ruby, nên có lẽ tôi đã sai).
Vilx-

chết tiệt :) bạn nói đúng
Patrick Oscarity

In "2012" cho tôi. Các trích dẫn không phù hợp - là chúng?
người dùng không xác định

Vâng, bạn đúng. Bạn có thể sử dụng $><<hoặc putsthay vào đó. Dù thế nào đi nữa, tôi sẽ không thử điều này nữa, tôi đã từ bỏ :)
Patrick Oscarity

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

Vân vân


Và thêm một phủ định ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

nó vẫn cho ra năm 2012 q){$[-2012~m:2012;m;2012]}` 2012- q){$[2012~m:-2012;m;2012]}` 2012-q){$[2012~m:2012;m;-2012]}` 2012
tmartin

Điều này có thể bị đánh bại bằng cách chuyển đổi ;m;cho một cái gì đó như ;1;hoặc ;x;.
streetster

0

Hmm .. hãy để tôi thử:

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 ký tự không có khoảng trắng.

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
Bị hỏng bằng cách chèn "-", tức là System.out.println(-i)(đối với println đầu tiên). Cũng bị phá vỡ bởi ví dụ thay thế đầu tiên println(i)bằng ví dụ println(1). Cũng có khả năng bị phá vỡ bằng cách thay đổi i == jthành i += j(hoặc - =, v.v.).
TLW

0

PHP

Tôi hy vọng nó không thể phá vỡ :)

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

Tôi thêm một ký tự vào cuối dòng này: echo(printf("%s",$a)==4)?die(3và tôi nhận được 20123.
Vilx-

HmmTHER PHP 5.4.7 hoạt động chính xác với die (3.
Stanislav Yaglo

Bạn đúng. Lỗi của tôi. Tiếp tục tìm kiếm ...
Vilx-

PHP 5.3.3 - cũng đúng. die () chỉ xuất ra chuỗi, nó không xuất ra số.
Stanislav Yaglo

Đợi đã, DUH, đã tìm thấy nó! Chỉ cần thay đổi ."2012"thành ."FAIL". :)
Vilx-

0

Groovy: 26

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

Tôi không biết Groovy nhiều, nhưng điều này có hiệu quả không? x=2012;print x^2012?2012:-x
Vilx-

là những gì -cho?
Armand

@Alison Việc -thử và sửa đổi mã của bạn với một ký tự để nó không còn hoạt động.
Gareth

1
x=2012;print x^=2012?2012:x(thay đổi ^thành ^=) thay đổi đầu ra thành 0.
histocrat

0

Lua

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

1
Điều gì nếu bạn xóa một trong những -dấu hiệu đó?
Vilx-

Ồ, và nếu bạn thay đổi một trong những 2012thứ đó thành một thứ khác, khẳng định sẽ gây ra lỗi. Hmm ... tốt, tôi đoán bạn xứng đáng với điểm sáng tạo vì lạm dụng các quy tắc. Nhưng nghiêm túc, đó không phải là ý nghĩa của nó.
Vilx-
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.