Napisz program, który wypisze następujący wiersz o długości 80 znaków:
Ten program z codegolf.stackexchange.com zezwala na kodowanie łańcucha.
następnie akceptuje jeden wiersz danych wejściowych, a następnie drukuje kod źródłowy z ewentualnymi zmienionymi kolejnymi punktami kodowymi (brak dodanych i usuniętych) Kiedy ten kod jest wykonywany, to samo musi się zdarzyć, z wyjątkiem tego, że linia drukowana byłaby najnowszą linią wprowadzania.
Wyrażenie regularne w stylu Perla ^[A-Za-z0-9. ]{80}$
będzie pasować do dowolnego wiersza wprowadzania. Nie możesz przyjąć żadnych dodatkowych założeń.
Wynik zgłoszenia to liczba punktów kodowych w kodzie źródłowym pomniejszona o 94 . Niższe jest lepsze.
Kod nie może robić niczego, co byłoby niedopuszczalne w quine ( np. Czytanie pliku). W szczególności każde zgłoszenie z wynikiem ujemnym musi w jakiś sposób oszukiwać, ponieważ 93! jest mniejsza niż 64 80 .
Dodano 2014-04-21: Cały kod źródłowy twojego programu musi być dobrze sformatowany w kodowaniu znaków, pod którym policzono punkty kodowe. Na przykład, nie można używać 80 kolejnych bajtów w końcowym zakresie bajtów UTF-8 (80..BF) i liczyć każdego z nich jako pojedynczego ZNAKU WYMIANY UFFD (lub, co gorsza, wcale nie jest kodem).
Dodatkowo, jeśli kodowanie pozwala na wiele sposobów kodowania punktu kodowego ( np. SCSU ), twój program, jak również wszystkie programy, które generuje bezpośrednio lub pośrednio, musi używać tylko jednego z nich (lub przynajmniej wszystkie muszą być traktowane jednakowo w całym kodzie ).
Odpowiedzi:
GolfScript,
231162131Jak to działa
Zaczynamy od wybrania 94 różnych znaków, które zostaną zakodowane w celu zakodowania łańcucha. Dowolne 94 postacie będą działać, ale do gry w golfa wybieramy:
Nazwijmy tablicę tych znaków „i”.
Wiersz wprowadzania zawsze będzie zawierał 81 znaków (w tym LF). Wszystkie te znaki są obecne w pierwszych 65 znakach „&”. Jest to jedyny powód wybierania znaków z górnych 128 bajtów.
Zastępujemy każdy znak ciągu jego indeksem w „&”, więc LF staje się 0, spacja staje się 1 itd.
Otrzymane 81 liczb traktujemy jako cyfry pojedynczej liczby bazowej 65. Nazwijmy ten numer „N”.
Teraz wyliczamy wszystkie możliwe kombinacje „i” i pobieramy permutację odpowiadającą liczbie z góry. Osiąga się to w następujący sposób:
c = 1
iA = []
.N % c
doA
.N = N / c
ic = c + 1
.c < 95
wróć do 2.i = 0
is = ""
.&[A[i]]
, dodaj go do „s” i usuń z „&”.i = i + 1
.i < 94
wrócisz do 6.Załóżmy, że mamy bloki kodu „E” i „D”, które kodują i dekodują ciąg, jak wyjaśniono powyżej.
Teraz potrzebujemy opakowania dla tych bloków kodu, które spełniają wymagania pytania:
Robi to:
{…}.~
definiuje blok, kopiuje go i wykonuje drugą kopię. Pierwsza kopia pozostanie na stosie.\.$
zamienia zakodowany ciąg z blokiem i tworzy kopię zakodowanego ciągu z posortowanymi znakami.[{}/]:&;
konwertuje ciąg z góry na tablicę, zapisuje go w „&” i odrzuca.D puts
dekoduje zakodowany ciąg i wypisuje wynik.'"#{`head -1`}"'~
odczytuje jeden wiersz danych wejściowych poprzez wykonaniehead -1
w powłoce.E "'".@+\+
koduje ciąg oraz poprzedza i dołącza pojedynczy cytat.\'.~'
zamienia zakodowany ciąg i blok i dołącza ciąg'.~'
.Po wykonaniu bloku GolfScript drukuje zawartość stosu (zakodowany ciąg, blok,
'.~'
) i kończy działanie.„E” można zdefiniować w następujący sposób:
„D” można zdefiniować w następujący sposób:
Ostateczne gra w golfa:
Wymień
\.$[{}/]:&;0&@
się0@.$[{}/]:&\
zapisać dwa znaki.Zdefiniuj funkcję,
{;65base}:b
aby zapisać jeden znak.Usuń wszystkie białe znaki oprócz końcowego LF i LF w ciągu.
Przykład
źródło
Perl,
14281099Ma 1193 znaków ASCII (w tym 960 permutowanych cyfr binarnych). 1193 - 94 = 1099
Mój pierwszy projekt
Zanim zasugerowałem Dennisowi przejście na binarne, mój program zezwolił na stosowanie cyfr ósemkowych.
Mój pierwszy projekt koduje każdy ciąg w 160 cyfrach ósemkowych, z 2 cyframi na znak. To kodowanie ma 100 8 = 64 różnych znaków. System ósemkowy ma 8 różnych cyfr. Program musi mieć 160 kopii każdej cyfry, więc dopuszcza 8 × 160 = 1280 cyfr.
Trzymam 160 cyfr,
$s
a pozostałe 1120 cyfr$t
. Zaczynam od programu, który nie jest quine, ale drukuje tylko przypisania do$s
i$t
do następnego uruchomienia. To jest to:(() = $s =~ /$_/g))
jest przypisaniem do pustej listy zmiennych. Biorę tę sztuczkę z samouczka kontekstowego w PerlMonks . Wymusza kontekst listy na operatorze dopasowania=~
. W kontekście skalarnym dopasowanie byłoby prawdziwe lub fałszywe i potrzebowałbym pętli,$i++ while ($s =~ /$_/g)
aby policzyć dopasowania. W kontekście listy$s =~ /$_/g
znajduje się lista dopasowań. Umieszczam tę listę w skalarnym kontekście odejmowania, więc Perl liczy elementy listy.Aby zrobić quine, biorę formularz
$_=q{print"\$_=q{$_};eval"};eval
z quinów Perla z Rosetta Code . Ten przypisuje ciągq{...}
do$_
wywołańeval
, a następnie je wywołuje , dzięki czemu mogę umieścić mój kod w ciągu, a także go uruchomić. Mój program staje się Quine kiedy owinąć mój trzeci do ostatniej linii$_=q{
i};eval
, i zmienić mój ostatniprint
doprint "\$s = '$s';\n\$t = '$t';\n\$_=q{$_};eval"
.Na koniec gram w golfa swój program, zmieniając pierwsze zadanie na
$t
komentarz i usuwając dodatkowe postacie.Ma 1522 znaków ASCII (w tym 1280 permutowanych cyfr ósemkowych).
1522 - 94 = 1428
Przełącz na binarny
W komentarzach Dennis zauważył, że 960 permutowanych cyfr binarnych będzie mniej niż 1280 cyfr ósemkowych. Więc wykreśliłem liczbę permutowanych cyfr dla każdej bazy od 2 do 16.
Chociaż podstawa 8 jest lokalnym minimum, bazy 2, 3 i 4 wiążą się dla najlepszej bazy, przy 960 cyfrach permutowanych. W przypadku golfa kodowego najlepsza jest baza 2, ponieważ Perl ma konwersje dla bazy 2.
Zastąpienie 1280 cyfr ósemkowych 960 cyframi dwójkowymi oszczędza 320 znaków.
Zmiana kodu z ósemkowego na binarny kosztuje 8 znaków:
oct
dooct'0b'.$_
kosztów 7./../g
do/.{6}/g
kosztów 2."%02o"
na „% 06b” kosztuje 0.160
na480
koszty 0.0..7
na0,1
zapisy 1.Nauczyłem się kilku wskazówek golfowych Perla . Zapisują 14 znaków:
'A'..'Z','a'..'z','0'..'9'
naA..Z,a..z,0..9
, używając słów i nagich cyfr, zapisuje 12 znaków."\n"
aby$/
zapisać 2 znaki.Zapisuję 3 znaki, przenosząc
#$t
komentarz na koniec pliku. To usuwa nowy wiersz, który kończy komentarz, i literał\n
w quine.Te zmiany oszczędzają łącznie 329 znaków i zmniejszają mój wynik z 1428 do 1099.
źródło