Escriba un programa que siempre muestre "2012", ¡incluso si se modifica!


116

Esta idea no es mía, aunque no sé dónde se originó. Una vez lo conocí en un concurso de programación hace mucho tiempo (1998, si no recuerdo mal). La tarea es escribir un programa en su idioma favorito que salga 2012 y solo 2012 . El problema es que el programa todavía debe de salida 2012después de cualquier uno se modifica de sus personajes. La modificación puede ser inserción, eliminación o reemplazo. Por supuesto, la modificación será tal que el programa siga siendo sintácticamente válido.

Como no conozco todos los lenguajes de programación, tengo que pedirle a la audiencia que me ayude y probar las respuestas enviadas.

Agregado: Muchos han comentado que mi definición de modificaciones aceptables es demasiado vaga. Aquí está mi segundo intento: las modificaciones permitidas dejarán su programa sintácticamente válido y no harán que se bloquee. Allí, creo que eso debería cubrir todos los errores de tiempo de compilación, tiempo de enlace y tiempo de ejecución. Aunque estoy seguro de que de todos modos habrá algún caso marginal extraño en algún idioma, así que cuando surja lo veremos individualmente.


¿Qué tal errores de tiempo de ejecución como leer una dirección inválida más probable?
aaaaaaaaaaaa

@PeterTaylor: ya hay 3 respuestas, la C con una gran revisión. Puedes buscar inspiración allí.
Vilx-

2
¿Alguien descubrió si esto es imposible en APL o GolfScript o de manera similar?
Jeff Burdges

14
Esto me ha hecho pensar en el ADN y la redundancia y en el potencial de los rayos cósmicos para voltear bits en mis programas. Cosas interesantes.
Jon Purdy

11
... Necesitas dormir un poco.
Vilx-

Respuestas:


65

C, 53 caracteres

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

Un poco más largo que el lenguaje de scripts responde, y sigue el mismo principio básico. Se basa en el hecho de que, debido a las restricciones de la sintaxis de C, ¡las únicas letras que serían posibles cambiar sin invalidar el programa están dentro de las cadenas!

Editar: Afeitado de 4 caracteres.

Reeditar: la robustez aumentó, afeitó a un personaje.

Reedición: más larga, pero más robusta. ¡Solo prueba tu &ahora! (Correctamente esta vez).

Actualización: acortado un poco; derrota a la mayoría de los enfoques vistos hasta ahora.

Actualización: se cambió int a void; Debería vencer el último enfoque posible para romperlo, puedo pensar.

Actualización: pensé en otro enfoque; reemplazando el último a(que se pudra) con 0; El uso de nombres de dos letras debería resolver ese problema.

Actualización: última actualización revocada; asumiendo que los cambios que causan errores de tiempo de ejecución no están permitidos; afuncionará bien.

Actualización: retroceder un poco más; intentar desreferenciar *atambién segfault; por lo tanto, usar voidpara provocar un error de compilación no debería ser necesario.

Actualización: Y un acortamiento final; que se basa en la cadena que "2012"se coloca en una sola dirección (que es común); y que las cadenas literales son de solo lectura (también comunes).

Actualización: ¡ Me costó dos personajes, pero derroté tu punto y coma!


2
@PaulR: Ahora cambió a register void; El registerestá ahí para prevenir &; El voidestá ahí para prevenir *.
Williham Totland

66
OK ... corrígeme si esto no es válido C, pero simplemente funcionó en mi VS2010. Inserte un ;entre putsy (.
Vilx-

39
+1, felicidades, creo que lo has logrado. Escribí un arnés de prueba simple que trató de compilar y ejecutar todas las variaciones posibles de un código de su carácter, ¡y cada uno de ellos no se compiló, se bloqueó ni se imprimió 2012! (Solo usé caracteres ASCII imprimibles para las pruebas de inserción y sustitución, pero dudo que ayudaría a expandir el repertorio).
Ilmari Karonen

3
@IlmariKaronen: Je, eso es mucho esfuerzo; Gracias por pasar por todo eso. :)
Williham Totland

1
@Titus: Si se refiere a la conmutación ==de !=la ternario, que se lleva a ninguna parte; en lugar de generarlo a, ahora se genera "2012".
Williham Totland el

38

Haskell, 19

(\xx@2012->xx)$2012

o, como un programa completo,

29

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


Para un poco más de diversión:

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


