Üçüncü dereceden soru yazma


17

Bu meydan okuma ' Golf karşılıklı bir quine'nin bir uzantısıdır .

Seçtiğiniz üç dili kullanarak üçüncü dereceden bir Ouroboros programı oluşturun.

Yani, A dilinde, B dilinde pB programı çıkaran bir program pA yazın. Program pB, C dilinde program pC çıktısı almalı ve bu da orijinal program pA'yı A dilinde çıkarmalıdır.

A, B ve C'deki iki dil aynı veya birbirinin alt kümeleri veya üst kümeleri olamaz. PA, pB veya pC'nin hiçbiri aynı olmayabilir.

Örneğin, bir Haskell programı, orijinal Haskell programının çıktısını alan bir java programı çıkaran bir Perl programı çıkarır.

Diğer yandan, bir C # 2 çıktısı veren bir C # 3 programı geçersizdir. Perl programı ve Ruby programı aynı olsaydı, Perl -> Ruby -> Bash kombinasyonu bile geçersiz olurdu.

Bu kod golf, bu yüzden en kısa program pA kazanır.


Yanıtlar:


21

Python -> Perl -> Yakut, 48 karakter

Önceki cevabımın uyarlanması . Koşu

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

Python ile bu Perl snippet'ini üretir

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

Aşağıdaki Ruby kodunu oluşturur

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

daha sonra orijinal Python snippet'ini yazdırır:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl -> PHP -> HTML + JavaScript, 105 karakter

Bir şekilde dil zincirini anlamlı hale getirmek istedim, bu yüzden JavaScript içeren bir HTML sayfası üreten bir PHP betiği yazacağımı düşündüm. Üçüncü dil için Perl'i seçtim, çünkü Perl'i seviyorum. :)

Bazıları bu dördünü düşünebilir dili , ancak HTML'yi burada JavaScript'ten ayrı olarak saymıyorum - bir programlama dili değil, bir biçimlendirme dili. Her neyse, işte üç versiyon:

Perl (105 karakter):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 karakter):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 karakter):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Ps. Evet, PHP adımını neredeyse noop haline getirebileceğimi biliyorum, örneğin sadece Perl'de HTML + JS kodu oluşturma ve ekleme <?php, ancak bu hile gibi çok fazla hissetti. Bu çözümde, kod aslında aynen kopyalanmak yerine PHP ile işlenir.)


3

Düşük yük → sed → Perl, 23 bayt

Muhtemelen bunu daha iyi dil seçenekleri ile daha aşağı indirebilir. "Sed programları argüman olarak boş bir satır alabilir" kuralı yarışmayı ilan ettiği için muhtemelen rakipsizdir.

Düşük yük programı:

((iprint+q)Sa(:^)*aS):^

sed programını oluşturur:

iprint+q(((iprint+q)Sa(:^)*aS):^)

Perl programını oluşturan:

+ q baskı (((+ q baskı) Sa (: ^) * gibi) hazırlanmıştır: ^)


(not: Burada iki adet yeni satır vardır), bu da orijinal Düşük Yükleme programını tekrar oluşturur:

((iprint+q)Sa(:^)*aS):^

Buradaki temel amaç, dizelerin nesnel olabileceği dilleri bulmaktır (yani, bir dizeyi, kaçmak yerine sınırlayıcılarla kapatarak alıntı yapabilirsiniz); Düşük yük var (), Perl var q()ve sed'de bir dize, boşluk olana kadar devam eder (programda boşluk yoksa örtük olarak nesnel olabilir). Muhtemelen orada bir esolang veya golf dili var "burada mevcut çizginin geri kalanını yazdırın, yeni satırları takip etmeyin" talimatı, burada ideal olurdu, ama bir tane aramak için çok fazla zaman harcamadım; bu durumda talimatın uzunluğu eksi 8 bayt tasarruf edebilirsiniz. (Jelly neredeyse işe yarıyor, ancak talimatı kendini alıntılamıyor. Ayrıca, meydan okumayı son veriyor.)

Bunu şu şekilde 22 bayta düşürebilirsiniz :

((Csay + q) Sa (: ^) * gibi) hazırlanmıştır: ^

(normalde golf oynadığınız sıfıra değil, normal bir metin dosyası gibi bir satırsonu satırıyla). Ancak, bu, yeni satırın işlem yapılmamasını sağlayan bir Düşük Yük yorumlayıcısı gerektirir. Denemek Çevrimiçi! 'S, ama sanırım meydan okuma sonrası.

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.