Zrób prawie quine

12

Chciałem oszukać przyjaciela, dając mu quine, która prawie działała, ale stała się niechlujna i niechlujna.

Utwórz program, który po uruchomieniu wyświetli program, ale bez jednego znaku. Można dodać lub usunąć jeden znak lub oba (jeden znak się zmienia). Ale tylko jedna postać.

Twój wynik to (length of your program) / floor(sqrt(number of times the program almost quines))(Gdzie / 0jest nieskończoność)

number of times the program almost quinesto ile razy twój program działa, zmieniając tylko jeden znak na standardowym wyjściu. Twój program może nie akceptować danych wejściowych. Może również nie drukować programu, który już wydrukował.

Możesz też nie dodać charakteru, które zostały wcześniej dodane przed lub usunąć znak z tego samego indeksu. Na przykład, jeśli dodałeś 1wcześniej, a dodajesz 1ponownie, to tam number of times the program almost quineszatrzymują się. Jeśli usuniesz pierwszy znak, nie możesz ponownie usunąć pierwszego znaku. Jeśli zmieniłeś trzeci znak na a 2, nie możesz dodać 2ani usunąć trzeciego znaku.

mbomb007
źródło
co to jest quine?
Abr001am
@ Agawa001 Quine to program, który sam się drukuje.

Odpowiedzi:

7

CJam, 0,000884

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

Tutaj oznacza niedrukowalny znak o kodzie 128. Wypróbuj online.

Pomysł

Podejście to dołącza wszystkie znaki LUW (oryginalna specyfikacja) z punktami kodowymi między U + 4000000 a U + 7FFFFFFF do początkowo pustego ciągu następującego po bloku kodu.

Wybieramy UTF-8 , który koduje każdy z tych znaków za pomocą 6-bajtowego ciągu w następujący sposób:

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

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

Zatem możemy zakodować n-ty znak w tym zakresie, obliczając jego 6 najmniej znaczących cyfr w podstawie 64 i dodając 252 do najbardziej znaczących i 128 do pozostałych.

Punktacja

Jest 2 ** 31 = 2,147,483,6486 bajtów UTF-8 znaków, a długość oryginalnego kodu wynosi 39, więc wynik to 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Jak to działa

{                                }""    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
źródło
Przyjmuję to ze względu na twój pierwszy (niższy) wynik. Pozwolę na to.
6

CJam, 46 bajtów, 65504 dodanych, 65505 del, wynik 0,127424

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

Sprawdź to tutaj.

Podstawową postacią jest standardowy uogólniony quine CJam. Aby powiedzieć „prawie quine”, e#na końcu bloku quine znajduje się komentarz , w którym mogę swobodnie dodawać znaki bez wpływu na kod. Zauważ, że komentarz początkowo zawiera jedną spację.

Program kontynuuje dodawanie znaków na początku komentarza, zaczynając od, !a następnie przechodząc w kolejności wartości ASCII. Kody znaków CJam zawijają się po 2 16, więc w pewnym momencie doda to bajt zerowy. Gdy to nastąpi, program zaczyna usuwać bajty z końca komentarza (tak, że pozycja usuniętego znaku jest zawsze inna), aż komentarz będzie pusty.

Martin Ender
źródło
5

CJam, 19 bajtów, dodanie 65536, 0 del, wynik 0,074219

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

Prostsze jest lepsze.

jimmy23013
źródło