Напишіть програму, яка завжди виводить "2012" - навіть якщо вона модифікована!


116

Ця ідея не моя, хоча я не знаю, звідки вона виникла. Я колись зустрічався з цим на конкурсі програмування дуже давно (1998 р., Якщо я правильно пам’ятаю). Завдання - написати програму на улюбленій мові, яка виводить 2012 і тільки 2012 . Заковика в тому , що програма повинна ще вихід 2012після будь-якого одного з його персонажів змінюється. Модифікація може бути вставкою, видаленням або заміною. Звичайно, модифікація буде такою, що програма все ще синтаксично діє.

Оскільки я не знаю всіх мов програмування, я повинен просити аудиторію допомогти мені і перевірити подані відповіді.

Додано: Багато хто коментує, що моє визначення прийнятних модифікацій занадто розпливчасте. Ось моя друга спроба: дозволені модифікації дадуть вашій програмі синтаксично дійсні та не призведуть до її збою. Там я думаю, що це повинно охоплювати всі помилки компіляції, часу зв’язування та часу виконання. Хоча я впевнений, що у будь-якій мові все-таки буде якийсь незвичайний край, тому коли це з’явиться, ми розглянемо його окремо.


Як щодо помилок виконання, як-от читання найімовірнішої недійсної адреси?
aaaaaaaaaaaa

@PeterTaylor - Є вже 3 відповіді, C - з важким переглядом. Ви можете шукати натхнення там.
Vilx-

2
Хтось розібрався, чи це неможливо в APL чи GolfScript або подібному стислі?
Джефф Бурджес

14
Це змусило мене задуматися про ДНК та надмірності, а також про можливості космічних променів перевертати біти в моїх програмах. Цікаві речі.
Джон Перді

11
... Вам потрібно трохи поспати.
Vilx-

Відповіді:


65

C, 53 символи

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

Трохи довше, ніж відповідає мова сценаріїв, і дотримується того самого основного принципу. Покладається на той факт, що через обмеження синтаксису С єдині літери, які можна було б змінити, не роблячи програму недійсною, знаходяться в рядках!

Редагувати: Поголено 4 символи.

Reedit: Зросла стійкість , відгородився один символ.

Повторне редагування: довше, але надійніше. Просто спробуйте &зараз! (Правильно цього разу).

Оновлення: скорочено трохи; перемагає більшість підходів, побачених досі.

Оновлення: Змінено int до недійсного; повинен перемогти останній можливий підхід, щоб його зламати, я можу придумати.

Оновлення: Я маю на увазі інший підхід; заміна останнього a(може він гниє) на 0; використання двобуквенних імен має вирішити цю проблему.

Оновлення: останнє оновлення скасовано; припущення, що зміни, що викликають помилки виконання, заборонені; aбуде працювати чудово.

Оновлення: повторне відстеження; спроба знеструмлення *aтакож буде за замовчуванням; тому використовувати voidдля дражнити помилку компіляції з неї не слід.

Оновлення: І остаточне скорочення; яка покладається на рядок "2012", розміщений за однією адресою (що є загальним); і що буквальні рядки є лише для читання (також загальними).

Оновлення: коштувало мені двох символів, але я переміг твою неповторну напівколонку!


2
@PaulR: тепер змінено на register void; registerЄ , щоб запобігти &; voidє запобігти *.
Вілліхам Тотланд

6
Гаразд ... виправте мене, якщо це недійсне C, але воно просто працювало на моєму VS2010. Вставте ;між putsі (.
Vilx-

39
+1, вітаю, я думаю, ти це прибив. Я написав простий тестовий джгут, який намагався зібрати і запустити всі можливі однозначні зміни вашого коду, і кожен з них або не компілював, не розбивав або друкував 2012! (Я використовував друковані символи ASCII лише для тестів на вставку та заміщення, але я сумніваюся, що розширення репертуару допоможе.)
Ільмарі Каронен

3
@IlmariKaronen: Ге, це багато зусиль; дякую, що пережив усе це. :)
Вілліхам Тотланд

1
@Titus: Якщо ви маєте на увазі перехід ==на потрійну версію !=, це нікуди не потрапить; замість виведення aйого тепер виводить "2012".
Вілліхам Тотланд

38

Хаскелл, 19

(\xx@2012->xx)$2012

або, як повноцінна програма,

29

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


Для трохи веселішого:

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


