¿Qué olvidamos?

31

Su tarea es escribir un programa de computadora no vacío compuesto por alguna secuencia de bytes. Si elegimos un byte particular en el programa y eliminamos todas las instancias del programa, el programa modificado debería generar el byte eliminado.

Por ejemplo si nuestro programa fuera

aabacba

Luego bcbsaldría a, aaacatendría que salir by aababasaldría c.

No importa lo que haga el programa no modificado.

Las respuestas se puntuarán en bytes con el objetivo de minimizar el número de bytes.

Asistente de trigo
fuente
44
Dado que este desafío no está etiquetado quine, ¿podemos leer nuestro propio código fuente?
Dennis
1
@Dennis Claro. Be my guest
Wheat Wizard
2
Si todos los bytes de nuestro programa representan dígitos, ¿podemos generar el código de salida?
Sr. Xcoder
15
Creo que esto sería mejor como un desafío de código en el que tienes que maximizar la cantidad de caracteres discretos utilizados.
Notts90
2
Debería haber especificado más de 1 byte en lugar de no vacío : P. O lo que dijo Notts90.
Urna de pulpo mágico

Respuestas:

70

zsh, 603 594 566 561 548 440 415 399 378 370 bytes

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Depende de coreutils + dc.

Pruébalo en línea!

Eso fue ... un viaje.

Esta respuesta tiene tres partes. Las primeras 4 líneas manejan ciertos casos especiales para simplificar el código que sigue. Las siguientes 2 líneas y la última línea logran esencialmente lo mismo, pero exactamente una se ejecuta con cualquier eliminación de caracteres. Se escriben con conjuntos de caracteres en su mayoría complementarios, por lo que eliminar cualquier carácter rompe solo uno como máximo, permitiendo que el otro continúe funcionando.

Mirando la primera parte, primero manejamos

  • eliminación de nueva línea con ec\nho \\n
  • eliminación de espacio con ca t<<<$'\x20'(seguido de exi tpara evitar ejecutar código posterior, lo que daría como resultado una salida extraña)
  • $eliminación con d$c -e8BC6P( 8BC6= 9226es 36*256 + 10, y 36 y 10 son los valores de byte de los $caracteres de línea nueva y respectivamente; utilizamos dígitos hexadecimales en decimal para evitar tener que incluirlos en el comentario grande en la línea 6)
  • 0eliminación con d0c -eKp( Kobtiene la precisión decimal, que es la 0predeterminada)

En la siguiente parte, los únicos caracteres utilizados (aparte de la basura al final de la segunda línea) son $'\01234567v;espacio y nueva línea. De estos, cuatro se han contabilizado, por lo que el resto ( '\1234567v) no puede aparecer en la última línea. Al expandir los escapes octales ( $'\123'representa el carácter ASCII con el valor 123 8 ), obtenemos:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

La primera línea recorre todos los caracteres utilizados en el programa y busca cada uno en su propio código fuente ( $0es el nombre de archivo del script que se está ejecutando), imprimiendo cualquier carácter que no se encuentre.

La segunda línea parece un poco extraña, y parece hacer lo mismo que exitcon un montón de nops. Sin embargo, la codificación exitcomo octal da como resultado directamente $'\145\170\151\164', lo que no contiene 2o 3. De hecho, necesitamos hacer esto menos resistente a las mudanzas. Esto se debe a que si '\014567vse elimina alguno de ellos, se rompe la primera línea, la segunda línea también se rompe, permitiendo que se ejecute el resto del código. Sin embargo, necesitamos que también se rompa si se eliminan 2o 3se eliminan para que las líneas 3 y 4 puedan ejecutarse. Esto se logra calzando zapatos en :y ;, que tienen un 2 y un 3 en su representación octal, respectivamente.

La basura al final de la línea 2 simplemente está ahí para garantizar que todos los caracteres ASCII imprimibles aparezcan al menos una vez, ya que la forma en que se realiza la comprobación recorriendo cada uno requiere esto.

