Учитывая ввод программы, написанной в oOo CODE , выведите код BF, который он представляет.
Вот краткое описание того, как работает oOo CODE:
Сначала удаляются все не алфавитные символы (все, что не в диапазоне
A-Za-z
).Например, возьмите программу
PROgRam reVERsES giVeN iNPut sEqUENcE
(пример, приведенный на вики-странице esolangs, который делает именно то, что вы ожидаете). После этого первого шага мы теперь имеемPROgRamreVERsESgiVeNiNPutsEqUENcE
.Далее, разделите все оставшиеся символы на группы по 3. Теперь мы имеем
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Если есть конечная группа из 1 или 2 символов, откажитесь от нее.Преобразуйте каждую группу из 3 букв в команду BF на основе следующей таблицы:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
То есть, если первая буква группы в нижнем регистре, вторая в верхнем регистре, а третья в нижнем регистре, она будет преобразована в команду
[
.В нашем примере это, наконец, программа BF
,[>,]<[.<]+
, которая действительно меняет свой ввод.
Поскольку это код-гольф , победит самый короткий код в байтах.
Тестовые случаи:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
источник
Ответы:
ооо,
15691515 байтДолжно быть сделано. Попробуй это здесь .
Golfed:
Переведено на Brainfuck (с разрывами строк для ясности):
Разгромленный с объяснением:
Спасибо за интересный вызов!
источник
CJam,
3635 байтПроверьте это здесь.
объяснение
источник
JavaScript (ES6),
949391858483 байтаСохранено 1 байт благодаря @ dev-null
Я попробовал много вариантов этого, но это, кажется, самый короткий. Также работает на пустой ввод!
Как это устроено
Во-первых, с помощью
x.replace(/[a-z]/gi,c=>
, мы находим взять каждую буквуc
на входе. Мы устанавливаемa
иb
в""
на другом конце вызова функции, так как функция игнорирует все параметры мимо второго.a
сохранит двоичную строку для определения того, какой символ мы в настоящее время делаем, иb
сохранит результат.Теперь для запутанной части: во-первых, с
(a+=+(c<'a'))
, мы добавляем0
к,a
еслиc
это в верхнем регистре;1
в противном случае. Это выражение возвращает новое значениеa
, поэтому мы можем проверить , если он достиг трех символов длины с проверкой , если символ с индексом 2 существует:[2]?
. Если нет, то мы просто закончить функцию с:0
.Если
a
теперь это три символа, это двоичное число между000
и111
. Мы можем преобразовать это в десятичное число, добавив"0b"
в начало, а затем заставив движок проанализировать его как число с'0b'+a-0
.Тем не менее, нам все еще нужно сбросить
a
пустую строку. Мы не можем просто сделать,'0b'+(a="")-0
потому что это будет означать, что проанализированная строка является просто0b
. К счастью, когда анализируется как число, пустая строка становится равным 0, так что мы можем заменить0
с(a="")
.Теперь у нас есть наш номер, и мы можем только добавить символ в этой позиции индекса в
"><[]-+.,"
кb
. После замены мы используем ее&&b
для возврата из функции. (Ну, если результат.replace
не пустой, что происходит только при пустом вводе и в любом случае возвращает пустую строку.)источник
'0b'+a-0
vs+`0b${a}`
и+("0b"+a)
replace
выигрывает в конце концов!match
тропе ...05AB1E ,
3532 байтаКод:
Используя очень умный трюк от Мартина Бюттнера, из этого ответа . Объяснение:
Попробуйте онлайн!
Использует кодировку CP-1252 .
источник
Retina ,
79757170 байтСпасибо randomra за сохранение 1 байта.
Попробуйте онлайн!
объяснение
Мы начинаем с удаления всего, что не является буквой.
Это разбивает строку на куски из трех символов, возвращая все (не перекрывающиеся) трехсимвольные совпадения. Это автоматически отбрасывает любой неполный трейлинг-чанк.
Добавить
;
к каждой строке. Мы будем использовать это как маркер для преобразования base-2. Говоря об этом, мы будем просто обрабатывать заглавные буквы как1
и строчные как0
.Это делает забавное преобразование базы-2 в одинарное. На каждом шаге мы просто удваиваем символы слева от
;
и перемещаем;
один вправо. Почему это работает? Помните, что мы будем интерпретировать нижний регистр как0
и верхний регистр как1
. Всякий раз, когда мы обрабатываем букву, мы просто удваиваем промежуточную сумму (слева) до сих пор - двойные строчные буквы являются справедливыми2*0=0
, поэтому их можно полностью игнорировать, а заглавные буквы пока представляют двоичное число, поэтому их удвоение что мы хотим. Затем мы добавляем текущее письмо к той промежуточной сумме, которая представляет0
или1
соответственно.Удалите все строчные буквы / нули.
Сопоставьте каждую строку и замените ее на (десятичное) количество символов в этой строке. Благодаря
;
этому унарное число превращается в десятичный эквивалент +1.Транслитерация, которая заменяет 1-8 соответствующей командой.
Удалить перевод строки.
источник
;
. Я отредактирую это позже.MATL ,
3832 байтаПопробуйте онлайн!
источник
Japt,
3736 байтПроверьте это онлайн!
Как это устроено
источник
JavaScript (ES6),
11195 байтПросто удаляет не-буквы, преобразует буквы в верхнем регистре в 1 и строчные в 0, делит на группы по три, игнорирует завершающую группу 1 или 2 и декодирует группы.
Редактирование: благодаря @ dev-null сохранено 16 байт, хотя код больше не работает, когда передается пустая строка.
источник
match(/.../g).map().join
подход, но не учел количество байтов, и хотя это ничего не спасло. Спасибо за отзыв о первом матче.Python 3, 91 байт
Хм ... выглядит немного длиннее, особенно вторая строка.
b=[b,2*b+(c<'a')][c.isalpha()]
немного хуже, хотя.источник
Pyth, 40 байт
Попробуй это здесь!
Может сохранить 2 байта, если я могу вывести результат в виде списка символов вместо строки.
объяснение
Отфильтровывает все не-буквы, преобразует прописные буквы в 1 и строчные в 0, разбивает на блоки по 3, интерпретирует каждый кусок как двоичное число и использует его как индекс в строке, содержащей все команды BF.
источник
Джольф,
3134 байтаПопробуй это здесь! Заменить
►
на\x10
и♣
с\x05
. Поскольку я неправильно реализовал функцию chop, я получаю 3 байта. :(источник
Хун , 212 байт
Ungolfed:
У Hoon нет правильных регулярных выражений, только библиотека комбинатора синтаксического анализатора, поэтому, к сожалению, он довольно многословен. Сканирование ++ также дает сбой, если весь входной поток не анализируется, поэтому я должен использовать ++ rose, принудительно преобразовать его в единицу и развернуть для получения значения «самый дальний анализ». Кроме того, он интенсивно используется для каррирования и отображения списков (поворот ++), поэтому я присваиваю псевдонимы функций переменным из одной буквы.
Hoon - это язык программирования для Urbit, проекта переопределения с чистого листа. Он чисто функциональный, статически типизированный, похожий на шепот и компилируется в Nock. Nock - это основанная на комбинаторе виртуальная машина, которая работает поверх модели памяти двоичного дерева bignum.
Когда вы загружаете Urbit, вы попадаете в: dojo, shell и Hoon repl. Чтобы запустить фрагмент, просто наберите:
а затем вставьте автономную функцию в следующую строку.
источник
Желе , 27 байт
Попробуйте онлайн! Обратите внимание, что обратная косая черта должна быть экранирована во входной строке для второго последнего контрольного примера.
источник
Matlab, 98 байт
источник
Perl,
767372 + 1 = 73 байтаТребуется
-n
флаг:Используя трюк с преобразованием базы-2 .
Как это устроено:
источник
Юлия, 107 байт
Это анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, присвойте его переменной.
Ungolfed:
источник
Луа, 120 байт
Большое использование
string.gsub()
здесь, еще один раз мог бы позволить мне создать односимвольный указатель на эту функцию, чтобы получить несколько байтов. Кроме того, это моя первая программа lua без пробелов! : DЭта программа получает свой ввод через аргумент командной строки и выводит программу BrainFuck, по одной команде на строку.
Редактировать: 1 байт сохранен благодаря @ Олегу Волкову
Унгольф и объяснения
источник
b
и еще один при сохраненииstring.gsub
в более короткую переменную var и вручную сложить в нее первые аргументы:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 байт
Постараюсь в гольф это больше.
источник
Mathematica, 192 байта
Анонимная функция, которая принимает желаемую строку в качестве аргумента. Шаги (довольно простой) алгоритм:
источник
Рубин
1171141131118679 байтtr(?^+m='a-zA-Z','')
устанавливает m в'a-zA-Z'
и удаляет не буквы.tr(m,?0*26+?1)
преобразует строчные в 0, прописные в 1.scan(/.../)
чанк строки в группы по 3 и отбросить последнюю группу, если она имеет менее 3{$><<"><[]-+.,"[$&.to_i 2]}
преобразовать каждое двоичное число в символисточник
tr("a-zA-Z","01")
? или дажеtr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
дает111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 байт). Изменен параметр ввода из командной строки на стандартный ввод; исправил окружающие кавычки в выводе (но теперь у него нет завершающего символа новой строки)tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
КорочеPerl 6, 81 байт
Это, вероятно, можно сделать лучше, но это мой путь
использование
Ungolfed
источник
C ++,
173167 байтПолная программа, игра в гольф (читает со стандартного ввода):
Несколько не одураченный
Обратите внимание , что
@A
...Z[
в ASCII, а также для`a
...z}
.источник
Japt v2.0a0
-P
, 27 байтСохранено 3 байта благодаря @Shaggy
Попробуй
источник
Пайк, 31 байт, неконкурентоспособен
Пайк старше, чем задача, но я добавил некоторые функции, чтобы сделать его более конкурентоспособным - функция чанка. Я использовал тот же трюк, что и @Martin Büttner .
Попробуй это здесь!
источник
JavaScript, 148 байт
источник
TI-BASIC,
311288 байтЧто, нет ответов TI-BASIC? Время для меня, чтобы это исправить!
Ввод - код oOo в
Ans
.Выход - переведенный код BF .
Примеры:
Без игры в гольф:
(добавлены новые строки и комментарии)
Примечания:
источник