Golf ci podwójną quine dla większego dobra!

18

Dobry wieczór Panie i Panowie.

Dzisiaj - mamy wyzwanie kodowe. Zawody, które zostaną określone nie w liczbie punktów (asteroidy), ale po prostu, czy możesz je ukończyć (a la Zelda). I dla porównania, ilość bajtów (uh ... ale powiedziałeś ...).

Twoim wyzwaniem jest skomponowanie pojedynczego quine, który skompiluje się zarówno w WhiteSpace, jak i w dowolnym innym wybranym języku. Oba quiny muszą mieć absolutnie identyczne wyjście (które jako quine jest absolutnie identyczne z kodem źródłowym). Twój quine musi mieć więcej niż 3 bajty.

Twój wynik to rozmiar kodu źródłowego w bajtach.

Biorąc pod uwagę, że wyzwanie to dotyczy WhiteSpace, unikaj odpowiedzi, aby były jasne - najlepiej w stylu C. Twój wynik jest oryginalnym źródłem w bajtach - nie wersją ucieczkową.

Powodzenia.

Lochok
źródło
1
Czy zrobiłby zrzut heksowy xxd ?
Ilmari Karonen
Tak. Zaakceptuję to.
lochok

Odpowiedzi:

19

Biała spacja i Perl, 992 975 znaków

Dobry wieczór panie i Panowie.

Na początek, oto moje przesłanie zakodowane w base64, co moim zdaniem jest najlepszym sposobem na komunikację dużego programu Whitespace. (Naprawdę nie chcesz używać kodowania, które pozostawia białe znaki bez zmian, więc nie ma sensu wybierać czegoś bardziej „czytelnego”).

c2F5PDwgeDI7c2F5PDwwLDAgIApzYXk8PCB4MjtzYXk8PDAsMCAgCgoJCQogICAJCSAgCSAgCSAJ
CSAgCSAgCQkgCSAJIAkJCQkJICAJCSAJCQkgCQkJCQkgCSAJIAkJIAkgCSAgIAkJCQkJICAgCQkg
IAkgCQkgCSAJCSAJICAgIAkJCQkgCSAgCSAJCSAJICAgIAkgCQkgICAJICAgICAgCQkJIAkJCQkJ
IAkJCSAJCQkJICAgICAJCQkgCSAgICAgIAkJCQkJICAgICAgCQkgICAJCSAgICAJCQkJCQkJCSAg
CSAJIAkgICAJCQkgICAJCQkJCSAgCQkJCSAJICAgIAkgCQkJCQkgCSAgICAgCSAgCSAJICAgICAg
CSAgICAJICAgICAJCSAgIAkJCSAJIAkJCQkJCSAJCSAJIAkgICAgICAgCQkgIAkgICAgICAgICAg
IAkJICAgCSAJCQkgCSAgICAgCQkJCQkJIAkgICAgCQkJCSAJCQkJICAJCQkgICAJCQkgCSAgCSAg
IAkJCQkgIAkJIAkJCSAgIAkJCSAJCQkgCQkJICAJCSAJICAJIAkJCSAJIAkgCQkgICAgIAkgCSAJ
ICAJICAJIAkJICAgICAJIAkgICAgCQkJCSAgCSAJCSAJIAkJIAkgIAkgCSAJCSAJCSAJCSAJCQkg
CQkJICAgIAkJCSAgCSAgCQogICAJICAgICAJCQkJCSAJCSAJIAkgCSAJICAJCQkgICAJICAgCSAg
ICAJCSAJICAgICAgICAgCSAgIAkJCQkgCQkgICAgCQkgCSAJICAJCQkgCQkJCSAJCQkgICAJICAg
IAkgCSAJCQkgIAkJCQkgCSAJCSAJIAkgCQkJCSAJICAJIAkJIAkgICAJCiAKICAKICAgIAogCSAg
CQoKICAJCiAKICAgIAkJCQkgCSAKCSAJCQkKICAgICAJCQkJIAkgCgkgCSAgCiAgIAkJCgkgIAoK
CQkJCiAKCgoJIAkKICAgCSAgIAkgIAoKIAkKIAkgIAkKCiAJIAogICAJIAoKIAkKCiAJIAoKIAkK
CQogCSAgIAkgCgogCQoKCgoKICAgCiAgIAogCiAKIAkKCiAJCgogICAgCiAKIAoJIAogCiAgICAJ
IAoJIAkJIAoJICAgCSAKCSAJIAogCSAgCgogIAogCiAgICAJCQoJIAkJICAJCSAJCQkKCSAgCiAg
CQkJICAgCgkgCQkgICAJICAgICAKCSAgIAkKICAgICAJCQoJIAkgIAogICAJCQoJICAKCgkJCiAK
CgoJCjAK

Oto fragment, który podkreśla wszystkie widoczne części źródła. służy do wskazania tabulacji i znaku nowej linii.

say<< x2;say<<0,0  ↲
say<< x2;say<<0,0  ↲
↲
⇥⇥↲
   ⇥⇥  ⇥ [... etcetera ... skipping rest of a really long line ...]↲
   ⇥⇥⇥ ⇥⇥[... etcetera ... shorter but still quite a long line ...]↲
 ↲
  ↲
    ↲
 ⇥  ⇥↲
[... etcetera ... whole lotta whitespace in here ...]
⇥⇥↲
 ↲
↲
↲
⇥↲
0↲

Perl był naturalnym wyborem drugiego języka w tym wyzwaniu, będąc jednym z najlepszych języków ogólnego przeznaczenia do pisania zwartych quinów. Moja najkrótsza wersja Perla to 19 bajtów:

say<< x2
say<< x2
 

- i widać, jak to było ziarno dla połowy Perla podwójnej quine. Dla porównania, moja najlepsza biała księga ma długość 541 bajtów. (Chociaż istnieją krótsze - najlepiej 445 bajtów.)

Z punktu widzenia interpretera Perla pierwsza linia pliku źródłowego podwójnej quine zawiera dwie instrukcje, które składają się na cały program, ponieważ pozostała zawartość to dwa ciągi cudzysłowione. Pierwszy ciąg jest powtarzającą się linią Perla i jest ograniczony pustą trzecią linią. Drugi ciąg składa się z białych znaków i biegnie od czwartej linii źródła aż do 0separatora na dole pliku.

W przypadku czterech programów, pierwsze cztery linie zawierają trzy instrukcje, które są w dużej mierze bezużyteczne. (Ich efektem jest wypchnięcie dwóch wartości zerowych na stos, a następnie odrzucenie drugiej.) Są one uwzględnione tylko po to, aby bezpiecznie przejść przez nowe wiersze, których wymaga program Perl - po tym zaczyna się prawdziwy program. Zamiast zacytować dalsze nieczytelne źródło, oto parafrazowanie instrukcji, które składają się na program Whitespace, w formacie przypominającym asembler:

# Representation of "say<< ;say<<0,0  \n" in base 122 as ASCII chars.
PERLCODE = 44892457841068708924520433691075560592081

# Represention of the whitespace program, following the "push PERLCODE"
# instruction, in base 3 (see comments on wsout).
WSCODE = 9823454421986355730445143846606456399449033186160554878002671428613111806443504867738858766142050504887335990409088441824104338753030405625930185

# Set up the stack and the heap. The first three instructions are not
# particularly useful; they're just there to skip past the newlines in
# the Perl code. (Though the initial zero on the stack does get used
# at the very end.)

        push    0
        push    0
        jneg    wsout

        push    WSCODE
        push    PERLCODE
        dup
        dup
        push    0
        copy    1

# Output the first four lines of the file.

perl:   dup
        mod     122
        putchar
        div     122
        dup
        jnzero  perl
        pop
        jzero   perl
        push    68              # represents "jneg wsout"
        call    wsout

# Output the rest of the file.

        copy    1
        call    pushout
        push    2
        call    wsout
        call    pushout
        call    wsout
        putnum
        push    2
        call    wsout
        exit

# pushout: Output a Whitespace push instruction, using the number on
# the top of the stack as the instruction's argument. (Recursion is
# used to output the bits MSB-first.)

pushout:
        push    0
        dup
        call    wsout
        call    wsout
