Bir Quine 2 Kediler


30

Meydan okuma

Her ikisi de aynı dilde olan kedi programları olan A ve B olmak üzere iki program yapın. Birleştirildiğinde, AB (aynı dilde) bir kısrak olmalıdır.

Örneğin, diyelim hellove worldher ikisi de XYZ dilinde kedi programları. Eğer helloworldsöz konusu dilde bir quine, sonra çözüm geçerlidir.

Kediler ve quinlere aşina olmayanlar için, bir kedi programı tam olarak kendisine stdin ile verilenleri basan ve bir de kendi kaynak kodunu basan bir programdır.

Puanlama ve Kurallar

  • Birleştirilmiş AB programının toplam bayt sayısı sizin skorunuzdur. Bu kod golf olduğu için en düşük puan kazanır.
  • Standart boşluklar yasaktır
  • Girdi stdin'den alınmalı ve çıktı stdout'a gitmelidir.
  • Kedi programları tartışmaya gerek duymazlar; stdin'i stdout'a kopyalamaları yeterlidir.
  • Programa giriş verilmediğinde programın çalışması gerekir, ancak diğer girişler için doğru çalışması gerekmez (ancak olabilir).
  • Bir kez daha kaynak kodunu bir kez daha basması şartıyla, kodun sonlandırılması gerekmez.
  • Sıranın en az bir bayt uzunluğunda olması gerekiyor.
  • A ve B aynı program olabilir.
  • BA'nın bir kısrak, hatta geçerli bir program olması gerekmez.

A ve B'nin aynı program kuralı olması gerektiğini düşünmüyorum
Muhammad Salman

2
@MuhammadSalman Asıl fikrim, bir kedi programının bir kuyruğa dönüşmesi için iki katına çıkarılmasıydı. Sadece daha kolay çözümler için kapıyı açmak istedim çünkü mümkün olabileceğinden tamamen emin değildim. Her iki konuda da yanılmışım gibi görünüyor ama ben bu konuda iyiyim.
Beefster

3
Muhtemelen ABboş olmayan bir şey eklemelisin, çünkü bir çok dilde 0 baytlık bir kuyruğa izin veren 0 baytlık bir kedi var.
DJMcMayhem

9
@DJMcMayhem 0 baytlık bir quine olsa geçerli bir quine olmaz.
Nissa

4
Bir kedi programı nedir?
Pedro A

Yanıtlar:


32

V , 2 + 2 == 4 bayt

2i2i

Quine dene!

Kediyi deneyin!

A ise2i

B de2i

O nasıl çalışır?

Öncelikle, V'nin nasıl çalıştığına dair bazı açıklamalar. Bu cevap mümkün kılan Bir önemli şey V, boş bir program olmasıdır olan bir kedi programı. Bu özel bir durum değil, V'nin nasıl çalıştığının doğasında var. Başlangıçta, tüm girdiler bir "arabellek" içine yüklenir, her komut bir arabellek değiştirir ve sonra program bittiğinde arabellek örtülü olarak yazdırılır. Bu, herhangi bir NOP dizisinin aynı zamanda bir cat programı olduğu anlamına gelir.

iKomut aracı moduna insert girmek bir alttaki her karakter demektir, itampon içine eklenecektir. Ondan önceki bir sayı ile, o metin n kere çoğaltılır .

Bu, kedi programı için tampona hiçbir şey eklenmeyeceği ve okunduğu gibi basılacağı anlamına gelir. Diğer bir deyişle:

        " (Implicitly) Load all input
2       " 2 times,
 i      " Insert the following text into the buffer...
        " (nothing)
        " (Implicitly) Print the buffer

Ancak quine için aşağıdakilerden sonra bir metin var i:

2       " 2 times,
 i      " Insert the following text into the buffer...
  2i    "   "2i"
        " (Implicitly) Print the buffer

Arsız cevapsız

V , 0 bayt

Çevrimiçi deneyin!

A boş programdır.

B aynı zamanda boş programdır.

: P


21
Diğer her dil: Oy, çıkmaza girdik! . V: * standart sırayı gönderir * .
Outgolfer Erik,

13

Ruby, 71 bayt

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

Aşağıdaki gibi kediler halinde ayrılabilir:

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

ve

;puts (<<2*2+?2)[/.+2/m]||$<.read
2

