Brainf *** подпрограммы с уникальными выходами

19

Вы должны написать 100-байтовую программу brainfuck длиной BF.

Один символ будет удаляться из него всеми возможными способами из 100 новых (длиной 99 байт) программ. Например , для программы ++.>.на 5 Подпрограммы +.>., +.>., ++>., ++..и ++.>.

Ваша оценка будет равна числу уникальных результатов, которые генерируют 100 программ. Чем выше оценка, тем лучше.

Детали

  • Ваши программы будут прерваны после вывода первого символа.
  • Неверные или не завершающиеся программы и программы, генерирующие пустые выходные данные, не засчитываются в счет.
  • Ячейки BF являются 8-битовыми упаковочными. (255 + 1 = 0, 0-1 = 255)
  • Ваша программа не вводится. Если вы используете ,в коде, он устанавливает текущую ячейку в 0.
  • В левой части исходной позиции нет ячеек. Например <., недействительно, но .<допустимо, поскольку выполнение прекращается в. . Лента не ограничена в другом направлении.
  • Программы с несбалансированными скобками ( [и] ) недействительны.
  • Ваша исходная программа может быть короче 100 байтов, так как ее легко расширить до 100 байтов без изменения оценки.
  • Ваша оригинальная программа не должна быть действительным кодом BF.

Вы можете использовать эту программу python3 (ideone link), чтобы определить оценку вашего ответа. (Для долго работающих программ вам может потребоваться изменитьmaxstep переменную.)

пример

(Для простоты эта программа короче, чем 100 байт.)

Solution: ++,+[-]+><.-,-.

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

В случае ничьей победителем становится тот, у кого код короче. (Ваша программа может быть короче 100 байт, как указано в разделе «Сведения».) Если коды имеют одинаковую длину, победителем становится более ранний пользователь.

Бонусная головоломка: без жирного ограничения вы можете найти программу со счетом 100?

randomra
источник
Я решил бонусную головоломку; ответ (цензура).
AJMansfield
@AJMansfield Не могли бы вы отредактировать свой комментарий, чтобы другие тоже могли подумать о головоломке? Например, измените ваше решение на ссылку pastebin.com, которая содержит ответ.
Рандомра
3
Хм. Я написал генетический оптимизатор для этого вопроса, чтобы попытаться найти микро-улучшения существующих ответов, но пока он не слишком успешен. Они застревают на 79 и 43 соответственно. Ах, хорошо - это стоило того!
wchargin

Ответы:

12

Оценка: 35 41 69 78 79 83

(Удалить перевод строки.)

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

Попробуйте онлайн!

Я не уверен точно, почему это работает ...

Оценка: 79

X->>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>
+>+>+>+>+>+>+>+>+>+>+>+[>[-<+>>+<]+>[-<+>]<<<+]>>.

Попробуйте онлайн!

Он должен подвести 2 * мем [я] * я и добавить количество ячеек (+ константный) где адреса подсчитываются от справа налево. Множитель 2 и количество ячеек позволяют производить удаление + и>, имеющих разную четность.

Это действительно сработало в версии с 69 баллами. Но последняя версия сломала это и получила другое совпадение. Он вычисляет сумму (mem [i] * i + i + 1), а удаление + и> делает почти то же самое, за исключением суммы (i), которая имеет разницу в количестве ячеек, которая также является числом различных выходных данных. для удаления + и>.

Для бонуса:

+. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +.

jimmy23013
источник
Примечание: если вы проверяете это с помощью предоставленной программы для maxstepоценки, убедитесь, что вы увеличили значение (в def evaluate(r,maxstep=20000):), так как некоторые подпрограммы работают долго.
Рандомра
1
На самом деле счет можно увеличить 79, заменив ->+>+> ...на->,>+> ...
BrainSteel
@BrainSteel Я просто изменил его на неоперативный.
jimmy23013
9

Счет: 37 43

+>-,->,+-><->-[>---+-+<[--->>+><,+>>>++<><<<+<[>--]]><><+-+>+<<+<><+++<[[<[---->-<-]>++>],>,]<,]<+-.

РЕДАКТИРОВАТЬ: Теперь моя программа допускает некоторые квадратные скобки. Я не собираюсь выигрывать призы, но это то, что я получаю за то, что некоторые взвешенные ГСЧ выполняют за меня напряженную работу.

Это было сгенерировано программой, которую я написал на C.

Для каждого Nудаленного символа, вот выходные данные:

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

Всего имеется 37 уникальных выходов, которые (в числовом порядке):

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

Я на 90% на 100% уверен, что это решение не оптимально , но доказать, что это может быть чрезвычайно сложно . Есть несколько вещей, которые понятны. Отсутствие .символов до тех пор, пока последний символ не кажется подходящим , а квадратные скобки ( []) кажутся бесполезными. . Я немного подумал здесь, и хотел бы обрисовать следующее:

Позвольте Lбыть длина кода в байтах (в вызове, 100), иn также количество уникальных выходных данных подпрограмм.

Ведь L=3существует несколько оптимальных решений вида +-., где n=2(в этом случае выходные значения равны 1 и 255 для +.и -., соответственно.) Это дает наилучшее соотношение для L = 3at n/L = 66.67%. Обратите внимание, что это соотношение не может быть побито, по крайней мере,L<10 .

Ибо L=10решения достаточно просты, чтобы их перебить. Вот все лучшие решения, по адресу n = 6:

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

Который дает соотношение очков n/L = 60%.

Поскольку L->infinityясно, что отношение должно приближаться к 0, поскольку существует только 255 возможных выходов для потенциально бесконечного L.

Однако соотношение НЕ уменьшается равномерно. Невозможно построить решение для n=6, L=9, поэтому наилучшим из возможных соотношений L=9является 5/9 = 55.56% < 60%.

Возникает вопрос: как быстро и в каком отношении снижается соотношение? Ибо L = 100и на 10^9 checks/secondэто понадобится на несколько порядков больше, чем время жизни вселенной, чтобы найти оптимальное решение. Есть ли элегантный способ сделать это? Я очень сомневаюсь, что это до 37%для L = 100.

Соотношение на самом деле увеличивается, до L=100. Посмотрите другие ответы для подтверждения.

Я хотел бы услышать ваши оценки выше. Я мог быть ужасно неправ, в конце концов.

BrainSteel
источник