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

кто короче?
 
US Сергей-4030 #19.10.2011 19:39
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Вот, вчера было нефиг делать, вспомнил, как писать сабж и написал на java (раньше только на Си писал). Однако, в силу всяких причин, на Java даже короче получается. Получилась 31 "честная" строка (т.е. каждый оператор - в своей строке, закрывающие скобки - в своей строке). При этому сохраняется "нормальная" структура программы, операторы/функции - с соответствующими отступами. Кто сможет сделать короче? :)

Исходный текст. Не смотреть пока не напишете свой! [показать]


PS В Интернете не подглядывать. ;) Я не подглядывал.
 14.0.835.20214.0.835.202
Это сообщение редактировалось 19.10.2011 в 19:46
KZ TEvg #20.10.2011 13:21  @Сергей-4030#19.10.2011 19:39
+
-
edit
 

TEvg

аксакал

админ. бан
А как это вообще возможно?
Прописать путь к исходнику, открыть файл и вывести на экран?
 3.6.133.6.13

Balancer

администратор
★★★★☆
TEvg> А как это вообще возможно?

О! Надо же. Даже про Женю уже можно сказать «вот и выросло поколение», не только не решавшее этой классической задачи, но даже не слышавшей про неё :D

TEvg> Прописать путь к исходнику, открыть файл и вывести на экран?

Нет. И даже нельзя пользоваться, скажем, программой с командой LIST на Бейсике. И пустая программа тоже решением не является :)



Сам баловался когда-то, писал такие для Бейсика, Форта и Си. Хотя до рекордсменов, конечно, далеко :)



Куайн (программирование) — Википедия


Куайн (программирование)
Материал из Википедии — свободной энциклопедии
(Перенаправлено с Quine)
Перейти к: навигация,
поиск
У этого термина существуют и другие значения, см. Куайн.


// Дальше —
ru.wikipedia.org
 
 

TEvg

аксакал

админ. бан
Balancer> Нет. И даже нельзя пользоваться, скажем, программой с командой LIST на Бейсике. И пустая программа тоже решением не является :)

Ну принцип опишите. Можно например читать свой же машкод загруженный в память, но это не исходник. Можно получить путь к исполняемому файлу и открыть рядом файл с таким же названием, но с расширением исходника и отобразить его. А иначе - и не представляю.
 3.6.133.6.13

Balancer

администратор
★★★★☆
TEvg> Ну принцип опишите.

Я же дал ссылку выше на Википедию, где рассмотрены примеры на куче языков.

TEvg> Можно например читать свой же машкод загруженный в память

Нет, никакой памяти, никаких файлов. Только печать.
code c
  1. #include<stdio.h>
  2. char*i="\\#include<stdio.h> ",n='\n',q='"',*p=
  3. "%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m=
  4. "int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
  5. ;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}
 
+
0 (+1/-1)
-
edit
 

TEvg

аксакал

админ. бан
Посмотрел примеры - фуууу, отстой.
Пишут свой код в строке а потом выводят его два раза. Бред.
 3.6.133.6.13
US Mishka #20.10.2011 15:04  @Сергей-4030#19.10.2011 19:39
+
-
edit
 

Mishka

модератор
★★☆
Сергей-4030> Вот, вчера было нефиг делать, вспомнил, как писать сабж и написал на java (раньше только на Си писал).
Эх, что было. На Алголе68, ЕМНИП, 132 символа. Ещё спорили тогда надо ли рассматривать строку длинее 80, как 2 строки.
 
US Сергей-4030 #20.10.2011 16:56  @Mishka#20.10.2011 15:04
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Mishka> Эх, что было. На Алголе68, ЕМНИП, 132 символа. Ещё спорили тогда надо ли рассматривать строку длинее 80, как 2 строки.

Не, фигней типа укорачивать идентификаторы и проч. я не занимался. Это тривиально.
 14.0.835.20214.0.835.202
US Сергей-4030 #20.10.2011 16:59  @TEvg#20.10.2011 14:36
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
TEvg> Посмотрел примеры - фуууу, отстой.
TEvg> Пишут свой код в строке а потом выводят его два раза. Бред.