İki kedi, üç programın hepsinde bir no-op olan öncü 2 dışında aynıdır. Bu <<2bir ahırdır, yani bir sonraki satırdan başlayarak kendi satırında 2 bitene kadar her şeyin bir dizge olduğu anlamına gelir (kendimizle birleştiğimiz ( *2) ve sonunda bir son ekleriz. bu nedenle normal ifade eşleşmeyecek $<.readve STDOUT ifadesine düşeceğiz . Yine de kedileri bir araya getirdiğimizde, dize üçüncü satıra kadar sonlanmayacaktır, bu yüzden regex eşleşir ve kısa devre yapar ve quine'i çıkarırız.


11

Pyth, 29 bayt (5 + 24) 27 bayt (5 + 22)

pz=T0?TzjN*2]"pz=T0?TzjN*2]     # Quine
pz=T0                           # Cat A
     ?TzjN*2]"pz=T0?TzjN*2]     # Cat B

Bu eğlenceliydi.
Burada keki
deneyin Burada ilk kedi deneyin Burada
ikinci kedinin deneyin

açıklamalar

Cat A
pz=T0
pz       Print the input.
  =T0    (Irrelevant for cat)

Cat B
?TzjN*2]"pz=T0?TzjN*2]
?Tz                      If T (10) is truthy, output the input.
   jN*2]"pz=T0?TzjN*2]   (Irrelevant for cat)

Quine
pz=T0?TzjN*2]"pz=T0?TzjN*2]
pz                            Print the (empty) input (without a newline).
  =T0                         Set T to 0.
     ?Tz                      If T (0) is truthy, output the input.
             "pz=T0?TzjN*2]   Otherwise, get this string...
          *2]                 ... take two copies...
        jN                    ... and join them with a quote.

11

C # (Visual C # Derleyici) , 551 bayt

A: 95 bayt

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//

Çevrimiçi deneyin!

B: 438 + 18 bayt

class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

Çevrimiçi deneyin!

A + B: 533 + 18 bayt

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

Çevrimiçi deneyin!

A ve B, girdiyi komut satırı argümanı olarak alır. A + B, herhangi bir girişi yok sayar. B ve A + B’de 18 bayt/p:StartupObject=BMSBuild'e gönderilen seçenek . Sadece A + B'de kesinlikle gerekli, ancak B'de bulunmamasını da hile gibi görünüyordu. Bu şekilde, A + B için derleyici bayrakları A (yok) için derleyici bayrakları ve B için derleyici bayraklarıdır.

açıklama

Program A basittir. A sınıfı ibaşlangıç ​​durumuna getirilen (kullanılmayan) statik bir değişken içerir 2ve çalıştırıldığında ilk argümanını yazdırır. //Sonunda A + B kodu için önemlidir, ancak A kendisinde hiçbir şey yapmaz.

B programı, izolasyon bakımından gariptir, fakat esasen aynıdır. Baştan ibaşlatılan statik bir değişken içeren bir A Sınıfı oluşturur 0ve daha sonra Program A ile aynı olan Ana Sınıf B yöntemini çalıştırır, çünkü A.i1'den küçüktür ve tuhaf şeylerden önce geri döner. Yeni satırlar burada gerekli değildir, ancak A + B için önemlidir.

Birleştirildiğinde, //gelen A Programı Programı B'den A sınıfı beyanı dışında yorumlar fakat yeni satır B sınıfı izin gayet A.ibaşvurmak için 2yerine Programı A'dan değeri. Derleyici Bayrağı, Programı A.Main () 'in de bulunduğundan B.Main () işlevini çalıştırır. Sonuç, Program A + B'nin argümanını vermemesidir, ancak bunun yerine sadece standart C # quine olan B.Main () 'in aşağıdaki bölümüne gider .


1
"kedi programları ... stdout'a stdin kopyalamalısın"
Jakob

9

Haskell , 116 + 20 = 187 175 174 136 bayt

Johansjan Johansen’ın bana gösterdiğinden beri bir avuç bayt kurtardı. interact

Kedi 1

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact id

Çevrimiçi deneyin!

Kedi 2

main|1>0=interact id

Çevrimiçi deneyin!

Quine

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact idmain|1>0=interact id

Çevrimiçi deneyin!


