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 2012
despué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.
Respuestas:
C, 53 caracteres
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 últimoa
(que se pudra) con0
; 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;
a
funcionará bien.Actualización: retroceder un poco más; intentar desreferenciar
*a
también segfault; por lo tanto, usarvoid
para 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!
fuente
register void
; Elregister
está ahí para prevenir&
; Elvoid
está ahí para prevenir*
.;
entreputs
y(
.2012
! (Solo usé caracteres ASCII imprimibles para las pruebas de inserción y sustitución, pero dudo que ayudaría a expandir el repertorio).==
de!=
la ternario, que se lleva a ninguna parte; en lugar de generarloa
, ahora se genera"2012"
.Haskell, 19
o, como un programa completo,
29
Para un poco más de diversión:
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
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 ':
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
6472Los
init
actú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 ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Ahora puede cambiar cualquiera
u
ap
viceversa, 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 ...
fuente
a=map(head.show.length)[[a,a],[],[a],[a,a]]
solución, insertea
entre[]
. Sin embargo, ¡realmente me gusta esta publicación! Soluciones muy inteligentes.[a]
->[]
en la solución de 64 caracteresJavaScript
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
~eval
y!eval
.fuente
q-")"
devuelveNaN
, que eval convierte"NaN"
antes de evaluarlo, que simplemente lo devuelve aNaN
. Algo extraño que hacer, pero técnicamente legítimo, para que no invoque la captura.;
entreeval
y(
.~
delante deleval
hace que se repita2012
dos veces en lugar de una. No estoy seguro si eso desobedece las reglas o no: P!
after loeval(
rompe.Perl, 49 caracteres
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==print
de0-print
.fuente
print
comienza a regresar en'true'
lugar de 1 :-Pprint
ninguna versión de Perl 5, incluso si no está documentado explícitamente ).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:
Desafortunadamente, si te pones más estricto, me temo que esto será imposible. Aquí está mi solución:
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á'.
fuente
Python2
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
fuente
Brain-Flak , 44 + 3 = 47 bytes [No compite]
Esto usa la
-A
bandera de Brain-Flak y envía los caracteres2012
a STDOUTPrué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.
fuente
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.
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.
set
,print
,jump
, yjumpif
.set
declaraciones. Solo pueden contener (como máximo) una operación, que debe ser binaria. En particular: cambiarprint xx
aprint -xx
es un error de sintaxis.El programa
El núcleo del programa es esta parte:
Almacenamos
2012
enxx
, y luego probar si esto fue exitoso, y almacenar el resultado de la prueba eny
. Siy
es 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
y
es falsey, el salto no ocurre y la línea 4 se establecexx
en 2012.xx
se establecerá en 2012, ya sea que tomemos el salto o no.print
lí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.0
manera predeterminada , por lo que una modificación comoprint ax
no 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 1xx
. Esto asegura que cualquier modificación a la finalprint xx
todavía se imprimirá en 2012.xx
nuevamente.fuente
Pitón
Un poco detallado (ahora con una solución para ese molesto punto
print
y coma entre y(
!):fuente
pop()
El conjunto vacío no es un error en sí mismo, pero genera un 'Error'.pop
salidas<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
fuente
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.
fuente
p2
siempre 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.p2
está en Python 3.Mathematica, 23 caracteres
Nota: "/." significa "reemplazar"
fuente
/.
a//
(forma de postfix).Javascript -
68, 77, 84, 80 caracteresAquí hay una solución que debería funcionar este año :)
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' :(
fuente
eval(+a)
y muchas otras modificaciones funcionan perfectamente bien pero no hacen mucho.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?eval(0)
yeval(-a)
por ejemplo hace lo mismo.||
con|
.alert
aaler=
.Ruby 1.9 - 43 caracteres
No probado, así que aléjate.
fuente
Excel, 14 caracteres (engañando ligeramente):
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.
fuente
Java 7
Explicación:
a
el valor de2012
).a
se modifica de alguna manera, tomará la siguiente ruta: 1 → 3 → 5 (y devolveráb
el valor sin cambios de2012
).b
se modifica de alguna manera, tomará la siguiente ruta: 1 → 3 → 4 (y devolveráa
el valor sin cambios de2012
).a.equals(b)
el se modifica @ 1 aa.equals(a)
,b.equals(b)
o!a.equals(b)
aún tomará la misma ruta siguiente: 1 → 2 (y devolveráa
el valor sin cambios de2012
).a
se cambia a @ 2b
, seguirá la siguiente ruta: 1 → 2 (y volveráb
el valor sin cambios de2012
).a
ob
se cambia al opuesto en las líneas 3, 4 o 5, seguirá el siguiente camino: 1 → 2 (y volveráa
el valor sin cambios de2012
)a
el valor sin cambios de2012
)M
enclass M
oa
enmain(String[]a)
otro carácter válido se puede hacer sin ningún cambio en la funcionalidad del código.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 unenter one (seamos sinceros, Java, casi, nunca ganará nada en este SE xD).fuente
a
? ¿El programa todavía generará 2012, o generará -2012?-
antes dela
ob
. Aquí hay una captura de pantalla del error de compilación.Ruby 1.9
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.fuente
irb
, agregar un signo negativo antes de losrx
resultados en un programa válido que genera-2012
...puts
aputc
hace que esto muestre un a?
en Ruby 1.9.Scala, 95
(o 54 si se saltan las partes no significativas)
fuente
(...),("2012")
parecía romperlo.C#
Seguramente no es así de simple, ¿verdad? ...
Ok lo que extraño?
fuente
if (result += "2012")
que salga20122012
?if
enunciado, no una cadena.;
afterelse
hace que salga dos veces.PHP, 30
fuente
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Solución contra eso: inserte una nueva línea después$i=2012
.Taxi , 396 bytes
Formateado para humanos, eso es:
Al leer otras respuestas, la solución parece ser elegir un lenguaje frágil, establecer el valor, verificar el valor, imprimir el valor.
fuente
SmileBASIC
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.
fuente
?-A$VAR C
¿podría esta salida-2012
??B$VAR C
:? :)Haskell, 65
Perl, 84
Enfoque fallido:
fuente
$&
con algo así$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
podría ser seguro para la solución de Haskell.use English
in perl, eso lo arreglará. Creo que varias correcciones funcionan para Haskell, incluido el cambio a cadenas.print
con*rint
,prin:
,p:int
o#rint
, anteponiendo=
a la primera línea, o incluso sustituirs/.*/
cons/./
oy/.*/
(que se fija mediante la inicialización$ARG
a2012
para empezar). Además, su$SUBSEP
truco 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.PHP
4348fuente
-
entre el?
y los$a
resultados en la-2012
impresión.date()
, pero el programa tiene que funcionar más allá de 2012 también. ;)-
entre el? y los abdominales. ;-)Rubí (
5736)EDITAR Y otro en 36 caracteres.
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
-
posteriorp
en-2012
]p [2012,2012] .find (2012) .primero || 2012Este solo funcionará este año, pero también para concursos similares en el futuro :) (15.caracteres)
Tenga en cuenta que esta sustitución también está funcionando:
57 caracteres. Sin embargo, si cuenta las nuevas líneas, también son 76 caracteres.
fuente
#
al comienzo de la línea. Última solución: ingrese una nueva línea antesp
. (Nota: no conozco a Ruby, así que tal vez me equivoque).$><<
o en suputs
lugar. Lo que sea, no voy a intentar esto más, me di por vencido :)Q, 23
.
etc.
fuente
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
q){$[2012~m:-2012;m;2012]}` 2012
q){$[2012~m:2012;m;-2012]}` 2012
;m;
por algo como;1;
o;x;
.Hmm .. déjame intentarlo:
128 caracteres sin el espacio en blanco.
fuente
System.out.println(-i)
(para la primera impresión). También se rompe, por ejemplo, reemplazando el primeroprintln(i)
con, por ejemploprintln(1)
. También potencialmente roto al cambiari == j
ai += j
(o - =, etc.).PHP
Espero que sea irrompible :)
fuente
echo(printf("%s",$a)==4)?die(3
y obtengo20123
.."2012"
a."FAIL"
. :)Groovy: 26
fuente
x=2012;print x^2012?2012:-x
-
de?-
es tratar de modificar su código con un carácter para que ya no funcione.x=2012;print x^=2012?2012:x
(cambiando^
a^=
) cambia la salida a 0.Lua
fuente
-
signos?2012
a 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í.