Мета цього завдання - (врешті-решт) вивести всі можливі програми зупинки мовою на ваш вибір. Спочатку це може здатися неможливим, але ви можете це зробити дуже ретельним вибором порядку виконання.
Нижче наведена діаграма ASCII для ілюстрації цього. Нехай стовпці представляють нумерацію кожної можливої програми (кожна програма - це кінцева кількість символів з кінцевого алфавіту). Нехай кожен рядок являє собою особливий крок у виконанні цієї програми. X
Представляють виконання в виконанні цієї програми в той час кроку.
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
Як ви можете сказати, програми 2 і 4 не зупиняються. Якби ви виконували їх одночасно, ваш контролер застряг би у нескінченному циклі, який є програмою 2, і ніколи не виводить програми 3 і далі.
Натомість ви використовуєте підхід до доробки . Букви представляють можливий порядок виконання перших 26 кроків. В *
s місця , де ця програма була зупинена і виводиться. В .
s кроки , які не були виконані ще.
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
Вимоги до цільової мови
Мова цілі (мова, що інтерпретується паралельно) повинна бути повною Тьюрінгом. Окрім цього, це може бути будь-яка мова, яка завершує Тьюрінг, включаючи підмножини Тюрінга з більш великими мовами. Ви також можете інтерпретувати речі, такі як правила циклічних тегів. Вам також дозволено створити мову для тестування, доки ви не зможете показати, чому він є повним Тьюрінгом.
Наприклад, якщо ви вирішили протестувати мозковий ебать, найкраще протестувати лише []-+<>
підмножину, оскільки введення не підтримується, а вихід просто викидається (див. Нижче).
Якщо мова йде про програму "контролер" (яку ви займаєтеся гольфом), особливих вимог немає. Застосовуються звичайні мовні обмеження.
Як створити нескінченний список програм
Більшість мов програмування може бути представлена у вигляді серії символів з кінцевого алфавіту. У цьому випадку перераховувати список кожної можливої програми порівняно легко в порядку збільшення довжини. Алфавіт, який ви використовуєте, повинен відповідати вимогам цільової мови. У більшості випадків це друкується ASCII. Якщо ваша мова підтримує Unicode як додаткову функцію, не слід перевіряти кожну можливу комбінацію символів Unicode, лише ASCII. Якщо ваша мова використовується лише []-+<>
тоді, не випробовуйте різні комбінації символів ASCII "коментувати". Такі мови, як APL, мали б свої власні алфавіти.
Якщо ваша мова найкраще описується якось не алфавітним способом, наприклад, Fractran або Turing Machines, то існують і інші не менш дійсні методи формування списку всіх можливих дійсних програм.
Інтерпретація постійно зростаючого списку програм
Ключова частина цього завдання полягає в тому, щоб написати паралельного перекладача для зростаючого списку програм. Для цього є кілька основних кроків:
- Додайте до списку обмежену кількість програм
- Інтерпретуйте кожну програму зі списку окремо протягом певного періоду часу. Це можна досягти, виконавши один крок інструкцій для кожного. Збережіть усі штати.
- Видаліть зі списку всі програми, що завершують / викидають помилки
- Виведіть чисто зупинені * програми
- Додайте до списку ще кілька програм
- Моделюйте кожну програму по черзі, підбираючи виконання старих програм там, де вона припинилася
- Видаліть зі списку всі програми, що завершують / викидають помилки
- Виведіть чисто зупинені * програми
- повторити
* Ви повинні виводити лише ті програми, які чисто зупиняються. Це означає, що не було жодних синтаксичних помилок або невиконаних винятків, кинутих під час виконання. Програми, які вимагають введення, також повинні бути припинені без виведення їх. Якщо програма видає вихід, ви не повинні її припиняти, просто киньте вихід.
Більше правил
- Ви не повинні породжувати нові теми, щоб містити тестовані програми, оскільки це вивантажує роботу паралелізації на хост ОС / інше програмне забезпечення.
- Редагувати: щоб закрити майбутні лазівки, вам не дозволяється
eval
(або будь-яка пов’язана функція) частини коду перевіреної програми. Ви можетеeval
блокувати код з коду перекладача. (Відповідь BF-in-Python все ще діє у цих правилах.) - Це код-гольф
- Мова, в яку ви пишете свою заявку , не повинна відповідати мові, яку ви тестуєте / випускаєте.
- Ви повинні припустити, що наявна пам’ять не обмежена.
- Підтверджуючи повноту Тьюрінга, ви можете припустити, що введення жорстко кодується в програму, а вихід може бути прочитаний з внутрішнього стану програми.
- Якщо ваша програма виводить себе, ймовірно, це неправильно або поліглот.
"If your program outputs itself, it is probably wrong or a polyglot."