А вы сами до этого додумались? От вас идеи были - "читать файл с кодом" и проч. Между прочим, кроме того, что "вывести свой код в строке", там есть еще одна проблема, решить которую вовсе не так тривиально. Лично я из опыта знаю, что программистов, которые действительно решили задачку - процентов максимум пять.
 14.0.835.20214.0.835.202
RU Balancer #20.10.2011 17:03  @Сергей-4030#20.10.2011 16:59
+
-
edit
 

Balancer

администратор
★★★★☆
Сергей-4030> Лично я из опыта знаю, что программистов, которые действительно решили задачку - процентов максимум пять.

Так много? :) Боюсь, что процентов пять — это из «старого поколения».
 
US Сергей-4030 #20.10.2011 17:03  @Balancer#20.10.2011 14:35
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Balancer> Нет, никакой памяти, никаких файлов. Только печать.

Кстати, приведенное решение мне представляется некрасивым. Писать код в строчку без разделителей - фу. %( Тем более, что правильное форматирование тоже в какой-то степени усложняет задачу.
 14.0.835.20214.0.835.202
US Сергей-4030 #20.10.2011 17:05  @Balancer#20.10.2011 17:03
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Сергей-4030>> Лично я из опыта знаю, что программистов, которые действительно решили задачку - процентов максимум пять.
Balancer> Так много? :) Боюсь, что процентов пять — это из «старого поколения».

Да, пожалуй. Включая программистов VBA и PL/SQL, наверное, доли процента получатся.
 14.0.835.20214.0.835.202
US Сергей-4030 #20.10.2011 17:08  @Сергей-4030#20.10.2011 17:03
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Balancer>> Нет, никакой памяти, никаких файлов. Только печать.
Сергей-4030> Кстати, приведенное решение мне представляется некрасивым. Писать код в строчку без разделителей - фу. %( Тем более, что правильное форматирование тоже в какой-то степени усложняет задачу.

Кстати, а зачем там return ! printf ? Почему не написали return printf и не сэкономили еще два байта?
 14.0.835.20214.0.835.202
+
-
edit
 

Balancer

администратор
★★★★☆
Попытался нагуглить свой старый вариант на Форте. Он был интересен тем, что позволял вводить в программу любой функционал. То есть, кроме собственно, печати своего текста, программа могла ещё делать что угодно :) Навскидку не нашёл. Но наткнулся на обсуждения этой темы 13-летней давности :)

 
US Сергей-4030 #20.10.2011 17:24  @Balancer#20.10.2011 17:12
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Balancer> Попытался нагуглить свой старый вариант на Форте. Он был интересен тем, что позволял вводить в программу любой функционал. То есть, кроме собственно, печати своего текста, программа могла ещё делать что угодно :)

А чего там? По-моему, это довольно тривиально, разве нет? Даже если не на Форте.

Balancer>Навскидку не нашёл. Но наткнулся на обсуждения этой темы 13-летней давности :)

Я свои первые программы такого рода примерно тогда же писал. Ну, может, года на еще 4-5 пораньше.
 14.0.835.20214.0.835.202
US Mishka #20.10.2011 17:31  @Сергей-4030#20.10.2011 17:03
+
-
edit
 

Mishka