Para obtener uno que no se pueda modificar de tal manera que produzca simplemente un error de tiempo de ejecución, podemos codificar la información en las longitudes de las listas que no se pueden modificar utilizando solo cambios de un carácter, es decir

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

Para hacerlo más modificable (de forma segura), también podemos usar el número en sí mismo como elemento de la lista, solo tenemos que ponerle cadenas para evitar el intercambio de comas por más ':

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

Como esta cadena es solo el resultado de la expresión, también podemos sustituirla nuevamente por eso, no es un problema gracias a la pereza de Haskell

64 72

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

Los initactúa como "menos uno, pero no negativo" aquí.


También podemos incluir el sistema de tipos en el esquema de redundancia y luego escribir el número de manera que pueda modificarse con cambios de un carácter ...

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

Ahora puede cambiar cualquiera ua pviceversa, pero eso siempre estropearía la profundidad de los apilamientos de listas en el segundo elemento de tupla y, por lo tanto, desencadenaría un error en tiempo de compilación.

Esta idea podría ampliarse aún más de tal manera que los textos completos pudieran codificarse de forma compacta, fáciles de leer y editar, y aún así a salvo de modificar caracteres individuales.


Y otro más ...

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
Me temo que esto compila muy bien modificado, aunque se lanza una excepción en tiempo de ejecución .
Jeff Burdges

3
@JeffBurdges: claro, considero que esto se incluye en "y no hará que se bloquee".
dejó de girar en sentido antihorario el

1
Para la a=map(head.show.length)[[a,a],[],[a],[a,a]]solución, inserte aentre []. Sin embargo, ¡realmente me gusta esta publicación! Soluciones muy inteligentes.
Dillon Cower

99
Verifiqué que todas las variaciones de 5825 de su programa de 29 caracteres (reemplazando o insertando caracteres ASCII 32-126) funcionan como se esperaba. Aquí está el script de prueba que utilicé . Se puede ajustar fácilmente para probar otros programas, incluidos otros idiomas. Advertencia: me llevó casi 1 hora ejecutar en mi computadora portátil :)
hammar

1
[a]-> []en la solución de 64 caracteres
John Dvorak

14

JavaScript

Creo que esto es a prueba de errores en tiempo de ejecución, cualquier cambio individual debería dar como resultado un error de compilación o una sola alerta que indique 2012.

Editar: el código haría un error de tiempo de ejecución en algo como if("alert(2012 "==r), moví la sección de prueba para tratarlo.

Edit: Nice one Vilx-, pero reparable :-) Ahora hay un desajuste de paréntesis para insertar ese punto y coma.

Editar: Pero entonces una coma podría hacer lo mismo que el punto y coma, que es una gran cantidad de opciones, creo que lo he solucionado, pero ahora hay una gran cantidad de código.

Editar: simplificado un poco.

Editar: Uno más en una serie infinita de correcciones de errores.

Editar: esto se siente más largo y complicado que a prueba de balas, pero al menos debería ocuparse de ~evaly !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
Porque, por ejemplo , q-")"devuelve NaN, que eval convierte "NaN"antes de evaluarlo, que simplemente lo devuelve a NaN. Algo extraño que hacer, pero técnicamente legítimo, para que no invoque la captura.
aaaaaaaaaaaa

