download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Задача за познавачи

<1 2 3 4 >

Автор
Съобщение
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
Още едно по достъпно разглеждане на проблема, илюстрирано с примери на почти всички практически използваеми езици за програмиране.
http://rosettacode.org/wiki/Quine
boy4o
Вто, 07.12.10, 13:15
Много полезни примерчета. Наистина човек може да научи много за напълно непознати езици само от няколко реда, стига тези редове да решават заплетен проблем.
 
Но, доколкото схващам, това са решения на класическата постановка на задачата. Докато в началото Каката беше посочила допълнителни ограничения в смисъл да се използват само конструкции, които не са част от програмната среда. Тогава много от тези примери отпадат.
 
Също и ако оператори DATA и подобни на тях не се допускат, ще отпаднат още повече.
phrozencrew
Вто, 07.12.10, 18:47

RE: Задача за познавачи

” Още едно по достъпно разглеждане на проблема, илюстрирано с примери на почти всички практически използваеми езици за програмиране.
http://rosettacode.org/wiki/Quine
Е то това, нали не беше правилно решение, щото нали се сещаш, че:
” Не върви да извикаш команда TYPE на ДОС-а да изпечата текста
А в тия Quine-та има точно това:
@echo off
type %~0

Което е същото като няколко други примери.... ъ-ъ-ъъ
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-базиран външен файл. Както ще да го гледаш си иска да бъде разпечатан.

Друга работа за данни вкарани по време на компилация. Компилирането не е изпълнение. Точно затова стана дума, че шапките на паскалските програми са разрешени. Шапките на С/С++ също. Абе всичко, което не се изпълнява и не може да се тълкува като външно спрямо изпълнимия код става.

редактиран от кака.лара на 07.12.10 21:47
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" си е команда на интерпретара, нищо че може да се извика при изпълнение. Външна е за програмата. Въпросът е да се намери чистото решение, без хитруване пич

***
Древен, не съм казала, че задачата непременно трябва да има практическо приложение. Не, че няма. Виж поста на Фрози. Може точно тука да бърка, но в някаква ситуация може да излязат много полезни неща от това.

За шитнята с мехурчето си прав. Има си неща дето им е минало времето. Никой днеска не пали огън с търкане на пръчки. Ама точно преди малко гледах на Яя поста за Чомски. Това ти е направо жив пример точно за тая задача за само-описваща се програма. В теорията на генеративните граматики Чомски тръгва точно от нея и открива само-генериращите се граматики. Едно дето намира механизма как се променят естествените езици. Друго дето от тая теория тръгва обектното програмиране.

Абе номерът е такъв. Първо кретените измислят нещо кретенско. После дебилите го използват за нещо дебилско. Накрая накрая идиотите прибират парите на кретените и дебилите

редактиран от кака.лара на 07.12.10 23:33
phrozencrew
Сря, 08.12.10, 07:20

RE: Задача за познавачи

” Ти барем няма за какво да се правиш на глупав, пич

Променливата __FILE__ е системна за интерпретатора. А че програмата има достъп до нея не я прави част от програмата. Използват се външни данни от интерпретатира. Не виждаш ли, че нарочно е въведено това ограничение да не се използват никакви такива номера пич. „

При тъпото условие и примерите, дето се дадоха:
@echo off
type %~0

и
FileRead, quine, %A_ScriptFullPath%
MsgBox % quine

Пич какво ли означават според теб %~0 и %A_ScriptFullPath% ?

Между другото ето вариант и на BASH:
cat $0

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$ = ""

Този фрагмент трябва да се запише в началото на програмата. След като напечата текста тя ще заработи според предназначението си.

редактиран от electric_cc на 08.12.10 07:57

<1 2 3 4 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.