Burada iş yerinde temel prensibi biz ikinci kedi eklediğinizde ilk biz gelen etkileşime işlevin adını değiştirmek olmasıdır aiçin idmain. Yana interact idistediğimiz bir kedi idmainbir işlev olduğunu döndürür bir quine bana. Açık bir çözüm kullanmak olacaktır const, ancak girdilerin boş (++)işler de olduğunu varsayabiliriz . Buradan kaynak kodunu oldukça standart yollarla buluyoruz, kaynağı gkodlayan bir değişkenimiz var ve dizge biçiminde ve kod biçiminde yazdırmak için özel bir sarıcı kullanıyoruz. Kodlayıcımızı öne koymamız gereken küçük bir istisna var çünkü zaten bitirmemiz gerekiyor interact id. Bu fazladan demek oluyorg=kodlanmış değildir ve manuel olarak ele alınması gerekir. Bir sonraki kedimiz oldukça standarttır, ancak diğer kedinin sonuna konulduğunda geçerli bir kod yapmamız gerekir, bu nedenle her iki kedinin de desen koruma örnekleri olması gerekir.

Alternatif Strateji, 43 + 105 = 186 148

Kedi 1

g="";main|idmain<-(++g++show g)=interact id

Çevrimiçi deneyin!

Kedi 2

main|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

Çevrimiçi deneyin!

Quine

g="";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

Çevrimiçi deneyin!


1
Sen değiştirerek bu biraz kısaltabilirsiniz getContents+ putStrile interact id. Çevrimiçi deneyin! (Artık kuyruk boş olmayan bir girişle çalışmaz, bu da bir (++ ...)bölüm kullanılmasına izin verir idmain.)
Ørjan Johansen

@ ØrjanJohansen Teşekkürler! Bilmiyordum interact, sanırım bunun nedeni Haskell ile nadiren IO işleri yapmak. Gönderiyi düzenledim.
Buğday Sihirbazı

8

Python 3, 286 bayt

İlk Python golf'üm ve ilk quine'im! Çok şık değil, ama işe yarıyor.

Program A (238 bayt)

from atexit import*;s="from atexit import*;s=%r;register(lambda:print(end='b'in globals()and s%%s or open(0).read()));b=0\nif's'not in vars():print(end=open(0).read())";register(lambda:print(end='b'in globals()and s%s or open(0).read()));

(takip eden yeni satır yok)

B Programı (48 bayt)

b=0
if's'not in vars():print(end=open(0).read())

(takip eden yeni satır yok)

Çevrimiçi Deneyin

Teşekkür

  • Jo King sayesinde -24 bayt
  • Jo King sayesinde -82 bayt

Newline ve alıntı yapmak zorunda değilsiniz yerine bunu end=open...kullanabilir ve kullanabilirsiniz%r%s
Jo King

Cool, ben değiştim %r. Newline hakkında ne demek istediğinizi tam olarak bilmiyoruz.
Jakob

1
Yeni %sbir satırı biçimlendirmek yerine , tam anlamıyla sadece yapabilirsiniz \n. Bunun ;yerine ifadeleri bölmek için de kullanabilirsiniz \n( ifkendi satırında olması gerekenler hariç ). %Yaparak dizede kaçabilir %%. Dizeyi biçimlendirmek için gereken tek argüman dizgenin kendisidir, diğer her şey şeritli olabilir
Jo King

1
B Programı (ve bunun için yazılan metin) locals()2 bayt kaydetmek için kullanılabilir .
Jonathan Allan

6

C ++ (clang) , 313 + 102 = 415 bayt

Program A (yeni satırda bitiyor):

#include<cstdio>
#define Q(x,y)#x,B=#y;x
int c;auto I="#include<cstdio>",A=Q(int main(){if(c)printf("%s\n#define Q(x,y)#x\",\"#y;x\nint c;auto I=\"%s\",A=Q(%s,)\n#ifdef Q\nint n=++c;\n#else\n%s\n%s\n#endif",I,I,A,I,B);else while((c=getchar())>=0)putchar(c);},int c;int main(){while((c=getchar())>=0)putchar(c);})

B Programı (yeni satırda bitmiyor):

#ifdef Q
int n=++c;
#else
#include<cstdio>
int c;int main(){while((c=getchar())>=0)putchar(c);}
#endif

Çok sinsice değil ve her zamanki gibi C ++ sorgulamak için iyi değil. Burada ve orada aynı fikirde baytları tıraş etmenin yolları varsa şaşırmam. Küçük bir yakalama tanımlandıktan sonra bir şeyin davranışını değiştiriyor ve yan etkisi olan dinamik bir değişken başlatıcı hile yapıyor. (Bu derleyici uzantıları olmadan C bile yapılabilir mi?)

Çevrimiçi deneyin: A , B , AB

