Este desafio foi publicado como parte do desafio do LotM de abril de 2018
Brain-Flak é uma linguagem turp-tarpit que ganhou bastante fama aqui no PPCG. A memória da língua é composto por duas pilhas, mas um "escondido" terceira pilha foi descoberto por Wh e na Wizard , levando a algumas novas formas interessantes de pensar programas Brain-Flak.
Então, que tal dar mais visibilidade à pobre terceira pilha escondida? Vamos criar uma linguagem em que a terceira pilha tenha o reconhecimento que merece! Aqui eu apresento o Terceiro Flak .
O idioma
No Third-Flak, existe apenas uma pilha, chamada terceira pilha. Operadores trabalham no terceiro pilha da mesma forma que fazem em Brain-Flak, mas aqui não há []
, {}
, <>
nilads e nenhuma {...}
mônada (assim os personagens única admissível em um terceiro programa-Flak são ()[]<>
). Aqui está o que cada operador faz (exemplos serão apresentados representando a terceira pilha com uma lista em que o último elemento é o topo da pilha):
()
é o único operador de dois caracteres no Third-Flak. Aumenta o topo da terceira pilha em 1. Exemplo:[1,2,3]
→[1,2,4]
(
,[
,<
: Todos os parênteses abertura que não estão abrangidos pelo processo anterior empurrar uma0
para a terceira pilha. Exemplo:[1,2,3]
→[1,2,3,0]
)
aparece dois elementos da terceira pilha e empurra sua soma. Exemplo:[1,2,3]
→[1,5]
]
exibe dois elementos da terceira pilha e empurra para trás o resultado da subtração do primeiro da segunda. Exemplo:[1,2,3]
→[1,-1]
>
aparece um elemento da terceira pilha. Exemplo[1,2,3]
→[1,2]
E aqui estão as outras regras da linguagem:
No início da execução, a terceira pilha contém apenas um único 0.
É proibido ter vazio
[]
ou<>
dentro de um programa (eles seriam noops de qualquer maneira se seguissem a semântica do Third-Flak, mas na verdade eles têm um significado diferente no Brain-Flak que não é possível recriar aqui).Os parênteses sempre precisam ser equilibrados, exceto pelo fato de que os parênteses finais no final do programa podem estar ausentes. Como exemplo,
[()<(()
é um programa Third-Flak válido (e a terceira pilha no final do programa seria[1,0,1]
).Um programa pode conter apenas os seis caracteres permitidos
()[]<>
. Os programas são garantidos como não vazios.
Nota: está implícito nas regras anteriores que você não precisará lidar com situações em que precisa sair de uma pilha vazia.
O desafio
Simples, escreva um intérprete para o Third-Flak. Seu programa deve ter como entrada um programa Third-Flak e retornar como saída o estado da terceira pilha no final do programa.
Seu formato de saída é flexível, desde que seja possível ler de forma inequívoca o estado da terceira pilha e o mesmo número sempre é codificado da mesma maneira (esta é apenas uma maneira de dizer que qualquer formato de saída que não seja flagrante tentar trapacear é bom).
Sua escolha de saída pode restringir o intervalo de números que você pode gerenciar, desde que isso não trivialize o desafio (já que isso seria uma brecha padrão ).
Casos de teste
Para cada caso de teste, a primeira linha é a entrada e a segunda linha, a pilha de saída representada como uma lista de números separados por espaço, onde a parte superior da pilha é o último elemento.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
fonte
[()]
quebra a regra de que não precisa se preocupar com popping de uma pilha vaziae
está aqui .Respostas:
Flak cerebral , 276 bytes
Experimente online!
Você tinha que saber que isso estava por vir.
fonte
Retina 0.8.2 ,
644846 bytesExperimente online! Produz a pilha de baixo para cima. Funciona apenas com números inteiros não negativos e o último caso de teste é muito lento; portanto, o link inclui apenas três casos de teste. Explicação: A pilha precede implicitamente o programa, portanto, ele inicia como uma sequência vazia, que representa um único zero. O
()
nilad é transformado em um_
que é usado para contar em unário, enquanto os outros colchetes abertos são transformados em novas linhas que pressionam o zero na pilha à medida que são encontradas. Os colchetes próximos são processados um de cada vez para que a pilha esteja correta; o)
exclui a nova linha anterior, adicionando a parte superior dois elementos em conjunto, a]
elimina o elemento superior e as compara a partir do elemento anterior na pilha subtraindo-se assim, e o>
apenas exclui o elemento superior. Finalmente, a pilha é convertida em decimal. Editar: salvou 2 bytes graças a @Leo.fonte
$3
? (grande resposta, de qualquer maneira!)Python 3 ,
145 144 132 122 116 116104 104 bytes-7 bytes graças a Leo!
E - 5 graças a Lynn!
Experimente online!
Implementação bastante padrão.Agora não é tão legível. Estou decepcionado por não ter conseguido descobrir uma maneira mais curta de verificar entre os parênteses de início e de final.Algumas tentativas de one-liners:
124 bytes (função anônima):
115 bytes (programa completo):
Anexar é irritantemente mais longo que a atribuição simples
fonte
~-']>)'.index(i)
pode ser(2-ord(i)%5)
para salvar 4 bytes.Ruby ,
9891 bytesExperimente online!
Meu código inicial funcionou de maneira semelhante à resposta Python de Jo King, de modo que, antes de percorrer os caracteres de origem, substituímos todas as
()
substrings por outro caractere, como um operador distinto.No entanto, pelo menos em Ruby, descobriu-se que o golfista não fazia isso, mas preferia uma abordagem um pouco mais complicada. Aqui, mantemos um indexador adicional
i
que monitora nossa posição na string de origem e, sempre que um colchete de abertura é encontrado, fazemos uma inspeção visual verificando se nossos caracteres atuais + próximoss[i,2]
formam o()
operador. Nesse caso, pressionamos 1 em vez de 0 no topo da pilha e deixamos o fechamento)
fazer seu trabalho na próxima etapa.fonte
05AB1E , 25 bytes
Experimente online!
Explicação
fonte
SOGL V0.12 , 34 bytes
Experimente aqui!
fonte
R ,
182177 bytesExperimente online!
Retorna a pilha, onde a parte superior da pilha é a primeira e a parte inferior da pilha é a última.
Swaps
()
com7
e, em seguida, calcula os pontos de código mod 8 para obter valores numéricos distintos, que são mais fáceis e Golfier do que trabalhar com strings.É mais golfista trabalhar com o início de um vetor em R, então construímos a pilha dessa maneira.
Em seguida, ele vê um
)
, ou quandok==1
, adiciona um zero extra ao topo da pilha, pois é mais golfista adicioná-lo e removê-lo.fonte
CJam , 29 bytes
Experimente online!
fonte
Ceilão,
285266 bytesExperimente online!
(Economizou 19 bytes devido a uma sugestão de Leo.)
Formatado e comentado:
Experimente online!
fonte