44
Lo mismo que la solución C: inserte un ;entre evaly (.
Vilx-

1
Para los lectores de comentarios, la vulnerabilidad de punto y coma es fija, creo que el código debe estar limpio ahora.
aaaaaaaaaaaa

44
No estoy seguro de si esto cuenta o no, pero poner un signo ~delante del evalhace que se repita 2012 dos veces en lugar de una. No estoy seguro si eso desobedece las reglas o no: P
mellamokb

2
Agregar un !after lo eval(rompe.
jimmy23013

13

Perl, 49 caracteres

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

Basado en la respuesta de JB , pero esta realmente satisface la especificación . Una verificación exhaustiva indica que cada eliminación, inserción o reemplazo de un carácter deja la salida sin cambios o hace que el programa se bloquee cuando se ejecuta (como lo indica un valor de retorno distinto de cero y la salida a stderr), al menos mientras las inserciones y los reemplazos están restringidos a caracteres ASCII imprimibles.

(Sin la restricción, la tarea es imposible en Perl: una característica poco conocida del analizador Perl es que se detiene cuando se encuentra con un carácter Ctrl-D o Ctrl-Z, por lo que insertar cualquiera de los que están delante de cualquier archivo se convierte en un programa Perl válido que no hace nada)

Editar: Afeitado de un carácter más mediante la sustitución 1==printde 0-print.


Rompe con Perl 5.28 donde printcomienza a regresar en 'true'lugar de 1 :-P
JB

3
@JB: Bueno, puedes votarlo cuando eso suceda. :) (Para beneficio de otros lectores, esto es una broma. Hasta donde yo sé, no hay planes para cambiar el valor de retorno de printninguna versión de Perl 5, incluso si no está documentado explícitamente ).
Ilmari Karonen

12

Brainfuck

Estoy tratando de convencerme de que esto es posible, y estoy bastante seguro de que lo he estirado demasiado. He hecho algunas suposiciones sobre mi entorno:

  1. Un bucle infinito se considera un "bloqueo". Una condición similar podría lograrse decrementando el cero pasado o a la izquierda de la ubicación de memoria cero en ciertos intérpretes. Muchos intérpretes son difíciles de bloquear en tiempo de ejecución. Evito el problema de detención utilizando solo el bucle infinito más simple y obvio.
  2. Los corchetes sin igual se consideran un error de compilación.
  3. Esto solo funcionará en un entorno donde la salida del programa se regrese a su propia entrada. Utilizo eso para verificar que realmente produjo '2012'. Esta es la única forma en que podría evitarlo simplemente eliminando uno de los caracteres de salida.

Desafortunadamente, si te pones más estricto, me temo que esto será imposible. Aquí está mi solución:

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

Básicamente, puede cambiar el código de salida o el código de verificación, pero no ambos. Uno de ellos está garantizado para trabajar. Si uno de ellos no lo hace, se 'estrellará'.


55
¡Uf, cerebro! Tuviste que hacerlo, ¿no? XD
Vilx-

8
¿Hubieras preferido que usara espacios en blanco?
NRGdallas

7

Python2

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

Tuve que cambiar ligeramente el script de prueba de Ray para probar esto ya que la redirección stdout lo estaba rompiendo. Pasar dictos vacíos a exec evita contaminar el espacio de nombres

exec(prog, {}, {})

¡Excelente! ¡Tú lo haces!
Ray

6

Brain-Flak , 44 + 3 = 47 bytes [No compite]

Esto usa la -Abandera de Brain-Flak y envía los caracteres 2012a STDOUT

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

Pruébalo en línea!

Alternativa, 50 bytes

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

Pruébalo en línea!

Explicación

Cualquier modificación de un solo carácter a cualquiera de los códigos anteriores causará un error en el programa.


3
¡Decir ah! El lenguaje correcto para el desafío.
DLosc

4

Sisi , no competidora

Finalmente creo que encontré uno de mis idiomas que funciona. Es terriblemente largo, y el lenguaje es más nuevo que la pregunta, pero todavía se siente como un logro.

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

Sobre Sisi

Sisi es un lenguaje de juguete inspirado en el ensamblaje y QBasic. Es bueno para este desafío porque su sintaxis es extremadamente limitada.

  • Tiene sólo cuatro comandos: set, print, jump, yjumpif .
  • Todos los comandos tienen arity fijo.
  • Todas las líneas deben tener números de línea, que están aumentando estrictamente.
  • Las expresiones solo están permitidas en las setdeclaraciones. Solo pueden contener (como máximo) una operación, que debe ser binaria. En particular: cambiar print xxa print -xxes un error de sintaxis.
  • Los nombres de las variables deben estar compuestos de letras minúsculas.
  • Lo más importante: ¡no hay sintaxis de comentarios !

El programa

El núcleo del programa es esta parte:

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

Almacenamos 2012en xx, y luego probar si esto fue exitoso, y almacenar el resultado de la prueba en y. Si yes verdad, salte a la línea 55. (Salta a números de línea inexistentes simplemente avance rápidamente a la siguiente línea).

Endurecimiento por radiación

  • Si la asignación en la línea 1 se modifica, entonces yes falsey, el salto no ocurre y la línea 4 se establecexx en 2012.
  • Si se modifica la asignación en la línea 2 o la condición de salto en la línea 3, no nos importa: xxse establecerá en 2012, ya sea que tomemos el salto o no.
  • El objetivo de salto en la línea 3 puede cambiarse a un tamaño tan pequeño como 5 o tan grande como 955. Cualquier modificación posible lo lleva a la printlínea 955 tarde o temprano. No es posible con una modificación saltar hacia atrás (creando un ciclo) o más allá del final del programa.
  • Si se modifica la asignación en la línea 4, no nos importa: la asignación de la línea 1 será correcta y saltaremos más allá de la línea 4.
  • Si se modifica la línea 955, podemos tener un problema. Lo único desafortunado de Sisi es que las variables no inicializadas se configuran de 0manera predeterminada , por lo que una modificación como print axno es un error. La solución fea pero efectiva son las líneas 828-954, que asignan 2012 a cada variable posible con una distancia de edición de 1 xx. Esto asegura que cualquier modificación a la final print xxtodavía se imprimirá en 2012.
  • Si se modifica un número de línea, ya sea: 1) estará fuera de servicio y será un error de sintaxis, o 2) no afectará el flujo del programa. La principal modificación que podría preocuparnos: cambiar la línea 4 a 94, y luego insertarla después del salto a 55, no importa porque todo lo que hace es asignar 2012 xxnuevamente.

