Quine adouci par rayonnement

38

C'est simple: faites un bon quine où si vous supprimez un caractère, c'est toujours un quine.

La différence entre ceci et une quine durcie par rayonnement est que si votre programme est AB, une quine durcie par rayonnement Aproduirait AB, mais ici, Aproduirait A.

Code golf, toutes les règles standard, les échappatoires standards s'appliquent, pas de triche.

CalculatriceFeline
la source
Un programme vide est-il valide?
Loovjo
4
@Loovjo No.
Martin Ender
3
@feersum Le challenge indique "Fais un quine où ...", donc ABdevrait sortir AB.
Mego
1
@ Mego Je sais que cela est dit, mais les spécifications ne sont pas toujours aussi précises et ce n'est pas indiqué dans les exemples.
Feersum
4
@feersum "Faire un quine" signifie faire un quine. "La différence entre ceci et un quine durci aux radiations ..." signifie que la seule différence est que le programme avec n'importe quel octet supprimé donne un quine, pas un programme qui affiche la source du programme original. Il n'y a pas d'ambiguïté ici.
Mego

Réponses:

22

> <> (Poisson), 145 107 octets

Cette réponse utilise l'instruction de saut>> pour résoudre le problème.

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

Cette quine contient en fait deux générateurs quine différents. Il commence par une logique de saut et utilise par défaut le quine gauche. Si un personnage est supprimé de la logique de saut ou de la quine gauche, le programme passe à la quine droite.

Vous pouvez l'essayer ici

Explication

Le code peut être disséqué en quelques parties:

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 

Explication des différentes parties:

  • A: Saute à droite de C. Si un caractère est supprimé de A, ceci saute à gauche de D ou à droite de E, déclenchant la deuxième séquence. Si un caractère est supprimé de B ou C, le code est décalé d'un caractère vers la gauche, ce qui le fait basculer à gauche de D.
  • C: Ce code saute à gauche de B.
  • B: Quine # 1
  • D: Quine # 2
  • E: saute à gauche de D

Explication de la quine (avec # 1 comme exemple):

Une fois que le pointeur d'instruction a atteint l'une des quines, vous êtes certain que cette quine est complètement intacte.

>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
la source
Explication s'il vous plaît.
CalculatorFeline
Réitérant ci-dessus.
CalculatriceFeline
1
Est-ce assez clair?
Thijs ter Haar
36

Longueur , 4.54 × 10 761 octets

Il a ce nombre de caractères nuls:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Voyant en quoi le critère de cette contestation est en contradiction avec la définition de «bonne quine», sérieusement, je pense qu’une variante unaire va gagner.

Code Brainfuck étendu:

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

Si un caractère est supprimé du programme Lenguage, le dernier caractère devient un <, ce qui oblige le programme à imprimer exactement un caractère de moins.

jimmy23013
la source
1
Comment avez-vous réussi à trouver ce point fixe? (Ou encore, comment fonctionne le code Brainfuck?)
Martin Ender
1
@ MartinBüttner La première grande boucle copie et code les données sous forme de "> +++ ..." (et les inverse). L’autre grande boucle affiche les données sous forme d’entier unaire. Ce n'est pas si compliqué mais c'est long seulement parce que c'est Brainfuck.
Jimmy23013
Oh, d'accord, c'est comme un simple Brainfuck, mais avec une fonction de décodage différente?
Martin Ender
@ MartinBüttner Quelque peu. Mais la moitié du programme est la "fonction de décodage".
Jimmy23013
Il semble que vous pourriez utiliser une technique similaire pour construire des réponses de score arbitraire pour codegolf.stackexchange.com/q/57257/8478 (bien que cela puisse dépendre de la réponse à mon dernier commentaire).
Martin Ender