Щоб отримати таку, яку неможливо змінити таким чином, що приводить до помилки простого виконання, ми можемо кодувати інформацію в довжину списків, яку неможливо змінити, використовуючи лише зміни одного символу, тобто

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

Щоб зробити його більш модифікованим (безпечно), ми також можемо використовувати саме число як елемент списку - просто потрібно зробити його рядками, щоб запобігти обміну коми на плюс ':

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

Оскільки цей рядок є лише результатом виразу, ми також можемо знову замінити його цим - не проблема завдяки лінивості Haskell

64 72

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

Тут initдіє як "мінус один, але негативно".


Ми також можемо включити систему типів у схему надмірності, а потім записати число таким чином, щоб воно могло бути змінене змінами на один символ ...

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

Тепер ви можете змінити будь-який uна pнавпаки, але це завжди зіпсувало б глибину укладання списків у другому елементі кортежу і тим самим призведе до помилки часу компіляції.

Цю ідею можна було б додатково розширити таким чином, щоб цілі тексти могли бути закодовані компактно, легко читатись та редагуватись та все ще захищені від зміни окремих символів.


І ще один ...

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
Я боюся, що ця компіляція просто чудово модифікована, хоча виняток підкидається під час виконання .
Jeff Burdges

3
@JeffBurdges: впевнений, я вважаю, що це буде включено до "і не призведе до краху".
перестали повертати проти годинникового годинника

1
Для a=map(head.show.length)[[a,a],[],[a],[a,a]]розчину вставте aміж []. Мені дуже подобається цей пост, хоча! Дуже розумні рішення.
Dillon Cower

9
Я переконався, що всі 5825 варіантів вашої 29-символьної програми (замінивши або вставляючи символи 32-126 ASCII) працюють як слід. Ось тестовий сценарій, який я використав . Його можна легко налаштувати для тестування інших програм, включаючи інші мови. Попередження: На моєму ноутбуці пройшло майже 1 годину :)
Хаммар

1
[a]-> []у 64-чарному рішенні
Джон Дворак

14

JavaScript

Я вважаю, що це доказ помилок під час виконання, будь-яка зміна має призвести або до помилки компіляції, або до єдиного попередження 2012 року.

Редагувати: Код зробить помилку під час виконання на чомусь подібному if("alert(2012 "==r), я перемістив розділ спробу, щоб вирішити це.

Редагувати: Хороший один Vilx-, але виправлений :-) Тепер є дужка невідповідності для вставки цієї крапки з комою.

Редагувати: Але тоді кома могла зробити те саме, що і крапкою з комою, тобто безліччю варіантів, я думаю, що я це виправив, але код зараз дуже жахливий.

Редагування: трохи спрощено.

Редагувати: ще один із нескінченної серії виправлень.

Редагувати: Цей вид відчуває себе довше і складніше, ніж куленепробивний, але про нього слід принаймні піклуватися ~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
Тому що, наприклад, q-")"повертається NaN, в який перетворюється eval, "NaN"перш ніж його оцінювати, що просто повертає його назад NaN. Дивна річ, але технічно законна, щоб не викликати улов.
aaaaaaaaaaaa

