Çift yarıklı Quine


11

Amaç:

Programların her birinin, her bir fermuar, bir Çift yarık Quine gibi karakter başına geçmeli kaynak kodları çıkardığı iki programı kodlayın. Double-slit Quine'den çıktı, ilk programın kaynak kodundaki ilk karakterle başlar. Programlardan birinin kaynak kodu diğerinden daha kısasa, çıktının geri kalanı daha uzun kaynak kodunun geri kalanıyla doldurulmalıdır.

Kurallar:

  1. Her iki program için de herhangi bir programlama dilini kullanabilirsiniz, her ikisi için de aynı programlama dilini gerektirmez.
  2. Programlarınız bir dosyadan, dosya adından, ağdan, diğer programdan veya başka bir şeyden herhangi bir girdi almamalıdır.

Zorunlu kriterler:

  • Çıktıda bir yerlerde QUINE, büyük harflerle yazılmış sözcük , kesintisiz olmalıdır.
  • Hangi iki programlama dilini kullandığınızı belirtmeniz gerekir. Her ikisi için de aynı programlama dilini kullanıyorsanız, yalnızca bir programlama dilini belirtmeniz gerekir.
  • Her iki program da diğer programdan bağımsız olarak yürütülebilmeli veya yorumlanabilmelidir.

Misal:

Birinci programın bu örnek kaynak koduna sahip olmak :

"QIE"

Bu iki programın kaynak koduna sahip olmak :

"UN"

Daha sonra her iki programdan da geçerli Double-slit Quine çıktısı:

""QUINE""

Bu kod golf, her iki kaynak kodunun uzunluğunu toplarken en az bayt ve her bir programın çıktı uzunluğu da kazanır!


Her bir programın da bir ayraç olması gerekmez, değil mi? Ve her program en az bir karakter içermelidir?
mbomb007

@ mbomb007 Doğru. Her bir program, baştan sona fermuar gibi her iki kaynak kodu karakterini de vermelidir. QUINE çıktısını almak için bir programlama dilinde en az 1 bayta ihtiyacınız olduğunu tahmin ediyorum. Her iki programdan da çıktı aynı olmalıdır.
Plarsen

Çıktının geri kalanının uzun kaynak kodunun geri kalanıyla doğru bir şekilde doldurulması gerektiğini anladığımdan emin değilim . Nasıl serpilir Ave XYZserpiştirilir? AXYZ?
Dennis

@Dennis Aynen .+ya da zçalışıyor
Optimizer

@Dennis Doğru. Daha kısa bayt bitmesi durumunda daha uzun kaynak kodundan geriye kalanlar, her iki programın çıktısına eklenmelidir.
Plarsen

Yanıtlar:


9

CJam, 49 47 bayt

{`:_"__~~e#QUINE"}_~

ve

{`:_"__~~e#QUINE"}_~e#QUINE

ikisi de yazdır

{{``""__~~""++::__""ee##QQUUIINNEE""}}__~~e#QUINE

Çevrimiçi deneyin: program 1 , program 2 , geçerlilik kanıtı

Onlar nasıl çalışır

{                }   e# Push a code block.
                  _~ e# Execute a copy.
 `                   e# Convert the code block into a string.
  :_                 e# Duplicate each character of the resulting string.
    "__~~e#QUINE"    e# Push this string.

Program 1 burada biter ve tüm kaynak kodunun (her karakterin iki kez tekrarlanan) dize temsilini ve yığın üzerindeki e # QUINE dizesini içerir .

Program 2 ek olarak ayrıştırır e#QUINE, bu bir yorumdur.

Her iki durumda da, CJam iki dizgeyi otomatik olarak yazdırır ve yukarıda belirtilen çıktıya neden olur.


4

Ciddi, 46 56 42 bayt

QUNX;RZtdXεj.ƒ£REIQ

Hex Dökümü:

51554e583b525a746458ee6a2e7f9f9c524549510a

İkinci program tam tersine çevrilmiş programdır. Görünmez bir karakter içeriyor, ancak bayt sayısı doğru. Her iki program da bu palindromik dizeyi çıkarır:


QQUINEXR;£RƒZ⌂t.djXεεXjd.t⌂ZƒR£;RXENIUQQ

(Bir nedenden dolayı terminalimde görünmediğinde görünmez karakteri görüntüler. 7F baytını gerçekten anlamıyorum.)

Nasıl çalışır:

Q                     Push the source to the stack
 U                    Nop
  NX                  Push and pop lyrics to 99 bottles of beer
    ;R                Make a copy of the source reversed.
      Z               Zip them together.
       t              Completely flatten the list.
        dX            Delete the trailing newline
          εj          Join it into a string.
            .         Print it with a trailing newline.
             ⌂        (This is that 7F byte that won't show up. It halts.)

Programın geri kalanı yürütülmüyor.

Sonra diğer yön:

\n                   Nop
  Q                  Push the source code.
   IE                Nops
     R               Reverse source code to get source of first program
      £              Eval it into a function
       ƒ             Call it.

Bu noktada, şimdi yukarıdaki ilk programı yürütüyoruz, bu yüzden uygulama burada açıklandığı gibi devam ediyor.

Birkaç komutun burada dizelere veya boş yığınlara hiçbir şey yapmadığı gerçeğini yoğun bir şekilde kullanıyorum. Ayrıca tyığın üzerinde sadece bir öğe olduğunda beklenmedik davranışını sömürüyorum . Bu programın Seriously'nin gelecek sürümlerinde çalışmasını beklemeyin.

Ciddi tercümanın çevrimiçi sürümü bozulmaya devam ederken , tercümanı indirmeniz ve test etmek için kendi makinenizde çalıştırmanız gerekir.


@Dennis bilgisayarınızda test ettiniz mi? Bu benim kendi inşa ortamımın bir ürünü olabilir.
quintopia

@Dennis nvm haklısın. Seriously'nin tüm çıktı yöntemleri bir satır besleme ekler. 8 bayt pahasına tamir edebilirim. Görünüşe göre yöntem daha kısa olacak (bu üzücü çünkü bu yöntem daha serin IMO).
quintopia

1

GolfScript, 46 bayt

{`{.}%"..~~QUINE"}.~

ve

{`{.}%"..~~QUINE"}.~QUINE

ikisi de yazdır

{{``{{..}}%%""....~~~~QQUUIINNEE""}}..~~QUINE

Çevrimiçi deneyin: program 1 , program 2 , geçerlilik kanıtı

Nasıl çalışır

{`{.}%"..~~QUINE"}.~

{                }    # Push a code block.
                  .~  # Execute a copy.
 `                    # Convert the code block into a string.
  {.}%                # Duplicate each character of the resulting string.
      "..~~QUINE"     # Push that string.

Program 2'nin kaynak kodu ayrıca QUINE\niki tanımlanmamış token olan ayrıştırılır .


1

Perl, 61 + 60 = 121 bayt

Program 1:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#QIE

Program 2:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#UN

Golf olmayan bir dilde bunu denemek istiyorum düşündüm. Bu, Perl'deki her bir karakteri yazdırmadan önce ikiye katlamak ve sonuna eklemek QUINEiçin modifiye edilmiş evrensel bir kine kurucusudur . Daha sonra, eklenen metni telafi etmek için kodun sonuna bir yorum yapıştırmamız gerekir.

(Bunu diğer cevaplara gerçekten bakmadan yazdım. Tüm yorumu tek bir programa koyarak bir baytın kaydedilmesinin mümkün olabileceği ortaya çıktı, ancak böyle algoritmaları açıkça kopyalayıp kopyalamam gerektiğinden emin değilim.)

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.