Codegolf: Quine ve Antik


13

Bu zorluk Meta Quine miyim benzer ?

Bir quine, STDOUT'ta kendini üreten bir programdır. Bu zorluk, çalıştırıldığında STDOUT'ta bir program B üreten bir A programı üretmektir. Program B çalıştırıldığında STDOUT'ta A programı üretir. A ve B programları aynı dilde yazılmalı (ve çalıştırılmalıdır). Bağlantılı soru A! = B'yi kısıtladı. Bu çok kolay görünüyordu. Bu soru için, aşağıdaki kurallar kullanılarak A ve B'nin antika olduğu konusunda ısrar ediyoruz:

  1. A ve B programları aynı karakterlerden hiçbirini kullanamaz, boşluk ve ifade ayırıcıları ve noktalama işaretleri için kaydedemez.
  2. A ve B programlarının her biri, ne boşluk ne de ifade ayırıcısı ya da noktalama işareti olmayan en az bir karakter içermelidir.
  3. Kural 1 ve 2'nin amacı için, "boşluk" terimi, kendisi bir yorumlayıcı, operatör veya (ayırıcının aksine) yorumlanan herhangi bir sembol veya sembol dizisini hariç tutar. Bu nedenle Boşluk dilinde, boşluk yoktur.
  4. Bir ifade ayırıcı, deyimleri ayırmak için geleneksel olarak dil içinde kullanılan sözdizimsel bir öğedir. Bu, python'daki yeni satırı veya Java, perl veya C'deki noktalı virgül içerir.
  5. Noktalama işareti, boşluk veya POSIX sözcük karakteri sınıfında olmayan bir ASCII karakteridir (yani, bir alt çizgi bu amaç için noktalama işareti değildir) - yani ispunct()true değerini döndürür ve olmaz _.
  6. Program A çalıştırıldığında STDOUT üzerinde bir program (Program B) üretmelidir, bu program çalıştırıldığında Program A üretir.
  7. A ve B programları aynı programlama dilinde olmalıdır.
  8. Kullanılan programlama dili aslında bir programlama dili olmalıdır. Aksi takdirde iyi bir dava açmazsanız, Turing'in tamamlanması gerektiğini öneririm.
  9. A ve B'den en az biri, dil içinde en az bir ifade yürütmelidir.

Bu kod golf, bu yüzden en kısa cevap kazanır, skor A programının bayt cinsinden uzunluğudur (yani B programının uzunluğu ilgili değildir).


Lütfen ilk fıkradaki istisnalar listesine "noktalama işaretleri" ekleyebilir misiniz? Bu görevi birçok dilde (özellikle ana işlevde kıvırcık parantezler gerektirenler) çözmek imkansızdır.
FUZxxl

ilgili ama muhtemelen yeterince farklı.
Martin Ender

@FUZxxl Noktalama işaretlerine izin verdim ancak alt çizgileri hariç tuttum.
abligh

1
Burada amaç için, farklı "karakterler" olarak kabul edilir Ave akabul edilir?
HostileFork SE

1
Kural 5 ile eşleşen ASCII karakterlerinin tam bir listesini vermeniz daha iyi olur
aditsu quit çünkü SE, EVIL

Yanıtlar:


5

GolfScript, 13 bayt

1{\~\".~"}.~

Çıktı

-2{\~\".~"}.~

ilk programı oluşturur.

Bayt sayımı, sondaki LF'yi içerir, çünkü çıktının çıkışı bunu içerecektir.

Çevrimiçi deneyin.

Nasıl çalışır

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript, yığının içeriğini sonlandırma üzerine yazdırır.


Lütfen sorun bildirimini tekrar okuyun -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
Herşey hariç 1ve 2noktalama işaretidir.
Dennis

Tamam, son okuduğumdan beri kurallar değişti.
isaacg

Evet, işe yarıyor. Boşluğun ifadeler olarak kullanılmasını önlemek için kuralları ifade ettim, ancak noktalama için aynı boşlukun unutulacağını unuttum. Yani boşlukta yasal olarak sömürüldü.
abligh

14

Pascal (731 karakter)

Program A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Çıkış programı B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Çıkış programı A


3
Vaka çevirisinin (yanlış) kullanımından keyif alıyorum.
abligh

11

ROT13 ( kural güncellemesinden sonra artık rekabet etmiyor )

Bunun bir dil olarak kabul edilip edilmediğinden emin değilim, ama kesinlikle meydan okuma için uydurmadım. Genellikle bazı yardımcı programlar için yanıtlar sedda kabul edilir. Ben bunların kaldırılacağı sayılmaz eğer öyleyse Ancak, bir yargı çağrı (? Dile Edit gibi neyi sayar bir meta tartışma orada bir yerde olduğunu: var Orada şimdi )

A

Arasındaki döngüleri Ave N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Bence bu işe yaramıyor, çünkü rot13 STDINbir program yürütmüyor, sadece girdi alıyor . Eğer sıfır uzunluğunda bir program olduğunu savunarak ise, bu kurala 2. (ile programı tatmin edememesi sed) içinde geçirilen şeydir sed -e. Bu kabul edilebilir catolsaydı , o zaman bir kine tacolurdu ve bir kine ve antika olurdu. Ancak, hiçbir şey için kaynak üretiyor cat, tacya da bu konuda rot13.
abligh

@abligh Kullanılan dil rot13 ise, neden rot13 için kaynak kodunu yazdırmam gerekiyor? Ayrıca, Golfscript, Python veya başka bir şey çalıştırırsam, muhtemelen kaynak kodu stdin veya dosya yoluyla iletirim, bu yüzden gerçekten bir fark yoktur. Bu durumda rot13 olarak ise tercüman.
Ingo Bürk

rot13çünkü bir programlama dili 'programlama dili' nin makul bir tanımını karşılamıyor gibi görünmektedir ve hiçbir şeyi yorumlamamaktadır. Sorunu daha açık hale getirmek için değiştireceğim.
abligh

Bana uyar. Bu yanıtı artık rekabet etmeyecek şekilde bırakacağım ve bir meta tartışma başlatacağım. Bu arada güzel bir meydan okuma. "Gerçek" çözümleri görmek için sabırsızlanıyorum!
Ingo Bürk
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.