Имея 2 фрагмента кода brainfuck A
и B
, выведите некоторый код brainfuck, C
который работает так же, как работает B
с вводом A
результата s. Обратите внимание, что это C
должно работать для любого ввода, который соответствует следующим предположениям, как если бы он был дан A
.
Вы можете предположить:
- Конечный ввод.
- и A и B останавливаются.
- EOF постоянно 0 или последовательно -1.
- Последовательно разрешать или запрещать клетки слева
- Неограниченная лента (в противном случае требование может быть невозможно)
- Последовательное 8-битное упаковывание или неограниченное целое число
- Ни один поток (вход или выход для A или B) не содержит байта, представляющего EOF
- Код A и B могут содержать символы, которые возможно появляются в вашем C, и
+-[]<>,.
Например (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
действительные тесты
Самый короткий код на каждом языке победит. Победитель в Brainfuck будет принят.
Shortest code in each language win
иShortest Brainfuck solution will be accepted
два разных критерия выигрыша.4.Consistently allow or disallow cells to left
. Ведущий ответ требует, чтобы ячейки слева в ответе работали, но запрещали A, B и C не перемещаться мимо первого байта. В ответах A, B и C. мои ответные индикаторы перемещаются влево. Если правила для моей программы и C могут отличаться от A и B, то я, безусловно, могу значительно сократить свой ответ.>
секунд в начало моего ответа, чтобы он соответствовал более ограниченному аромату (но для гольфа мы должны также рассмотреть альтернативы). Кроме того, мне кажется, что A, B и C должны быть одинакового вкуса друг с другом.Ответы:
брейкфук, 526 байт
отформатирован:
Что касается A, B и C: EOF = 0, ячейки слева от начала не разрешены, 8-битные ячейки переноса.
Ожидает А, а
?
затем Б.Попробуйте онлайн
(Этот ответ можно сделать совместимым с интерпретатором «мозгового потрясения», который не позволяет перейти влево от старта за счет одного байта путем транслитерации
y/<>/></
и добавления а>
).Основная идея состоит в том, чтобы использовать серию замен строк, чтобы смоделировать ленты A и B, используя 2-ячеечные узлы, при этом особое внимание уделяется замене
.
в A и,
B, чтобы промежуточный поток данных сохранялся в блоке ячейки слева от моделируемой ленты. Схема замены строки:Вставить
>>
перед АВ А и В, замените
>
с>[-]+>
и<
с<<
В А заменить
.
на>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Вставить
>[>>]+>
после A и до BВ B заменить
,
на,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
источник
,[>,]<[.<]?,[...,]
вход12345
возвращает111
, даже если достаточно>
раньше?,[>,]<[.<]
не действителен, но>,[>,]<[.<]
есть.)>
s к D.брейкфук , 1287 байт
Попробуйте онлайн!
Вот! Код брейкфук, который составляет два кода брейкфук. Использовать "!" разделить два фрагмента входного кода. Например , сниппета A:
>,[>,]<[.<]
, фрагмент B:,[...,]
. Вход для моей программы:>,[>,]<[.<]!,[...,]
. Не прекратится, если нет "!" найден.По сути, это то же самое, что и моя версия VBA. Сгенерированный код такой же, как и в версии VBA (обратите внимание, что примеры в посте VBA были сделаны до последнего изменения во фрагментах мозгового меха).
объяснение
Это мой исходный код:
источник
>[,>]<[.<]!,[...,]
, поэтому фрагмент А ничего не выводит. Конечно, это должно быть>,[>,]<[.<]!,[...,]
для рабочего примера.VBA,
512489479 байтобъяснение
Код VBA изменяет код brainfuck таким образом, что вывод фрагмента A будет сохранен в списке, а ввод фрагмента B будет считан из этого списка.
Сначала инициализирует некоторые переменные
Затем он читает фрагмент A и заменяет каждый
<
на<<<[+]-<<
, каждый>
на>>>>>>>[+]-<<
каждый.
процедурой храненияпосле этого он удаляет память фрагмента A и вносит изменения в сохраненный список, чтобы его можно было прочитать как ввод для фрагмента B:
Затем будет прочитан фрагмент B, каждый
<
будет заменен на<<<<<
, каждый>
будет заменен на>>>>>
и каждый,
будет заменен процедурой чтения списка:Brainfuck исходный код
Это мой источник фрагментов кода. Я объясню это подробно позже.
Выход для тестового примера 1:
f ",[..,]",",[...,]"
Попробуйте онлайн!
Выход для тестового примера 2:
f ">,[>,]<[.<]",",[...,]"
Попробуйте онлайн!
Выход для тестового примера 3:
f ",.",",."
Попробуйте онлайн!
Сложный тестовый пример: фрагмент A: создайте алфавитный треугольник
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Попробуйте онлайн!Фрагмент кода B: сортировка ввода по возрастанию.
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Попробуйте онлайн!Результат:
Попробуйте онлайн!
источник
Brainfuck , 785 байт
Попробуйте онлайн!
Чтобы разделить A от BI выбрал
/
.Explaination:
Фактический код , который генерирует это только для чтения цикла с флагом для A / B и переключатель , который уменьшает вход для поиска
>
,<
,/
,,
, и.
и в противном случае просто выходной вход. На самом деле это просто транспортер, в котором переносимый код находится внутри структуры данных, так что он не мешает сохраненным данным из A или друг друга./
Просто перемещает активную ячейку в первую неиспользуемую ячейку. Первоначально я очистил его, но это делает программу и вывод больше.Результат программы имеет следующую модель памяти:
c
Является покрошить.cz
Всегда0
указывает, где в моих эмулированных данных BF указатель. Активное значение -1, в то время как все посещенные ячейки будут иметь1
. В операциях вродеaprint
иbread
некоторыеc
приобретают особое значение.Печать A-кода пропускает все ячейки на 1 байт, чтобы освободить место для ввода еще одного байта, который копируется, а резервная копия в следующих байтах рушится и копируется обратно.
Чтение B-кода извлекает ввод из ввода. Здесь деструктивно нормально, и когда вы «читаете» последний байт, вы получаете 0 как EOF независимо от реализации.
Я начинал как расширенный код BrainFuck, дающий результат EBF. Большая часть отладки выполнялась в файлах результатов, а затем обновлялась в источнике, который его сгенерировал. Затем я просто выполнял операции независимо, чтобы получить вывод BF, но я заметил ответ Дориана, который побил меня по длине, поэтому я продолжил игру с источником EBF для уменьшения выхода BF. Исходный код довольно читабелен и прост по сравнению с другими материалами, которые я сделал с ним:
источник
[->+]
в программе C происходит сбой для таких входов, как->->,./,.
, и это можно исправить с помощью[->>+]
(убедившись, что указатель начинается на ячейке с желаемой четностью). Потому что[-<+]
, я думаю, вы можете изменить схему навигации, чтобы полагаться на все выходные данные А, отличные от нуля?->->,.
а B есть,.
, выдает ли ваш предпочитаемый переводчик тот же C, что и TIO, и работает ли C так, как ожидается на вашем переводчике? Потому что это терпит неудачу на TIO . (Я написал это в ответ на комментарий, который сейчас удален.)-1
пользовательские данные, но на самом деле я сделал строку «перейти к активной ячейке, обнулить ее». Я обновил свой ответ, а затем добавил байт: -O, но по крайней мере это работает. КСТАТИ. Если я не использую сканирование для-1
при получении ввода в B, мне придется переместить активный байт с копией,>[-<+]<
и, таким образом, я добавляю больше символов, чем сохраняю, заменяя их+[-<+]-
на[<]
. Если вы не скопируете, вы не сможете узнать, был ли завершен созданный вами байт, и скопировать все байты.[-<+]
было на самом деле также в отношении устранения ошибок (в отличие от сохранения байтов), для ввода, например-./,>++++++[<++++++>-]<.
, который должен печатать,#
а не%
. :) Но я также вижу некоторые возможности для экономии байтов. Удачи! Я постараюсь оптимизировать мое решение с двойной бесконечностью ленты, хотя, смотря на то, что вы сделали, я думаю, что, возможно, правильная бесконечная лента в конечном итоге более удачна.sed, 165 байт
Для ароматов с EOF = 0 ячейки слева от начала не разрешены, 8-битные оберточные ячейки.
Ожидается программа A в первой строке и B во второй строке.
Попробуйте онлайн
При этом используются 2-ячеечные узлы для имитации лент А и В, а выход А занимает непрерывные ячейки слева от самого левого узла.
Альтернативное 173-байтовое решение:
Попробуйте онлайн
Первоначально мой дизайн был основан на вдвойне бесконечной ленте, которая требовала значительно больше работы для перемещения влево (перемещение данных при прохождении за крайнюю левую ячейку, с которой встречались ранее) и перехода от A к B (очистка данных вместо простого прохождения мимо самой правой ячейки ранее встречался).
Спасибо Сильвестру и Дориану за трюки и идеи.
источник
,[..,]
и B программы,[...,]
.s/x/>>/g
в самом конце, но меня больше интересуют улучшения, которые пока сократят вывод.