Disclaimer: Não, este não é um desafio de piada para reverter uma string.
Tarefa
Há apenas uma operação para suportar: subtração ( -
).
Você também tem apenas dois átomos para suportar: zero ( 0
) e um ( 1
).
Aqui, a notação de prefixo -AB
é equivalente à notação de postfix AB-
, onde A
e B
são expressões.
Sua tarefa é (recursivamente) converter uma expressão na notação de prefixo em seu equivalente na notação postfix.
Definições
Uma expressão na notação de prefixo é gerada pela seguinte gramática:
S > -SS
S > 0
S > 1
Uma expressão na notação postfix é gerada pela seguinte gramática:
S > SS-
S > 0
S > 1
Exemplo
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Regras e liberdade
- Você pode renomear a operação e os átomos para qualquer caractere, desde que seja consistente.
- O formato de entrada deve ser consistente com o formato de saída (além do fato de que a entrada está na notação de prefixo e a saída está na notação de postfix).
Caso de teste
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Testcas fornece créditos ao Dada .
Respostas:
brainfuck , 32 bytes
Experimente online!
Eu usei
@
como operação, porque seu ponto de código (64) é conveniente.U
também é possível com a mesma contagem de bytes, usando 3 * 85 + 1 = 256 = 0.Explicação
A fita é usada como uma pilha. Em cada iteração do loop principal, o ponteiro de dados inicia duas células à direita da parte superior da pilha.
fonte
Retina ,
373029 bytesExperimente online! Economizei 7 bytes ao perceber que os termos sempre começam com um dígito, para que eu não precise mais limitar a correspondência aos últimos
-
(anteriormente era o único garantido a ser seguido por dois termos). Economizou 1 byte não colocando-
s em sua própria linha. Por exemplo,-01
torna-se-0¶1
qual é então substituído por01-
. Agora, se eu tiver,--010
ou seja--0¶1¶0
, quero mudar o interior-0¶1
para01-
para poder substituir o-01-¶0
com01-0-
, mas na verdade não importa qual dos dois-
s removo, removo o que está no início da linha, como isso é mais fácil de testar.fonte
-0-0-00
deve se tornar0000---
.Haskell ,
6259 bytesExperimente online! Uso:
fst.f $ "--01-0-01"
.0
e1
podem ser caracteres arbitrários que são maiores que o caractere-
.Edit: -3 bytes graças ao Zgarb!
A função
f
analisa recursivamente uma expressão e retorna uma tupla dessa expressão na notação postfix e na string restante, seguindo a gramática simples a partir da qual expressões de prefixo válidas podem ser construídas:Se o primeiro caractere
a
da string de entrada for maior que-
, estaremos em uma expressão atômica e retornaremos uma tupla de uma string com o caracterea
e o restante da string de entrada.Se encontrarmos a
-
, duas expressões precisam ser analisadas. Isso pode ser obtido(a,x)<-f r
para obter a primeira expressãoa
e, em seguida, analisarx
novamente(b,c)<-f x
a sequência restante para obter a segunda expressãob
e a sequência final restantec
.(a,(b,c))<-f<$>f r
faz exatamente isso porque<$>
nas tuplas mapeia uma função dois, o segundo elemento de uma tupla, sendo três bytes menor que(a,x)<-f r,(b,c)<-f x
. Depois de obter as duas expressões e a corda resto, as expressões são concatenados e um "-" é acrescentado:(a++b++"-",c)
.fonte
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)
quando procurei uma versão com os dois casos combinados, que é um byte mais longo.Haskell, 54 bytes
A função
v
pega uma string e uma função, reorganiza a subexpressão inicial e aplica a função ao restante da string até que tudo tenha sido reorganizado. A pilha de chamadas e o argumento da função juntos acompanham qual expressão está sendo analisada. A funçãoh
responde ao desafio e év
chamada de si mesma como um primeiro argumento fictício.fonte
v f l=l
se você a mover em segundo.v id
.last
truque em um byte.Perl 5 , 57 bytes
Eu uso
x
como operador em vez de-
(veja o link TryItOnline abaixo).Experimente online!
Explicações:
/x((?0)|.)((?0)|.)/
corresponde recursivamente a uma expressão completa: ax
no início, depois uma expressão(?0)
(é uma chamada recursiva) ou um átomo (.
), seguido por outra expressão-ou-átomo.Então, preciso salvar a segunda expressão / atom (
my$n=$2;
), porque, caso contrário, as chamadas recursivas a substituirão.A função é chamada recursivamente na primeira expressão (
f($1)
), depois na segundaf($n)
e nox
é anexada no final (.x
).fonte
Python 3,
1171121051009876626159 bytesChangelog:
!=
para>
(-1 byte, copiado da sugestão de @ovs)Use-o assim:
fonte
return
lambda x:p(x)[0]
provavelmente poderia substituir suaf
função.else
, acho.d="-"
realmente salvar bytes?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
para 59 bytesPitão, 20 bytes
Isso cria uma função
y
que espera uma string como parâmetro.Experimente on-line: Demonstration or Test Suite
Explicação:
A função
y
analisará e converterá a primeira expressão de prefixo em uma expressão de postfix. Portanto, se for chamado assim,y"10"
ele retornará apenas1
.fonte
Retina ,
343129 bytesExperimente online!
;
são usados para indicar nós, que são compostos inicialmente por um único número e aumentam para qualquer coisa que já tenha sido analisada.-
são transformadas em novas linhas, para que.+
possamos pegar qualquer coisa que não seja analisada-
.fonte
Perl 6 , 45 bytes
Experimente online!
fonte