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, `8hubiera 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 
WorldoEARTHno 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 hiloworldy looimprime.#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
mainlí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.aa todos los mediosmain()nunca se pone{, eliminandoba 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 yIque se expande antes(; por otro lado, usaI(,causas<<<<y,)elimina el punto y coma (salvo cualquier otro error).std::coutsin 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
clcompilador de Visual C ++ 2010. Ojalá me hubiera molestado en escribir esto antes:fuente
/copció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.writeDevuelve 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 elifcuerpo se ejecute yano 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:
qse haya ejecutado requiere una declaración fuera deq. Lotryresuelve muy bien, al requerir al menos dos declaraciones, ninguna de las cuales se puede eliminar por completo.qha ejecutado ocurre evaluandoral final.qno se modificó se logra medianteeval(q[17:]), que debe evaluarseNoneparaqque se ejecute.ifcondició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,exprya 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:
finalse elimina la palabra clave, la segunda línea se evalúa como1/(8-8), causando una/ by zeroexcepció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 initializedcomo 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):
19342823075080880373se descodifica el entero resultante , la cadena correspondiente contendría el punto de código0x18D53Bque no es un carácter Unicode válido, seSystem.Char.ConvertFromUtf32bloquea con unArgumentOutOfRangeException.508088037380718711contendría dos puntos de código no válidos0x1B0635y0x140077, 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,
193428037380718711por 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 dividimosscon 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 hystatic 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 !xlugar de#if x #else.=>Sintaxis func usada .#if!xen lugar de#if !x. Créditos a @JohnBot.=>sintaxis de func, se puede eliminar la condición adicional de preproc.fuente
staticencendidoMain.Mainun 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 elpcomando 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,hy eltdesbordamiento 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-c0pAhtratení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 letraees 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 llamamethodcon los valores dearrcomo 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 sievalse quita,(*[expr])es un error de sintaxis. Si se elimina expr , seevalqueja de no tener suficientes argumentos$>.write("world")-1no 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-1se 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
chra 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
\x04como 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-\x03y\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"*5genera 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").writelugar deprint. En Python 3,writedevuelve el número de caracteres escritos, lo que verificaremos es5asegurarnos 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 lafordeclaració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
worldcon una nueva línea final. Corre así:Esto se basa en el recuento de bytes del código fuente, por lo que
filedebe contener el código anterior y nada más (sin shebang, sin línea nueva). Se requiere Perl 5.10+sayy 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
readejecute 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
diese 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#writedevuelve 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 losbase04intentosbase54intentará ejecutarse.La nueva línea, ya sea dentro o fuera de la cadena, es obligatoria. De lo contrario,
`basese 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 .execReemplaza 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" % 5es 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]devuelvenily"%c" % nilcausa un error.si
%s[10]se elimina, entonces ruby intenta ejecutar el comandoec%co earthque no funciona.Cambiando
10a1, o0también se traduce en un comando desconocido (ya seaeceooecco). 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
writey el inicio de la cadena, pero no creo que eso afecte el estado prístino. Además, en mi máquinabase64colgará 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.ps1y ejecutados desde el directorio local, tales como:PS C:\Tools\Scripts\Golfing\> .\c.ps1.El alias
gces la abreviaturaGet-Contenty es similar a lacatlectura de un archivo (en este caso, nuestra ruta de ejecución.\c.ps1). Obtenemos.Lengthel archivo, lo configuramos$ay 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 obligacatcha 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 yexitnormalmente.Es obvio que si alguna de las
ifdeclaraciones se manipula, la otra tendrá un error. Si"world";se altera cualquier parte de , la primeraifcausará un error. Como tiene que ser contiguo, no podemos eliminar ambasifdeclaraciones. Las cadenas en el medio resultarán en paréntesis no coincidentes, o resultarán en la{a}ejecución del segundo . Eltry/catches detectar el error de la primeraifinstrucción para que podamos borrarlo correctamente. El exterior"$( )"evita que las cadenas de ambos extremos se corten. Lo último;aes 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.ps1o.\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 porqueano 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
mainse incluye solo si__LINE__==6. También evita que se limpie pormaincompleto, ya que eso deja#endifflotando (por lo que es importante que#endifesté fuera demain).Lo utilicé
#elseporque me he convencido bastante de que no hay una versión de__LINE__==6que no se pueda eliminar una subcadena y aún así sea verdad, ya que ambas6y__LINE__por sí mismas son verdaderas. También se usa-Werror=undefpara que algo así#ifdef(LINE__)no se evalúe como falso, pero es un error.Con gcc (en Linux, al menos),
putsdevuelve el número de caracteres impresos (incluida la nueva línea final), por lo que al eliminar cualquier parte de la cadena seputs("...")/6devuelve0, lo que1/0provoca una excepción de punto flotante. Tenga en cuenta que esta excepción no se produce a menos que1/0se 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 declareacomo unint. Pruébalo en línea! (C ++)fuente
1/mientras deja la nueva línea y aún se ejecutará .1se 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
unserializey 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 laserializefunció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$fasignació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
xxdvolcado 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