Bueno uno! No puedo pensar en una forma de eludir esto. "A" por esfuerzo de mi parte, ¡eso es seguro! :)
Vilx-

3

Pitón

Un poco detallado (ahora con una solución para ese molesto punto printy coma entre y (!):

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

@Jeff Burdges: Sí, con este estoy confiando en que los errores de tiempo de ejecución también se rechacen. :)
Dillon Cower

Me temo que todavía es sintácticamente correcto si la intersección produce el conjunto vacío y pop arroja un error de tiempo de ejecución . Agregue más 2012 en ambos lados.
Jeff Burdges

@DC: Diría que una excepción no es lo mismo que un error de tiempo de ejecución, aunque parece que las excepciones se llaman errores en Python. pop()El conjunto vacío no es un error en sí mismo, pero genera un 'Error'.
Williham Totland

1
Una excepción se convierte en un error cuando no se detecta.
Ilmari Karonen

1
insertar una coma después de las popsalidas<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')

¿Qué dialecto SQL es este? Parece Transact-SQL (también conocido como SQL Server), pero tiene una sintaxis no válida para eso.
Vilx-

@ Vilx-: Lo probé en SQL Server 2008 cuando estaba tratando de romperlo, y funcionó bien.
mellamokb

@mellamokb - Eso es extraño. Es exactamente lo que hice, y se quejó de que no puede asignar un valor predeterminado a la variable (necesita una instrucción SET separada), y no hay IIF (solo CASE).
Vilx:

1
@ Vilx-: Ah, tienes razón. Ahora me doy cuenta de que realmente estaba probando en SQL Azure. Con SQL Server 2008 obtengo esos mismos errores que usted. Sin embargo, parece funcionar bien en SQL Server 2012 / Azure. Aquí hay una demostración con SQL 2012: sqlfiddle.com/#!6/d41d8/27
mellamokb

OK, felicidades, ¡no puedo encontrar ninguna manera obvia de romper esto! :) Eso no quiere decir que no haya ninguno. ;)
Vilx-

3

He creado un script de Python para juzgar todas las soluciones de Python. El script rompe la primera y la tercera solución de Python, con muchos métodos diferentes. Y la segunda solución, usar lambda para protegerse, es irrompible. La segunda solución de Python está en Python 3. Lo modifiqué en formato Python 2 y luego el programa juez lo rompió.

Aquí está el guión del juez.

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) 

¡bueno! mi respuesta apesta y sopla al mismo tiempo
gnibbler

p2siempre lanza una excepción para Python2. El resultado nunca es 2012. Su programa de jueces no se ejecutará en Python3 ya que usa declaraciones de impresión.
gnibbler

@gnibbler No noté que p2está en Python 3.
Rayo

He elaborado una nueva respuesta para Python2 que pasa su script
gnibbler

3

Mathematica, 23 caracteres

Nota: "/." significa "reemplazar"

2012/.Except@2012->2012

2
Esto podría ser una especie de respuesta / derrota débil, pero cambia /.a //(forma de postfix).
Dillon Cower

@DillonCower Buena captura!
Dr. belisario

2

Javascript - 68, 77, 84 , 80 caracteres

Aquí hay una solución que debería funcionar este año :)

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

