Зайнятий мозковий бобер


13

Напишіть мозкову програму, що містить не більше 256 символів, яка виконує якомога більше кроків, але не обмежується нескінченно. Програма може не приймати жодного вводу.

Більш конкретно:

  • Припустимо нескінченну кількість комірок праворуч.
  • <Чи не коли в крайній лівій клітинці робить нічого.
  • A, -коли значення комірки дорівнює нулю, встановлює клітинку на 255.
  • Усі інструкції +-<>.вважаються одним кроком при виконанні.
  • Якщо a [або ]зустрічається, він вважається одним кроком. Однак, якщо умова істинна , і потік управління стрибки, відповідні ]або [зовсім НЕ знову розраховувати як крок.
  • Виграє рішення, яке робить найбільш кроків.
  • Якщо у вашому рішенні є якась закономірність, оцінюється надання функції, скільки кроків nбуде тривати подібна програма довжини , але не є обов'язковою.
  • Для підрахунку інструкцій можна скористатися цим модифікованим перекладачем :

Приклад:

++[-]

Зустрічаються інструкції є ++[-]-], і програма виконувалась 7 етапів.


6
Я був би здивований, якщо переможець припиняється, не переповнюючи кількість перекладача. Майте на увазі, що 6-штатний бомб ТМ займає щонайменше 10 ** 36534 кроків.
Пітер Тейлор

Я згоден. Здається, велика ймовірність, що ви можете написати програму BF <50 char, яка може працювати протягом років. Я почну.
captncraig

Підписано. Сторінка дослідження "Зайнятий Бівер" за адресою drb.insel.de/~heiner/BB є дуже цікавою, особливо той факт, що програми запису працюють надзвичайно довго і вони все ще мають точні результати (див. Drb.insel.de/~heiner/BB/bb -xlist.txt ) - симуляції запам'ятовують стани, будують "макроси", щоб зберегти кроки моделювання тощо
schnaader

4
@AntonGolov: на жаль, у цьому Всесвіті оперативні пам’яті та HD-диски не перетворюються на нескінченні пристрої зберігання даних, коли ви намагаєтесь зберігати на них бінтуми розміром більше 256 ^ у байтах ...
перестали повертати проти годинника,

1
@boothby Це цілком можливо зробити точні обчислення за участю трансценденталів на сучасних комп'ютерах. Компоненти значень просто повинні зберігатися в більш абстрактному зображенні, ніж звичайні floatабо doubleпримітиви, що використовуються для загальних повсякденних обчислень. (В цей момент комп'ютер здебільшого просто маніпулює рядками, що представляють рівняння)
AJMansfield

Відповіді:


15

Ось програма з 41 символом, яка врешті-решт зупиняється, залишаючи більше 10 ↑ (10 ↑ 28) суміжних комірок, встановлених рівним 1 (тому кількість виконаних інструкцій набагато більша, ніж це):

>+>+>+>+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]

Якщо я не помиляюся, це правильний переклад наступної програми мовою BF-варіанту, яка використовує один біт для кожної комірки пам'яті (тобто вміст комірки 0..1 замість 0..255, тому "+" діє, щоб просто перевернути бітове значення):

>+>+>+>+[+>[>]+[+>[>]+[+>[>]+[<]+<]+<]+<]

Точне значення (кількість суміжних 1-біт), вироблене останньою програмою, становить

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


Вищеописана програма ініціалізує та обчислює функцію, яка зростає як 2 ↑↑ x (у позначенні стрілки Кнут ). Аналогічне перетворення варіанту-програми BF, яка ініціалізує та обчислює функцію, яка зростає як 2 ↑ 23 x, забезпечує наступну 256-символьну програму:

>+>+>+>+>+>+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+

який врешті-решт зупиняється, залишаючи більше 2 ↑ 23 6 сусідніх комірок, встановлених рівним 1 (тому кількість кроків надзвичайно більше).

NB-1 : 2 ↑ 23 6 - число "немислимо велике"; наприклад, навіть 2 ↑ 4 6 = 2 ↑↑↑↑ 6 вже перевершує перший додаток (3 ↑↑↑↑ 3) у послідовності, що використовується для обчислення числа Грема .

