Daha iyi için size bir Double Quine Golf!


18

İyi akşamlar bayanlar ve baylar.

Bu gece - bir kod zorluğumuz var. Puan miktarı (la la Asteroids) olarak değil, sadece bitirip bitiremeyeceğinizi belirleyecek bir yarışma (la la Zelda). Ve karşılaştırma uğruna, bayt miktarı (uh ... ama dedin ...).

Zorluğunuz, hem WhiteSpace hem de seçtiğiniz herhangi bir dilde derlenen tek bir soru oluşturmaktır . Her iki tırnak da tamamen aynı çıktıya sahip olmalıdır (tırnak olarak kaynak koduyla tamamen aynıdır). Quiniz 3 bayttan daha uzun olmalıdır.

Puanınız kaynak kodunuzun bayt cinsinden boyutudur.

Bu zorluğun WhiteSpace'i içerdiği göz önüne alındığında, cevaplarınızın net olması için lütfen kaçın - tercihen C tarzında. Skorunuz bayt cinsinden orijinal kaynaktır - kaçan sürüm değil.

İyi şanslar.


1
Bir xxd altıgen dökümü yapar mı?
Ilmari Karonen

Evet. Kabul edeceğim.
lochok

Yanıtlar:


19

Whitespace ve Perl, 992875 karakter

İyi akşamlar bayanlar ve baylar.

Başlamak için, burada büyük bir Whitespace programı iletişim kurmak için en iyi yol olduğunu düşünüyorum base64 kodlanmış benim teslim. (Herhangi bir boşluğu olduğu gibi bırakan bir kodlama kullanmak istemezsiniz, bu nedenle daha "okunabilir" bir şey seçmenin bir anlamı yoktur.)

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

İşte kaynağın tüm görünür kısımlarını vurgulayan bir alıntı. bir sekmeyi ve bir yeni satırı belirtmek için kullanılır.

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↲

Bu zorluktaki Perl, ikinci dil için doğal bir seçimdi ve kompakt alıntılar yazmak için en iyi genel amaçlı dillerden biri oldu. En kısa Perl quine 19 bayt:

say<< x2
say<< x2
 

- ve çift kineğin Perl yarısı için tohumun nasıl olduğunu görebilirsiniz. En iyi Whitespace quine'm, 541 bayt uzunluğunda. (Daha kısa olanlar var olsa da - 445 bayt gördüğüm en iyisi.)

Perl tercümanının bakış açısına göre, çift dilin kaynak dosyasının ilk satırı, geri kalan içerik iki alıntı dizgisi olduğundan, tüm programı uygun hale getiren iki ifade içerir. İlk dize yinelenen Perl çizgisidir ve boş üçüncü satır ile sınırlanır. İkinci dize tamamen boşluktur ve kaynağın dördüncü satırından 0dosyanın altındaki sınırlayıcıya kadar çalışır.

Bir Whitespace programı olarak alındığında, ilk dört satır büyük ölçüde işe yaramayan üç talimat içerir. (Etkileri yığına iki sıfır değeri itip ikincisini atmaktır.) Sadece Perl programının gerektirdiği yeni satırları güvenle geçmek için dahil edilirler - gerçek program bundan sonra başlar. Okunamayan kaynağı daha fazla alıntılamak yerine, Whitespace programını oluşturan talimatların montaj benzeri bir formatta bir ifadesi:

# 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

Üstteki dev sayılar, Whitespace kullanıcılarının gerçek dizeler yerine kullanması gereken şeydir. Bunu uygun bignum desteğine sahip olmayan bir Whitespace yorumlayıcısında çalıştırmaya çalışmayın.

Son olarak, program tekrar, ancak bu kez C-tarzı kaçar, çünkü özellikle talep edildi:

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

2
Vaov! Brainfuck'ın ilk çözüm olacağını düşündüm.
boothby

1
Ben düşündüm, ama sorun Brainfuck quines Whitespace quines daha uzun olmasıdır. İkisi arasında sonuç çok büyük olurdu.
ekmek kutusu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.