Задача за познавачи
Автор |
|
kookkiВто, 07.12.10, 09:02 |
Кодовете за С++ от втория линк на Vesov, така и не могат да се компилират. Dev гърми хиляда и сто грешки. Които не успях да коригирам. Текста от страницата не го четох, че ме домързя, но ще видя какво са написали все пак. | | boy4oВто, 07.12.10, 11:42 |
Примера на С от втория линк на Vesov успях да компилирам след като изтрих новия ред след първия ред: char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
main(){printf(f,34,f,34,10);} |
Доколкото схващам, използвана е хитрината, че може да се присвои стойност на променлива извън изпълнимата част на програмата, присвояването става на етапа на компилация и така се избягва зацикляне на функцията printf(). В този смисъл имам питане към Каката (виждам, че никът й още не е посинял...). Изискването за самоотпечатване само до изпълнимия код ли се отнася, или до целия текст на програмата? Защото, ако е само до изпълнимия код, няма да е никакъв проблем да се копира текстът само на изпълнимата част в оператор/и DATA на Basic, например. Това би бил неизпълним код, вътрешни данни и изискването не би се отнасяло до такива данни. Тогава решението може да се обобщи до всички езици, допускащи такова представяне на данните. Както е случаят със заглавните блокове в Паскал или с предопределените в неизпълним клас на Java и С++ константи. | | vesovВто, 07.12.10, 12:28 | | | boy4oВто, 07.12.10, 13:15 |
Много полезни примерчета. Наистина човек може да научи много за напълно непознати езици само от няколко реда, стига тези редове да решават заплетен проблем. Но, доколкото схващам, това са решения на класическата постановка на задачата. Докато в началото Каката беше посочила допълнителни ограничения в смисъл да се използват само конструкции, които не са част от програмната среда. Тогава много от тези примери отпадат. Също и ако оператори DATA и подобни на тях не се допускат, ще отпаднат още повече. | | phrozencrewВто, 07.12.10, 18:47 | RE: Задача за познавачи
” Още едно по достъпно разглеждане на проблема, илюстрирано с примери на почти всички практически използваеми езици за програмиране. http://rosettacode.org/wiki/Quine „
Е то това, нали не беше правилно решение, щото нали се сещаш, че: ” Не върви да извикаш команда TYPE на ДОС-а да изпечата текста „
А в тия Quine-та има точно това: Което е същото като няколко други примери.... ъ-ъ-ъъ FileRead, quine, %A_ScriptFullPath%
MsgBox % quine |
И ако тия по-горните са верни, то тогава и аз съм познал вярното решение още в началото :
” Щото иначе е много тъпо решението. Примерно: <?php
echo file_get_contents('selfreader.php');
?> |
„
В крайна сметка задачата се оказа много лесна! | | кака.лараВто, 07.12.10, 21:46 |
” В крайна сметка задачата се оказа много лесна! „ Абе нали за това са добавени допълнителни ограничения. Да не се използват външни за езика средства. Иначе всеки който не го мързи ще погледне н и-нета и е готов. Като помислиш това echo file_get_contents('selfreader.php'); какво прави? Използва записа на файла през OS. Ама става дума да не използва външни данни и файлове. Сещаш ли се, че записът на програмата във във файла и самата програма различни неща? Записът е външен за програмата. Щом ще използваш външния запис, трябва да изкараш и него на екрана, и да изкараш и целия код на OS дето ти го изкарва, и да изкараш и... нали се сещаш Същото и за въпроса на boy4o. Само още по-плетено. Не става да използваш DATA-оператори. Те може да изглеждат неизпълними, ама с тях се манипулира при изпълнението. Може да местиш програмно точката на четене в DATA-пула. Това директно значи, че целия пул е изпълним. Или ако който му е кеф, да го мисли като RAM-базиран външен файл. Както ще да го гледаш си иска да бъде разпечатан. Друга работа за данни вкарани по време на компилация. Компилирането не е изпълнение. Точно затова стана дума, че шапките на паскалските програми са разрешени. Шапките на С/С++ също. Абе всичко, което не се изпълнява и не може да се тълкува като външно спрямо изпълнимия код става. | | phrozencrewВто, 07.12.10, 22:01 | RE: Задача за познавачи
” Абе нали за това са добавени допълнителни ограничения. Да не се използват външни за езика средства. Иначе всеки който не го мързи ще погледне н и-нета и е готов. Като помислиш това echo file_get_contents('selfreader.php'); какво прави? Използва записа на файла през OS. Ама става дума да не използва външни данни и файлове. Сещаш ли се, че записът на програмата във във файла и самата програма различни неща? Записът е външен за програмата. Щом ще използваш външния запис, трябва да изкараш и него на екрана, и да изкараш и целия код на OS дето ти го изкарва, и да изкараш и... нали се сещаш „
Пич, сещаш ли се, че се правиш на глупав. Има ли значение дали ще посоча файл или ще използвам възможностите на език за програмиране да изпише текущия си изпълним файл. Това колко е по различно според теб??? <?php
echo file_get_contents(__FILE__);
?> |
Що си говорим глупости вече три страници? | | кака.лараВто, 07.12.10, 22:40 |
Ти барем няма за какво да се правиш на глупав, пичПроменливата __FILE__ е системна за интерпретатора. А че програмата има достъп до нея не я прави част от програмата. Използват се външни данни от интерпретатира. Не виждаш ли, че нарочно е въведено това ограничение да не се използват никакви такива номера пич. Иначе на BASIC направо пишеш 10 LIST. "LIST" си е команда на интерпретара, нищо че може да се извика при изпълнение. Външна е за програмата. Въпросът е да се намери чистото решение, без хитруване пич *** Древен, не съм казала, че задачата непременно трябва да има практическо приложение. Не, че няма. Виж поста на Фрози. Може точно тука да бърка, но в някаква ситуация може да излязат много полезни неща от това. За шитнята с мехурчето си прав. Има си неща дето им е минало времето. Никой днеска не пали огън с търкане на пръчки. Ама точно преди малко гледах на Яя поста за Чомски. Това ти е направо жив пример точно за тая задача за само-описваща се програма. В теорията на генеративните граматики Чомски тръгва точно от нея и открива само-генериращите се граматики. Едно дето намира механизма как се променят естествените езици. Друго дето от тая теория тръгва обектното програмиране. Абе номерът е такъв. Първо кретените измислят нещо кретенско. После дебилите го използват за нещо дебилско. Накрая накрая идиотите прибират парите на кретените и дебилите | | phrozencrewСря, 08.12.10, 07:20 | RE: Задача за познавачи
” Ти барем няма за какво да се правиш на глупав, пичПроменливата __FILE__ е системна за интерпретатора. А че програмата има достъп до нея не я прави част от програмата. Използват се външни данни от интерпретатира. Не виждаш ли, че нарочно е въведено това ограничение да не се използват никакви такива номера пич. „
При тъпото условие и примерите, дето се дадоха: @echo off type %~0и FileRead, quine, %A_ScriptFullPath% MsgBox % quineПич какво ли означават според теб %~0 и %A_ScriptFullPath% ? Между другото ето вариант и на BASH: | | electric_ccСря, 08.12.10, 07:52 |
Тук много прилягат думите на един мой даскал (в уважителен смисъл): Рекох да река, после си помислих дали да река, ама хайде рекох да река, защото после другите ще рекат рече да рече, ама нищо не рече. * Кака Лара, ти май пишеш по десетопръстната система. в бързината вместо "в" си написала "н". Задачата е нерешима, ако програмата по време на работа използва оператори от типа $include. Иначе колко му е да четеш модулите и да ги печаташ. Ако няма ограничение да се печата само заредения в паметта текст, примерно решение, което печата всички модули на Microsoft Basic може да бъде: Dim a$ Dim p$ a$ = Dir$(".BAS") Do If Instr(Ucase$(a$), ".BAS") > 0 Then Open a$ For Input as #1 Line Input #1, P$ Close Print P$ end if a$ = Dir$ loop Until a$ = "" Този фрагмент трябва да се запише в началото на програмата. След като напечата текста тя ще заработи според предназначението си. | | Коментар |