Напишите программу, которая всегда выдает «2012» - даже если она изменена!

116

Эта идея не моя, хотя я не знаю, откуда она взялась. Однажды я встретил его на конкурсе по программированию очень давно (1998, если я правильно помню). Задача состоит в том, чтобы написать программу на вашем любимом языке, который выводит 2012 и только 2012 . Загвоздка в том , что программа должна еще выход 2012после любого одного из его персонажей изменяется. Модификация может быть либо вставкой, удалением или заменой. Конечно, модификация будет такой, что программа все еще синтаксически допустима.

Поскольку я не знаю всех языков программирования, я должен попросить аудиторию помочь мне и проверить представленные ответы.

Добавлено: Многие отмечают, что мое определение приемлемых модификаций слишком расплывчато. Вот моя вторая попытка: разрешенные изменения оставят вашу программу синтаксически действительной и не приведут к ее аварийному завершению. Там, я думаю, это должно охватывать все ошибки времени компиляции, компоновки и выполнения. Хотя я уверен, что на каком-то языке в любом случае будет какой-то странный случай, поэтому, когда это произойдет, мы рассмотрим его индивидуально.

Vilx-
источник
Как насчет ошибок во время выполнения, таких как чтение наиболее вероятного неверного адреса?
aaaaaaaaaaaa
@PeterTaylor - уже есть 3 ответа, C с тяжелым пересмотром. Вы можете искать вдохновение там.
Vilx-
2
Кто-нибудь выяснил, если это невозможно в APL или GolfScript или аналогично кратко?
Джефф Берджес
14
Это заставило меня задуматься о ДНК, избыточности и возможности космических лучей в моих программах. Интересные вещи.
Джон Пурди
11
... Тебе нужно немного поспать.
Vilx-

Ответы:

65

C, 53 символа

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

Немного дольше, чем отвечает язык сценариев, и следует тому же основному принципу. Полагается на тот факт, что из-за ограничений синтаксиса C единственные буквы, которые можно было бы изменить, не делая программу недействительной, находятся внутри строк!

Изменить: сбрил 4 символа.

Reedit: Прочность увеличена, сбрил одного персонажа.

Повторное редактирование: длиннее, но надежнее. Просто попробуйте &сейчас! (Правильно на этот раз).

Обновление: немного укорочено; побеждает большинство подходов, замеченных до сих пор.

Обновить: заменено int на void; должен победить последний возможный подход, чтобы сломать это, я могу думать.

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

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

Обновление: возвращение назад немного больше; пытаясь разыменовать*a также приведет к ошибке; поэтому использовать его voidдля исключения ошибки компиляции не нужно.

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

Обновление: это стоило мне двух персонажей, но я победил вашу маленькую точку с запятой!

Виллихам Тотланд
источник
2
@PaulR: теперь изменилось на register void; registerЕсть , чтобы предотвратить &; voidесть предотвратить *.
Williham Totland
6
ОК ... поправьте меня, если это неверный C, но он просто работал на моем VS2010. Вставьте ;между putsи (.
Vilx-
39
+1, поздравляю, я думаю, что вы это прибили. Я написал простую тестовую систему, которая пыталась скомпилировать и запустить все возможные варианты вашего кода, состоящие из одного символа, и каждый из них либо не скомпилирован, ни разбился, ни напечатан 2012! (Я использовал только печатные символы ASCII для тестов на вставку и замену, но я сомневаюсь, что расширение репертуара помогло бы.)
Ilmari Karonen
3
@IlmariKaronen: Хех, это много усилий; спасибо, что прошел через все это. :)
Williham Totland
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"]]

