Quine suavizada por radiación

38

Es simple: haga una quine adecuada donde, si elimina cualquier personaje, sigue siendo una quine.

La diferencia entre esto y una quina endurecida por radiación es que si su programa es AB, en una quine endurecida por radiación se Ageneraría AB, pero aquí, se Aemitiría A.

Código de golf, todas las reglas estándar, se aplican las lagunas estándar, sin trampas.

CalculadoraFeline
fuente
¿Es válido un programa vacío?
Loovjo
44
@Loovjo No.
Martin Ender
3
@feersum El desafío dice "Hacer una quine donde ...", por lo que ABdebería salir AB.
Mego
1
@Mego Sé que dice eso, pero las especificaciones no siempre son tan precisas y no se indica en los ejemplos.
fiesta
44
@feersum "Hacer una quine" significa hacer una quine. "La diferencia entre esto y una quine endurecida por radiación ..." significa que la única diferencia es que el programa con cualquier byte eliminado da como resultado una quine, no un programa que imprima la fuente del programa original. No hay ambigüedad aquí.
Mego

Respuestas:

22

> <> (Pez), 145107 bytes

Esta respuesta utiliza la instrucción de salto de> <> para solucionar el problema.

!<0078*+00~..>0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.0f<>0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.0+*a58 

Esta quina en realidad contiene dos generadores de quina diferentes. Comienza con algo de lógica de salto y, por defecto, usa la quine izquierda. Si se elimina un personaje de la lógica de salto o de la línea izquierda, el programa salta a la línea derecha.

Puedes probarlo aquí

Explicación

El código se puede diseccionar en algunas partes:

A: !<0078*+00~..>0[!. 
B:              >0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.
C:                                                    .0f<
D:                                                        >0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.
E:                                                                                                 .0+*a58 

Explicación de las diferentes partes:

  • A: Salta a la derecha de C. Si se elimina algún carácter de A, salta a la izquierda de D o a la derecha de E, lo que activa la segunda quine. Si se elimina algún carácter de B o C, el código se desplaza 1 carácter a la izquierda, lo que hace que salte a la izquierda de D.
  • C: este código salta a la izquierda de B.
  • B: Quine # 1
  • D: Quine # 2
  • E: salta a la izquierda de D

Explicación de la quine (con # 1 como ejemplo):

Una vez que el puntero de instrucción alcanza cualquiera de las quines, está seguro de que esa quine está completamente intacta.

>0[!.                                       //Fix the instruction pointer's direction and empty the stack (The '!.' is a leftover from codepart A)
     "r43a*+                                //Start reading all of the code and add the '"' character to the stack
            8a+&                            //Because the quine started reading at the 19th character instead of the first, the stack has to move 18 characters. 
                                            //This part saves the number 18 to the register.
                {ee+00&1-:&(?.              //Move the stack one to the left, decrease the stack by 1. If the stack is not empty yet, jump back to the start of this section.
                              ~~              //Clean the temporary variables from the stack. It should now contain the whole quine.
                                ol?!;4b*0.  //Print the first character from the stack. As long as the stack isn't empty, jump back to the start of this section.
Thijs ter Haar
fuente
Explicación por favor.
CalculatorFeline
Reiterando arriba.
CalculatorFeline
1
¿Es esto lo suficientemente claro?
Thijs ter Haar
36

Lenguaje , 4.54 × 10 761 bytes

Tiene este número de caracteres nulos:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Al ver cómo el criterio en este desafío entra en conflicto con la definición de una "quine adecuada", en serio, creo que una variante unaria va a ganar.

Código Brainfuck ampliado:

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

Si se elimina un carácter del programa Lenguage, el último carácter se convierte en a <, lo que hace que el programa imprima exactamente un carácter menos.

jimmy23013
fuente
1
¿Cómo lograste encontrar ese punto fijo? (O, alternativamente, ¿cómo funciona el código Brainfuck?)
Martin Ender
1
@ MartinBüttner El primer bucle grande copia y codifica los datos en forma de "> +++ ..." (y los invierte). El otro gran bucle imprime los datos como un entero en unario. No es tan complicado, pero es largo solo porque es Brainfuck.
jimmy23013
Ah, claro, ¿es como una quine Brainfuck simple, pero con una función de decodificación diferente?
Martin Ender
@ MartinBüttner Algo. Pero la mitad del programa es la "función de decodificación".
jimmy23013
Parece que podría usar una técnica similar para construir respuestas de puntaje arbitrario para codegolf.stackexchange.com/q/57257/8478 (aunque cómo exactamente eso dependería de la respuesta a mi último comentario).
Martin Ender