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

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

Balancer

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

Работает:
code text
  1. $ cat axt.py
  2. (s,t) = ('(s,t) =', '\nprint s,(s,t),t')
  3. print s,(s,t),t
  4. $ python axt.py
  5. (s,t) = ('(s,t) =', '\nprint s,(s,t),t')
  6. 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 リレー - まめめも

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


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

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

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

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

HolyBoy

аксакал

Balancer> Работает:

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

code text
  1. $ python3 q.py
  2.   File "q.py", line 2
  3.     print s,(s,t),t
  4.           ^
  5. SyntaxError: invalid syntax
  6.  
  7. $ python2 q.py
  8. (s,t) = ('(s,t) =', '\nprint s,(s,t),t')
  9. 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

code c
  1. #include "stdio.h"
  2. INCLUDE(#include "stdio.h")
  3. EMPTY_LINE()
  4. LINE(int min(int a, int b))
  5. LINE({)
  6. LINE(    return a < b ? a : b;)
  7. LINE(})
  8. EMPTY_LINE()
  9. LINE(int main(int argc, char * argv[]))
  10. LINE({)
  11. LINE(    int a;)
  12. LINE(    int b;)
  13. LINE(if(argc < 3))
  14. LINE({)
  15. LINE(    return -1;)
  16. LINE(})
  17. LINE(    sscanf(argv[1], "%d", &a);)
  18. LINE(    sscanf(argv[2], "%d", &b);)
  19. LINE(    int result = min(a, b);)
  20. LINE(    return result;)
  21. LINE(})


main.cpp

code c
  1. // SelfPrintC.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. //#define PRINT_CODE //uncomment to run the program
  5.  
  6. #ifdef PRINT_CODE
  7. int main(int argc, char * argv[])
  8. {
  9.     #define LINE(l) printf("%s\n", #l);
  10.     #define INCLUDE(hdr) printf("%s\n", #hdr);
  11.     #define EMPTY_LINE() printf("\n");
  12.     #include "code.h"
  13.     return 0;
  14. }
  15. #else
  16. #define LINE(l) l
  17. #define INCLUDE(hdr)
  18. #define EMPTY_LINE()
  19. #include "code.h"
  20. #endif
Воздух выдержит только тех, Только тех, кто верит в себя, Ветер дует туда, куда Прикажет тот, кто верит в себя.  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru