Definamos un programa prístino como un programa que no tiene ningún error en sí mismo, pero lo hará si lo modifica quitando cualquier subcadena contigua de N caracteres, donde 1 <= N < program length
.
Por ejemplo, el programa Python 2 de tres caracteres
`8`
es un programa impecable ( gracias, Sp ) porque todos los programas resultantes de la eliminación de subcadenas de longitud 1 causan errores (errores de sintaxis, de hecho, pero cualquier tipo de error funcionará):
8`
``
`8
y también todos los programas resultantes de la eliminación de subcadenas de longitud 2 causan errores:
`
`
Si, por ejemplo, `8
hubiera sido un programa sin errores `8`
, no sería perfecto porque todos los resultados de la eliminación de la subcadena deben ser erróneos.
Su tarea en este desafío es escribir el programa prístino más corto posible que no requiera ninguna entrada pero que emita cualquiera de las siguientes cinco palabras:
world
earth
globe
planet
sphere
La palabra que elijas depende totalmente de ti. La única palabra más una nueva línea final opcional debe imprimirse en stdout (o la alternativa más cercana a su idioma). El programa más corto en bytes gana.
Notas:
- Se requiere un programa independiente, no una función.
- Las palabras distinguen entre mayúsculas y minúsculas; salida
World
oEARTH
no está permitido. - Las advertencias del compilador no cuentan como errores.
- Los subprogramas de error pueden tomar entrada o dar salida o hacer cualquier otra cosa siempre y cuando eventualmente se produzcan errores.
Aquí hay un fragmento de pila que enumerará qué programas necesitan error dado un programa potencialmente prístino:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
fuente
Respuestas:
Carril , 24 bytes.
Creo que esto funciona. Y es a la vez corto y legible (en lo que respecta al ferrocarril).
$'main'
que obtenemosInternal Error: Crash: No 'main' function found
.#
, no hay forma de que el programa salga limpiamente, por lo que siempre terminará conCrash: No valid move
. Creo que no es posible eliminar una subcadena de modo que la pista forme un bucle válido (infinito).#
, se desconectará del final de la vía, por lo que el tren se estrellará (con el mismo error que el anterior).#
, también se desconectará#
desde el final de la pista (y potencialmente incluso el comienzo de la pista desde el punto de entrada$
). Así que de nuevo el mismo error.En cuanto al programa real: cada programa ferroviario debe tener una
$'main'
(o una variante más larga, pero estamos jugando al golf aquí) como punto de entrada a la función y el tren comienza en el$
sudeste. Sin embargo, todo en esa primera línea puede ser parte de la pista, por lo que eliminar'main'
la pista es:Los
-
y/
son simplemente pedazos de rieles que necesitamos para que el tren tome esas vueltas de 45 °.[world]
empuja el hiloworld
y loo
imprime.#
marca el final de la pista, la única forma de finalizar de forma segura un programa Rail.Curiosamente, esta solución solo es posible porque Rail permite que las pistas atraviesen la
main
línea; si eso no fuera posible#
, sería después de la primera línea nueva y el código siempre se podría acortar aque es un programa válido que no hace nada (Los caracteres sin espacio entre
'
y#
no afectarían eso).También bastante interesante: si acabara de jugar golf imprimiendo la tarea
world
, no habría sido mucho más corto o más simple:fuente
/
de la#
.$
inicio de la vía, por lo que el tren se estrella inmediatamente (Rail espera que la vía continúe hacia el sudeste de la vía$
).Funciton (
186136 bytes en UTF-16)Este programa imprime "mundo".
La mayoría de las subcadenas que elimine de esto evitarán que sea una caja completa, de lo que el analizador se quejará. Las únicas eliminaciones posibles que dejan un cuadro completo son:
La mayoría de estos eliminan el extremo colgante en la parte superior derecha de la caja, que es el conector de salida. Sin este extremo suelto, la caja es solo un comentario:
Este ya no es un programa válido porque el analizador espera un programa con exactamente una salida:
La única posibilidad que deja un conector de salida es la última de las anteriores, que deja esto:
Sin embargo, este número no codifica una cadena Unicode válida en el UTF-21 esotérico de Funciton. Intenta ejecutar esto, obtienes:
Por lo tanto, este programa es impecable.
fuente
Visual C ++ -
9695 bytesPropiedades:
int main()
sin un error de compilación.a
a todos los mediosmain()
nunca se pone{
, eliminandob
a todos los medios a nuestra línea no termina en una;
, la eliminación de<
mediosstd::cout<'w'
provoca un error, y la eliminación de<<
las causasstd::cout'w'
,'w''o'
etc.I(a)
,I(b)
que nunca coinciden yI
que se expande antes(
; por otro lado, usaI(,
causas<<<<
y,)
elimina el punto y coma (salvo cualquier otro error).std::cout
sin encontrarse con un líder<<
y, por lo tanto, no puede eliminar ninguno#include<iostream>
al principio sin un error de compilación.''
tiene un error de carácter vacío y'w,
, etc., intenta convertir todo en un solo carácter.)
o(
del otro lado, por ejemplo, no puede hacer cosas comoI('w',I('r'
.Compila en línea usando Visual C ++ .
Una vez más, esto no es una prueba exhaustiva. Si crees que puedes hacerlo funcionar sin una sección, asegúrate de hacérmelo saber.
Las versiones anteriores usaban un enfoque considerablemente diferente y se demostró que no era impecable, así que eliminé esos puntajes.
Verificación:
El siguiente programa ha confirmado que esta versión es inmaculada usando el
cl
compilador de Visual C ++ 2010. Ojalá me hubiera molestado en escribir esto antes:fuente
/c
opción se incluye automáticamente y se compila (como si se creara una biblioteca y no un programa). Si marca la casilla Ejecutar que el sitio no incluye/c
, no recibirá un mensaje de éxito, y en su lugar encontrará el "ENLACE: error fatal LNK1561: el punto de entrada debe estar definido".Pitón 3,
7933open(1,'w')
abre la salida estándar, luego imprimimos la cadena.write
Devuelve el número de caracteres escritos. Esto se utiliza para reforzar la eliminación de la subcadena: la eliminación de parte de la cadena hace que se devuelva algo distinto de 5, y 5 menos ese valor se evalúa como verdadero. Pero eso hace que elif
cuerpo se ejecute ya
no está definido.Esto se basa en la inteligente quine prístina de Anders Kaseorg aquí .
Como solo se necesita verificar una sola declaración, esta es mucho más corta que la solución anterior, pero también menos general.
Vieja solución:
Para verificar que realmente es un programa impecable:
Algunos puntos clave:
q
se haya ejecutado requiere una declaración fuera deq
. Lotry
resuelve muy bien, al requerir al menos dos declaraciones, ninguna de las cuales se puede eliminar por completo.q
ha ejecutado ocurre evaluandor
al final.q
no se modificó se logra medianteeval(q[17:])
, que debe evaluarseNone
paraq
que se ejecute.if
condición es un poco difícil de corregir. Para asegurarse de que se evaluó, tiene el agradable efecto secundario de la configuracióne
, que se necesita para configurarr
. (Esta es la razón por la que usé Python 3,expr
ya que una función hace maravillas para los efectos secundarios a nivel de expresión).fuente
Haskell, 61
¿Algún tipo de error está bien? En ese caso:
Haskell, 39
fuente
JavaScript,
747335 bytesResulta que la respuesta fue mucho más simple de lo que pensaba ...
Explicación
fuente
a="world"
, no se produce un errorif(a="world")["bol"+a[4]]
no errorJava 8, 301 bytes
Porque cada pregunta necesita una respuesta Java.
Expandido
Explicación
public static main(String[]a){}
es requerido.La parte más dificil:
final
se elimina la palabra clave, la segunda línea se evalúa como1/(8-8)
, causando una/ by zero
excepción.fuente
System.out.print()
método vacío . Hay paraprintln()
, pero no paraprint()
. Entonces, si lo eliminarad='d'
, daríaThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
como error (Y si lo eliminarad=
, daríaThe blank final field d may not have been initialized
como error).Funciton ,
143142136 bytesLa puntuación está en UTF-8 como de costumbre, ya que UTF-16 sería dos bytes más grande (debido a la lista de materiales).
Entonces, he estado contemplando una respuesta Funciton por un tiempo y pensé que sería imposible, porque siempre se podía eliminar una línea completa y el código aún formaría un bloque válido. Luego hablé con Timwi al respecto, y se dio cuenta de que puedes poner todo el número en una sola línea, de modo que eliminarlo interrumpiría el programa por falta de un conector de salida.
Pero los literales en una sola línea son notoriamente caros, tanto por el mayor número de caracteres como por el mayor número de caracteres no ASCII. Y su mención de un bloque de "comentario vacío" me hizo pensar ...
Así que se me ocurrió esta solución más eficiente que utiliza un bloque de comentarios vacío adicional que se rompe cuando intenta eliminar cualquier cosa que deje intacto el bloque literal:
Eso deja dos opciones (gracias a Steve por señalar eso):
19342823075080880373
se descodifica el entero resultante , la cadena correspondiente contendría el punto de código0x18D53B
que no es un carácter Unicode válido, seSystem.Char.ConvertFromUtf32
bloquea con unArgumentOutOfRangeException
.508088037380718711
contendría dos puntos de código no válidos0x1B0635
y0x140077
, lo que llevaría a la misma excepción.Tenga en cuenta que incluso sin el bloque de comentarios vacío, eliminar la segunda línea conduciría a un punto de código no válido. Pero el bloque de comentarios evita que tomemos una línea desde dentro de la segunda línea, para obtener un número entero como,
193428037380718711
por ejemplo, lo que no causaría un error.fuente
Rubí, 36
Asignamos
s="planet"
, luego escribimos esa cadena en STDOUT. Esto devuelve el número de caracteres escritos. Xor eso con 6, de modo que si se escribieron otros caracteres que no sean 6, obtendremos un número entero distinto de cero. Luego nos dividimoss
con ese índice. Solo el carácter 0 des
"p" es una cadena de código válida (no operativa). Pasamos eso aeval
, usando la(*[argument])
sintaxis que es equivalente a solo(argument)
excepto que no es válida fuera de una llamada al método.Pristineness verificado programáticamente en Ruby 1.9.3 y 2.2
fuente
*
?C #,
128118101 bytesPensamiento en abusar de la regla de subcadena contigua.
El código
Por qué funciona
class h
ystatic void Main()
son obligatorios'w','o','r','l','d'
causa un error porque la matriz de caracteres se inicializa con longitud1*5
.Antes del golf y la separación
Verificado con
https://ideone.com/wEdB54
EDITAR:
#if !x
lugar de#if x #else
.=>
Sintaxis func usada .#if!x
en lugar de#if !x
. Créditos a @JohnBot.=>
sintaxis de func, se puede eliminar la condición adicional de preproc.fuente
static
encendidoMain
.Main
un miembro de la función Expresión de cuerpo y 2 más por la eliminación de los espacios antes del preprocesador condición:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. Eso es 115 por mi cuenta.MATLAB,
373633 bytesComo no estoy seguro de si también se nos permite generar ans = , tuve que encontrar una solución alternativa para generar de manera adecuada. Usar fprintf por sí solo no funcionó, porque no importa lo que intenté, simplemente se negó a cometer errores. Usar disp por sí mismo no era una opción, ya que solo tomaría 1 argumento y ese argumento en sí mismo obviamente también se ejecutaría sin errores.
Si no es un problema incluir también ans = en la salida, entonces MATLAB se puede hacer con 20 bytes :
fuente
> <> , 17 bytes
Pruébalo en línea!
Imprime "tierra".
La única forma en que un
><>
programa sale sin un error es ejecutando el;
carácter, lo cual es un problema, ya que puede eliminar todos los caracteres antes de eso, por lo que ese;
es el primer carácter ejecutado. Puede evitar eso utilizando elp
comando para modificar el programa para incluirlo;
durante la ejecución. La eliminación de cualquier sección del código hace;
que nunca se produzcan errores causando errores a través de las instrucciones no válidasB
,h
y elt
desbordamiento de la pila y los bucles infinitos que eventualmente se quedan sin memoria. Solo tenía que asegurarme de que todos los bucles infinitos continuaban llenando la pila.Todas las variantes se probaron con este fragmento de Python:
agregado a (una versión ligeramente modificada de) el intérprete oficial fish.py por el creador de> <>. De los 152 subprogramas posibles, 92 se equivocaron debido a instrucciones no válidas, 18 por desbordamiento de pila y 42 por quedarse sin memoria.
Hechos curiosos, la primera versión de esto
e"ooooo6-c0pAhtra
tenía un par de subprogramas extraños que lograron usar el comando put para colocar uno[
que despejaría la pila, en lugar de la instrucción no válidaA
. Además, "tierra" es la única de las frases que funcionará con este método, porque la primera letrae
es una instrucción válida en><>
. De lo contrario, el"
comando debe colocarse al frente del programa, y un subprograma válido podría ser solo"
.fuente
Rubí, 34
Esto tiene algunos componentes:
eval(*[
expr])
se toma prestado de la respuesta de histocrat , y es prístino, además de verificar que el valor de retorno de expr es un programa ruby válido que no falla.method(*arr)
es una sintaxis de ruby que llamamethod
con los valores dearr
como argumentos. La razón de esto es necesario aquí es porque es solamente válida como parámetros para un método, por lo que sieval
se quita,(*[expr])
es un error de sintaxis. Si se elimina expr , seeval
queja de no tener suficientes argumentos$>.write("world")-1
no se puede destrozar excepto dentro de la cadena y la resta.$>.write("world")
escribe "mundo" en STDOUT y devuelve el número de caracteres escritos, luego resta 1. Por lo tanto, si el programa no está destrozado, el valor será exactamente 4 . Si está destrozado (ya sea que-1
se elimine o la cadena se acorte), devolverá uno de -1,0,1,2,3 o 5 . Cualquier otra alteración da como resultado un error de sintaxis.Llamar
chr
a un número devuelve el carácter representado por ese número. Entonces, cuando se invoca el resultado del ejemplo anterior, se produce un error en -1 y, de lo contrario, devuelve una cadena de un solo carácter.No estoy seguro de por qué es así, pero parece que ruby interpreta
\x04
como un carácter de espacio en blanco, lo que significa que la expresión es válida (los programas de ruby vacíos no hacen nada). Sin embargo, cualquiera de los otros caracteres (\x00
-\x03
y\x05
) resultan enInvalid char '\x01' in expression
. Encontré esto simplemente iterando sobre las posibles matemáticas que podía hacer con el número devuelto. Anteriormente había usadodonde "planeta" más una nueva línea eran 7 caracteres, 16 veces para obtener 112
p
, la única función de una letra en ruby definida por defecto. Cuando no se le dan argumentos, es efectivamente un no-opMención de honor:
$><<"%c"*5%%w(w o r l d)
está muy cerca, pero no está impecable. Eliminar"%c"*5%
resultados sin errores. Mini explicación:$>
es stdout y se<<
llama a una función en él."%c"*5
genera la cadena de formato"%c%c%c%c%c"
, que luego intenta ser formateada (%
) por una matriz:%w(w o r l d)
que es una versión más corta de['w','o','r','l','d']
. Si hay muy pocos o demasiados elementos en la matriz de manera que no coincida con la cadena de formato, se muestra un error. El talón de Aquiles es eso"%c"*5
, y%w(w o r l d)
ambos pueden existir de forma independiente, y$><<
solo necesita un argumento de ambos. Por lo tanto, hay algunas formas diferentes de destrozar este programa en primos sin errores.Validado usando esto:
fuente
Python 3 , 43 bytes
Pruébalo en línea!
Cómo funciona
Para protegernos contra las eliminaciones de subcadenas, utilizamos en
open(1,"w").write
lugar deprint
. En Python 3,write
devuelve el número de caracteres escritos, lo que verificaremos es5
asegurarnos de que no se eliminó ninguna parte de la cadena. Hacemos esto al buscar el valor de retorno en el diccionario{5:[]}
y recorrer el resultado confor[]in…:a
, que fallará si no obtuvimos un iterable vacío o si lafor
declaración se elimina.fuente
Javascript (Node.js),
9395 bytesCompruebe su propio tamaño dos veces, por lo que si falta algún carácter, se genera un error. La longitud es 156 porque Node.js antecede
function (exports, require, module, __filename, __dirname) {
al código en tiempo de ejecución.Gracias Martin Büttner por señalar un error. Corregido ahora.
fuente
Perl 5.10+,
7163 bytesImprime
world
con una nueva línea final. Corre así:Esto se basa en el recuento de bytes del código fuente, por lo que
file
debe contener el código anterior y nada más (sin shebang, sin línea nueva). Se requiere Perl 5.10+say
y el operador definido u//
.Es increíblemente difícil hacer un programa prístino con Perl, porque:
Cualquier identificador bareword (por ejemplo
foo
,a
,_
) es una declaración válida conno strict 'subs';
(el valor predeterminado). Esto significa que el programa no puede comenzar ni terminar con una letra, número o guión bajo.Como explica tchrist , "los identificadores especificados mediante desreferencia simbólica no tienen absolutamente ninguna restricción en sus nombres". Esto significa que el programa no puede comenzar con cualquiera de los sellos
$
,@
,%
, o*
, ya que la eliminación de todo menos el primer y último personaje se deje siempre un nombre de variable válido.Muchas funciones integradas (incluidas la mayoría de las funciones capaces de producir resultados) funcionan
$_
de forma predeterminada, por lo que las llamadas a menudo funcionarán incluso si elimina el argumento (por ejemplo,say"world"
vs.say
).Cómo funciona
Esta solución se inspiró en la respuesta Node.js de Naouak , que verifica su propia longitud para asegurarse de que no se hayan eliminado los caracteres.
El programa tiene dos secciones, una dentro de paréntesis y la otra dentro de un bloque:
La primera sección lee el archivo fuente y muere si tiene menos de 63 caracteres. La segunda sección verifica que se
read
ejecute con éxito. Si se elimina cualquiera de las secciones (con o sin paréntesis o llaves), la otra sección generará una excepción.Quitar el medio o el lado izquierdo o derecho del programa desequilibrará los paréntesis y / o llaves, causando un error de sintaxis.
Si el primero
die
se altera (ad
,e
,di
,de
, oie
, que son todos identificadores válidos), la comprobación de longitud se convierte en:que evalúa a:
Esto toma una referencia a una cadena e intenta desreferenciarla como una matriz, produciendo un error:
Si se altera cualquier otra declaración, la verificación de longitud fallará y el programa morirá.
Prístino verificado con el siguiente programa:
fuente
Ruby + coreutils,
332726 bytesPruébalo en línea!
Los backticks en ruby ejecutan el comando dentro de ellos y devuelven lo que el programa puso en STDOUT como una cadena. La
#{expr}
sintaxis permite incrustar expresiones en cadenas y backticks. Este programa podría reescribirse (de manera no prístina) como:IO#write
devuelve el número de bytes escritos, por lo que si la cadena se acorta, no será el número correcto.#{}
incrustar automáticamente convierte el número en una cadena. Si se elimina alguna pieza y no se produce un error de sintaxis, se ejecutará el comando incorrecto. Si"world"
se elimina parte de, uno de losbase04
intentosbase54
intentará ejecutarse.La nueva línea, ya sea dentro o fuera de la cadena, es obligatoria. De lo contrario,
`base
se pueden eliminar los primeros 5 caracteres ( ), lo que convierte la línea completa en un comentario. También debe haber uno o más caracteres entre el primer backtick y#
, de lo contrario, se{
pueden eliminar para hacer que todo sea un comentario de shell .exec
Reemplaza el proceso actual de ruby con el comando especificado. Vea mi otra respuesta para una explicación de lameth(*[])
sintaxis y la necesidad de la misma.(s="ec%co earth")
asigna la cadena "ec% co earth" a la variables
. Las asignaciones devuelven lo que se asignó, por lo que la cadena también se devuelve."format string %d" % 5
es azúcar sintáctico parasprintf("format string %d",5)
, sin embargo, los espacios alrededor%
no son necesarios.s[10]
obtiene el carácter en la cadena en el índice 10. Cuando no está destrozado, este carácter es "h", la última letra de la cadena. Sin embargo, eliminar cualquier carácter de la cadena significa que la cadena es más corta, por lo que no hay ningún carácter en el índice 10, por lo que ses[10]
devuelvenil
y"%c" % nil
causa un error.si
%s[10]
se elimina, entonces ruby intenta ejecutar el comandoec%co earth
que no funciona.Cambiando
10
a1
, o0
también se traduce en un comando desconocido (ya seaeceo
oecco
). Eliminarlo por completo no es técnicamente un error de sintaxis, ya que llama al método#[]
en la cadena, pero luego se queja de que no hay suficientes argumentos.Una nota sobre cómo resolver esto en general: debe tener algún contenedor que verifique el código en su interior en un sentido abstracto mientras es impecable. Por ejemplo, un programa con división al final (
blablabla/somevar
) nunca funcionará porque una división siempre se puede eliminar (blablabla
). Estos son algunos de estos envoltorios que he usado hasta ahora:eval(*[
código])
utilizado por histocrat y en mi primera respuesta. Valida que la salida es un programa ruby válidoexec(*[
código])
utilizado anteriormente, valida que la respuesta es un comando válido`#{
código}`
La sintaxis de retroceso también ejecuta un comando (y, por lo tanto, valida que sea válido), sin embargo, STDOUT se captura como una cadena en lugar de salir como el STDOUT del proceso principal '(Ruby).
Debido a esto no pude usarlo para esta respuesta,EDITAR: lo hice funcionar. Limitaciones descritas anteriormente.Editar: Gracias a @histocrat por señalar algunos defectos
fuente
write
y el inicio de la cadena, pero no creo que eso afecte el estado prístino. Además, en mi máquinabase64
colgará esperando la entrada, lo que podría estar en contra de las reglas.$>.write"world"
funcione, ¡gracias! En cuanto a la base64 en espera de entrada, parece variar según el sistema. TIO funciona bien. Eso hace que sea aún más confuso si sigue las reglas.PowerShell, (97 bytes + 5 para el nombre del programa) = 102 bytes
Se controla antes de que se destruya ... dos veces.
Espera que se guardan como
c.ps1
y ejecutados desde el directorio local, tales como:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.El alias
gc
es la abreviaturaGet-Content
y es similar a lacat
lectura de un archivo (en este caso, nuestra ruta de ejecución.\c.ps1
). Obtenemos.Length
el archivo, lo configuramos$a
y verificamos si no es igual a 97 con-eq97
. Si es igual (es decir, el programa no se ha modificado), imprimimos con"world"
y ejecutamos un comando no válidoa
. Esto obligacatch
a que surta efecto, lo que nos permite controlarnos nuevamente. Esta vez, si nuestro código no es igual a 97, lanzamos un comando no válido para que nuestro programa tenga errores e imprima texto de error en la salida. Entoncesclear()
el error yexit
normalmente.Es obvio que si alguna de las
if
declaraciones se manipula, la otra tendrá un error. Si"world";
se altera cualquier parte de , la primeraif
causará un error. Como tiene que ser contiguo, no podemos eliminar ambasif
declaraciones. Las cadenas en el medio resultarán en paréntesis no coincidentes, o resultarán en la{a}
ejecución del segundo . Eltry
/catch
es detectar el error de la primeraif
instrucción para que podamos borrarlo correctamente. El exterior"$( )"
evita que las cadenas de ambos extremos se corten. Lo último;a
es evitar que partes del medio se corten y que resulten en programas válidos (por ejemplo"it}a)";a
, que se imprimiránit}a)
y luego se producirán errores).Hay varias circunstancias especiales:
gc
,gc<space>
ogc .\
, el programa eventualmente fallará con un poco de error de falta de memoria (debido a repetidas llamadas de autoejecución) y probablemente bloqueará el shell (y tal vez la computadora). No probado.<space>.\c.ps1
o.\c.ps1
, el programa se detendrá y solicitará la entrada del usuario. No importa lo que ingrese el usuario, el programa seguirá teniendo errores, ya que el recuento de tamaños será incorrecto.$
y termina antes de que"
se corte la última , el programa generará lo que quede y luego generará un error porquea
no es válido.Verificado con lo siguiente:
(¡Gracias a Martin por su amplia ayuda!)
fuente
C (gcc) (Linux,
-Werror=undef
), 66 bytesPruébalo en línea!
¡Gran reto! Esto fue engañosamente difícil, ¡pero estoy bastante seguro de que tengo un programa válido ahora!
Utiliza un comando de preprocesador para que no se puedan eliminar nuevas líneas, ya que el corchete de cierre
main
se incluye solo si__LINE__==6
. También evita que se limpie pormain
completo, ya que eso deja#endif
flotando (por lo que es importante que#endif
esté fuera demain
).Lo utilicé
#else
porque me he convencido bastante de que no hay una versión de__LINE__==6
que no se pueda eliminar una subcadena y aún así sea verdad, ya que ambas6
y__LINE__
por sí mismas son verdaderas. También se usa-Werror=undef
para que algo así#ifdef(LINE__)
no se evalúe como falso, pero es un error.Con gcc (en Linux, al menos),
puts
devuelve el número de caracteres impresos (incluida la nueva línea final), por lo que al eliminar cualquier parte de la cadena seputs("...")/6
devuelve0
, lo que1/0
provoca una excepción de punto flotante. Tenga en cuenta que esta excepción no se produce a menos que1/0
se asigne a algo, por lo quea=
se requiere.Ninguna otra parte de una línea se puede eliminar sin crear un error, generalmente un error de sintaxis o un error de enlace.
Como beneficio adicional, esto proporciona una solución de 86 bytes para C ++ bastante trivialmente, solo agregue
#include <cstdio>
y declarea
como unint
. Pruébalo en línea! (C ++)fuente
1/
mientras deja la nueva línea y aún se ejecutará .1
se suponía que en la línea anterior, creo.=1
. Creo que necesitas poner el 1 en una línea por sí solo.PHP, 73 bytes
Explicacion
Asumo la configuración predeterminada de php.ini. Entonces short_tags está deshabilitado. Esto significa que no puede eliminar el
=
de la etiqueta de apertura.Esto es básicamente
<?=unserialize('s:5:"world"');
.Si elimina cualquier parte de la cadena serializada, obtendrá un error.
Simplemente puede eliminar
unserialize
y el script solo generará la cadena serializada. Para superar esto lo usocall_user_func
. Eliminar uno de los parámetros dará como resultado un error.Sin embargo, puede eliminar
un
, para llamar a laserialize
función. Entonces sacamos 'ns'. Eliminar cualquier carácter no daría como resultado un nombre de función incorrecto.Usaremos una asignación en línea para usar la asignación de variables con la etiqueta de salida. En lugar de usar
&&
, usamos '|' para evitar eliminar una sola&
o eliminar la$f
asignaciónPodrías eliminar
='ns')&&($f="u{$p}erialize"
y terminar con($p)?$f:''
. Por lo tanto, agrego paréntesis adicionales alrededor$f="u{$p}erialize"
.Nota
Técnicamente, puede eliminar las etiquetas de apertura sin producir un error. Sin embargo, esto ya no es un script PHP, sino solo un archivo de texto sin formato.
fuente
Matlab (77)
intentalo
Nota:
Siguiendo el consejo de @ Optimiser de diseñar una RCP o algo así, me enfrenté a una subcadena imprevista que no condujo a ningún error de compilación cuando se eliminó, por ejemplo: ¡eliminar
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
de esta edición anteriorfeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
no genera ningún error! También, para la misma edición reciente, hubobsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
ybsxfun(@(a,b)a,'world',1:5)
, si me preguntaron cómo estaba cuando los descubrí en mi consola de salida, lloré como un bebé, así que aquí está el programa:Un ejemplo de un programa no prístino
editar:
fuente
SmileBASIC, 63 bytes
fuente
Un peral , 17 bytes
Este programa contiene bytes con el conjunto de bits alto (que no son válidos UTF-8 y, por lo tanto, no se pueden publicar en TIO), así que aquí hay un
xxd
volcado hexadecimal reversible:Explicación
Esto es solo
print'world'
con una suma de verificación añadida. Verifiqué por fuerza bruta que ninguna de las posibles eliminaciones da un programa con una suma de verificación válida, por lo que obtiene un error después de una posible eliminación.Bastante aburrido, pero vincula al líder actual, así que sentí que valía la pena publicarlo.
fuente