Aquí está el violín de prueba .

Actualización 1: Se corrigió el problema donde eval (+ a) lo rompió (gracias eBusiness).

Actualización 2: corregido para el '|' caso (gracias de nuevo eBusiness).

Actualización 3: Corregido para el caso '>' (gracias de nuevo eBusiness). Y rompió por el caso '1' :(


No protegiste tu evaluación. eval(+a)y muchas otras modificaciones funcionan perfectamente bien pero no hacen mucho.
aaaaaaaaaaaa

@eBusiness: Gracias por señalar el eval(+a)caso, eso ahora debería solucionarse. Además, no he podido encontrar uno de los casos de modificación en el que funciona bien pero no muestra el 2012, ¿podrían darme un ejemplo?
Briguy37

eval(0)y eval(-a)por ejemplo hace lo mismo.
aaaaaaaaaaaa

La edición posterior puede al menos romperse reemplazando ||con |.
aaaaaaaaaaaa

55
Se rompe si cambia el primero alerta aler=.
jimmy23013

2

Ruby 1.9 - 43 caracteres

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

No probado, así que aléjate.


2

Excel, 14 caracteres (engañando ligeramente):

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

Cualquier cambio válido en la matriz afectará el contenido de ambas celdas, e intentar cambiar solo una celda activa un mensaje de error.

Por supuesto, esto se descompone si considera que en realidad es solo una fórmula, a diferencia de las 2 fórmulas que están obligadas a ser idénticas.


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

Explicación:

  1. Sin cambiar nada, tomará la siguiente ruta: 1 → 2 (y devolverá ael valor de 2012).
  2. Si el contenido de String ase modifica de alguna manera, tomará la siguiente ruta: 1 → 3 → 5 (y devolverá bel valor sin cambios de 2012).
  3. Si el contenido de String bse modifica de alguna manera, tomará la siguiente ruta: 1 → 3 → 4 (y devolverá ael valor sin cambios de 2012).
  4. Si a.equals(b)el se modifica @ 1 a a.equals(a), b.equals(b)o!a.equals(b) aún tomará la misma ruta siguiente: 1 → 2 (y devolverá ael valor sin cambios de2012 ).
  5. Si ase cambia a @ 2 b, seguirá la siguiente ruta: 1 → 2 (y volveráb el valor sin cambios de 2012).
  6. Si cualquiera ao bse cambia al opuesto en las líneas 3, 4 o 5, seguirá el siguiente camino: 1 → 2 (y volveráa el valor sin cambios de 2012)
  7. Si el contenido de la cadena en @ 3 se modifica de alguna manera, seguirá la siguiente ruta: 1 → 2 (y devolverá a el valor sin cambios de2012 )
  8. Cambio Men class Moa enmain(String[]a) otro carácter válido se puede hacer sin ningún cambio en la funcionalidad del código.
  9. Cualquier otro cambio dará como resultado un error de compilación (excluyendo algunos de los espacios de entrada / espacios en blanco, que se pueden eliminar / agregar).

Pruebe todas estas modificaciones aquí, para verificar que todas sigan imprimiendo 2012.

Si puede encontrar alguna forma de romperlo siguiendo las reglas de OP, me encantaría saberlo, así que puedo pensar en algo para solucionarlo.
A diferencia de la mayoría de las preguntas similares en las que se modifica un solo carácter, esta pregunta permite que la estructura básica del lenguaje de programación en cuestión esté intacta, por lo que Java finalmente puede competir en un enter one (seamos sinceros, Java, casi, nunca ganará nada en este SE xD).


¿Qué es un signo negativo se inserta en la ruta 4 antes de la a? ¿El programa todavía generará 2012, o generará -2012?
Kritixi Lithos

@KritixiLithos Es una cadena, por lo que no puede insertar un -antes del ao b. Aquí hay una captura de pantalla del error de compilación.
Kevin Cruijssen

1

Ruby 1.9

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

Construyo este programa corto pero simple que le invitamos a romper de acuerdo con las reglas anteriores. Ni siquiera pude encontrar una posición donde se cambie la salida (sin romper el código) si #se inserta un para comentar el resto de la línea.


pone (r = 2012) == 2012? -r: 2012.send (: abs) imprime "-2012"
Joanis

@ M.Joanis Pero necesita dos caracteres adicionales: un carácter de espacio y un signo menos. Un menos solo no funcionará.
Howard

Ah, tienes razon! Error de compilación. No sé nada sobre Ruby, debería ser más cuidadoso. ¡Lo siento!
Joanis

1
Según irb, agregar un signo negativo antes de los rxresultados en un programa válido que genera -2012...
Konrad Rudolph

2
Cambiar putsa putchace que esto muestre un a ?en Ruby 1.9.
histocrat

1

Scala, 95

(o 54 si se saltan las partes no significativas)

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

Me temo que no sé lo suficiente sobre Scala para encontrar algún defecto. :( ¿Pueden otras personas, por favor, echar un vistazo?
Vilx-

No es difícil a este nivel. La mayor parte de la dureza de Scala se debe a la complejidad de su sistema de tipos (que todavía no puedo entender completamente: D)
Sarge Borsch

No conozco a Scala, pero (...),("2012")parecía romperlo.
jimmy23013

1

C#

Seguramente no es así de simple, ¿verdad? ...

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

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

Ok lo que extraño?


1
¿Qué sucede si cambia la octava línea a "Console.WriteLine (-result);"?
Glenn Randers-Pehrson

No hay compilador de C # aquí, pero ¿no debería cambiar la línea 7 para if (result += "2012")que salga 20122012?
Philipp

hmmmm ... no había pensado en eso ... de vuelta al tablero de dibujo
Guerra

@Philipp: Nop, eso no se compilaría. Necesita un valor booleano para un ifenunciado, no una cadena.
Vilx-

66
Agregar un ;after elsehace que salga dos veces.
jimmy23013

1

PHP, 30

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

Bienvenido a PPCG! Bonito primer post! ¿Puedes agregar una explicación también?
Rɪᴋᴇʀ

2
Y así es como lo derrotaría:<?=$i=2012;$i==2012?-$i:2012;?>
Vilx-

@ Vilx- Bien, no había pensado en eso.
jsa

Una derrota poco convincente para cualquier solución PHP de una línea: coloque todo el código en un comentario <?#$i=2012;$i==2012?$i:2012;?>Solución contra eso: inserte una nueva línea después $i=2012.
Titus

1

Taxi , 396 bytes

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.

Formateado para humanos, eso es:

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.

Al leer otras respuestas, la solución parece ser elegir un lenguaje frágil, establecer el valor, verificar el valor, imprimir el valor.


1

SmileBASIC

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

Primero, habilitamos el modo estricto. Esto lo obliga a declarar todas las variables antes de usarlas, y evita cosas como cambiar? A $ a? B $.

A continuación, se crea una variable de cadena llamada "A $" y el valor se establece en "@ 2012". Para asegurarse de que el valor de A $ no se haya alterado, el programa intentará saltar a una etiqueta, y la única etiqueta en el programa es @ 2012.

Ahora, A $ es definitivamente "@ 2012", pero antes de imprimirlo, es necesario eliminar el @. SHIFT () elimina el primer elemento de una cadena o matriz (al igual que pop (), pero desde el otro extremo). Para descartar el valor devuelto por SHIFT, se pasa a un bloque IF / THEN, que no hace nada. En caso de que alguien intente comentar esa línea, declaramos una variable "B", que se usa más adelante. Si se comenta el VAR, la última línea arrojará un error de variable indefinida.

Ahora, se imprime A $, y hay otro VAR para evitar comentarios. La línea final solo se asegura de que las variables B y C hayan sido declaradas.


OK ... No sé nada sobre SmileBASIC, así que esto es una mera suposición: ?-A$VAR C¿podría esta salida -2012?
Vilx-

Eso no funcionará porque A $ es una cadena.
12Me21

¡Espera, tengo una idea! ¿Qué pasa con ?B$VAR C:? :)
Vilx-

Eso provocará un error porque "B $" no ha sido declarado.
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;

Enfoque fallido:

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

Su solución Perl puede romperse reemplazando la primera $&con algo así $0.
Howard

Y el Haskell se rompe si reemplaza la coma con un signo más. Intento valiente sin embargo.
Jeff Burka

Creo que nub$filter(\x->x==2012||x==2012)(2012:[2012])podría ser seguro para la solución de Haskell.
Jeff Burka

Olvidé el use Englishin perl, eso lo arreglará. Creo que varias correcciones funcionan para Haskell, incluido el cambio a cadenas.
Jeff Burdges

1
La solución de Perl sigue siendo bastante frágil. Algunas formas de romperlo (que se encuentra al probar mi propia respuesta ) incluyen la sustitución printcon *rint, prin:, p:into #rint, anteponiendo =a la primera línea, o incluso sustituir s/.*/con s/./o y/.*/(que se fija mediante la inicialización $ARGa 2012para empezar). Además, su $SUBSEPtruco aún no protege contra la inserción de un *punto y coma antes del punto y coma final, pero una solución mucho más fácil es eliminar ese punto y coma innecesario.
Ilmari Karonen

0

PHP 43 48

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

Insertar un -entre el ?y los $aresultados en la -2012impresión.
Gareth el

Lindo intento con el date(), pero el programa tiene que funcionar más allá de 2012 también. ;)
Vilx-

