Detector de radiación!

26

Un programa endurecido por radiación es un programa en el que, si se elimina cualquier carácter del código, el programa seguirá funcionando igual. Para esta pregunta, escribiremos un programa que detecte cuándo se irradia.

Escriba un programa o función que, cuando se elimine cualquier byte, el programa resultante generará ese byte y solo ese byte. ( Puede generar ese byte varias veces, siempre que no genere ningún otro byte )

Reglas:

  • El programa tiene que contener al menos 2 bytes distintos. (No hay soluciones de solo 0s;)
  • No importa lo que haga el programa original.
  • No leer su propio código fuente.
  • El código se puntuará en el número de bytes distintos, donde gana la cantidad más alta. Por ejemplo, abc= 3 puntos, ababba= 2 puntos, abcgana.
    • El desempate es el recuento de bytes más pequeño, seguido del tiempo de envío anterior.

¡Buena suerte!

Jo King
fuente
Perdí esa línea. ¡Me avergüenza!
Mego
55
"El código se puntuará según el número de caracteres distintos, donde gana la mayor cantidad". Espero que la mayoría de las soluciones (si no todas) tengan algún tipo de cadena en algún lugar que puedan rellenar con caracteres arbitrarios sin cambiar realmente la solución (por lo que se reduce a si su idioma está restringido a ASCII, ASCII extendido o Unicode) .
Martin Ender
3
... La caja de arena no es perfecta. :( / Sólo puede medir "bytes distintos" en lugar de "personajes distintos", ya que los caracteres están relacionados con la codificación y otros problemas.
user202729
1
¿Puede el programa tomar alguna entrada?
gggg

Respuestas:

15

05AB1E , 9 7 bytes (Puntuación de 3)

22'''rr

Pruébalo en línea!

Eliminar un '

Con cualquier 'eliminación, 22''rrresultará en 22 siendo lo primero en la pila y 'siendo lo último en la pila, que cuando se invierte dos veces resulta en' .

Eliminar un r

Con cualquier reliminación, 22'''rresulta que 22 es lo primero en la pila, un 'ser lo segundo en la pila y un rser lo último en la pila. Esto r, sin embargo, fue precedido por un 'que lo convierte en la cadena literal "r"(a diferencia del comandoreverse stack ), que se imprime implícitamente.

Eliminar un 2

Con cualquier 2eliminación, el ser 2'''rrserá lo 2primero en la pila, 'será lo segundo en la pila y finalmente rserá lo último en la pila, que cuando se invierte una vez da como resultado2 .

Por lo tanto, esta respuesta es válida. Sin nada eliminado ', resulta irrelevante. Esto funciona para cualquier número que no sea 2 también.


Creado un verificador de validez, puede usarlo para competir en 05AB1E *.

* No estoy 100% seguro de cuántas soluciones son posibles en 05AB1E ...


Soluciones más válidas que son peores o iguales

  • 1 punto (inválido)
  • 2 puntos
    • '''''''VV, '''''''XX o'''''''<any command that pops a without pushing>x2
    • Cualquier número impar de 'más de 3 seguido de cualquier número par de smás de 1 (EG'''''''''ssss ).
    • '''..con cualquier número de períodos por encima de 1 y cualquier número impar de 'más de 2.
  • 3 puntos
    • '\\'''rr- la misma idea que 22'''rrpero \es "eliminar el último elemento de la pila".
Urna de pulpo mágico
fuente
La salida normal de 'es irrelevante para las reglas, como usted dice. Pero invalida el objetivo nominal de detectar anomalías, lo cual es un poco divertido.
gggg
1
@gggg Estoy bastante seguro de que al menos UNA de mis alternativas no imprime nada jajaja.
Urna mágica del pulpo
1
@MagicOctopusUrn De nada. Solo pensé que bien podría editar en lugar de comentar.
boboquack
@boboquack ¿funcionó mi etiqueta original (@boboquack), o la encontraste al ver la publicación nuevamente? Estoy tratando de averiguar cómo funcionan las etiquetas cuando el usuario nunca comentó jajaja.
Urna mágica del pulpo
@boboquack Quiero decir, ¿recibiste una notificación de mi "gracias"? Además, probablemente deberíamos eliminar este hilo hasta mi +1 para su "De nada".
Urna mágica del pulpo
9

Brainfuck, Puntuación 3

Puede no ser competitivo ya que la salida solo se ve a través de un volcado de memoria.

+++++++++++++++++++++++++++++++++++++++++++++,-

Suponiendo que la entrada está vacía y EOF deja la celda sin cambios. Utiliza un intérprete que volca la memoria en una salida, como esta .

Elimine un signo más y la memoria es el valor unicode para "+"; de lo contrario, es el valor unicode para ",". Sin embargo, es más un doblador de reglas que una respuesta. Más o menos lo mismo con "-". Abusa del hecho de que estos tres caracteres están uno detrás del otro en el conjunto de caracteres unicode.

Håvard Nygård
fuente
Inteligente, para ser completamente honesto, no pienses que es un vacío legal.
Urna mágica del pulpo
Estás asumiendo que EOF deja la celda sin cambios, ¿sí?
Jo King
Sí, y mientras no haya entrada, debería estar bien 😊
Håvard Nygård
Estoy tentado a permitir esto, pero ¿ tiene un intérprete que tenga un volcado de memoria que solo generaría celdas cambiadas y deja la celda sin cambios en EOF?
Jo King
1
copy.sh/brainfuck Este debería funcionar bien. Simplemente ejecútelo y presione "ver memoria".
Håvard Nygård
9

Un peral, 256 bytes distintos, 975 bytes

Desafortunadamente, la pregunta requiere una solución óptima para contener un byte NUL en algún lugar (ya que debe contener los 256 bytes en algún lugar). Esto significa que a) no puedo darle un enlace TIO (porque a TIO no le gusta NUL en los programas, o al menos, no he encontrado una forma de escribirlo que mi navegador pueda manejar), y b) I no puede pegar el programa en Stack Exchange literalmente. En cambio, he colocado un xxdhexdump reversible oculto detrás del enlace "fragmento de código" debajo.

Explicación

Este programa consta de tres partes idénticas. (Concatenar múltiples porciones idénticas de un programa es algo así como un tema para mí en programas de .) Cada A Pear Tree requiere una suma de verificación en algún lugar para que el intérprete sepa qué partes del programa ejecutar; rota cualquier parte del programa para el cual la suma de comprobación se inicia correctamente antes de ejecutarla (o imprimea partridge si no coincide la suma de verificación). En este caso, tenemos una suma de comprobación en cada una de las tres partes y, por lo tanto, una parte no irradiada se moverá al inicio. Por lo tanto, podemos suponer que el programa consta de una parte no modificada, seguida de otras dos partes (una de las cuales puede haber sido modificada).

Cada parte comienza con una nueva línea, luego continúa con el siguiente código (he agregado espacios en blanco y comentarios a continuación):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Después de eso viene una copia de cada octeto que no se ha utilizado en el programa hasta ahora (solo para subir la puntuación) y, finalmente, la suma de comprobación. (No hay una nueva línea final; las partes comienzan con una nueva línea pero no terminan con una).

Aquí hay tres casos distintos:

  • Se eliminó un carácter distinto de una nueva línea . En este caso, aparecerá un número impar de veces en la segunda y tercera parte. Eso significa que se agregará y / o eliminará de %zun número impar de veces, y finalmente terminará en la tabla hash. De hecho, será la única clave en la tabla hash (ya que la cadena se ejecuta desde después de la nueva línea de la segunda parte hasta el final de la tercera parte, y la tabla hash comenzó con una sola nueva línea), así que ' Se imprimirá solo.
  • Se eliminó la primera o tercera línea nueva . En este caso, el programa se rotará de modo que sea la tercera de las nuevas líneas que faltan, fusionando efectivamente la segunda y la tercera parte en una sola línea. El literal de cadena al que se accede a través de <DATA>contiene todos los caracteres un número par de veces, por lo que la tabla hash tendrá su contenido original, una nueva línea y se imprimirá.
  • La segunda línea nueva fue eliminada . En este caso, el programa no se rotará (ya que la primera parte tiene una suma de verificación válida), por lo que la segunda parte se moverá a la misma línea que la primera parte. <DATA>solo comienza a leer desde la línea de abajo __DATA__, por lo que solo verá la tercera parte. Esto tiene más de cinco caracteres que aparecen un número impar de veces, por lo que activará el caso especial para imprimir una nueva línea.

Verificación

Una última cosa que debe verificarse para detectar prácticamente cualquier programa de A Pear Tree endurecido por radiación es si una eliminación ocasiona aleatoriamente una sección no deseada del código a la suma de comprobación correctamente y gira el código en el lugar incorrecto; Dado que estamos usando sumas de verificación de 32 bits, esto es poco probable pero no imposible. Utilicé el siguiente script de fuerza bruta para asegurar que esto no suceda para ninguna eliminación:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

El script de verificación confirma que este programa funciona correctamente.

ais523
fuente
7

Stax , 11 bytes (puntaje de 4)

'''cc'~~'dd

