Отказ от ответственности: Нет, это не шутка, чтобы перевернуть строку.
задача
Поддерживается только одна операция: вычитание ( -
).
У вас также есть только два атома для поддержки: ноль ( 0
) и один ( 1
).
Здесь префиксная нотация -AB
эквивалентна постфиксной нотации AB-
, где A
и B
являются выражениями.
Ваша задача (рекурсивно) преобразовать выражение в префиксной нотации в его эквивалент в постфиксной нотации.
Определения
Выражение в префиксной записи генерируется следующей грамматикой:
S > -SS
S > 0
S > 1
Выражение в постфиксной нотации генерируется следующей грамматикой:
S > SS-
S > 0
S > 1
пример
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Правила и свобода
- Вы можете переименовать операцию и атомы в любой символ, если это не противоречит.
- Формат ввода должен соответствовать формату вывода (кроме того факта, что ввод в префиксной записи, а вывод в постфиксной записи).
Прецедент
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Тесты по кредитам Дада .
Ответы:
брейкфук , 32 байта
Попробуйте онлайн!
Я использовал
@
в качестве операции, потому что его кодовая точка (64) удобна.U
также возможно с тем же количеством байтов, используя 3 * 85 + 1 = 256 = 0.объяснение
Лента используется в качестве стека. На каждой итерации основного цикла указатель данных начинается с двух ячеек справа от вершины стека.
источник
Сетчатка ,
373029 байтПопробуйте онлайн! Сэкономили 7 байтов, поняв, что термины всегда начинаются с цифры, поэтому мне больше не нужно ограничивать совпадение последним
-
(ранее это был единственный, за которым следовали два условия). Сохранено 1 байт, не помещая-
s в отдельной строке. Например,-01
становится,-0¶1
который затем заменяется на01-
. Теперь, если у меня есть--010
ИЭ ,--0¶1¶0
то я хочу , чтобы изменить внутреннее ,-0¶1
чтобы01-
так , что я могу заменить-01-¶0
с01-0-
, но это на самом деле не важно , какой из этих двух-
сек я удалю, поэтому я удалить один в начале строки, а это проще для проверки.источник
-0-0-00
должен стать0000---
.Haskell ,
6259 байтПопробуйте онлайн! Использование:
fst.f $ "--01-0-01"
.0
и1
могут быть произвольными символами, которые больше, чем символ-
.Редактировать: -3 байта благодаря Zgarb!
Функция
f
рекурсивно анализирует одно выражение и возвращает кортеж этого выражения в постфиксной нотации и оставшуюся строку, следуя простой грамматике, из которой можно построить допустимые выражения префикса:Если первый символ
a
входной строки больше чем-
, мы находимся в атомарном выражении и возвращаем кортеж строки с символомa
и оставшуюся часть входной строки.Если мы найдем
-
, два выражения должны быть проанализированы. Это может быть достигнуто ,(a,x)<-f r
чтобы получить первое выражение ,a
а затем разобрать часть строкиx
снова ,(b,c)<-f x
чтобы получить второе выражениеb
и окончательную часть строкиc
.(a,(b,c))<-f<$>f r
делает именно это, потому что<$>
на кортежах функция отображает функцию два, второй элемент кортежа, будучи на три байта короче, чем(a,x)<-f r,(b,c)<-f x
. После получения обоих выражений и часть строки, выражения сцепляются и «-» добавляется:(a++b++"-",c)
.источник
f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)
когда я искал версию с обоими случаями вместе, что на байт длиннее.Haskell, 54 байта
Функция
v
принимает строку и функцию, переставляет начальное подвыражение, затем применяет функцию к оставшейся части строки, пока все не будет переставлено. Стек вызовов и аргумент функции вместе отслеживают, какое выражение анализируется. Функцияh
отвечает на вызов и просто вызываетсяv
с самим собой как фиктивный первый аргумент.источник
v f l=l
если вы переместите ее второй.v id
.last
трюк на один байт.Perl 5 , 57 байт
Я использую в
x
качестве оператора вместо-
(см. Ссылку TryItOnline ниже).Попробуйте онлайн!
Пояснения:
/x((?0)|.)((?0)|.)/
рекурсивно соответствует полному выражению: ax
в начале, затем выражение(?0)
(это рекурсивный вызов) или atom (.
), за которым следует другое выражение-или-атом.Затем мне нужно сохранить второе выражение / atom (
my$n=$2;
), потому что в противном случае рекурсивные вызовы переопределят его.Затем функция вызывается рекурсивно в первом выражении (
f($1)
), затем во второмf($n)
иx
добавляется в конце (.x
).источник
Python 3,
1171121051009876626159 байтChangelog:
!=
на>
(-1 байт, скопировано из предложения @ovs)Используйте это так:
источник
return
lambda x:p(x)[0]
может заменить вашуf
функцию.else
, метинкс.d="-"
ли байты действительно?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
на 59 байтPyth, 20 байт
Это создает функцию,
y
которая ожидает строку в качестве параметра.Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
Функция
y
проанализирует и преобразует первое префиксное выражение в постфиксное выражение. Так что, если он называется какy"10"
он вернется только1
.источник
Сетчатка ,
343129 байтПопробуйте онлайн!
;
используются для указания узлов, которые изначально составлены из одного числа, а затем увеличиваются до всего, что уже было проанализировано.-
превращаются в новые строки, так что с помощью.+
мы можем захватить все, что не разобрано-
.источник
Perl 6 , 45 байт
Попробуйте онлайн!
источник