[image]

Программа, печатающая собственный текст

кто короче?
 
RU Balancer #17.11.2011 11:06  @Сергей-4030#17.11.2011 07:59
+
-
edit
 

Balancer

администратор
★★★★★
Сергей-4030> Вы уверены, что у вас с кавычками все правильно?

Работает:

$ cat axt.py
(s,t) = ('(s,t) =', '\nprint s,(s,t),t') 
print s,(s,t),t
$ python axt.py 
(s,t) = ('(s,t) =', '\nprint s,(s,t),t') 
print s,(s,t),t


:)
   
US Сергей-4030 #17.11.2011 18:23  @Balancer#17.11.2011 11:06
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> Вы уверены, что у вас с кавычками все правильно?
Balancer> Работает:

Прикольно. Питон рулез. :)
   15.0.874.10615.0.874.106
RU AXT #17.11.2011 23:15  @Сергей-4030#17.11.2011 07:59
+
-
edit
 

AXT

инженер вольнодумец
★★
Сергей-4030> Вы уверены, что у вас с кавычками все правильно?

Ну, Балансер уже продемонстрировал, что да :)
Кстати, именно в печати кавычек весь фокус, позволяющий сделать такой простой и чистый квайн.

Дело в том, что:

1) В Питоне у каждого типа есть метод _format_, выдающий (если соблюдается контракт) внутреннее представление экземпляра в строку.
2) Для строки этот метод выдаёт её в закавыченном виде с экранированием всех служебных символов.
3) Оператор print обладает одной особенностью: строки он печатает, как есть, а для всех остальных типов то, что возвращает _format_.
4) (a,b,c,d,e,f) — это встроенный тип, кортеж (tuple). Всегда.

Дальше нужно объяснять? :)
   7.0.17.0.1
US Сергей-4030 #17.11.2011 23:25  @Sandro#17.11.2011 23:15
+
-
edit
 

Сергей-4030

исключающий третье
★★
AXT> Дальше нужно объяснять? :)

Все понятно, спасибо. Кул. :)
   15.0.874.10615.0.874.106
+
-
edit
 

Balancer

администратор
★★★★★
Настойщий Уроборос-квайн!

quine リレー - まめめも

Update (2013-07-15): I improved this program to 50-language version. 50 言語版にパワーアップさせま.. // d.hatena.ne.jp
 

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


Квайн на Ruby выдаёт квайн на Python, который выдаёт квайн на Perl, который выдаёт квайн на Lua, который на OCaml, далее GHC, GCC, Java, Brainfuck, Whitespace, Unlambda и снова исходный вариант на Ruby :)

Проверить, правда, не вышло, там довольно жёсткая привязка к версиям, у меня уже на Ruby обламывается с ошибкой :)

Подробности на английском: Uroboros Programming With 11 Programming Languages – Asiajin

// via Квайн на Питоне. Короче можете? :) — Talks — Форум
   
+
-
edit
 

HolyBoy

старожил

Balancer> Работает:

Но привязано к версиям.

$ python3 q.py
  File "q.py", line 2
    print s,(s,t),t
          ^
SyntaxError: invalid syntax

$ python2 q.py
(s,t) = ('(s,t) =', '\nprint s,(s,t),t') 
print s,(s,t),t
   
+
-
edit
 

Balancer

администратор
★★★★★
HolyBoy> Но привязано к версиям.

Не к версиям, а к языку. Python3 != Python ;)
   
+
-
edit
 

Mishka

модератор
★★★
Balancer> Не к версиям, а к языку. Python3 != Python ;)
Тогда можно сказать, что любая версия любого языка не есть язык. Что Java, что C, что C++, что C#, что Jovial, что Ada,... :P
   
+
-
edit
 

Balancer

администратор
★★★★★
Mishka> Тогда можно сказать, что любая версия любого языка не есть язык.

Это просто проекция «почти мема» (как «KDE4 != KDE», «Gnome3 != Gnome» и т.д.). Python3 до сих пор весьма не любят из-за поломанной совместимости. И в любом приличном дистрибутиве либо основным до сих пор стоит 2.x, либо есть выбор. Python3 по умолчанию и без альтернатив только в совсем гиковских дистрибутивах, типа Arch'а используется :)



Обычно в языках, всё же, стараются оставлять поддержку старых версий в новых, снося только совсем уже obsolete фичи. Тут же поломали много именно в базовом функционале.
   
+
-
edit
 
Решение на C/С++ тривиально, хотя есть траблы с #include, плюс ещё и отступы не сохраняются.

Решение подказал мне мой опыт работы с большими enum'ами, когда их требовалось объявить, замапить их имена в виде строк в массив по индексу плюс ещё экспортировать в lua_State.

code.h


#include "stdio.h"
INCLUDE(#include "stdio.h")
EMPTY_LINE()
LINE(int min(int a, int b))
LINE({)
LINE(    return a < b ? a : b;)
LINE(})
EMPTY_LINE()
LINE(int main(int argc, char * argv[]))
LINE({)
LINE(    int a;)
LINE(    int b;)
LINE(if(argc < 3))
LINE({)
LINE(    return -1;)
LINE(})
LINE(    sscanf(argv[1], "%d", &a);)
LINE(    sscanf(argv[2], "%d", &b);)
LINE(    int result = min(a, b);)
LINE(    return result;)
LINE(})


main.cpp


// SelfPrintC.cpp : Defines the entry point for the console application.
//

//#define PRINT_CODE //uncomment to run the program

#ifdef PRINT_CODE
int main(int argc, char * argv[])
{
	#define LINE(l) printf("%s\n", #l);
	#define INCLUDE(hdr) printf("%s\n", #hdr);
	#define EMPTY_LINE() printf("\n");
	#include "code.h"
	return 0;
}
#else
#define LINE(l) l
#define INCLUDE(hdr)
#define EMPTY_LINE()
#include "code.h"
#endif
   

в начало страницы | новое
 
Поиск
Настройки






Статистика
Рейтинг@Mail.ru
АвиаТОП
 
Яндекс.Метрика
website counter
 
free counters