¡Ejecute y depure en línea!

Es un honor para mí tener la primera respuesta (cronológicamente) a este desafío con un puntaje mayor o igual a 4. Sin embargo, el puntaje puede ser aún mayor.

En Stax, se escribe un literal de cadena que se compone de un solo carácter ', por '', 'c, 'd, '~lo que todos los literales de cadena. Los comandos correspondientes para c dy ~significa duplican la parte superior de la pila principal, abren la parte superior de la pila principal, abren la parte superior de la pila principal y empujan a la pila de entrada, respectivamente. Para este desafío, la pila de entrada no afecta la salida y no es importante, por lo tanto, podemos decird y ~son idénticos.

Explicación

Es mejor dividir el código en varias partes y considerarlas por separado.

Cuando no se manipula, '''ccempuja un literal 'y un literal ca la pila principal, y duplica la parte superior, por lo que la pila sería (de abajo a abajo) c,c,'.

Cuando no se manipula, '~~empuja el literal ~y luego lo hace estallar (y empuja a la pila de entrada), que es básicamente un no-op para la pila principal.

Cuando no se manipula, 'ddempuja el literal dy luego lo abre, otro no-op para la pila principal.

Al final del programa, dado que no se realiza una salida explícita, la parte superior de la pila principal se imprimirá implícitamente.

Si el programa se ejecuta tal cual, la pila final está quieta c,c,'y generarác .

Si la primera parte se convierte ''cc, entonces tenemos un literal ', y dos instrucciones de copia, la pila final será ',','. Dado que las otras dos partes no funcionan, el resultado será' .

Si se convierte en la primera parte '''c, el resultado es básicamente el mismo con la sin control, pero cno se duplica. Entonces la pila será c,'. Después de dos no-op la parte superior de la pila esc .