Si exitno se llamó en la primera sección (es decir, fue destruida por la eliminación de uno de '\01234567v), pasamos a la segunda, en la que debemos lograr lo mismo sin usar ninguno de estos caracteres. La última línea es similar a la primera línea decodificada, excepto que podemos contraer el rango del bucle para guardar algunos bytes, porque ya sabemos que todos los caracteres, excepto el, '\01234567vhan sido cubiertos. También tiene 0# $#delante, lo que lo comenta y evita que produzca resultados extraños si se eliminaron 0o $no.

Pomo de la puerta
fuente
55
¡Guau, muy impresionante teniendo en cuenta la cantidad de personajes distintos involucrados! Definitivamente estoy deseando ver esa explicación.
Kevin Cruijssen
3
@KevinCruijssen aquí tienes :)
Pomo
1
@Doorknob si esto no te gana 548 internet, no sé qué hace. Honestamente, la versión de 603 bytes es igual de impresionante, ¡ja!
Urna mágica del pulpo
3
La única respuesta interesante hasta ahora.
htmlcoderexe
21

Retina , 1 byte

1

Pruébalo en línea!

Cuando 1se eliminan todas las instancias del byte único ( ), la salida es 1. Suficientemente simple.

Conor O'Brien
fuente
66
Estaba navegando en TIO para encontrar algo como esto: me ganaste. Por cierto, este es un políglota, funciona con Snails
JayCe
En mi opinión, esta respuesta debe actualizarse a una respuesta políglota como la primera (posiblemente con una lista de idiomas para siempre incompleta), y las otras dos rechazadas al olvido. Ah, y esto también funciona en C .
@Rogem No estoy seguro de lo que quieres decir con "esto funciona en C." ¿tiene un compilador de C que genera 1el programa vacío? De todos modos, creo que las respuestas en cuestión utilizan diferentes enfoques y comportamientos. OMI, una respuesta políglota solo está garantizada si el enfoque sigue siendo el mismo. (Objetivamente, esto no es un políglota ya que el código real es diferente, para las respuestas a continuación.) Siéntase libre de votar como quiera, pero una respuesta válida es una respuesta válida. Mantendré mi respuesta tal como está, no deseo albergar una colección de respuestas.
Conor O'Brien
11

Lenguaje, 216173027061157310 bytes

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Hay 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #sy 216173027061157310 - 144115194786755540espacios.

Los 144115617572598740 #sy los espacios codifican el siguiente programa BF:

++++++[>++++++<-]>.

Pruébalo en línea!

Los 144115241762960340 $sy los espacios codifican el siguiente programa BF:

+++++++[>+++++<-]>.

Pruébalo en línea!

Los 144115194786755540 $sy #s codifican el siguiente programa BF:

++++++++[>++++<-]>.

Pruébalo en línea!

Editar: 72057832274401770 bytes guardados gracias a @Nitrodon.

Neil
fuente
¿Por qué no usar Uy byte 127? Pruébalo en línea! ¿O incluso solo el byte nul y soh?
Jo King
@JoKing No sabía que Uera el byte ASCII imprimible más corto que se podía generar. No quería usar bytes no imprimibles.
Neil
Incluso sin aprovechar las celdas de ajuste o los caracteres no imprimibles, puede reducir esto a 216173027061157310 bytes al incluir el carácter de espacio como un tercer byte distinto.
Nitrodon
77
No puedo evitar votar porque "Editar: 72057832274401770 bytes guardados ..."
Sr. Lister
9

Polyglot * , 1 byte (en espera de confirmación )

0

Pruébalo en línea! (usando triangularidad)

*: Esto funciona en una variedad (bastante amplia) de idiomas (excepto para esolangs como 4,> <> y similares y algunas otras excepciones). Idéntico a la respuesta de Jelly en el código fuente, pero el método de E / S es diferente: la salida es a través del código de salida. Cuando uno elimina 0el código fuente, se queda con un programa vacío, que a menudo no produce errores y produce el código de salida 0 en la mayoría de los idiomas.

Sr. Xcoder
fuente
3

sed , 1 byte



Pruébalo en línea!

Completamente diferente de la respuesta Retina, o la respuesta Jelly.

tsh
fuente
No veo ningún código ¿No sería eso una respuesta de 0 bytes? ¿Como funciona esto?
Mástil
15
@Mast Hay una nueva línea ..... tendrás dificultades para leer los programas escritos en Whitespace si sigues pensando así.
user202729
3

Unario (no competitivo), 96 bytes

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Aquí está el xxdbasurero.

Una definición más amplia de lenguaje Unary permite cualquier carácter en su código fuente. Pero no he encontrado un compilador o intérprete que funcione para esto. Entonces marqué esta respuesta como no competitiva. Si puede encontrar uno que haya publicado antes de esta pregunta, lo vincularé.

tsh
fuente
44
Este es el programa Unary más pequeño que he visto.
Draco18s