Esse desafio está relacionado a alguns dos recursos da linguagem MATL, como parte do evento de linguagem do mês de maio de 2018 . Desafio associado : Área de transferência de funções: colar .
Introdução
O MATL possui várias pranchetas , nas quais é possível armazenar valores (cópia) para serem recuperados posteriormente (colar). Algumas áreas de transferência são automáticas , o que significa que a cópia é automaticamente acionada por determinados eventos. Esse desafio se concentra em uma das pranchetas automáticas, denominada área de transferência de entrada de função ou simplesmente área de transferência de função .
Essa área de transferência armazena as entradas nas quatro chamadas mais recentes para as funções normais de captação de entradas. Funções normais são o tipo mais comum de funções no MATL. Entrada de entrada significa que a função recebe pelo menos uma entrada (funções que não recebem entrada não são consideradas pela área de transferência da função).
Isso é melhor explicado com os seguintes exemplos, que usam duas funções normais:
+
, que exibe dois números da pilha e aumenta sua soma.U
, que exibe um número e empurra seu quadrado.
Exemplo 1 :
3 2 + 6 + 12 4 U + +
produz o resultado 39
. O código é interpretado da seguinte maneira:
- Literais numéricos como
3
ou12
são empurrados para a pilha - Funções como
+
acionar suas entradas e enviar suas saídas para a pilha.
As chamadas de função, em ordem cronológica, são:
3 2 +
dá5
5 6 +
dá11
4 U
dá16
12 16 +
28
11 28 +
dá39
.
A área de transferência pode ser vista como uma lista de quatro listas. Cada lista interna contém as entradas para uma chamada de função, com as chamadas mais recentes primeiro . Dentro de cada lista interna, as entradas estão em sua ordem original .
Então, depois de executar o código, o conteúdo da área de transferência é (em notação Python):
[[11, 28], [12, 16], [4], [5, 6]]
Exemplo 2 :
10 20 U 30 +
deixa números 10
e 430
na pilha. A pilha é exibida de baixo para cima no final do programa.
As chamadas de função são
20 U
dá400
400 30 +
dá430
Como houve apenas duas chamadas de função, algumas das listas internas que definem a área de transferência estarão vazias . Observe também como 10
não é usado como entrada para nenhuma função.
Assim, o conteúdo da área de transferência após a execução do código é:
[[400, 30], [20], [], []]
Exemplo 3 (inválido):
10 20 + +
é considerado inválido, porque +
falta uma entrada para a segunda (em MATL, isso implicitamente acionaria a entrada do usuário).
O desafio
Entrada : uma sequência S com números literais +
e U
separados por espaços.
Saída : o conteúdo da área de transferência função após analisar a string S .
Esclarecimentos:
- Você pode usar quaisquer dois símbolos consistentes para representar essas funções, exceto dígitos. Além disso, você pode usar qualquer símbolo consistente como separador, em vez de espaço.
- Somente as duas funções indicadas serão consideradas.
- A sequência de entrada conterá pelo menos um número literal e pelo menos uma função.
- Todos os números serão inteiros positivos, possivelmente com mais de um dígito.
- É possível que alguns literais numéricos não sejam utilizados por nenhuma função, como no exemplo 2.
- A entrada é garantida como um código válido, sem a necessidade de números adicionais. Portanto, uma string como no exemplo 3 nunca ocorrerá.
- O rastreamento de listas internas vazias na saída pode ser omitido. Portanto, o resultado no exemplo 2 pode ser
[[400, 30], [20]]
- Qualquer formato de saída razoável e inequívoco é aceitável. Por exemplo, uma cadeia com vírgula como separador interno e vírgula como separador exterior:
400,30;20;;
.
Regras adicionais:
A entrada e a saída podem ser obtidas por qualquer meio razoável .
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas .
O menor código em bytes vence.
Casos de teste
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
[[28, 11], [16, 12], [4], [6, 5]]
saída é válida para o primeiro exemplo?M
?M
. Farei isso no desafio "colar"Respostas:
05AB1E , 20 bytes
Experimente online!
-4 graças a Emigna (assim como -8 graças a ele me atualizando sobre regras).
a
b
fonte
Bash , 43 bytes
Experimente online!
Isso imprime a área de transferência no seguinte formato, observe o uso de \ x0F como separador.
A idéia principal é passar isso para dc, um idioma baseado em pilha, de forma que os itens de pilha necessários sejam impressos.
A entrada é canalizada para sed, onde todos
+
são substituídosrdnFPrp+
, o que em dc imprime o segundo número na pilha, seguido por \ x0F e, em seguida, o número superior antes de realizar a adição. sed também substitui todosU
comp2^
, imprimir o elemento superior da pilha e quadrado dele.O resultado do sed é avaliado como código dc, imprimindo a área de transferência inteira.
Como as linhas estão na ordem inversa,
tac
(reversacat
) é usada para corrigir isso.E, finalmente, o sed escolhe as 4 primeiras linhas do tac.
fonte
Python 2 , 126 bytes
Experimente online!
fonte
Haskell ,
113109 bytesA primeira linha define uma função anônima que leva uma corda, por exemplo
"3 2 + 6 + 12 4 U + +"
, e retorna uma lista de listas de ints:[[11,28],[12,16],[4],[5,6]]
. Experimente online!fonte
Limpo , 140 bytes
Experimente online!
No estilo Clean clássico, é a solução Haskell, exceto cerca de 50% a mais.
fonte
JavaScript (ES6), 107 bytes
Recebe a entrada como uma lista composta por números inteiros
'+'
e'U'
. Retorna outra lista que consiste em números inteiros, matrizes de 2 números inteiros e'_'
para slots vazios.Experimente online!
Comentado
fonte
Go,
305303295 bytesForam eliminados 8 bytes graças a @ovs
Experimente online!
fonte
Oitava , 206 bytes
Experimente online!
Se apenas o Octave tivesse uma
pop
sintaxe.m
é a área de transferência da memória,t
a pilha.fonte
m
et
ao contrário, adicionando elementos à frente e não ao fim?Python 3 ,
218204 bytes-14 bytes graças a ovs
Experimente online!
fonte
Vermelho ,
335330 bytesExperimente online!
Mais legível:
fonte
R ,
205182 bytesExperimente online!
M
é a área de transferência da memória,P
é o programa eS
é a pilha.Tecnicamente,
S
é inicializado como um vetor que contém um único zero, mas como nunca recebemos uma entrada inválida, ele me salva um byte deS={}
.fonte
C (gcc) , 264 bytes
Usei a recursão para poder usar a pilha de funções como a pilha de dados: a lista de entrada é percorrida e as operações são executadas: os resultados são exibidos em ordem inversa, com os impulsos de pilha não exibidos.
A pilha é implementada como uma lista vinculada. Veja como funciona:
Originalmente, usei uma estrutura para os nós, mas mudei para ponteiros simples para economizar espaço. Um recurso interessante dessa lista vinculada é que ela se limpa quando a recursão é concluída.
Experimente online!
fonte