@Gareth - hmm :)
The Coder

1
@ Vilx- "La tarea es escribir un programa en su idioma favorito que genere 2012" ¿dónde dice que tiene que funcionar más allá de 2012? :)
The Coder

1
@TheCoder Ok, ahora voy a insertar mi -entre el? y los abdominales. ;-)
Gareth

0

Rubí ( 57 36)

EDITAR Y otro en 36 caracteres.

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

Supongo que usar cadenas es bastante a prueba de fallas porque esa cosa negativa ya no funciona.


EDITAR siguiente intento (36 caracteres) [no importa, agregando un resultado -posterior pen -2012]

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


Este solo funcionará este año, pero también para concursos similares en el futuro :) (15.caracteres)

p Time.now.year

Tenga en cuenta que esta sustitución también está funcionando:

p Time.new.year

57 caracteres. Sin embargo, si cuenta las nuevas líneas, también son 76 caracteres.

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


Primeras dos soluciones: agregue un #al comienzo de la línea. Última solución: ingrese una nueva línea antes p. (Nota: no conozco a Ruby, así que tal vez me equivoque).
Vilx-

maldita sea :) tienes razón
Patrick Oscity

Imprime "2012" para mí. Las citas no son conformes, ¿verdad?
usuario desconocido

Si, tienes razón. Podrías usar $><<o en su putslugar. Lo que sea, no voy a intentar esto más, me di por vencido :)
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