4
Те саме, що і рішення C - вставити ;між evalі (.
Вількс-

1
Для читачів коментарів виправлення крапки з комою виправлено, я вважаю, що код зараз чистий.
aaaaaaaaaaaa

4
Не впевнений, чи зараховується це чи ні, але ~ставлення перед evalпричинами повторюється 2012 двічі замість одного разу. Не впевнений, чи це не дотримується правил чи ні: P
mellamokb

2
Додавання !після eval(розбиває його.
jimmy23013

13

Perl, 49 чол

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

Виходячи з відповіді JB , але ця фактично задовольняє специфікації . Вичерпна перевірка показує, що кожне видалення, вставка чи заміна одного символу або залишає вихід незмінним, або спричиняє збій програми при запуску (як зазначено ненульовим значенням повернення та виведенням на stderr), принаймні до тих пір, поки вставки та заміни обмежуються символами для друку ASCII.

(Без обмеження завдання неможливо в Perl: маловідома функція парсера Perl полягає в тому, що він зупиняється, коли стикається з символом Ctrl-D або Ctrl-Z, тому вставляючи будь-яку з них перед будь-яким файлом виворотами це у дійсну програму Perl, яка нічого не робить.)

Редагувати: Поголив ще одну табличку, замінивши 1==printна 0-print.


Перерви з Perl 5.28, де printпочинається повернення 'true'замість 1 :-P
JB

3
@JB: Ну, ти можеш це зробити негативом, коли це станеться. :) (На користь інших читачів, це жарт. Наскільки я знаю, printв жодній версії Perl 5 не планується змінювати повернуту вартість , навіть якщо вона не є чітко зафіксованою .)
Ilmari Каронен

12

Брейнфук

Я намагаюся переконати себе, що це можливо, і я цілком впевнений, що, можливо, я розтягнув це занадто далеко. Я зробив кілька припущень щодо свого оточення:

  1. Нескінченний цикл вважається "крахом". Аналогічна умова може бути досягнута зменшенням нуля або зліва від нуля місця пам'яті у певних інтерпретаторах. Багатьом перекладачам важко зірватися під час виконання. Я уникаю проблеми зупинки, використовуючи лише найпростіший, очевидний нескінченний цикл.
  2. Незрівняні квадратні дужки вважаються помилкою компіляції.
  3. Це буде працювати лише в середовищі, де вихід програми передається на власний вклад. Я використовую це для перевірки того, що він справді вийшов '2012'. Це єдиний спосіб, коли я міг обійти просто видалення одного з вихідних символів.

На жаль, якщо ви отримаєте якісь суворіші дії, я боюся, що це буде неможливо. Ось моє рішення:

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

В основному, ви можете змінити вихідний код або код підтвердження, але не обидва. Один із них гарантовано працює. Якщо хтось із них цього не зробить, він "виллється".


5
Тьфу, мізерний! Ви просто НАДАЛИ, чи не так? XD
Vilx-

8
Ви б вважали за краще, щоб він замість цього використовував пробіли?
NRGdallas

7

Python2

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

Мені довелося трохи змінити тестовий сценарій Рея, щоб перевірити це, оскільки перенаправлення stdout порушило його. Передача порожніх диктів для виконання дозволяє уникнути забруднення простору імен

exec(prog, {}, {})

Чудово! Ви встигаєте!
Рей

6

Brain-Flak , 44 + 3 = 47 байт [Не конкурує]

При цьому використовується -Aпрапор Brain-Flak та виводиться символи 2012в STDOUT

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

Спробуйте в Інтернеті!

Альтернативно, 50 байт

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

Спробуйте в Інтернеті!

Пояснення

Будь-яка зміна символів будь-якого з наведених вище кодів призведе до помилки програми.


3
Га! Правильна мова для виклику.
DLosc

4

Сісі , не конкуруючий

Нарешті, я думаю, я знайшов одну зі своїх мов, яка працює. Це жахливо довго, і мова є новішою, ніж питання, але вона все ще відчуває себе як досягнення.

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 - мова іграшок, натхненна складанням та QBasic. Це добре для цього виклику, оскільки його синтаксис надзвичайно обмежений.

  • Вона має тільки чотири команди: set, print, jump, і jumpif.
  • Усі команди мають фіксовану аритність.
  • Усі рядки повинні мати номери рядків, які суворо збільшуються.
  • Вирази дозволяються лише у setвисловлюваннях. Вони можуть містити (максимум) одну операцію, яка повинна бути двійковою. Зокрема: зміна print xxна print -xx- це синтаксична помилка.
  • Імена змінних повинні складатися з малих літер.
  • Найголовніше: немає синтаксису коментарів !

Програма

Основою програми є ця частина:

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

Ми зберігаємо 2012в xx, а потім перевірити, чи був успішним і зберегти результат тесту в y. Якщо yце правда, перейдіть до рядка 55. (Переходи до неіснуючих номерів рядків просто вперед до наступного рядка.)

Радіаційне затвердіння

  • Якщо призначення в рядку 1 модифіковане, то yфальси, стрибок не відбувається, а рядок 4 встановлюється xxдо 2012 року.
  • Якщо призначення у другому рядку або умова стрибка у рядку 3 буде змінено, нас не хвилює: xxчи будемо ми встановити 2012 рік, чи будемо ми робити стрибок чи ні.
  • Ціль стрибка в рядку 3 може бути змінена на 5 або 955. Будь-яка можлива модифікація printрано чи пізно потрапляє на лінію 955. Неможливо з однією модифікацією стрибнути назад (створивши цикл) або минувши до кінця програми.
  • Якщо призначення в рядку 4 буде змінено, нас не хвилює: призначення рядка 1 буде правильним, і ми пропустимо повз 4 рядок.
  • Якщо рядок 955 буде змінено, у нас може виникнути проблема. Єдине прикро про Sisi - це те, що неініціалізовані змінні за замовчуванням є 0, тому модифікація, на зразок print ax, не є помилкою. Некрасивим, але ефективним рішенням є лінії 828-954, які призначають 2012 кожній можливій змінній з відстані редагування 1 від xx. Це гарантує, що будь-які зміни до фіналу print xxвсе ж надрукують 2012 рік.
  • Якщо номер рядка буде змінено: 1) він вийде з ладу і буде синтаксичною помилкою, або 2) це не вплине на потік програми. Основна модифікація, про яку ми можемо турбуватися, - змінити лінію 4 на 94, тим самим вставити її після переходу до 55 - не має значення, тому що все, що вона робить, - це призначити 2012 xxзнову.

