Це виклик для гольфу з кодом, за допомогою якого вам потрібно розробити програму, яка діє як квінка або кволка, яка модифікує себе, щоб ілюструвати машинне навчання.
Фон
Існує основна програма штучного інтелекту під назвою "гра в панголін", яка описана тут . Основні ідеї полягають у тому, що програма при першому запуску запитує:
Добре, будь ласка, придумайте щось
Це панголін?
Ви можете відповісти:
Так
У такому випадку він говорить:
Добре. Це було так легко.
Або якщо ні, це говорить:
Ой. Ну ви виграєте тоді - Що ви думали?
Ви можете сказати:
собака
На яке б це сказало
Будь ласка, дайте мені питання про собаку, щоб я міг сказати різницю між собакою і панголіном
ви можете відповісти
Чи їсть мурах?
Потім він запитав:
Яка відповідь на собаку?
До якого ви б сказали
ні
І сказало б
Спасибі
Наступного разу, коли він запускається, він би задав питання вище, і створив бинарне дерево таких питань.
Змагання
Досить фону. Це завдання полягає в написанні самомодифікуючої програми панголіну. Правила такі:
Вихід програми (як описано вище) повинен бути
STDERR
. Остаточна відповідь завжди буде "Добре. Це було так легко". або "Спасибі". Після цього він повинен вивести або поточну версію програми, або нову версію програми, яка включає питання доSTDOUT
. Жодна відповідь, написана мовою, яка не підтримує написанняSTDOUT
таSTDERR
читання з неї,STDIN
не буде дійсною.Іншими словами, під UNIX ви можете викликати програму так:
приклад:
$ mylanguage myprogram > myprogram.1
[dialog goes here]
$ mylanguage myprogram1 > myprogram.2
[dialog goes here]
- Програма повинна використовувати саме вказані підказки (оскільки скорочення підказок не виявляє навичок). Підказки (без лапок і де% s заміщені) наступні:
список:
"OK, please think of something"
"Is it %s?"
"Good. That was soooo easy."
"Oh. Well you win then -- What were you thinking of?"
"Please give me a question about %s, so I can tell the difference between %s and %s"
"What is the answer for %s?"
"Thanks"
Очікуючи відповідей "так / ні", ваша програма повинна прийняти
y
абоyes
в будь-якому випадку "так",n
абоno
в будь-якому випадку "ні". Що ви робите з невідповідними входами, залежить від вас. Наприклад , ви можете вирішити , прийняти будь-яку відповідь , який починається зy
абоY
як «так», і нічого іншого , як немає.Ви можете припустити, що назви поставлених речей та запитань складаються лише з літер ASCII, цифр, пробілів, дефісів, знаків запитань, коми, крапки, колонки та крапки з комою, тобто вони відповідають наступному регулярному вираженню
^[-?,.;: a-zA-Z]+$
. Якщо ви зможете впоратися з більш ніж цим (особливо цитування символів на обраній вами мові), ви можете бути саморобним, але не набирайте зайвих балів.Ваша програма не може прочитати або записати будь-який файл ( за винятком
STDIN
,STDOUT
іSTDERR
), або з мережі; зокрема він не може ні читати, ні записувати власний код з диска. Її стан необхідно зберегти в самому програмному коді.Коли програма запускається і правильно відгадує відповідь, вона повинна виконуватись точно як квінт, тобто вона повинна записувати в
STDOUT
точно свій код, без змін.Коли програма запускається і неправильно відгадує відповідь, вона повинна кодувати надане нове запитання та відповідь у своєму власному коді та записувати його
STDOUT
у свій власний код, щоб вона могла розрізнити оригінальну здогадку та наданий новий об’єкт у крім розрізнення всіх раніше заданих об’єктів.Ви повинні вміти справлятися з декількома послідовними запусками програмного забезпечення, щоб вони дізналися про багато об'єктів. Дивіться тут приклади декількох прогонів.
Тестові запуски наведені за посиланням у голові (очевидно, що охоплює лише діалогове вікно
STDIN
таSTDERR
діалог).Стандартні лазівки виключаються.