bits:   dup
        jzero   bitend
        dup
        mod     2
        swap
        div     2
        call    bits
bitend: call    wsout
        ret

# wsout: Output a sequence of whitespace characters as represented by
# the number on the top of the stack. The number is read in base 3,
# LSB-first, with 0 = SPC, 1 = TAB, 2 = NL. Calling wsout with a value
# of zero will output a single space.

wsout:
        dup
        mod     3
        mul     -23             # some ugly math that transforms
        mod     -24             # (0, 1, 2) into (32, 9, 10)
        add     32
        putchar
        div     3
        dup
        jnzero  wsout
        pop
        ret

Olbrzymie liczby na górze to to, czego my, użytkownicy Whitespace, musimy używać zamiast rzeczywistych ciągów. Nie zawracaj sobie głowy próbą uruchomienia tego na interpreterze Whitespace, który nie ma odpowiedniego wsparcia bignum.

Wreszcie, oto program ponownie, ale tym razem z ucieczkami w stylu C, ponieważ został specjalnie zażądany:

say<< x2;say<<0,0  \nsay<< x2;say<<0,0  \n\n\t\t\n   \t\t  \t  \t \t\t  \t  \t\t \t \t \t\t\t\t\t  \t\t \t\t\t \t\t\t\t\t \t \t \t\t \t \t   \t\t\t\t\t   \t\t  \t \t\t \t \t\t \t    \t\t\t\t \t  \t \t\t \t    \t \t\t   \t      \t\t\t \t\t\t\t\t \t\t\t \t\t\t\t     \t\t\t \t      \t\t\t\t\t      \t\t   \t\t    \t\t\t\t\t\t\t\t  \t \t \t   \t\t\t   \t\t\t\t\t  \t\t\t\t \t    \t \t\t\t\t\t \t     \t  \t \t      \t    \t     \t\t   \t\t\t \t \t\t\t\t\t\t \t\t \t \t       \t\t  \t           \t\t   \t \t\t\t \t     \t\t\t\t\t\t \t    \t\t\t\t \t\t\t\t  \t\t\t   \t\t\t \t  \t   \t\t\t\t  \t\t \t\t\t   \t\t\t \t\t\t \t\t\t  \t\t \t  \t \t\t\t \t \t \t\t     \t \t \t  \t  \t \t\t     \t \t    \t\t\t\t  \t \t\t \t \t\t \t  \t \t \t\t \t\t \t\t \t\t\t \t\t\t    \t\t\t  \t  \t\n   \t     \t\t\t\t\t \t\t \t \t \t \t  \t\t\t   \t   \t    \t\t \t         \t   \t\t\t\t \t\t    \t\t \t \t  \t\t\t \t\t\t\t \t\t\t   \t    \t \t \t\t\t  \t\t\t\t \t \t\t \t \t \t\t\t\t \t  \t \t\t \t   \t\n \n  \n    \n \t  \t\n\n  \t\n \n    \t\t\t\t \t \n\t \t\t\t\n     \t\t\t\t \t \n\t \t  \n   \t\t\n\t  \n\n\t\t\t\n \n\n\n\t \t\n   \t   \t  \n\n \t\n \t  \t\n\n \t \n   \t \n\n \t\n\n \t \n\n \t\n\t\n \t   \t \n\n \t\n\n\n\n\n   \n   \n \n \n \t\n\n \t\n\n    \n \n \n\t \n \n    \t \n\t \t\t \n\t   \t \n\t \t \n \t  \n\n  \n \n    \t\t\n\t \t\t  \t\t \t\t\t\n\t  \n  \t\t\t   \n\t \t\t   \t     \n\t   \t\n     \t\t\n\t \t  \n   \t\t\n\t  \n\n\t\t\n \n\n\n\t\n0\n
chlebak
źródło
2
Łał! Myślałem, że pieprzenie mózgu będzie pierwszym rozwiązaniem.
stoisko
1
Myślałem o tym, ale problem polega na tym, że kołki Brainfuck są nawet dłuższe niż kołki Białej Przestrzeni. Między nimi wynik byłby ogromny.
breadbox