Хороший! Я не можу придумати спосіб, як це обійти. "А" за зусилля від мене, це точно! :)
Vilx-

3

Пітон

Трохи багатослівний (тепер із виправленням для цієї прискіпливої ​​крапки з комою між printта (!):

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

@Jeff Burdges: Так, із цим я забороняю також помилки під час виконання. :)
Dillon Cower

Боюся, що це все ще синтаксично правильно, якщо перехрестя видає порожній набір, а поп викидає помилку виконання . Додайте ще 2012 року з обох сторін.
Джефф Бурджес

@DC: Я б сказав, що виняток - це не те саме, що помилка виконання, хоча, здається, винятки називають помилками в Python. pop()Якщо порожній набір не є помилкою сам по собі, але він викликає "Помилку".
Вілліхам Тотланд

1
Винятком стає помилка, коли вона не потрапляє.
Ільмарі Каронен

1
вставлення коми після popвиходів<built-in method pop of set object at 0xb6fe93ac> ()
гніблер

3

T-SQL 2012, 55

DECLARE @n CHAR(4)='2012'PRINT IIF(@n='2012',@n,'2012')

Що це за діалект SQL? Схоже, Transact-SQL (він же SQL Server), але в ньому є недійсний синтаксис.
Vilx-

@ Vilx: я сам тестував його в SQL Server 2008, коли я намагався його зламати, і він спрацював чудово.
mellamokb

@mellamokb - Це дивно. Це саме те, що я зробив, і він скаржився, що ви не можете призначити значення за замовчуванням змінній (вам потрібен окремий оператор SET), і немає IIF (лише CASE).
Vilx-

1
@ Vilx-: Ах, ти маєш рацію. Тепер я розумію, що насправді тестував на SQL Azure. З SQL Server 2008 я отримую ті самі помилки, що і ви. Однак, схоже, він працює добре в SQL Server 2012 / Azure. Ось демонстрація з SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

Гаразд, вітаю, я не можу знайти жодних очевидних способів вирішити це! :) Це не означає, що таких немає. ;)
Вількс-

3

Я створив сценарій python, щоб судити про всі рішення python. Сценарій розбиває перше і третє рішення пітонів, використовуючи безліч різних методів. І друге рішення, що використовувати лямбда, щоб захистити себе, є непорушним. Друге рішення python знаходиться в python 3. Я змінив його у формат python 2, а потім програма судді розірвала його.

Ось сценарій судді.

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) 

круто! моя відповідь одночасно смокче і дме
гніблер

p2завжди кидає виняток для Python2. Вихід ніколи не буде . Ваша програма судді не працюватиме під Python3, оскільки вона використовує заяви друку.
гніблер

@gnibbler Я не помітив, що p2є в python 3.
Ray

Я розробив нову відповідь на Python2, який передає ваш сценарій
gnibbler


2

Javascript - 68, 77, 84 , 80 символів

Ось рішення, яке має запрацювати цього року :)

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

Ось тест-скрипка .

Оновлення 1: виправлена ​​проблема, коли eval (+ a) зламав її (спасибі eBusiness).

Оновлення 2: Виправлено для параметра "|" випадок (ще раз дякую електронному бізнесу).