Entonces podemos detectar la radiación en la primera parte.

La segunda parte y la tercera parte funcionan exactamente de la misma manera. Tomaré la tercera parte como ejemplo.

Si se manipula la tercera parte, las dos primeras partes se mantienen tal cual y la pila antes de ejecutar la tercera parte es c,c,'

Si la tercera parte se convierte 'd, dse empuja un literal a la parte superior de la pila principal y no se hace nada más. La parte superior de la pila principal es ahora la dque saldrá.

Si se convierte en la tercera parte dd, se sacan dos elementos de la pila principal y ahora la parte superior de la pila es 'y se emite.

Por lo tanto, podemos detectar radiación en la tercera parte. Por la misma razón, podemos detectar radiación en la segunda parte.

Weijun Zhou
fuente
5

05AB1E , puntaje 2, 6 bytes

„"""„„

Imprime el doble del personaje eliminado a veces. No contiene '.

Cómo funciona:

Quitando el primero

"""„„

Pruébalo en línea!

Primero, empujamos un literal de cadena vacío a la pila. Luego presionamos „„, que se imprime implícitamente.

Eliminar un "

„""„„

Pruébalo en línea!

Primero, empujamos ""a la pila con las 2-char stringinstrucciones. Luego intentamos obtener otra cadena de 2 caracteres, pero esto se cancela (no estoy exactamente seguro de por qué) y el"" se imprime.

Eliminar el segundo o el tercero

„"""„

Pruébalo en línea!

Primero, empujamos ""a la pila con las 2-char stringinstrucciones. Luego presionamos , que se imprime implícitamente.

boboquack
fuente
5

Gelatina , 5 bytes, puntaje 2

”””ḷḷ

Pruébalo en línea!

Con cualquier eliminado:

””ḷḷ

Pruébalo en línea!

El carácter comienza un carácter literal de un byte. Este programa comienza con el ””que produce la cadena . La diada toma su argumento izquierdo. La cadena acaba se pasa a través de las dos instancias de .

Con cualquier eliminado:

”””ḷ

Pruébalo en línea!

En este programa se ””obtiene el carácter, se ”ḷobtiene el carácter y solo se genera este.


Otras soluciones

  • Muchos otros personajes, como ao ohabrían funcionado en lugar de esta presentación.
  • ⁾⁾⁾⁾FFF. Esto funciona de manera similar. es como pero inicia un literal de cadena de dos bytes. Los programas "irradiados" emiten el byte eliminado dos veces, que se consideró válido en los comentarios.

Aquí hay una versión Jelly (mucho menos elegante) del verificador de validez de Magic Octopus Urn. La columna izquierda de la salida es el carácter eliminado y la columna derecha es la salida del programa resultante.

dylnan
fuente
Mi verificador de validez no es muy elegante. Falla para la otra solución publicada;).
Urna mágica del pulpo