Introdução
Uma fila é um tipo de dados abstrato em que os elementos são adicionados à frente (enfileiramento) e removidos da parte traseira (desenfileiramento). Isso também é conhecido como princípio FIFO (primeiro entrar, primeiro a sair) .
É melhor mostrado com um exemplo:
Desafio
Dada uma matriz não vazia que contém números inteiros positivos e elementos que indicam uma desenfileiramento (remoção de um elemento), produza a lista final da fila.
Digamos que X
denote uma desenfileiramento neste exemplo. Vamos dar uma olhada na seguinte lista:
[45, X, X, 37, 20, X, 97, X, 85]
Isso pode ser traduzido para o seguinte pseudo-código da fila:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Você pode ver que, no final, o resultado é [85, 97]
qual é a saída dessa sequência.
Casos de teste
Observe que você pode escolher qualquer outro símbolo ou caractere X
, desde que não seja um número inteiro positivo.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Respostas:
Geléia , 8 bytes
Usa qualquer valor falso ( 0 ou iterável vazio) para desenfileirar.
Experimente online!
Como funciona
fonte
Python 2,
565350 bytesExperimente Online!
Retirar da fila é
-1
. Esse truque permite o fatiamento pitônico fácil da fila.fonte
Mathematica, 102 bytes
Definitivamente não é a solução mais curta, mas não pude resistir porque é meio perversa.
Após algumas funções auxiliares, isso define uma função pura que recebe uma string como entrada: na string, os números são separados por vírgulas (o espaço em branco é opcional); o caractere de desenfileiramento é
"]"
; e a lista não possui delimitadores na frente ou atrás. Por exemplo, o primeiro exemplo no OP seria inserido como a string"45,],],37,20,],97,],85"
. A saída da função é uma lista de números.A função conta quantas linhas de fila
"]"
estão na sequência de entrada, anexa quantas cópias"f["
à frente da sequência e, em seguida, envolve a coisa toda"r[...]"
. No exemplo acima, isso produz"r[f[f[f[f[45,],],37,20,],97,],85]"
; observe que os colchetes estão equilibrados.Em seguida,
ToExpression
interpreta a sequência resultante como um pedaço do código do Mathematica e a executa. A funçãof
é convenientemente definida para reter todos os seus argumentos, exceto o primeiro (e também ignora vírgulas à direita; isso é necessário para remover a fila de filas vazias de qualquer maneira) er
converte a sequência de números resultante em uma lista de números na ordem correta.fonte
b___,
deveria estar lá? Ele funciona , mas as voltas vírgula vermelho por causa disso. (também, qual é a diferença entre as linhas 2 e 3?)f[a_,b___]:=b
(sem vírgula), enquanto a linha 3 é equivalente af[a_,b___,Null]:=b
. Nos dois casos,b___
refere-se a qualquer número de argumentos (incluindo nenhum). A linha 3 é mais específica, portanto, é sempre usada antes da linha 2, quando apropriado. Portanto, a funçãof
ignora seu primeiro argumento e também ignora seu último argumento, se esse argumento forNull
. Isso foi necessário para lidar com a remoção da fila de uma fila vazia. Observe que uma entrada típica produzirá uma expressão comor[f[f[f[5,3,],2,],],11]
, onde cada vírgula antes]
denota aNull
.Retina , 30 bytes
Experimente online!
Remove repetidamente o primeiro número que é (não necessariamente imediatamente) seguido por um
X
junto com issoX
, ou umX
no início da string. Em seguida, inverte os números restantes.fonte
JavaScript,
7063535043 bytesObrigado @ Neil por jogar 10 bytes com x.map em vez de loop e expressão ternária
Obrigado @Arnauld por jogar fora 3 bytes
Obrigado @ETHproductions por jogar fora 7 bytes
Experimente online!
Retirar da fila pode ser qualquer valor não numérico que não seja verdadeiro.
fonte
if
declaração ternária em vez de uma instrução, e mais curta ainda se você usasse emmap
vez de um loop e ainda mais curta ainda se usasse uma expressão em vez de um bloco. Veja as dicas .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
para salvar muito poucos bytes nareturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
é ainda mais curto.a?
suficiente, eu acho?)Mathematica,
4645 bytesObrigado a ngenisis por economizar 1 byte.
Basicamente, o mesmo que a minha resposta Retina, usando a correspondência de padrões. Combinamos repetidamente o primeiro
X
e o removemos junto com o primeiro número (se houver). Depois que terminamos, invertemos a lista.fonte
Pure Bash, 72
Entrada fornecida como parâmetros da linha de comandos.
Experimente online .
fonte
Haskell, 41 bytes
fonte
x&(y:z)
MATL ,
1312 bytesEntrada é uma matriz de números, com
0
para "desenfileirar".Saída é números separados por espaços. Um resultado vazio é mostrado como nada.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Haskell,
4140 bytesA função é
foldl(#)[]
(também incluída no bytecount com um byte de separação entre eles)Experimente online!
X é qualquer número inteiro não positivo
EDIT: -1 byte graças a nimi
fonte
|l>[]=init l|1>0=l
Julia,
78767357 bytesAgradecemos a Harrison Grodin por algumas excelentes sugestões de golfe para Julia. Substituído if / else por ternário e por / end com compreensão de lista para uma economia de 16 bytes.
Removidos alguns espaços desnecessários para economizar 3 bytes.
Antes de números negativos ou zero serem permitidos:
Ungolfed:
Eu sou bastante novo para Julia; pode haver uma maneira melhor. Usa
:X
para X, que é um símbolo em Julia. Atualizado: agora que 0 é permitido, usa 0 (ou qualquer número negativo) para X, salvando dois caracteres. Atualizado novamente para remover alguns espaços em branco que eu não sabia que não eram necessários.fonte
05AB1E ,
1211 bytesGuardou um byte graças a Riley
Experimente online!
Explicação
Os desenfileiramentos são indicados por qualquer letra .
fonte
GNU Sed, 43
A pontuação inclui +2 para uso dos sinalizadores
-r
e-n
.Experimente online .
Explicação
fonte
PHP, 85 bytes
-8 bytes em
$v
vez deis_int($v)
se todo valor de desenfileiramento pertencer a falsefonte
Python 3 ,
9594 bytesExperimente online!
Também 94 bytes:
fonte
Perl 5 , 28 + 1 = 29 bytes
28 bytes de código +
-p
sinalizador.Experimente online!
Ele usa uma string (
$\
) como a fila: quando a entrada contém um número inteiro (/\d/?
, nós o anexamos no início de$\
($\=$_.$\
), caso contrário, removemos o último coms/.*\n$//
. No final,$\
é implicitamente impresso graças à-p
flag (e aqueles incomparáveis}{
).Outras abordagens:
33 bytes , usando uma matriz como a fila (é a maneira mais natural de fazê-lo em Perl, mas não a mais curta):
Experimente online!
52 bytes , usando regex e
reverse
(acontece exatamente a mesma coisa que a resposta Retina de Martin Ender - graças a quem eu salvei 2 bytes nele). A reversão da lista exige muitos caracteres, porque, para preservar os números inteiros, tenho que converter a string em uma matriz para revertê-la e depois voltar a uma string para imprimi-la. (emsay for
vez de$_=join$",
pode salvar 2 bytes, mas requer-E
ou-M5.010
e não é tão interessante).Experimente online!
fonte
Python 3, 107 bytes
Dequeuer pode ser qualquer valor não numérico.
Experimente online
fonte
Lote, 160 bytes
Isso foi mais difícil do que precisava ser.
Isso significa que eu a) preciso ter um marcador de fim de fila, que não seja removido eb) preciso manipular a fila de trás para frente, para que novos itens sejam inseridos logo antes do marcador final, para que os itens antigos possam ser removidos da frente, o que significa que eu c) tenho que inverter a fila antes de imprimi-la.
fonte
PHP, 70 bytes
fonte
C #, 115 bytes +33 bytes para usar
Método anônimo que retorna uma lista de números inteiros após executar as operações de enfileiramento e desenfileiramento. Inteiros negativos são usados para remover elementos da fila.
Programa completo com método não destruído e casos de teste:
fonte
Scala, 97 bytes
Como entrada,
f
recebe uma lista com0
o elemento "desenfileirar". Utiliza recursão de cauda com um segundo parâmetro (b
), atuando como um acumulador. Inicialmente,b
é o vazioSeq
(Nil
).Explicações:
Nota:
b dropRight 1
é usado em vez deb.tail
evitar a exceção:tail of empty list
.Casos de teste :
f
também pode trabalhar com outros tipos (String
,char
..., mesmo lista heterogênea desses tipos!):fonte
REXX, 115 bytes
Pega uma sequência separada por espaços, imprime uma sequência separada por espaços
fonte
C ++,
122119 bytes0 indica uma desenfileiramento.
Experimente online!
fonte
Swift 3, 70 bytes
Supondo que temos uma matriz de Ints como
let x = [1, 2,-1,3,-1,4]
Observe que
[].prefix(0)
é uma maneira sorrateira de obter um ArraySlice vaziofonte