Оновлення 3: Виправлено для випадку ">" (ще раз дякую електронному бізнесу). І порушив справу "1" :(


Ви не охороняли свою оцінку. eval(+a)і багато інших модифікацій працює ідеально, але не дуже багато.
aaaaaaaaaaaa

@eBusiness: Дякую, що вказали на eval(+a)випадок, який зараз слід виправити. Крім того, я не зміг знайти один із випадків модифікації, коли він працює нормально, але не виводить 2012 рік, тож, будь ласка, наведіть мені приклад?
Briguy37

eval(0)і, eval(-a)наприклад, робить те ж саме.
aaaaaaaaaaaa

Редагування публікації можна принаймні порушити, замінивши ||на |.
aaaaaaaaaaaa

5
Порушення, якщо ви змінили перший alertна aler=.
jimmy23013

2

Рубін 1,9 - 43 символи

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

Не випробуваний, тому відривайтесь.


2

Excel, 14 символів (трохи обман):

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

Будь-яка дійсна зміна масиву вплине на вміст обох комірок, а спроба змінити лише одну клітинку викликає повідомлення про помилку.

Звичайно, це виходить з ладу, якщо ви вважаєте, що це дійсно лише одна формула, на відміну від 2 формул, які обмежені ідентичними.


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

Пояснення:

  1. Не змінюючи нічого, він піде наступним шляхом: 1 → 2 (і поверне aзначення значення 2012).
  2. Якщо вміст String aбудь-яким чином буде змінено, він піде наступним шляхом: 1 → 3 → 5 (і поверне bнезмінене значення 2012).
  3. Якщо вміст String bбудь-яким чином буде змінено, він піде наступним шляхом: 1 → 3 → 4 (і поверне aнезмінне значення 2012).
  4. Якщо a.equals(b)on @ 1 буде змінено на a.equals(a), b.equals(b)або !a.equals(b)він все одно піде таким же шляхом: 1 → 2 (і він поверне aнезмінене значення 2012).
  5. Якщо aна @ 2 буде змінено bйого, він все одно піде наступним шляхом: 1 → 2 (і він поверне bнезмінене значення 2012).
  6. Якщо будь-який aабо bбуде змінено на протилежне в рядках 3, 4 або 5, він все одно піде наступним шляхом: 1 → 2 (і поверне aнезмінне значення 2012)
  7. Якщо вміст String on @ 3 будь-яким чином буде змінено, він все одно піде наступним шляхом: 1 → 2 (і поверне aнезмінне значення 2012)
  8. Зміна Mв class Mабо aв main(String[]a)інший діючий персонаж може бути зроблено без будь - яких змін в функціональність коду.
  9. Будь-яка інша зміна призведе до помилки компіляції (виключаючи деякі вхідні / білі простори, які можна видалити / додати).

Спробуйте всі ці модифікації тут, щоб переконатися, що вони все ще друкують 2012 рік.

Якщо ви зможете знайти будь-який спосіб його порушення, дотримуючись правил ОП, я хотів би знати, тому я можу придумати щось, щоб виправити це.
На відміну від більшості подібних запитань, де змінюється одна таблиця знаків, це питання дозволяє базовій структурі мови програмування бути недоторканою, тому Java, нарешті, можуть змагатися за один вхід (визнаймо це, Java буде - майже - ніколи нічого не виграє це SE xD).


Який негативний знак вставляється на шлях 4 перед a? Чи буде програма все ще виходити в 2012 році, або буде виходити -2012?
Корови гукають

@KritixiLithos Це рядок, тому ви не можете вставити a -перед aабо b. Ось скріншот помилки компіляції.
Кевін Круїйсен

1

Рубін 1.9

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

Я будую цю коротку, але просту програму, яку вам пропонують перервати відповідно до вищезазначених правил. Я навіть не зміг знайти позицію, де зміна виводу (не порушуючи код), якщо #вставлений а, щоб прокоментувати решту рядка.


ставить (r = 2012) == 2012? -r: 2012.send (: abs) друкує "-2012"
Joanis

@ M.Joanis Але вам потрібні два додаткові символи: пробіл та мінус. Мінус поодинці не вийде.
Говард

Ах, ти маєш рацію! Помилка компіляції. Я нічого не знаю про Рубі, я повинен бути обережнішим. Вибачте!
Джоаніс

1
Відповідно irb, додавання мінусу до rxрезультатів у дійсній програмі, яка виводить -2012
Конрад Рудольф

2
Якщо змінити, putsце putcпризведе до виведення a ?в Ruby 1.9.
гістократ

1

Скала, 95

(або 54, якщо пропустити безглузді частини)

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

Боюся, я не знаю достатньо про Scala, щоб знайти будь-які недоліки. :( Чи можуть, будь-ласка, інші люди подивитись?
Vilx-

На цьому рівні не важко. Більшість твердості Scala пояснюється складністю системи її типу (яку я досі не можу зрозуміти повністю: D)
Sarge Borsch,

Я не знаю Скалу, але, (...),("2012")здавалося, зламав її.
jimmy23013

1

C #

Звичайно, це не так просто, чи не так? ...

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

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

Добре, що я сумую?


1
Що станеться, якщо 8-й рядок змінити на "Console.WriteLine (-result);"
Гленн Рендерс-Персон

Тут немає компілятора C #, але чи не слід змінювати рядок 7, щоб if (result += "2012")зробити його вихідним 20122012?
Філіпп

хмммм ... я не думав про це ... повернутися до креслярської дошки
війна

@Philipp - Ні, це не збирається. Вам потрібне булеве значення як ifвисловлювання, а не рядок.
Vilx-

6
Додавання ;після цього elseробить його два рази.
jimmy23013

1

PHP, 30

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

Ласкаво просимо до PPCG! Гарний перший пост! Чи можете ви також додати пояснення?
Rɪᴋᴇʀ

2
І ось як я переміг би її:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-

@ Vilx - Ніцца, я про це не думав.
jsa

Нагальна поразка для будь-якого однорядкового рішення PHP: покладіть весь код у коментар. <?#$i=2012;$i==2012?$i:2012;?>Рішення проти цього: вставити новий рядок після $i=2012.
Тит

1

Таксі , 396 байт

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.

Відформатований для людей, це:

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.

Ознайомившись з іншими відповідями, рішенням здається вибрати неміцну мову, встановити значення, перевірити значення, роздрукувати значення.


1

SmileBASIC

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

По-перше, ми включаємо суворий режим. Це змушує вас оголосити всі змінні перед їх використанням і запобігає такі зміни, як "A $ to" B $.

Далі створюється змінна рядка під назвою "A $" і значення встановлюється на "@ 2012". Щоб переконатися, що значення A $ не було змінено, програма спробує перейти до мітки, і єдиною міткою в програмі є @ 2012.

Тепер, A $, безумовно, "@ 2012", але перш ніж надрукувати його, @ потрібно видалити. SHIFT () видаляє перший елемент у рядку чи масиві (як pop (), але з іншого кінця). Щоб відкинути значення, повернене SHIFT, воно передається блоку IF / THEN, який нічого не робить. На випадок, якщо хтось спробує прокоментувати цей рядок, ми оголосимо змінну "B", яка буде використана пізніше. Якщо VAR прокоментується, останній рядок видасть помилку Невизначена змінна.

Тепер надрукується A $, і є ще одна VAR для запобігання коментарів. Заключний рядок просто гарантує, що змінні B і C були оголошені.


Гаразд ... Я нічого не знаю про SmileBASIC, тому це суто здогад: ?-A$VAR C- Чи міг би цей результат -2012?
Vilx-

Це не спрацює, оскільки A $ - це рядок.
12Me21

Зачекайте, я маю ідею! Як щодо: ?B$VAR C? :)
Vilx-

Це призведе до помилки, оскільки "B $" не було оголошено.
12Me21

0

Хаскелл, 65

import Data.List
nub$filter(\x->x==2012||x==2012)([2012]++[2012])

Перл, 84

use strict;use English;$ARG=
2032;s/.*/2012/unless$ARG eq 2012;$SUBSEP=2012;print;

Не вдався підхід:

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

Ви, рішення Perl, можна порушити, замінивши перше $&на щось подібне $0.
Говард

І Haskell один зламається, якщо замінити кому знаком плюс. Хоча доблесна спроба.
Джефф Бурка

Я думаю, що це nub$filter(\x->x==2012||x==2012)(2012:[2012])може бути безпечним для рішення Haskell.
Джефф Бурка

Я забув use Englishінтерл, що це виправить. Я думаю, що для Haskell працює кілька виправлень, включаючи перехід до рядків.
Джефф Бурджес

1
Рішення Perl все ще досить крихке. Деякі способи зламати його (знайдені під час тестування мого власного відповіді ) включають заміну printз *rint, prin:, p:intабо #rint, випереджаючи =до першої лінії, або навіть замінити s/.*/з s/./або y/.*/(які будуть усунені шляхом ініціалізації $ARGдо 2012почати с). Крім того, ваш $SUBSEPтрюк все ще не захищає від вставлення *перед кінцевою крапкою з комою, але набагато простішим рішенням є просто видалити цю непотрібну крапку з комою.
Ільмарі Каронен

0

PHP, 43 48

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

Вставлення -між друком ?та $aрезультатами -2012друку.
Гарет

Мила спроба з date(), але програма повинна працювати і після 2012 року. ;)
Вількс-

