Hatena::ブログ(Diary)

まめめも このページをアンテナに追加 RSSフィード

2009-09-16

[][][][][][][][][][][] quine リレー

Update (2013-07-15): I improved this program to 50-language version. 50 言語版にパワーアップさせました。


これはこのプログラム自身を出力する Unlambda プログラム、を出力する Whitespace プログラム、を出力する brainfuck プログラム、を出力する Java プログラム、を出力する C プログラム、を出力する Haskell プログラム、を出力する OCaml プログラム、を出力する Lua プログラム、を出力する Perl プログラム、を出力する Python プログラム、を出力する Ruby プログラム、です。

# ruby
l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t
.size/2)};5.times{s=s.dump[r]};puts\"# python\\nprint(\\\"# perl\\\\nprint(\\\\\\
\"# lua"+l*4+"nprint("+l*7+"\"(* ocaml *)"+l*8+"nprint_endline"+l*15+"\"-- haskel
l"+l*16+"nimport Data.List;import Data.Bits;import Data.Char;main=putStrLn("+l*31
+"\"/* C */"+l*32+"n#include<stdio.h>"+l*32+"nint main(void){char*s[501]={"+l*31+
"\"++intercalate"+l*31+"\","+l*31+"\"(c(tail(init(show("+l*31+"\"/* Java */"+l*32
+"npublic class QuineRelay{public static void main(String[]a){String[]s={"+l*31+"
\"++intercalate"+l*31+"\","+l*31+"\"(c("+l*31+"\"brainfuck"+l*64+"n++++++++[>++++
<-]+++++++++>>++++++++++"+l*31+"\"++(concat(snd(mapAccumL h 2("+l*31+"\"110"+l*31
+"\"++g(length s)++"+l*31+"\"22111211100111112021111102011112120012"+l*31+"\"++co
ncatMap("+l*32+"c->let d=ord c in if d<11then"+l*31+"\"21002"+l*31+"\"else"+l*31+
"\"111"+l*31+"\"++g d++"+l*31+"\"22102"+l*31+"\")s++"+l*31+"\"2100211101012021122
2211211101000120211021120221102111000110120211202"+l*31+"\"))))))++"+l*31+"\","+l
*63+"\""+l*64+"n"+l*63+"\"};int i=0;for(;i<94;i++)System.out.print(s[i]);}}"+l*31
+"\")))))++"+l*31+"\",0};int i=0;for(;s[i];i++)printf("+l*63+"\"%s"+l*63+"\",s[i]
);puts("+l*63+"\""+l*63+"\");return 0;}"+l*31+"\");c s=map("+l*32+"s->"+l*31+"\""
+l*63+"\""+l*31+"\"++s++"+l*31+"\""+l*63+"\""+l*31+"\")(unfoldr t s);t[]=Nothing;
t s=Just(splitAt(if length s>w&&s!!w=='"+l*31+"\"'then 501else w)s);w=500;f 0=Not
hing;f x=Just((if x`mod`2>0then '0'else '1'),x`div`2);g x= reverse (unfoldr f x);
h p c=let d=ord c-48in(d,replicate(abs(p-d))(if d<p then '<'else '>')++"+l*31+"\"
."+l*31+"\");s="+l*31+"\"# ruby"+l*32+"n"+l*31+"\"++"+l*31+"\"l=92.chr;eval s=\"+
(z=l*31)+\"\\\"\"+s+z+\"\\\""+l*31+"\"++"+l*31+"\""+l*32+"n"+l*31+"\""+l*15+"\""+
l*7+"\")"+l*4+"n\\\\\\\")\\\")\"########### (c) Yusuke Endoh, 2009 ###########\n"

最初のコメント行以外の改行は読みやすさのために入れています。QuineRelay.rb などというファイルとして保存してください。以下のように実行します。

$ ruby QuineRelay.rb > QuineRelay.py
$ python QuineRelay.py > QuineRelay.pl
$ perl QuineRelay.pl > QuineRelay.lua
$ lua QuineRelay.lua > QuineRelay.ml
$ ocaml QuineRelay.ml > QuineRelay.hs
$ runghc QuineRelay.hs > QuineRelay.c
$ gcc -Wall -o QuineRelay QuineRelay.c && ./QuineRelay > QuineRelay.java
$ javac QuineRelay.java && java QuineRelay > QuineRelay.bf
$ beef QuineRelay.bf > QuineRelay.ws
$ wspace QuineRelay.ws > QuineRelay.unl
$ unlambda QuineRelay.unl > QuineRelay2.rb

最終的に得られる出力 QuineRelay2.rb は最初の Ruby プログラムと一致するはず。

$ diff QuineRelay.rb QuineRelay2.rb

念のため各処理系バージョンを書いておきます。すべて Debian/lennyaptインストールできるものです。

biosedbiosed 2009/09/29 21:59 Good work!!!

XbiscuitXbiscuit 2009/09/30 02:20 Yo dawg, I put a quine in your quine in your quine in your quine in your quine in your quine in your quine in your quine in your quine in your quine in your quine so you can quine while you quine while you quine while you quine while you quine while you quine while you quine while you quine while you quine while you quine while you quine.

SteamedFishSteamedFish 2009/09/30 16:14 wow, BT!

JJJJ 2009/10/03 01:55 damm, awesome!

xxxooooxxxoooo 2009/10/07 20:23 nice work

OvidiuOvidiu 2009/11/03 08:02 Amazing work! I'm speechless.

ldleworkldlework 2009/11/05 05:41 This really is a work of modern art. Museum this please.

ku-ma-meku-ma-me 2009/11/08 15:04 Thank you all. I'm glad the whole world looks this despite Japanese article.

This is actually easier than it looks. In fact, it took less than three hours to write this. I wrote only Ruby and Haskell in effect.

Anton ZhbankovAnton Zhbankov 2009/11/10 18:41 Here is some mod for your program: http://catap.ru/blog/2009/11/09/one-japan-man/

Erlang and sh added.

(‘∀`*)(‘∀`*) 2009/11/11 19:57 すげー!

ドイツよろしく。

NiKoNiKo 2009/11/16 03:11 Damn lame, you didn't provide Malbolge code generation http://en.wikipedia.org/wiki/Malbolge

Just kidding, it's awesome =)

KevinKevin 2009/12/20 19:18 That is an amazing display of computer programming skills. Thank you for the code.

なまえ1なまえ1 2011/05/01 16:45 I'm so glad to see it!

pf_milespf_miles 2011/07/04 23:36 You must be a language master.
Awesome work!!

WendelWendel 2011/07/08 03:34 I got this error, what I'm doing wrong?
$ ruby QuineRelay.rb
QuineRelay.rb:14: syntax error, unexpected '+', expecting tCOLON2 or '[' or '.'
*63+"\""+l*64+"n"+l*63+"\"};int i=...
^

yajneshyajnesh 2012/02/25 21:27 You are a genius...

AhitagniAhitagni 2012/04/30 21:01 That's great work! Its just like a fine work of art. I really appreciate your work.

Not reading JapaneseNot reading Japanese 2012/12/04 05:39 On Ubuntu 12.04

$ ruby QuineRelay.rb > QuineRelay.py
QuineRelay.rb:15: syntax error, unexpected '+', expecting tCOLON2 or '[' or '.'
*63+"\""+l*64+"n"+l*63+"\"};int i=...
^

DarkstarDarkstar 2013/06/07 18:04 だめです:

$ gcc -o QuineRelay QuineRelay.c
QuineRelay.c: In function 'main':
QuineRelay.c:3:47549: error: expected ')' before ';' token
QuineRelay.c:3:47568: error: expected ';' before '}' token

なぜですか。。。

ku-ma-meku-ma-me 2013/06/07 18:48 > Darkstar さん

ご報告ありがとうございます。確かに動かなくなってますね。おそらくどれかの処理系の挙動が変わったんだと思うんですが、もう lenny がないんですぐには確認できそうにないです。そのうち作り直したいと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証