Вы должны написать 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?
источник
Ответы:
Оценка:
354169787983(Удалить перевод строки.)
Попробуйте онлайн!
Я не уверен точно, почему это работает ...
Оценка: 79
Попробуйте онлайн!
Он должен подвести 2 * мем [я] * я и добавить количество ячеек (+ константный) где адреса подсчитываются от справа налево. Множитель 2 и количество ячеек позволяют производить удаление + и>, имеющих разную четность.
Это действительно сработало в версии с 69 баллами. Но последняя версия сломала это и получила другое совпадение. Он вычисляет сумму (mem [i] * i + i + 1), а удаление + и> делает почти то же самое, за исключением суммы (i), которая имеет разницу в количестве ячеек, которая также является числом различных выходных данных. для удаления + и>.
Для бонуса:
источник
maxstep
оценки, убедитесь, что вы увеличили значение (вdef evaluate(r,maxstep=20000):
), так как некоторые подпрограммы работают долго.79
, заменив->+>+> ...
на->,>+> ...
Счет:
3743РЕДАКТИРОВАТЬ: Теперь моя программа допускает некоторые квадратные скобки. Я не собираюсь выигрывать призы, но это то, что я получаю за то, что некоторые взвешенные ГСЧ выполняют за меня напряженную работу.
Это было сгенерировано программой, которую я написал на C.
Для каждого
N
удаленного символа, вот выходные данные:Всего имеется 37 уникальных выходов, которые (в числовом порядке):
Я на
90% на100% уверен, что это решение не оптимально, но доказать, что это может быть чрезвычайно сложно. Есть несколько вещей, которые понятны. Отсутствие.
символов до тех пор, пока последний символ не кажется подходящим, а квадратные скобки (. Я немного подумал здесь, и хотел бы обрисовать следующее:[]
) кажутся бесполезными.Позвольте
L
быть длина кода в байтах (в вызове,100
), иn
также количество уникальных выходных данных подпрограмм.Ведь
L=3
существует несколько оптимальных решений вида+-.
, гдеn=2
(в этом случае выходные значения равны 1 и 255 для+.
и-.
, соответственно.) Это дает наилучшее соотношение дляL = 3
atn/L = 66.67%
. Обратите внимание, что это соотношение не может быть побито, по крайней мере,L<10
.Ибо
L=10
решения достаточно просты, чтобы их перебить. Вот все лучшие решения, по адресуn = 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
. Посмотрите другие ответы для подтверждения.Я хотел бы услышать ваши оценки выше. Я
мог бытьужасно неправ, в конце концов.источник