Polyquine yazın


33

Bir polikin hem quine hem de polyglot'tur. 1 En az iki farklı dilde geçerli olan bir yazı yazmalısınız. Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

1 Bunu ben yaptım. Ya da daha doğrusu, Geobits yaptı . Görünüşe göre, ilk o da değildi .

Quines için kurallar

Sadece gerçek paralar kabul edilir. Olduğuna göre,, STDOUT kelimesi kelimesine tüm kaynak kodunu yazdırmak gerekiyor olmadan :

  • kaynak kodunuzu doğrudan veya dolaylı olarak okuyunuz.
  • beslediğiniz her ifadeyi yalnızca değerlendiren ve basan bir REPL ortamına güvenmek.
  • Belli durumlarda kaynağı sadece basan dil özelliklerine güvenebilirsiniz.
  • Sıranın tamamını veya bir kısmını yazmak için hata mesajları veya STDERR kullanarak. (STDOUT'a bir şeyler yazabilir veya STDOUT geçerli bir sorgu olduğu ve hata mesajlarının bir parçası olmadığı sürece uyarılar / ölümcül olmayan hatalar oluşturabilirsiniz.)

Ayrıca, kodunuzun değişmez bir dize içermesi gerekir .

Polyglots Kuralları

Kullanılan iki dil açıkça farklı olmalıdır. Özellikle:

  • Aynı dilin farklı versiyonları olmamalıdır (örn. Python 2 ve Python 3).
  • Aynı dilin farklı lehçeleri olmamalıdır (ör. Pascal vs. Delphi).
  • Bir dil diğerinin altkümesi olmayabilir (örneğin, C ile C ++).

4
"kodunuzu gerekir Hatta böyle brainfuck olarak hiçbir dize hazır var dilde bir dize içeriyor"?
Peter Olson

@PeterOlson Kuralın amacı, golf oynamaya özgü dillerde birkaç boşluktan kaçınmaktır (örneğin bu ). Kuralın kaldırılmasının veya zayıflatılmasının ne olacağını tahmin edemediğim için (ve kesinlikle gerekli olmadıkça değişen kuralların hayranı olmadığım için) üzgünüm ama BF başvuruları bunun için geçerli olmayacak meydan okuma. Teselli olacaksa, bir BF sunumu zaten rekabetçi olmayacaktır. ;)
Martin Ender

1
"o da ilk değildi" nereye bağlar?
Outgolfer Erik,

2
C gerçekten bir C ++ alt kümesi değildir.
MD XF

İki farklı Brainf ** k-tabanlı dil, Brainf ** k ve MOO gibi aynı dilde sayılıyor mu?
MD XF

Yanıtlar:


14

CJam / GolfScript, 34 bayt