(Farkında olduğum tek taşınabilirlik kaygısı, programın <cstdio>hem genel ad alanına hem de içine ad koyduğunu varsaymasıdır std.)



5

Python 3 , 100 + 37 = 137 bayt

Program A:

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#

Çevrimiçi deneyin!

Program B:

print(end=open(0).read())
print(s%s)

Çevrimiçi deneyin!

Quine AB'yi Yap

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#print(end=open(0).read())
print(s%s)

Çevrimiçi deneyin!

Yalnızca giriş boş olduğunda çalışır, aksi halde girişi çıkışa hazırlar.


Çift tırnak tek olanlar olmalıdır.
Jonathan Allan,

Çökmesine izin verilir?
Jakob

@ Jakob soru çökmesini olduğunu söylemez değil izin ve tipik standart hataya çıkış göz ardı edilir
Jo Kral

Tamam, yeterince adil. Zeki kısayollar!
Jakob

4

Ataşesi , 15 + 126 = 141 bayt

A:

AllInput[]|Echo

Çevrimiçi deneyin!

B:

@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

Çevrimiçi deneyin!

A + B:

AllInput[]|Echo@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

Çevrimiçi deneyin!

açıklama

Cat programının her biri kodlar AllInput[]|Echo basit bir kedi programı olan . B , ana kin fazıdır; tek başına, girişsiz ( @denilen) olarak adlandırılan vektörlü bir fonksiyondur (unary üzerinden |Call). Bu durumda, birinci şartlı If[_,A,B]yürütür Bbasit olan AllInput[]|Echo.

Ne zaman A + B yürütülür, tekli @, ikili hale @nedeniyle Echolambda ile birleştirilmesi:

AllInput[]|Echo@{If[_, ...

Şimdi, bu lambdanın daha önce yapıldığı anlamına gelir. Echo yapıldığı . Koşullara geri dönersek, bu fonksiyon artık STDIN'in bir argüman olarak hepsini içeriyor. Böylece, standart quine çerçevesi olan If[_,A,B]yürütür A.


3

Stax , 16 + 12 = 28 bayt

Kedi 1:

"yi|d|ca34b4lr"y

Koş ve hata ayıkla

"yi|d|ca34b4lr"y Full program, implicit input
"yi|d|ca34b4lr"  Push the string
               y Push raw input
                 Implicit output of top item

Kedi 2:

i|d|ca34b4lr

Koş ve hata ayıkla

i|d|ca34b4lr Full program, implicit input
i            Don't parse input (prefix directive)
 |d          Push main stack depth, always zero
   |c        Cancel because top item is falsy, and implicitly print
     a34b4lr Never executed

Quine:

"yi|d|ca34b4lr"yi|d|ca34b4lr

Koş ve hata ayıkla

"yi|d|ca34b4lr"yi|d|ca34b4lr Full program
"yi|d|ca34b4lr"              Push the string
               y             Push input
                i            No-op
                 |d          Push main stack depth, i.e. 2
                   |c        Do nothing because top is truthy
                     a       Get the string to the top
                      34     Push 34 (charcode of ")
                        b    Copy both
                         4l  Listify top 4
                           r Reverse
                             Implicit output

3

Kedi 1:

Lua , 41 bayt

a=io.read;while a(0)do io.write(a(1))end;

Çevrimiçi deneyin!


Kedi 2:

Lua , 70 bayt

if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

Çevrimiçi deneyin!


Quine:

Lua , 111 bayt

a=io.read;while a(0)do io.write(a(1))end
if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

Çevrimiçi deneyin!

io.input(arg[0]) Cat 2'de geçerli dosyayı standart girdi olarak ayarlar ve sonuç olarak cat kaynak kodu yazdırır.


1
PPCG'ye Hoş Geldiniz
Muhammad Salman

Son yarı-kolonu kaldırarak kedi 1'de bir bayttan tasarruf edebilirsiniz.
Muhammad Salman

1
Ne yazık ki, geçerli dosyayı okumak standart bir boşluktur. Ama yine de iyi deneyin.
Beefster


0

JavaScript (Node.js) , 199 bayt


a=()=>console.log(require('fs').readFileSync(0)+'');a();var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

Çevrimiçi deneyin!

Kedi A, 57 bayt


a=()=>console.log(require('fs').readFileSync(0)+'');a();

Çevrimiçi deneyin!

Kedi B, 142 bayt

var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

Çevrimiçi deneyin!

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.