@Gareth - hmm :)
Кодер

1
@ Vilx- "Завдання полягає в тому, щоб написати програму на своїй улюбленій мові, яка виводить 2012", де сказано, що вона повинна працювати після 2012 року? :)
Кодер

1
@TheCoder Добре, тепер я збираюся вставити своє -між? і абс. ;-)
Гарет

0

Рубін ( 57 36)

EDIT І ще один з 36 символів.

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

Я думаю, що використання рядків є досить незахищеним, оскільки той мінус більше не працює.


Наступна спроба редагувати (36 знаків) [не маючи на увазі, додаючи результати -після ]p-2012

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


Цей буде працювати лише цього року, але і для подібних конкурсів у майбутньому :) (15. годин)

p Time.now.year

Зауважте, що ця заміна також працює:

p Time.new.year

57 символів. Якщо порахувати нові рядки, це теж 76 символів.

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


Перші два рішення - додайте а #на початку рядка. Останнє рішення - введіть новий рядок раніше p. (Примітка - я сам не знаю Рубі, тому, можливо, я помиляюся).
Vilx-

чорт :) ти маєш рацію
Патрік Осіті

Друкує «2012» для мене. Цитати не відповідають - чи не так?
користувач невідомий

Так, ти маєш рацію. Ви можете використовувати $><<або putsзамість цього. Що б я більше не намагався, я відмовився :)
Patrick Oscity