{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~

Bayt sayısı, program onsuz kısa bir süre olmayacağından, takip eden bir satır akışı içerir.

CJam ve GolfScript bazı açılardan çok benzer olsa da , birçok fark vardır. Bunu "dürüst" bir polikin yapmak için , mümkün olduğunca farklılıklara güvenmeye karar verdim . Blok ve dize sözdizimi dışında (dillerin diğerleriyle o kadar çok dilde paylaştığı), kodun hiçbir kısmı iki dilde de aynı şekilde gerçekleşmez.

Çevrimiçi GolfScript yorumlayıcısının bir hatası var; Bu program sadece resmi tercüman ile çalışır.

Örnek çalışma

$ cat polyquine
{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~
$ md5sum polyquine <(cjam polyquine) <(golfscript polyquine)
e2f1f3cd68abbbceec58080513f98d9a  polyquine
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/63
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/62

Nasıl çalışır (CJam)

" Push that block.                                                                        ";

{"__X.0#@@?LL
;~"N}

" Push two copies of the block, 1 (computed as 1**0) and rotate the block copies on top.  ";

__X.0#@@

" If 1 is truthy (oh, the uncertainty), execute the first copy; else, execute the second.
  Evaluating the block pushes the string it contains; N pushes a linefeed.                ";

?

" Push two empty arrays.                                                                  ";

LL

" Discard one empty array and dump the second.                                            ";

;~

" (implicit) Print all items on the stack.                                                ";

Nasıl çalışır (GolfScript)

# Push that block.

{"__X.0#@@?LL
;~"N}

# Push a copy of the block; _ and X are noops, # initiates an inline comment.

__X.0#@@?LL

# Discard the 0 and execute the copy of the block.
# Evaluating the block pushes the string it contains; N is a noop.

;~

# (implicit) Print all items on the stack, followed by a linefeed.

CJam / GolfScript, 12 bayt

{"0$~"N}0$~

Dillerin farklılıklarını olabildiğince önleyen hile çözümü.

Çevrimiçi deneyin:

Nasıl çalışır (CJam)

 "0$~"       " Push that string.                                                          ";
      N      " Push a linefeed.                                                           ";
{      }0$~  " Push a copy of the block and execute it.                                   ";
             " (implicit) Print the stack.                                                ";

Nasıl çalışır (GolfScript)

 "0$~"       # Push that string.
      N      # Undefined token (noop).
{      }0$~  # Push a copy of the block and execute it.
             # (implicit) Print the stack, followed by a linefeed.

14

C # / Java, 746 bayt

Java'daki karakterlerin aynı unicode dizileri olarak yazılabilmesi özelliğini kullanıyorum. Mecbur kalırsak AC # derleyicisi ve için talimat BJava için talimat, aşağıdaki kod parçası kullanabilirsiniz:

//\u000A\u002F\u002A
A//\u002A\u002FB

C # ile aşağıdaki şekilde "tanınır":

//\u000A\u002F\u002A
A//\u002A\u002FB

Ve şu şekilde Java ile:

//
/*
A//*/B

Yüzünden \u000A, satır atlar \u002Folduğunu /ve \u002Aolan *Java.

Yani son polyglot-quine:

//\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="//@#'^using System;//'#^class Program{public static void//@#'^Main//'#main^(String[]z){String s=!$!,t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&'!,s};for(int i=0;i<7;i++)t=t.//@#'^Replace//'#replace^(!!+(char)a[i],b[i]);//@#'^Console.Write//'#System.out.printf^(t);}}",t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A",s};for(int i=0;i<7;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);//\u000A\u002F\u002A
Console.Write//\u002A\u002FSystem.out.printf
(t);}}

Ancak, dil ayrıntılarını nedeniyle boyutu çok büyük.

İdeone.com adresinde mevcut olan derleme: C # , Java .


3
Programming Puzzles & Code Golf topluluğuna hoş geldiniz!
Outgolfer Erik

2
Neredeyse iki yıl geçtiğini biliyorum, ama 58 byte golf oynayabilirsiniz. Çevrimiçi Java'yı deneyin. ve çevrimiçi deneyin # C.
Kevin Cruijssen

688 bayt mı demek istediniz?
Ivan Kochurkin

13

Python 3 ve JavaScript, 134 bayt

İşte benim (son?) Denemem:

a='eval(a.split(" ")[2%-4]),1//2# q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8)) print(a[-12:]%a) a=%r;eval(a)';eval(a)

Özellikle biraz JavaScript kullanılabiliyorsa, özellikle de birileri tek tek tırnak işaretleri almak için daha iyi bir yol biliyorsa.


Kaynatılmış, program şöyle görünür:

a='a long string';eval(a)

eval()Fonksiyon her iki dilde ifadeleri değerlendirecektir. Böylece uzun dize idam edilir:

eval(a.split(" ")[2%-4]),1//2# ... the rest gets commented out

Bu, uzun dizgiyi boşluklarla böler ve dizine eklenen alt dizgiyi değerlendirir 2%-4. JavaScript, üçüncü alt dizgiyi ( 2 % -4 == 2) ve Python'u en son ikincisini ( 2 % -4 == -2) çalıştırır, çünkü modulo operatörleri negatifler için farklı davranır.

Dizenin geri kalanı her iki dilde de göz ardı edilir. JavaScript durur, //Python ise tamsayı bölmeli olarak görür ve durur #.

Böylece JavaScript kaynak kodunu konsola yazdırır:

q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8))

Ve Python burada:

print(a[-12:]%a)

Her ikisi de programın bir şablonu olan dizenin son bölümünü kullanır:

a=%r;eval(a)

+ 1 140 bayt için golfed: a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"]). JavaScript'te test edildi ancak python'da test edilmedi ... fakat çalışması gerekiyor.
soktinpk

@soktinpk Teşekkürler, ama Python'un izin vereceğini sanmıyorum a.split(1).
grc

1
-8 bayt:q=unescape("%27")
Patrick Roberts

8

Ruby / Perl / PHP, 52

$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;

Christopher Durr'ın Perl quine'inden sözlü kopya aldı .

Bu kuralların kötüye kullanılmasıdır. Ruby ve Perl kesinlikle aynı dilde değildir ve Perl de Ruby'nin alt kümesidir (örneğin, bağlantılı Perl sorgularının çoğu Ruby'de çalışmaz). Ancak Ruby eğer istersen Perl gibi görünebilecek şekilde tasarlandı ve golf oynarken çok olur.


Bu PHP'de de çalışmak için yapılabilir mi (yoksa zaten yapıyor mu)? Dokümanı doğru okuyorsam, onu komut satırından çalıştırabilir -Rve script etiketlerine ihtiyacınız yoktur. php.net/manual/en/features.commandline.options.php
hmatt1

Buna kural suistimali demezdim. İki dilin kesişiminde çalışan bir inine bulmak kesinlikle bu soruya yaklaşmak için geçerli bir yoldur. Ancak, bunu görmek kendi işin değil, topluluk wiki'sini işaretleseydin tercih ederim.
Martin Ender

@ chilemagic gerçekten öyle!
histocrat

@ MartinBüttner bitti.
histocrat

6

Bash / GolfScript, 73

.~0 () 
{ 
    declare "-f" @* ".~0" " () 
"+@n.;
    echo '.~0;'
}
.~0;

İlk 3 satırın her birinde bir boşluk vardır.

Bash / GolfScript, 78

alias :a~a.='eval "alias :a~a."\
;set [61 39]+a[39]+n"":a;echo ":a~a."'
:a~a.

5

PHP / Perl - 171

#<?PHP$s=1;$t="";
$a='%s<%cPHP$s=1;$t="";%c$a=%c%s%c;$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);%c#%c>';$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);
#?>

Çalıştır:

$ php quine.pl
$ perl quine.pl

phpKod aslında çalışıyorsa (sadece kendisini baskı yapmadığı).


5

Bash / Ruby, 104 82

"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
a

Eski versiyon:

"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
a

Bash / Ruby, tanımsız davranış olmadan 128

"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
a

vay, Ruby kodunun nasıl çalıştığını bile anlamadım: D
Martin Ender

@ MartinBüttner <<a, Ruby'de aynı Bash gibi çalışır, ancak bir dize döndürür. Daha önce bir Ruby programı yazmadım. Bu özelliğe sahip rastgele bir dil buldum.
jimmy23013

Bash'ta da nasıl çalıştığını bilmiyorum: P
Martin Ender

@ MartinBüttner Heredoc denir. <<wordTekli bir satır tarafından kapatılan bir dize döndürür word.
jimmy23013 10:14

5

retiküler / befunge-98, 28 bayt [rekabet etmeyen]

<@,+1!',k- ';';Oc'43'q@$;!0"

Retiküler deneyin! Befunge 98'i dene!

