Faire presque quine

12

Je voulais tromper un ami en lui donnant une quine qui fonctionnait presque , mais qui devenait de plus en plus bâclée.

Créez un programme qui, une fois exécuté, produira le programme, mais un caractère désactivé. Un caractère peut être ajouté, supprimé ou les deux (un caractère change). Mais un seul personnage.

Votre score sera (length of your program) / floor(sqrt(number of times the program almost quines))(Où / 0est l'infini)

number of times the program almost quinesest le nombre de fois que votre programme s'exécute sans changer qu'un seul caractère dans stdout. Votre programme peut ne pas accepter d'entrée. Il peut également ne pas imprimer un programme qu'il a déjà imprimé.

Vous ne pouvez pas non plus ajouter un caractère que vous avez déjà ajouté auparavant, ni supprimer un caractère du même index. Par exemple, si vous avez ajouté 1auparavant et que vous ajoutez à 1nouveau, c'est là que number of times the program almost quiness'arrête. Si vous supprimez le premier caractère, vous ne pouvez plus supprimer le premier caractère. Si vous avez changé le troisième caractère en a 2, vous ne pouvez pas ajouter 2ou supprimer le troisième caractère.

mbomb007
la source
quelle quine?
Abr001am
@ Agawa001 Un quine est un programme qui s'imprime.

Réponses:

7

CJam, 0.000884

{_,6/[{64md}6*](124+\+'�f++`"1$~"}""1$~

Ici, indique le caractère non imprimable avec le point de code 128. Essayez-le en ligne.

Idée

Cette approche ajoute tous les caractères UCS (spécification d'origine) avec des points de code compris entre U + 4000000 et U + 7FFFFFFF à la chaîne initialement vide qui suit le bloc de code.

Nous choisissons UTF-8 , qui encode chacun de ces caractères en utilisant une chaîne de 6 octets comme suit:

1111110u₂     10vvvvvv₂     10wwwwww₂     10xxxxxx₂     10yyyyyy₂     10zzzzzz₂

252 + u       128 + vvvvvv  128 + wwwwww  128 + xxxxxx  128 + yyyyyy  128 + zzzzzz

Ainsi, nous pouvons encoder le nième caractère de cette plage en calculant ses 6 chiffres les moins significatifs en base 64 et en ajoutant 252 aux plus significatifs et 128 aux autres.

Notation

Il y a 2 ** 31 = 2,147,483,6486 caractères UTF-8 octets et la longueur du code original est de 39, donc le score est 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Comment ça fonctionne

{                                }""    e# Push the code block and an empty string.
                                    1$~ e# Execute a copy of the code block.
 _,                                     e# Push the length of the string.
   6/                                   e# Divide by 6 to get the number of chars.
      {64md}6*                          e# Perform modular division six times.
     [        ]                         e# Collect the results in an array.
               (124+\+                  e# Add 124 to the first element.
                      '�f+              e# Add 128 to all and cast each to Char.
                          +             e# Concatenate the strings.
                           `            e# Push a string representation.
                            "1$~"       e# Push '1$~' to complete the quine.
Dennis
la source
J'accepte cela en raison de votre premier score (inférieur). Je le permettrai.
6

CJam, 46 octets, 65504 add, 65505 del, Score 0.127424

{`-2<_0c#)!{'#/~(_)\+\+S+]'#*}*W<"
}_~"e# 
}_~

Testez-le ici.

La forme de base est un quine CJam généralisé standard. Pour "quine quine", il y a un commentaire e#à la fin du bloc de la quine, où je peux librement ajouter des caractères sans affecter le code. Notez que le commentaire contient initialement un seul espace.

Le programme continue à ajouter des caractères à l' avant du commentaire, à partir de !puis aller dans l' ordre de la valeur ASCII. Les codes de caractères de CJam s'enroulent après 2 16 donc à un moment donné, cela ajoutera un octet nul. Une fois que cela se produit, le programme commence à supprimer les octets de la fin du commentaire (de sorte que la position du caractère supprimé est toujours différente) jusqu'à ce que le commentaire soit vide.

Martin Ender
la source
5

CJam, 19 octets, 65536 add, 0 del, Score 0,074219

"a"{\)_)++`\"_~"}_~

Plus c'est simple, mieux c'est.

jimmy23013
la source