NB-2 : Я думаю, що, ймовірно, 256 символів вистачить програмі BF, щоб ініціалізувати та обчислити функцію з виведенням, значно більшим за число Грема - якщо я знайду час, можливо, я спробую написати її.

Примітка-3 : Якщо когось цікавить походження вищезазначених програм, ось деякі програми програмування для "Brainf * ck F" з різними програмами, написаними в Python. ("Brainf * ck F", або просто "F", це те, що я назвав варіантом "Тюрінга", повним розмовою Smallf * ck . пов'язана веб-сторінка - це лише «файловий кабінет» - детальну дискусію щодо вищевказаних програм див. у файлі Busy_Beavers.txt.


На даний момент це явний переможець (якщо я тільки не занижую інших). Більше пропозицій дуже вітаються, але я зазначу це як прийняте зараз. Якщо хтось не погоджується, будь ласка, прокоментуйте.
Антон Голов

Коли ви досягнете цього рівня, стає нереально вважати, що у вас є перекладач з нескінченною пам'яттю. Я починаю вважати, що це буде кращим завданням з обмеженою обертовою пам’яттю, щоб ми могли реально виконати відповіді.
captncraig

9

Ось приємний 39 символів:

-[>-[>-[-[>+<-]<[>+<-]<[>+<-]>>>]<-]<-]

В основному він робить «сани» на 3 просторих місця, які рухаються вправо, і зменшуються по одній. Виконано в 31,919,535,558 інструкцій, при цьому внутрішня петля виконується 256 ^ 3 рази. У мене ще достатньо місця, щоб розширити цей досить далеко зі швидкістю 14 символів на інший порядок до часу виконання.

Працює на будь-якому перекладачі з необмеженою пам'яттю або з обгортковою пам'яттю.

Я залишаю читачеві вправу визначити, коли закінчиться покращена версія на 2 петлі:

-[>-[>-[>-[>-[-[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]>>>>>]<-]<-]<-]<-]

Зараз він пробіг протягом ночі, і це понад 3 000 000 000 кроків. Досі не пройшов через єдину ітерацію зовнішньої петлі. Ледь зробив це через 15% другого циклу.


2

Ця програма працює в нескінченній кількості комірок. Два значення ініціалізуються на початку зі значеннями ascii 255. Перше значення при першому обертанні основного циклу розбивається на комірку 255 і вони ініціалізуються з 255 у кожному, при другому обертанні основного циклу кожне значення в 255 осередках знову розбивається до 255 * 255 комірок, таким же чином для 255 обертання основної петлі загальна кількість ініціалізованих комірок складе 255 ^ 255. Друге значення визначає, скільки разів повинна повторюватися основна петля.

>->>-[<<[<]>[[[>]>>>[>]-[<]<<<[<]>-]>]>[>>[>]>+<<[<]<-]>>[>]>-]

2

Ця програма майже така ж, як і моя попередня програма, відмінність полягає в тому, що значення, що визначають зовнішній цикл, залишається фіксованим у певній комірці, тому і кількість ініціалізованих комірок, і загальна кількість кроків в кінці програми можуть бути збільшені

->>-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]

комірки, ініціалізовані в кінці програми 255 ^ 255

-[>-[>->>[-]-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<-]<-]

комірки, ініціалізовані в кінці програми 255 ^ 255 ^ 3

Далі я змінив його для виконання ще більшої кількості кроків.

->>>->>-<<<<<[>>>[>]<[[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<[>>>[[<+>-]>]<<[<]]<]>>>>[[<<+>>-]>]<-<<[<]<<-]

він ініціалізує 255 ^ 255 комірок під час першого обертання основних 255 ^ (255 ^ 255 * 255) комірок під час другого обертання головної петлі 255 ^ {255 ^ (255 ^ 255 * 255) * 255} осередків під час третього обертання основної петлі в таким чином петля повторюється 255 разів


Виглядає здорово! Вибачте за те, що ще не прийняли відповідь - мені доведеться трохи поглянути на них та визначити порядок зростання. Коли ви говорите «255 ^ 255 * 255», ви маєте на увазі «255 ^ (255 * 255)»? (Я б очікував "255 ^ 256" в іншому випадку.)
Антон Голов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.