Aradaki şey ;befunge s göz ardı edilir ve !aralarında segmentine atlama ;retiküler için s. Böylece, retiküler görür:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                             move left
                           "  capture string
                          0   push zero
                        ;!    skip `;` (end program)
                       $      drop zero
                     q@       reverse TOS
                 '43'         push 34 (")
                c             convert to char
               O              output all
              ;               end program

Befunge şöyle görür:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                            move left
                           " capture string
                         !0  push 1
              ;         ;    skip this
         - ';'               push 27
       ,k                    output top 27 chars
   +1!'                      push 34 (")
  ,                          output "
 @                           end program

4

Ruby / Mathematica, 225 bayt

İşte benim çok dövülebilir polikinim (örnek ve kavram ispatı olarak hizmet ediyor):

s="s=%p;puts s%%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1";puts s%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1

İlk bölüm bu Ruby quine'ye dayanıyor ve temelde:

s="s=%p;puts s%%s;#MathematicaCode";puts s%s;#MathematicaCode

Dize ataması Mathematica'da tam olarak aynıdır. puts s%s4 sembollerinin bir ürünü olarak yorumlanır: putsdize s, %(son REPL sonucu ya Out[0]ilk değerlendirip ifade ise) ve başka s. Bu elbette tamamen anlamsız, ancak Mathematica ;herhangi bir çıktıyı önemsemiyor ve bastırmıyor, bu yüzden sadece sessizce işleniyor. Ardından #satırın geri kalanını Ruby için yorum yapar, Mathematica ise devam eder.

Mathematica koduna gelince, bunun en büyük kısmı, Ruby'nin biçimindeki dizge işlemlerini herhangi bir string değişmez kullanmadan simüle etmektir. FromCharacterCode@{37,112}olduğu %pve FromCharacterCode@{37,112}bir %%. Birincisi, dize ile değiştirilir ( InputFormtırnak işaretleri ekler), ikincisini bir tanesiyle değiştirir %. Sonuç Printed. Son yakalama, #cephede bununla nasıl başa çıkılacağı . Bu, Mathematica'nın saf (adsız) bir fonksiyonun ilk argümanının simgesidir. Ne yapmamız olduğunu Yani biz yapmak ekleyerek bu saf fonksiyonun bütün &derhal bağımsız değişkenle fonksiyonu çağırmak 1. 1Bir işlev çağrısı için bir hazırlık yapılması sonucu "çarpar"1hangi Mathematica, fonksiyondan ne gibi bir şey döndüğüne bakılmaksızın tekrar yutuyor.


2

> <> ve CJam, 165 bayt

"~~~~~~~~~~~~~~~~~~~~~~~r00gol?!v93*0.Hi
'                               <       .1*5av!?log10oar~~~r
'"`{"`"\"_~e#.21 <.2+4*96;!?log10oa"}_~e#.21 <.2+4*96;!?log10oa

CJam için, program çok satırlı bir dize değişmeziyle başlar. Bu ile kaçılır `ve daha sonra quine kodunu yazdırmak için standart quine ile takip eden bir yorum kullanır.

İlk önce, <<> için, "ilk satırın tamamından geçen ve her karakteri yığına iter. Bundan sonra, takip eden boşluklar (dolgulu giriş nedeniyle yaratılmış) silinir ve ardından yığın tersine çevrilir. Yığındaki her karakter (yani ilk satırın tamamı) çıkar ve ardından ikinci satıra aşağı doğru hareket eder.

İkinci satır aslında aynı şeyi yapar, aksi yönde olması dışında, yığını ters çevirmenize gerek yoktur. (Yine de yapıyorum çünkü takip eden boşlukları silmeliyim.)

Sonunda üçüncü satıra geçer. Tek büyük fark, .tek tırnak işaretini kullanarak yapılan CJam bloğunu atlamanız gerektiğidir . Tek satır tüm satırı yakalar (tekrar, geriye) ve sonra da çıktı alınır.


2

C / PHP, 266 304 300 282 241 203 + 10 bayt

//<?php
function main($a){printf($a="%c//<?php%cfunction main(%ca){printf(%ca=%c%s%c,13,10,36,36,34,%ca,34,36,10,10,10);}%c#if 0%cmain();%c#endif",13,10,36,36,34,$a,34,36,10,10,10);}
#if 0
main();
#endif

+10 bayt, çünkü C içinde derleme GCC derleyici bayrağını gerektirir -Dfunction=.

Nasıl çalışır (PHP'de):

  • PHP tercümanı <?phpHTML'den önceki her şeyi basar . //HTML’de bir yorum değildir, bu yüzden basılmıştır.
  • maindeğişkenli bir işlev olarak bildirilir a.
  • printf//Standart bir C / PHP sorgulama yöntemi kullanarak (zaten basılı olanı geçersiz kılmak için ) bir satır başı ve ardından kaynak kodunu yazdırır.
  • #if 0 PHP tarafından göz ardı edilir.
  • main($a)boş bir değişken başlatır a. (Önceden error_reporting(0), çağırmanın neden olduğu hataları yoksaymak için kullanılırdı main())
  • #endif PHP tarafından da göz ardı edilir.

Nasıl çalışır (C cinsinden):

  • //<?php tek satırlı bir yorumdur, bu nedenle dikkate alınmaz.
  • functionAnahtar kelime nedeniyle komut satırı derleyici tartışmaya göz ardı edilir -Dfunction=.
  • GCC ve Clang değişkenlerin başlaması veya içermesi ile ilgilenmez $. (Bu günü kurtardı.)
  • printf Standart bir C / PHP sorgulama yöntemi kullanarak (bu örnekte işe yaramaz) bir satır başı ve sonra kaynak kodunu yazdırır.
  • #if 0endifPHP'nin arayabilmesi için her şeyi yok sayar main.
  • #endif "beni yoksay" bloğunu sonlandırır.

2

Wumpus / > <> / Befunge-98 28 bayt

"]#34[~#28&o@,k+deg0 #o#!g00

Wumpus'ta dene!, Deneyin> <>! , Befunge-98'de dene!

Nasıl çalışır:

Wumpus Kodu:

  " Start string literal
    Bounce off end of line and come back
  " End string literal
   ] Push top of stack to bottom
    #34 Push double quote
       [~ Get bottom of stack and swap it with the double quote
         #28 Push 28
            &o@ Print the top 28 items on stack and terminate program

> <> Kod:

  " Start string literal
    Wrap when it reaches the end of the line
  " End string literal
   ]# Clear stack and reflect
  " Wrapping string literal again, but backwards
                     g00 Get the character from cell 0 (")
                 #o#! Skip into the printing loop
                      Exit with an error

Befunge-98 Kodu:

  " Wrapping string literal
   ] Turn right
   ] Turn right again, going West
  " Wrapping string literal going West
                 !g00 Get double quote and invert it
              #o# Skip over the o instruction
           g0   Get double quote
        +de Push 27
     @,k    Print 27+1 items from the stack and terminate program.


1

C / TCL, 337 bayt

#define set char*f= 
#define F 
#define proc main(){ 
set F "#define set char*f= 
#define F 
#define proc main(){ 
set F %c%s%c; 
proc /* {} {} 
puts -nonewline %cformat %cF 34 %cF 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 
"; 
proc /* {} {} 
puts -nonewline [format $F 34 $F 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 

1

C / Vim 4.0, 1636 bayt

Kontrol karakterleri içerir.

map () {}/*
map g ;data0df"f"cf"
f"cf"
f"D2kyyP;g6k2dd4x5jA"JxA","JxA","jyyPkJxA"jok;g2kdd4xkJx3jdd
map ;g O"vdldd0i# 0# 1# 2# 3# 4# 5# #0lx2lx2lx2lx2lx2lx2lx:s/##/#/g
o:s//"/gk0y2lj02lp"addk@ao:s//\\/gk0ly2lj02lp"addk@ao:s///gk04ly2lj02lp05l"vp"addk@ao:s///gk05ly2lj02lp05l"vp"vp"addk@ao:s//
/gk06ly2lj02lp05l"vp"vp"vp"addk@ao:s//
/gk02ly2lj02lp05l"vp"addk@a
unmap ()

map ;data o*/ char*g[]={"map () {}/*#2map g ;data0df#0f#0cf#0#5#3f#0cf#0#5#3f#0D2kyyP;g6k2dd4x5jA#0#3JxA#0,#0#3JxA#0,#0#3jyyPkJxA#0#3jo#3k;g2kdd4xkJx3jdd#2map ;g O#4#4#4#4#3#0vdldd0i## 0## 1## 2## 3## 4## 5## ###30lx2lx2lx2lx2lx2lx2lx:s/####/##/g#5o:s//#0/g#3k0y2lj02lp#0addk@ao:s//#1#1/g#3k0ly2lj02lp#0addk@ao:s//#4#4#3/g#3k04ly2lj02lp05l#0vp#0addk@ao:s///g#3k05ly2lj02lp05l#0vp#0vp#0addk@ao:s//#4#4#5/g#3k06ly2lj02lp05l#0vp#0vp#0vp#0addk@ao:s//#4#4#5/g#3k02ly2lj02lp05l#0vp#0addk@a#2unmap ()#2#2map ;data o*/ char*g[]={","#A#0#a#0,#0#b#0,#0#c#0#C#2","}; /*#3#2#2#0*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf(#0#1n#0);else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}"}; /*

"*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf("\n");else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}

Vim'iniz aşağıdaki setlere sahip olmalıdır:

set noai
set wm=0
set nosi
set tw=0
set nogdefault

1

C / Lisp, 555 bayt

t(setq /*;*/){}main(){char q='\"',s='\\';char*a= 
"~%t(setq /*;*/){}main(){char q='~A';char*a= 
~S;char*b=/* 
)(setq a ~S) 
(setq */ ~S;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);}~%";char*b=/* 
)(setq a "\\\"',s='\\\\") 
(setq */ " 
t(setq /*;*/){}main(){char q='%c%c',s='%c%c';char*a= 
%c%s%c;char*b=/* 
)(setq a %c%c%c%c%c',s='%c%c%c%c%c) 
(setq */ %c%s%c;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 
";printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 

Kasıtlı olarak boş ilk satır.


1

Perl / Javascript (SpiderMonkey), 106 bayt

$_='$q=+[]?h^O:unescape("%27");print("$_="+$q+$_+$q+";eval($_)"||(q($_),"=$q$_$q;",q(eval($_))))';eval($_)

Online Perl'i deneyin!
JavaScript'i çevrimiçi deneyin!

açıklama

İnce veri $_her iki dilde de saklanır ve daha sonra evaled, Perl'de oldukça standart bir işlemdir. Bir printişlevi olduğu için SpiderMonkey'i TIO'da seçtim , ancak bu kolayca + 20 bayt için tarayıcıya taşınabilir ( eval("print=alert");başlangıç ​​başına ekleyin)$_ tanımlamanın ).

Perl saklanan verileri görür $_ve evalher zamanki gibi bu kadar. Yana +[]truthy Perl olup, 'depolanır $qve stringwise-XOR ile hve O. Son numara, printJavaScript'in ilk bölümünün +Perl'de tüm öğelere sayı gibi davrandığı ve daha 0sonra eklediği çağrıda , daha sonra ||gerçekte (q($_),"=$q$_$q;",q(eval($_)))eşdeğer olanı döndürmek için işleci kullanıyoruz "\$_=$q$_$q;eval(\$_)".

JavaScript'inizde +[]döner 0, biz diyoruz böylece unescape("%27")mağaza 'içinde $q(ne yazık ki, atob... SpirderMonkey içinde doesm't varoldukları için). Çağrıda print, +JavaScript birleştirme işleci olduğundan, ilk blok istenen çıktıyı ve ikinci kısmı|| yoksayıldıktan .

Sayesinde Patrick Roberts' comment için unescapehile!


Perl / JavaScript (Tarayıcı), 108 bayt

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

Online Perl'i deneyin!

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

açıklama

Quine verisini $_her iki dilde de saklıyoruz ve sonra evalPerl'de oldukça standart bir prosedür.

Perl saklanan verileri görür $_ve evalher zamanki gibi bu kadar. evalİçinde $_yürütülen ve ayrıştırma başarısız, ama bu yana olduğu eval, hata yapmaz. printfdaha sonra, tek bir alıntı dizge q()ile `, sınırlayıcı olarak, tıpkı sadece `komutların çalıştırılmasıyla sonuçlanacağı gibi çağrılır, daha sonra ilk kullanım için $q, çünkü +[]Perl'deki rutubet, stringwise-XOR aracılığıyla 'saklanır ve$qhO .

JavaScript'te, içindeki evalblok , Perl'deki gibi dize formatları olduğundan , a ve aliases argümanı olan $_bir fonksiyon ayarlar . Ne zaman denir döner diyoruz böylece, kod çözme için de ve mağaza .qreturnStringconsole.logprintfconsole.logprintfprintf+[]0atob'$q


1

Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bayt

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='eval("0"?0?"def strtr(s,f,t);s.tr(f,t) end;class String;def chr(n);self+n.chr end;end":"$u=strtr=(s,f,t)=>[...f].reduce((s,a,i)=>s.replace(RegExp(a,`g`),t[i]),s);printf=console.log;(S=String).prototype.chr=function(n){return this+S.fromCharCode(n)}":[]&&"sub strtr{eval q(q(X)=~y/X/X/r)=~s/X/shift/ger}");printf(strtr("%s<?#/.__id__;s=+0;#j;read -d jj q<<jj;s=zj;Q=jecho s=1//2z;_=rksksksz<z?z#/.__id__z;s=+0z;#ksz;read -d ksks qz<z<ksksz;s=zzksz;Q=kskQksz;evalz zkQ;echo kqj;eval kQwk_=j%sj;eval(k_);//;#jjj;f=jjjs=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)jjj;q=_[18]*3;print f%%(q,_,q,q,f,q)%s","jkwz","".chr(39).chr(36).chr(10).chr(92).chr(92)),[]&&"s=1//2;_=r".chr(39).chr(39).chr(39),$_,$u?"":"".chr(10));';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Çevrimiçi olarak doğrulayın!

Bu cevabımdaki güncellemelerime dayanarak, farklı bir permütasyon basan kodu denemeyi ve optimize etmeyi deneyebileceğimi düşündüm, ama yine de bir sürü daha bayt ekleyen Bash'e eklemeye başladım. Bu benim ilk denememden daha fazla optimize edilmiş olsa da (300 byte'tan fazla tasarruf) Hala daha fazla golf oynayabileceğinden eminim.


Alternatif Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bayt

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='$z=0?"$&".next+92 .chr+10 .chr: 0..a||eval("printf=console.log;unescape`$%27%5C%0Ak`");$q=$z[1]?$z[1]:h^O;printf("%s%s%s%s<?#/.__id__;s=+0;#%s;read -d %s%s q<<%s%s;s=%s%s;Q=%secho s=1//2%s;_=r%ss%ss%ss%s<%s?%s#/.__id__%s;s=+0%s;#%ss%s;read -d %ss%ss q%s<%s<%ss%ss%s;s=%s%s%ss%s;Q=%ss%sQ%ss%s;eval%s %s%sQ;echo %sq%s;eval %sQ%s%s_=%s%s%s;eval(%s_);//;#%s%s%s;f=%s%s%ss=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)%s",[]&&"s=1//2;_=r",$r=[]&&$q,$r,$r,$q,$q,$q,$q,$q,$b=$z[2]?$z[2]:chr(92),$q,$q,$b,$d=$z[0]?$z[0]:h^L,$d,$d,$b,$b,$b,$b,$b,$d,$b,$d,$d,$b,$b,$d,$d,$b,$b,$b,$d,$b,$d,$d,$d,$b,$b,$b,$d,$d,$q,$d,$n=$z[3]?$z[3]:chr(10),$d,$q,$_,$q,$d,$q,$q,$q,$q,$q,$q,$q,$q,$q,$z[4]?"":$n);';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Çevrimiçi olarak doğrulayın!

Benim asıl yaklaşımıma biraz daha yaklaştı, ama nedenlerin tekrarı printf hala delilik. Konumsal argümanları kullanmak, bunun yerine yalnızca Chrome'da çalışmasını sağlar ve PHP'de de çalışmak için zordur, çünkü $sgiriş %1$senterpolasyonludur, ancak belki de iki yaklaşımın bir kombinasyonunu kullanarak çok fazla bayt kurtarabilir ...


0

C / dc, 152 bayt

z1d//[[z1d//]P91PP93P[dx]Pq 
;main(){char*a="z1d//[[z1d//]P91PP93P[dx]Pq%c;main(){char*a=%c%s%c;printf(a,10,34,a,34);}//]dx";printf(a,10,34,a,34);}//]dx

Yorumlardan yararlanmak, evet!


0

Perl 5 / Ruby / PHP / JavaScript (Tarayıcı), 153 bayt

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

Online Perl'i deneyin!
Ruby'yi çevrimiçi deneyin!
PHP'yi çevrimiçi olarak deneyin!

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

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.