0

Q, 23

{$[2012~m:2012;m;2012]}

.

q){$[2012~m:2012;m;2012]}`
2012
q){$[1012~m:2012;m;2012]}`
2012
q){$[2012~m:1012;m;2012]}`
2012
q){$[2012~m:2012;m;1012]}`
2012
q){$[2012~\m:2012;m;2012]}`
2012
q){$[2012~/m:2012;m;2012]}`
2012
q){$[2012~'m:2012;m;2012]}`
2012

тощо


І додавання мінус ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Гаффі

вона все ще виводить 2012 q){$[-2012~m:2012;m;2012]}` 2012- q){$[2012~m:-2012;m;2012]}` 2012-q){$[2012~m:2012;m;-2012]}` 2012
tmartin

Це можна перемогти, вимкнувши ;m;щось на зразок ;1;або ;x;.
Стрітер

0

Хм .. дозвольте спробувати:

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 символів без пробілу.

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
Розбито, вставивши "-", тобто System.out.println(-i)(для першого println). Також розбивається, наприклад, замінюючи перший println(i)на напр println(1). Також потенційно може бути порушена зміною i == jна i += j(або - = тощо).
TLW

0

PHP

Я сподіваюся, що це непорушно :)

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

Я додаю один символ до кінця цього рядка: echo(printf("%s",$a)==4)?die(3і я отримую 20123.
Vilx-

Гм… PHP 5.4.7 працює правильно з матрицею (3.
Станіслав Ягло,

Ти правий. Моє ліжко. Продовження пошуку ...
Vilx-

PHP 5.3.3 - також правильно. die () виводить лише рядки, не виводить числа.
Станіслав Ягло

Зачекай, ДЮХ, знайшов! Просто змініть ."2012"на ."FAIL". :)
Vilx-

0

Грувий: 26

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

Я багато не знаю Гроови, але чи спрацювало б це? x=2012;print x^2012?2012:-x
Vilx-

для чого це -?
Арман

@Alison Це -спробувати змінити свій код одним символом, щоб він більше не працював.
Гарет

1
x=2012;print x^=2012?2012:x(змінюється ^на ^=) змінює вихід на 0.
гістократ

0

Луа

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

1
Що робити, якщо видалити один із цих -знаків?
Vilx-

О, і якщо ви заміните один із них 2012на щось інше, затвердження призведе до помилки. Хм ... ну, мабуть, ви заслуговуєте на творчі бали за зловживання правилами. Але якщо серйозно, то це не малося на увазі.
Vilx-
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.