08.11.2009

Цепной квайн

Один японец написал вот такой вот цепной квайн.

# 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"+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"

Заускать надо так:

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

Эта фиговина делает следующее: исходная программа на руби генерит прогу на питоне, которая генерит прогу на перле, которая генерит прогу на Lua, которая генерит прогу на окамле, которая генерит прогу на хаскелле, которая генерит прогу на Ц, которая генерит прогу на яве, которая генерит прогу на брейнфаке, которая генерит прогу на Whitespace, которая генерит прогу на Unlambda, которая генерит исходную прогу снова на руби.

updпри постинге на блогспот пришлось внести маленькое изменение в код, т.к. блогспот не хотел валидировать текст, что привело к потере компилябельности. Поэтому для тестов пользуйтесь либо исходником catap-а, либо оригинальным исходником японца.

20 коммент.:

Анонимный комментирует...

o.O воистину невозможное

Amper комментирует...

Жесть!!! Он извращенец!!!

Сёмка Новиков комментирует...

ААААААААААААААААААААААААААААААААААААААААААА!!!!!!!!!!!!!!11

catap.ru комментирует...

/me преклоняется

curvedbrain.org комментирует...

Хешельме-мешельбе-полный-бизнес.

neithere.net комментирует...

фантастика

tiho-tiho комментирует...

йебанутым с добрым утром.

kpobococ_ комментирует...

пиздец какой-то, хочу так уметь

Анонимный комментирует...

Что-то не запускается.

Анонимный комментирует...

Поставщик странной хуйни. С 1952. Япония.

catap.ru комментирует...

http://catap.ru/blog/2009/11/09/one-japan-man/

Я не смог устоять. Простите меня.

Анонимный комментирует...

Спасибо, я кончил.

boombick комментирует...

Ну этож японцы.. Но вообще я в ахуе, честно говоря

Анонимный комментирует...

И всего-то 25 строк. А какое содержание!

Анонимный комментирует...

Это тест на идиотизм. Олин только человек попробовал запустить, остальные....

Между тем оно не запускается ни под 1.8.7, ни под 1.9

cherem комментирует...

А кто пробовал-то?

fedorchuk комментирует...

да, в самом деле?

fedorchuk комментирует...

нет, наверное

zw0rk комментирует...

Опираться надо на исходник японца, т.к. при посте на блогспот в одном месте пришлось поставить лишний пробел, что убило всю идею. Парсер у блогспота такой парсер.

zw0rk комментирует...

Вот на хабре и catap тоже сразу всё понял, как я вижу :)

Отправить комментарий