Поскольку эта строка является просто результатом выражения, мы также можем снова заменить ее этим - не проблема благодаря ленивости Хаскелла

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
Я боюсь, что это компилируется просто отлично, хотя исключение выдается во время выполнения .
Джефф Берджес
3
@JeffBurdges: конечно, я считаю, что это будет включено в "и не приведет к сбою".
перестал поворачиваться против часовой стрелки с
1
Для a=map(head.show.length)[[a,a],[],[a],[a,a]]решения вставьте aмежду []. Мне действительно нравится этот пост, хотя! Очень умные решения.
Диллон Коуэр
9
Я проверил, что все 5825 вариантов вашей 29-символьной программы (замена или вставка символов ASCII 32-126) работают должным образом. Вот тестовый скрипт, который я использовал . Его можно легко настроить для тестирования других программ, включая другие языки. Предупреждение: на моем ноутбуке потребовалось почти 1 час :)
Hammar
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)
}
AAAAAAAAAAAA
источник
1
Потому что, например, q-")"возвращается NaN, в который eval конвертируется "NaN"перед его вычислением, что просто возвращает его обратно NaN. Странная вещь, но технически законная, так что это не вызывает улова.
аааааааааааа
4
То же самое, что и решение C - вставьте ;между evalи (.
Vilx-
1
Для читателей комментариев исправлена ​​уязвимость точки с запятой, я считаю, что код теперь будет чистым.
аааааааааааа
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

Brainfuck

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

  1. Бесконечный цикл считается «крахом». Подобное условие может быть достигнуто уменьшением после нуля или слева от ячейки памяти нуля в некоторых интерпретаторах. Многим переводчикам сложно потерпеть крах во время выполнения. Я избегаю проблемы остановки, используя только самый простой, самый очевидный бесконечный цикл.
  2. Несоответствующие квадратные скобки считаются ошибкой компиляции.
  3. Это будет работать только в среде, где выходные данные программы передаются обратно на собственный ввод. Я использую это, чтобы убедиться, что он действительно вывел «2012». Это единственный способ обойтись, просто удалив один из выходных символов.

К сожалению, если вы станете более строгими, я боюсь, что это будет невозможно. Вот мое решение:

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

По сути, вы можете изменить выходной код или код подтверждения, но не оба. Один из них гарантированно работает. Если один из них этого не сделает, он «рухнет».

captncraig
источник
5
Тьфу, блядь! Вы просто должны были, не так ли? XD
Vilx-
8
Вы бы предпочли, чтобы он использовал пробелы?
NRGdallas
7

python2

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

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

exec(prog, {}, {})
gnibbler
источник
Большой! Ты делаешь это!
Рэй
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 изменено, то значение yfalse, скачок не происходит, а в строке 4 устанавливается xxзначение 2012.
  • Если назначение в строке 2 или условие перехода в строке 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снова.
DLosc
источник
Хороший! Я не могу придумать способ обойти это. «А» за усилия от меня, это точно! :)
Vilx
3

питон

Немного многословно (теперь с исправлением этой надоедливой точки с запятой между printи (!):

a=[0]
(lambda x:print(
set(['2012']).intersection(set(["2012"])).pop()))(
*a)
Диллон Кауэр
источник
@Jeff Burdges: Да, с этим я делаю ставку на ошибки во время выполнения, которые также запрещены. :)
Диллон Кауэр
Я боюсь, что это все еще синтаксически правильно, если пересечение выдает пустой набор, а pop выдает ошибку времени выполнения . Добавьте больше 2012 с обеих сторон.
Джефф Берджес
@DC: Я бы сказал, что исключение не совпадает с ошибкой во время выполнения, хотя в Python исключения называются ошибками. pop()Пустой набор сам по себе не является ошибкой, но он вызывает ошибку.
Williham Totland
1
Исключение становится ошибкой, когда оно не перехвачено.
Илмари Каронен
1
вставив запятую после popвыходных данных<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')
мизер
источник
Какой это диалект 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
ОК, поздравляю, я не могу найти очевидных способов это сломать! :) Это не значит, что их нет. ;)
Vilx-
3

Я сделал скрипт Python, чтобы судить обо всех решениях 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) 
луч
источник
прохладно! мой ответ - отстой и удары одновременно
gnibbler
p2всегда выдает исключение для Python2. Выходные данные никогда не 2012. Ваша программа судьи не будет работать под Python3, поскольку она использует операторы print.
gnibbler
@gnibbler Я не заметил, что p2это в Python 3.
Рэй
Я разработал новый ответ для Python2, который передает ваш скрипт
gnibbler
3

Mathematica, 23 символа

