Faça um quase quine

12

Eu queria enganar um amigo, dando-lhe uma solução que quase funcionou, mas ficou cada vez mais desleixada.

Crie um programa que, quando executado, produzirá o programa, mas com um caractere desativado. Um caractere pode ser adicionado, removido ou ambos (um caractere é alterado). Mas apenas um personagem.

Sua pontuação será (length of your program) / floor(sqrt(number of times the program almost quines))(Onde / 0fica o infinito)

number of times the program almost quinesé quantas vezes seu programa é executado enquanto altera apenas um caractere no stdout. Seu programa pode não aceitar entrada. Também pode não imprimir um programa que já foi impresso.

Você também não pode adicionar um caractere que você adicionou anteriormente anteriormente ou remover um caractere do mesmo índice. Por exemplo, se você adicionou 1antes e adicionou 1novamente, é aí que as number of times the program almost quinesparadas. Se você remover o primeiro caractere, não poderá remover o primeiro caractere novamente. Se você alterou o terceiro caractere para a 2, não poderá adicionar 2ou remover o terceiro caractere.

mbomb007
fonte
o que é um quine?
Abr001am 04/05
@ Agawa001 Um quine é um programa que se imprime.

Respostas:

7

CJam, 0.000884

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

Aqui, denota o caractere não imprimível com o ponto de código 128. Experimente online.

Idéia

Essa abordagem anexa todos os caracteres UCS (especificação original) com pontos de código entre U + 4000000 e U + 7FFFFFFF na cadeia inicialmente vazia que segue o bloco de código.

Escolhemos UTF-8 , que codifica cada um desses caracteres usando uma sequência de 6 bytes da seguinte maneira:

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

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

Assim, podemos codificar o enésimo caractere nesse intervalo, computando seus 6 dígitos menos significativos na base 64 e adicionando 252 aos mais significativos e 128 aos demais.

Pontuação

Existem 2 ** 31 = 2,147,483,6486 bytes de caracteres UTF-8 e o comprimento do código original é 39, portanto a pontuação é 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Como funciona

{                                }""    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
fonte
Estou aceitando isso por causa da sua primeira pontuação (mais baixa). Eu vou permitir.
6

CJam, 46 bytes, 65504 add, 65505 del, Pontuação 0.127424

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

Teste aqui.

A forma básica é uma solução CJam generalizada padrão. Para "quase quine", há um comentário e#no final do bloco do quine, onde posso adicionar caracteres livremente sem afetar o código. Observe que o comentário contém inicialmente um único espaço.

O programa continua adicionando caracteres à frente do comentário, iniciando !e depois na ordem do valor ASCII. Os códigos de caracteres do CJam são agrupados após 2 16, portanto, em algum momento, isso adicionará um byte nulo. Quando isso acontece, o programa começa a remover bytes do final do comentário (de modo que a posição do caractere removido seja sempre diferente) até o comentário ficar vazio.

Martin Ender
fonte
5

CJam, 19 bytes, 65536 add, 0 del, Pontuação 0.074219

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

Mais simples é melhor.

jimmy23013
fonte