etc.


¿Y agregando un negativo ( -)? - {$[-2012~m:2012;m;2012]}- {$[2012~m:-2012;m;2012]}-{$[2012~m:2012;m;-2012]}
Gaffi

todavía q){$[-2012~m:2012;m;2012]}` 2012q){$[2012~m:-2012;m;2012]}` 2012q){$[2012~m:2012;m;-2012]}` 2012
sale

Esto puede ser derrotado cambiando el ;m;por algo como ;1;o ;x;.
StreetSter

0

Hmm .. déjame intentarlo:

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 caracteres sin el espacio en blanco.

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
Roto al insertar "-", es decir System.out.println(-i)(para la primera impresión). También se rompe, por ejemplo, reemplazando el primero println(i)con, por ejemplo println(1). También potencialmente roto al cambiar i == ja i += j(o - =, etc.).
TLW

0

PHP

Espero que sea irrompible :)

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

Agrego un carácter al final de esta línea: echo(printf("%s",$a)==4)?die(3y obtengo 20123.
Vilx-

Hmm ... PHP 5.4.7 funciona correctamente con el dado (3.
Stanislav Yaglo

Tienes razón. Culpa mía. Continuando la búsqueda ...
Vilx-

PHP 5.3.3 - correcto también. die () solo genera cadenas, no genera números.
Stanislav Yaglo

¡Espera, DUH, lo encontraste! Solo cambia ."2012"a ."FAIL". :)
Vilx-

0

Groovy: 26

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

No conozco mucho a Groovy, pero ¿funcionaría esto? x=2012;print x^2012?2012:-x
Vilx-

¿cuál es la -de?
Armand

@Alison El -es tratar de modificar su código con un carácter para que ya no funcione.
Gareth

1
x=2012;print x^=2012?2012:x(cambiando ^a ^=) cambia la salida a 0.
histocrat

0

Lua

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

1
¿Qué pasa si eliminas uno de esos -signos?
Vilx-

Ah, y si cambia uno de esos 2012a otra cosa, la afirmación generará un error. Hmm ... bueno, supongo que mereces puntos de creatividad por abusar de las reglas. Pero en serio, no fue así.
Vilx-
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.