Запись: "/." означает «заменить»

2012/.Except@2012->2012
Доктор белисарий
источник
2
Это может быть своего рода слабый ответ / поражение, но изменить /.на //(постфиксная форма).
Диллон Коуэр
@DillonCower Хороший улов!
Доктор Велизарий
2

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

Вот решение, которое должно работать в этом году :)

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

Вот тестовая скрипка .

Update 1: Исправлена ошибка , при которой Eval (+ а) сломал его (благодаря электронному бизнесу).

Обновление 2: исправлено для «|» дело (еще раз спасибо eBusiness).

Обновление 3: исправлено для случая «>» (еще раз спасибо eBusiness). И сломался для дела «1» :(

Briguy37
источник
Вы не охраняли свой eval. eval(+a)и многие другие модификации работают отлично, но не очень.
аааааааааааа
@eBusiness: Спасибо за указание на eval(+a)случай, который теперь должен быть исправлен. Кроме того, мне не удалось найти один из случаев модификации, когда он работает нормально, но не выводит 2012, поэтому не могли бы вы привести пример?
Briguy37
eval(0)и, eval(-a)например, делает то же самое.
аааааааааааа
После редактирования его можно по крайней мере нарушить, заменив ||на |.
аааааааааааа
5
Перерывы, если вы измените первый alertна aler=.
jimmy23013
2

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

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

Не проверено, поэтому откололись.

histocrat
источник
2

Excel, 14 символов (немного изменяет):

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

Любое допустимое изменение массива повлияет на содержимое обеих ячеек, и попытка изменить только одну ячейку вызовет сообщение об ошибке.

Конечно, это не работает, если вы придерживаетесь мнения, что на самом деле это только одна формула, а не две формулы, которые должны быть идентичными.

user3490
источник
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) @ 1 изменено на a.equals(a), b.equals(b)или !a.equals(b)оно все равно будет идти по тому же пути: 1 → 2 (и будет возвращено aнеизменное значение 2012).
  5. Если значение a@ 2 изменено на, bоно все равно будет идти по следующему пути: 1 → 2 (и будет возвращено bнеизменное значение 2012).
  6. Если либо ab в строках 3, 4 или 5 либо изменилось на противоположное, он все равно будет идти по следующему пути: 1 → 2 (и вернет aнеизмененное значение 2012)
  7. Если содержимое строки в @ 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или b. Вот скриншот ошибки компиляции.
Кевин Круйссен
1

Рубин 1.9

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

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

Говард
источник
ставит (r = 2012) == 2012? -r: 2012.send (: abs) печатает "-2012"
Joanis
@ M.Joanis Но вам нужно два дополнительных символа: пробел и минус. Один минус не сработает.
Говард
Ах, ты прав! Ошибка компиляции. Я ничего не знаю о Руби, я должен быть более осторожным. Сожалею!
Джоанис
1
В соответствии с irbдобавлением минуса перед rxрезультатами в действительной программе, которая выводит -2012...
Конрад Рудольф
2
Изменение putsв putcпричинах этого для вывода ?в Ruby 1.9.
гистократ
1

Скала, 95

(или 54, если пропустить не значащие части)

