Não acredito que ainda não tenhamos isso. É uma das estruturas de dados mais importantes da programação, mas ainda assim simples o suficiente para implementá-lo em um código-golfe :
Desafio
Sua tarefa é implementar uma pilha que permita empurrar e estourar números, testar sua implementação e manter a E / S simples, usaremos a seguinte configuração:
- A entrada será uma lista de números inteiros não negativos
Todo número inteiro positivo indica um e todo indica um - descartando o elemento superior. 0 pop ()
- A saída será a pilha resultante
Exemplo
Por exemplo, se :
A saída será:
Regras
- A entrada será uma lista de números inteiros não negativos em qualquer formato de E / S padrão
- você pode usar um número inteiro negativo para indicar o final de um fluxo de números inteiros
- A saída será uma lista / matriz / .. da pilha resultante
- Se você escolher onde o elemento principal estará (no início ou no final), a saída precisa ser consistente
- a saída é flexível (por exemplo, números inteiros separados por novas linhas seriam bons), a única coisa que importa é a ordem
- você pode usar um número inteiro negativo para indicar a parte inferior da pilha
- Você está garantido que nunca haverá um quando a pilha estiver vazia
Exemplos
[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]
Respostas:
MATL , 6 bytes
Entrada é um vetor de linha de números.
A pilha final é mostrada de cabeça para baixo, com o elemento mais recente abaixo.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Java (JDK 10) , 42 bytes
Como "[a] saída é flexível [...], a única coisa que importa é a ordem", isso altera a matriz de entrada em uma
0
matriz terminada. Exemplo:[1,0,2]
retornará o[2,0,2]
que deve ser interpretado como = .[2
,0,2
]
[2]
Experimente online!
Versões prévias:
Java (JDK 10) , 60 bytes
Experimente online!
Créditos:
Se eu posso terminar o programa com erros: 55 bytes
(embora tudo esteja corretamente modificado)
Experimente online!
fonte
>0
pois nunca haverá zero no início da lista (o que implicaria que o topo da pilha estivesse-1
).Sed, 17 bytes
:;s/[0-9]\+,0//;t
-3 bytes graças a @ OMᗺ, -1 graças a @eggyal
Como você nunca deve exibir uma lista vazia, você não precisa de nada além de uma máquina de estados finitos iterada. Expressões regulares são uma ferramenta para construir máquinas de estados finitos e
sed
podem iterar. É uma partida feita no céu.Recebe a entrada do stdin, da seguinte forma:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Produz a pilha no sentido inverso:
[12,101,28]
Pode ser menor em dois bytes se meu local
sed
entender inerentemente as classes de caracteres\d
, mas não por algum motivo.fonte
g
é redundante - economizando 4 bytes: Experimente on-line!PowerShell ,
464140 bytesExperimente online!
Recebe entrada por meio de splatting, por exemplo
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
, que no TIO se manifesta como argumentos separados.-5 bytes graças ao mazzy.
Troca de -1 byte
$_
para1
fonte
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(não$z
), caso contrário, você está apenas passando um array como o primeiro único argumento /C (gcc) ,
62605655 bytes-2-6 bytes graças a l4m2-1 byte graças ao ceilingcat .
Usa a noção permitida de -1 matrizes finalizadas.
f()
chama a si próprio de forma recursiva, até ficar totalmente enrolado, e depois segue pela lista.r
controla quantos números descartar antes de imprimir algo. Aumenta se o item atual for 0, diminui caso contrário. Se 0, não precisamos descartar e podemos imprimir o número.Experimente online!
fonte
f(l)int*l;
=>f(int*l)
?r=0
parece inútilHaskell, 28 bytes
Experimente online!
fonte
R , 45 bytes
Experimente online!
fonte
F
também irá levá-lo a 48 bytes, mas este é imho mais limpoR+pryr
eaReduce
solução é 44 bytesPython 2 ,
595751 bytesExperimente online!
fonte
Gelatina , 6 bytes
Experimente online!
Como funciona
fonte
[1,3,7,0,0,0]
, por exemplo, é dividido[[1,3,7],[],[],[]]
e cada passo da redução esquerda é exibido no elemento da matriz esquerda.Flak cerebral ,
4036 bytesExperimente online!
Obrigado a @Nitrodon por -4 bytes.
Como o Brain-Flak já usa pilhas, este é um bom quebra-cabeça para o Brain-Flak.
fonte
{{}<>{}<>}
pode ser reduzido para{{}<>}
.Wolfram Language (Mathematica) , 28 bytes
Experimente online!
fonte
b
é diferente de zero.)a___
primeiro. Pode-se ver isso tentandoReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. Em uma nota relacionada,StringReplace
é realmente ganancioso, por isso esta submissão não iria trabalhar comStringReplace
(com padrão comoa___~~b_~~"0"~~c___
)Python 2 , 48 bytes
Experimente online!
fonte
2*0**x
sempre será0
. Obviamente estou perdendo alguma coisa.x=0
, caso em que é 2.Espaço em branco , 89 bytes
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Separa a nova linha da lista de entradas
-1
para indicar que terminamos as entradas.Experimente online .
Explicação em pseudo-código:
fonte
Python 2 ,
60595756 bytesExperimente online!
Salvou:
fonte
0
ein
JavaScript, 40 bytes
Saídas na ordem inversa.
Experimente online
1 byte salvo graças a Herman L .
fonte
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
é um byte menor(un)shift
antes de detectar que a saída poderia ser revertida.o
é referenciado no retorno de chamada após ser definido no segundo argumento.05AB1E , 9 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
Alternativa de 9 bytes :
Experimente on-line para verificar todos os casos de teste .
Explicação:
PS: Se a saída deveria ter sido revertida para corresponder aos casos de teste na descrição do desafio, podemos adicionar um final
R
à segunda versão (portanto 10 bytes ), que reverte a lista. Experimente online ou verifique todos os casos de teste .fonte
Retina 0.8.2 , 18 bytes
Experimente online! O link inclui casos de teste. Explicação:
Prefixe um extra
,
.Processe todas as operações pop.
Remova o
,
se ainda estiver lá.A reversão dos números custaria 8 bytes extras:
fonte
<number>, 0
sub-listas por nada.Ruby , 36 bytes
Experimente online!
Lambda anônimo. Saídas na ordem inversa.
fonte
Brain-Flak , 36 bytes
Experimente online!
fonte
Brain-Flak , 32 bytes
Experimente online!
Usa
-1
para significar o final da matriz (mas qualquer número serve realmente).fonte
V , 10 bytes
Experimente online!
Explicação
Equivalente no Vim , 16 bytes
Experimente online!
Explicação
Praticamente o mesmo, exceto gravar uma macro
q
e chamá-la recursivamente:fonte
Java 10,
7572 bytesSaídas separadas por vírgula. O topo da pilha é o último. Experimente online aqui .
Graças a Olivier Grégoire por jogar 2 bytes.
Por favor, verifique Kevin Cruijssen e respostas Java de Olivier Grégoire . Eles adotam uma abordagem baseada em lista, com o último superando o meu por uma margem arrumada.
Ungolfed:
fonte
Stack
objeto- real . +1 de mim.n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 bytes), mas coloca os,
números anteriores, não depois.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 bytes), utiliza uma lista, em vez de uma matriz e messes com a saída, pois pode retornar coisas como "[, 2]"$
para salvar um byte adicional, pois cada um0
que adicionamos é removido imediatamente.GolfScript ,
1412 bytesExperimente online!
fonte
Perl 5
-p
, 17 bytesObrigado @sundar e @DomHastings
Experimente online!
fonte
> <> , 25 bytes
Experimente online! (a entrada deve ser escrita em ascii. caso contrário, use esta )
Como funciona
i:?\~~
verifica 0, continua~~
a excluir a entrada anterior. caso contrário, desça para:(0:/:^?
que verifica -1 (não há mais entrada), depois encerra para excluir -1 e faz um loop:!?l:!<oan;
que gera cada número com uma nova linha e termina quando a pilha é esvaziadafonte
Casca , 6 bytes
Já que não há resposta Husk e esse é meu idioma favorito de golfe:
Experimente online!
Explicação
Solução alternativa, 6 bytes
Em vez de virar, também podemos reverter a lista e usar a dobra à direita:
Ḟ?:tø↔
fonte
brainfuck ,
214150 bytesLê a entrada como números separados por novas linhas. Isso deve incluir uma única nova linha à direita. Também não espera zeros à esquerda em cada número. Saída como uma lista separada de nova linha semelhante
Experimente online!
Explicação
que não é realmente uma explicação, mas na verdade é apenas a versão em que eu estava trabalhando com os comentários e outras coisas que podem ou não ser úteis para ninguémfonte
Braquilog , 21 bytes
Experimente online!
-1 byte, e mais importante, isso parece uma maneira muito menos desajeitada de fazer isso.
Alternativa 21 byter:
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
Experimente online!Código mais antigo:
22 bytes
Experimente online!
fonte
Aviso: Muitas linhas se seguem. Você foi avisado.
CJam , 17 bytes
Código mais perigoso
(assume que os elementos da pilha podem ser separados apenas por espaços na saída e que a matriz de entrada pode ter qualquer forma que desejar)
Experimente online!
Explicação
Código alternativo nº 1, 27 bytes
(assume que os elementos da pilha precisam ser impressos no formato mostrado na pergunta e que a matriz de entrada pode ter a forma que desejar)
Experimente online!
Explicação
Código alternativo nº 2, 24 bytes
(assume que os elementos da pilha podem ser agrupados na saída e que a matriz de entrada deve estar no formato exato mostrado na pergunta)
Experimente online!
Explicação
Código mais seguro para isso, 34 bytes
(assume que os elementos da pilha precisam ser impressos no formato mostrado na pergunta e que a matriz de entrada deve estar no formato exato mostrado na pergunta)
Experimente online!
Explicação
Agradecemos a @Jo King por apontar que aqueles com a saída ordenada são inválidos, pois coisas como
[12]
e[1,2]
seriam indistinguíveis.Agradecemos também a @Jo King, fornecendo uma alternativa muito adequada para as saídas agrupadas e cortando 9 bytes!
fonte
[12]
e[1,2]
. No entanto, a versão de 27 byte parece bem, embora você pode se livrar do espaço em branco e suportes para 18 bytes]S*
(3), enquanto vírgulas usar]',*
(4)Vermelho , 64 bytes
Experimente online!
fonte