модератор
★★☆
Сергей-4030> Кстати, приведенное решение мне представляется некрасивым. Писать код в строчку без разделителей - фу. %( Тем более, что правильное форматирование тоже в какой-то степени усложняет задачу.
Дык, на Алголе-68 есть строки, вырезки и прочая фигня. Там описание переменной с инициализацией тривиально. Т.е. описание основы, а программа тоже основа, переменной и вывод — вполне на одну строчку из двух "операторов" (на самом деле основ) и тянет.
 7.0.17.0.1
US Mishka #20.10.2011 17:34  @Сергей-4030#20.10.2011 17:08
+
-
edit
 

Mishka

модератор
★★☆
Сергей-4030> Кстати, а зачем там return ! printf ? Почему не написали return printf и не сэкономили еще два байта?

Не, не подходит. У printf возвращается количество байтов напечатанное. И 0, как правило, означает ошибку. А main работает наоборот — 0 возвращается в случае успеха.
 7.0.17.0.1
MD Wyvern-2 #20.10.2011 17:42  @Balancer#20.10.2011 14:19
+
-
edit
 

Wyvern-2

координатор
★★★☆
☠☠
TEvg>> А как это вообще возможно?
Balancer> О! Надо же. Даже про Женю уже можно сказать «вот и выросло поколение», не только не решавшее этой классической задачи, но даже не слышавшей про неё :D

Соотвественно НЕ читавшие "Этюды" Уэзерелла, слыхом не слыхавшие про Дейкстру и его задачу про вагоны, определяющую профпригодность программистов %( Если учитывать, что сейчас практически ФСЁ проектируется/моделируется на компах, а работа с любой программой суть "программирование" - то скоро будем таки опасатся дятлов....
Жизнь коротка, путь искусства долог, удобный случай мимолетен, опыт обманчив.... Ἱπποκράτης  3.0.193.0.19
US Сергей-4030 #20.10.2011 18:01  @Mishka#20.10.2011 17:34
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Mishka> Не, не подходит. У printf возвращается количество байтов напечатанное. И 0, как правило, означает ошибку. А main работает наоборот — 0 возвращается в случае успеха.

Это понятно, но в задаче нет спецификации "возвратить непременно код выполнения "успех". :)
 14.0.835.20214.0.835.202
KZ TEvg #21.10.2011 06:36  @Сергей-4030#20.10.2011 16:59
+
-
edit
 

TEvg

аксакал

админ. бан
Сергей-4030> А вы сами до этого додумались? От вас идеи были - "читать файл с кодом" и проч.

Это некрасивая идея и некрасивое решение. А я не люблю такие задачи. Уж лучше действительно свой файл прочитать. Или написать на асме дизасемблер, прочитать свой загруженный код в памяти и конвертнуть его в исходник. Это было бы красиво.
 3.6.133.6.13
US Сергей-4030 #21.10.2011 08:37  @TEvg#21.10.2011 06:36
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
Сергей-4030>> А вы сами до этого додумались? От вас идеи были - "читать файл с кодом" и проч.
TEvg> Это некрасивая идея и некрасивое решение. А я не люблю такие задачи. Уж лучше ... Это было бы красиво.

Это было бы тривиально. Читать исходный текст сможет каждый, а соображать - не каждый. Некоторые любят нетривиальные задачки.
 14.0.835.20214.0.835.202
US Mishka #22.10.2011 00:56  @Сергей-4030#20.10.2011 18:01
+
-
edit
 

Mishka

модератор
★★☆
Сергей-4030> Это понятно, но в задаче нет спецификации "возвратить непременно код выполнения "успех". :)
Тогда можно использовать особенность C — там три разных прототипа main — один без параметров и с возвратом void — return не нужен совсем. :)
 7.0.17.0.1

Mishka

модератор
★★☆
TEvg> Это некрасивая идея и некрасивое решение.
Это задачка на понимание рекурсии. Глубокое понимание. И как и где её остановить.
 7.0.17.0.1

AXT

инженер вольнодумец

quine задачи компьютеры программирование техника
Mishka> Это задачка на понимание рекурсии. Глубокое понимание. И как и где её остановить.

Как сказать. Понятно, что идея заключается в том, чтобы засунуть исходный текст программы в саму программу, а точнее — её исходный текст. Но общепринятые варианты сводятся к одноуровневой конструкции (начало программы)(текст программы в удобном для печати виде)(конец программы). Так что от принципа остаётся немного :)

Кстати, прочитав топик, вертел всё это дело в голове, и внезапно придумалась сверхнаглядная конструкция на Питоне:

code python
  1. (s,t) = ('(s,t) =', '\nprint s,(s,t),t')
  2. print s,(s,t),t


Погуглил - в первой двадцатке выдачи python+quine ничего похожего нет, видимо я таки изобретатель :)
 7.0.17.0.1
US Сергей-4030 #17.11.2011 07:59  @Sandro#17.11.2011 06:53
+
-
edit
 

Сергей-4030

исключающий третье
★☆
админ. бан
AXT> Кстати, прочитав топик, вертел всё это дело в голове, и внезапно придумалась сверхнаглядная конструкция на Питоне:

Вы уверены, что у вас с кавычками все правильно?
 15.0.874.12015.0.874.120

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