object Main{def main(ar:Array[String]){print(((s:String)=>if(s=="2012")s else"2012")("2012"))}}
Сардж Борщ
источник
Боюсь, я не знаю достаточно о Скале, чтобы найти какие-либо недостатки. :( Могут ли другие люди, пожалуйста, взглянуть?
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
Что произойдет, если вы измените восьмую строку на «Console.WriteLine (-result);»?
Гленн Рандерс-Персон
Здесь нет компилятора C #, но не следует ли изменить строку 7, чтобы if (result += "2012")он выводился 20122012?
Филипп
хмммм ... я не думал об этом ... вернуться к чертежной доске
война
@ Филипп - Нет, это не скомпилируется. Вам нужно логическое значение в качестве значения для ifоператора, а не строки.
Vilx-
6
Добавление ;после elseделает его выводит два раза.
jimmy23013
1

PHP, 30

<?=$i=2012;$i==2012?$i:2012;?>
АПБ
источник
Добро пожаловать в PPCG! Хороший первый пост! Можете ли вы добавить объяснение также?
Rɪᴋᴇʀ
2
И вот как я победил бы это:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-
@ Вилкс: Хорошо, я об этом не думала.
17
Хромое поражение для любого однострочного решения 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 $ на? B $.

Затем создается строковая переменная с именем «A $», и ее значение устанавливается равным «@ 2012». Чтобы убедиться, что значение A $ не было перепутано, программа попытается перейти к метке, и единственная метка в программе - @ 2012.

Теперь A $ определенно равен «@ 2012», но перед его печатью необходимо удалить @. SHIFT () удаляет первый элемент в строке или массиве (как pop (), но с другого конца). Чтобы отбросить значение, возвращаемое SHIFT, оно передается в блок IF / THEN, который ничего не делает. На всякий случай, если кто-то пытается закомментировать эту строку, мы объявляем переменную «B», которая используется позже. Если VAR закомментирован, последняя строка выдаст ошибку неопределенной переменной.

Теперь печатается A $, и есть еще один VAR для предотвращения комментариев. Последняя строка просто гарантирует, что переменные B и C были объявлены.

12Me21
источник
ОК ... Я ничего не знаю о 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])

Perl, 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в Perl, это будет исправить. Я думаю, что несколько исправлений работают на 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 года. ;)
Vilx-
@ Гарет - хм :)
Кодер
1
@ Vilx- «Задача - написать программу на вашем любимом языке, которая выйдет в 2012 году», где говорится, что она должна работать после 2012 года? :)
Кодер
1
@TheCoder Хорошо, теперь я собираюсь вставить свой -между? и абс. ;-)
Гарет
0

Рубин ( 57 36)

РЕДАКТИРОВАТЬ И еще один в 36 символов.

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

Я думаю, что использование строк довольно безопасно, потому что этот минус больше не работает.


РЕДАКТИРОВАТЬ следующую попытку (36 символов) [не берите в голову, добавляя -послеp результатов в -2012]

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


Этот будет работать только в этом году, но также и для подобных конкурсов в будущем :) (15.chars)

p Time.now.year

Обратите внимание, что эта замена также работает:

p Time.new.year

57 символов Если учесть переводы строк, то это тоже 76 символов.

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

Патрик Осцити
источник
Первые два решения - добавить #в начале строки. Последнее решение - введите новую строку раньше p. (Примечание: я сам не знаю Руби, так что, возможно, я ошибаюсь).
Vilx-
блин :) ты прав
Патрик Осцити
Принты "2012" для меня. Цитаты не соответствуют - они?
пользователь неизвестен
Да, ты прав. Вы можете использовать $><<или putsвместо. Как бы то ни было, я больше не буду пробовать это, я сдался :)
Патрик Осци
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

и т.д

tmartin
источник
И добавить отрицательный ( -)? - {$[-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;.
streetster
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 правильно работает с die (3.
Станислав Ягло
Вы правы. Виноват. Продолжая поиск ...
Vilx-
PHP 5.3.3 - тоже правильно. die () выводит только строки, но не выводит числа.
Станислав Ягло
Подожди, ДУХ, нашел это! Просто поменяйте ."2012"на ."FAIL". :)
Vilx-
0

Groovy: 26

x=2012;print x^2012?2012:x
Armand
источник
Я немного знаю Groovy, но сработает ли это? x=2012;print x^2012?2012:-x
Vilx-
для чего -?
Арманд
@Alison Это -попытка изменить ваш код одним символом, чтобы он больше не работал.
Гарет
1
x=2012;print x^=2012?2012:x(меняется ^на ^=) меняет вывод на 0.
гистократ
0

Lua

print(- -(function(ab,ba)assert(ab==ba)return- -ab end)(2012,2012))
Мниип
источник
1
Что если вы удалите один из этих -признаков?
Vilx-
Да, и если вы поменяете одно из них 2012на другое, утверждение выдаст ошибку. Хм ... ну, я полагаю, вы заслуживаете очков творчества за нарушение правил. А если серьезно, это не так, как это было задумано.
Vilx-