Fai un quasi quine


12

Volevo ingannare un amico dandogli un quine che quasi funzionava, ma diventava sempre più sciatto.

Crea un programma che, una volta eseguito, emetterà il programma, ma con un carattere disattivato. È possibile aggiungere, rimuovere o entrambi (un personaggio cambia). Ma solo un personaggio.

Il tuo punteggio sarà (length of your program) / floor(sqrt(number of times the program almost quines))(Where / 0is infinity)

number of times the program almost quinesè quante volte il tuo programma viene eseguito cambiando solo un carattere in stdout. Il tuo programma potrebbe non accettare input. Potrebbe anche non stampare un programma che ha già stampato.

Non è inoltre possibile aggiungere un carattere precedentemente aggiunto in precedenza o rimuovere un carattere dallo stesso indice. Ad esempio, se hai aggiunto 1prima e aggiungi di 1nuovo, è lì che si number of times the program almost quinesferma. Se si rimuove il primo carattere, non è possibile rimuovere nuovamente il primo carattere. Se hai cambiato il terzo carattere in a 2, non puoi aggiungere a 2o rimuovere il terzo carattere.


qual è un quine?
Abr001am

@ Agawa001 Un quine è un programma che si stampa da solo.

Risposte:


7

CJam, 0.000884

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

Qui, indica il carattere non stampabile con il punto di codice 128. Provalo online.

Idea

Questo approccio aggiunge tutti i caratteri UCS (specifica originale) con punti di codice tra U + 4000000 e U + 7FFFFFFF alla stringa inizialmente vuota che segue il blocco di codice.

Scegliamo UTF-8 , che codifica ciascuno di questi caratteri usando una stringa di 6 byte come segue:

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

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

Pertanto, possiamo codificare l' ennesimo carattere in questo intervallo calcolando le sue 6 cifre meno significative nella base 64 e aggiungendo 252 a quelle più significative e 128 a quelle rimanenti.

punteggio

Ci sono 2 ** 31 = 2,147,483,6486 byte UTF-8 caratteri e la lunghezza del codice originale è 39, quindi il punteggio è 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Come funziona

{                                }""    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.

Lo accetto per il tuo primo punteggio (più basso). Lo permetterò.

6

CJam, 46 byte, 65504 aggiunti, 65505 del, punteggio 0.127424

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

Provalo qui.

La forma base è una quinta CJam generalizzata standard. Per "quasi quine", c'è un commento e#alla fine del blocco di quine, in cui posso aggiungere liberamente caratteri senza influire sul codice. Si noti che il commento inizialmente contiene un singolo spazio.

Il programma continua aggiunta di caratteri per la parte anteriore del commento, a partire !e poi andare in ordine di valore ASCII. I codici dei caratteri di CJam si concludono dopo 2 16, quindi ad un certo punto, questo aggiungerà un byte nullo. Una volta che ciò accade, il programma inizia a rimuovere i byte dalla fine del commento (in modo che la posizione del carattere rimosso sia sempre diversa) fino a quando il commento è vuoto.


5

CJam, 19 byte, 65536 aggiungi, 0 del, punteggio 0,074219

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

Più semplice è meglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.