No jogo Pickomino , existem várias peças no meio da mesa, cada uma com um número inteiro positivo diferente. A cada turno, os jogadores jogam dados de uma certa maneira e recebem uma pontuação, que é um número inteiro não negativo.
Agora o jogador pega o ladrilho com o número mais alto que ainda é menor ou igual à sua pontuação, removendo o ladrilho do meio e adicionando-o à sua pilha. Se isso não for possível, porque todos os números no meio são maiores que a pontuação do jogador, o jogador perde o bloco mais alto da pilha (que foi adicionada mais recentemente), que é retornada ao meio. Se o jogador não tiver mais peças, nada acontece.
O desafio
Simule um jogador jogando o jogo contra si mesmo. Você recebe uma lista dos ladrilhos no meio e uma lista das pontuações que o jogador obteve. Retorne uma lista dos ladrilhos do jogador após todos os turnos terem sido avaliados.
Regras do desafio
- Você pode assumir que a lista com os blocos é ordenada e não contém nenhum número inteiro duas vezes.
- Você pode pegar as duas listas de entrada na ordem que desejar
- A saída deve manter a ordem dos blocos na pilha, mas você pode decidir se a lista é classificada de cima para baixo ou de baixo para cima.
Regras gerais
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- É recomendável adicionar uma explicação para sua resposta.
Exemplo
(retirado do 6º caso de teste)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
A primeira pontuação é 22, portanto, pegue o bloco mais alto no meio <= 22, que é o próprio 22.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [22, 22, 23, 21, 24, 0, 22]
A pontuação seguinte é 22, portanto, pegue o ladrilho mais alto no meio <= 22. Como 22 já foi tirado, o jogador deve levar 21.
Middle: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 21]
Remaining scores: [22, 23, 21, 24, 0, 22]
A próxima pontuação é 22, mas todos os números <= 22 já estão sendo usados. Portanto, o jogador perde o bloco mais alto da pilha (21), que é devolvido ao meio.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [23, 21, 24, 0, 22]
As próximas pontuações são 23, 21 e 24, então o jogador pega essas peças do meio.
Middle: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21, 24]
Remaining scores: [0, 22]
O jogador rebenta e marca zero. Portanto, o bloco com o número 24 (no topo da pilha) é retornado para o meio.
Middle: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21]
Remaining scores: [22]
A última pontuação é 22, mas todas as peças <= 22 já estão ocupadas, então o jogador perde a peça mais alta da pilha (21).
Middle: [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Final Stack and Output: [22, 23]
Casos de teste
(com o bloco mais alto último na lista de saída)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [26, 30, 21]
Output: [26, 30, 21]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [35, 35, 36, 36]
Output: [35, 34, 36, 33]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23]
Output: [23]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: []
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23, 0]
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Output: [22, 23]
Tiles: [1, 5, 9, 13, 17, 21, 26]
Scores: [6, 10, 23, 23, 23, 1, 0, 15]
Output: [5, 9, 21, 17, 13, 1]
Tiles: []
Scores: [4, 6, 1, 6]
Output: []
Respostas:
Haskell ,
119111104103 bytes1 byte economizado graças a Ørjan Johansen
Experimente online!
Assume que os blocos são classificados em ordem decrescente.
Não há muita fantasia acontecendo aqui. O primeiro argumento é a pilha de jogadores, o segundo a pontuação e o terceiro é a pilha no meio.
fonte
sort
está em ascensão. O caso de teste do TIO nunca atinge esse ramo, no entanto. Eu recomendo testar todos os casos sempre que iterar dessa maneira.(#)=span.(<)
.Japt, 24 bytes
Oof! Isso não funcionou tão bem quanto eu pensei!
Recebe a entrada na ordem inversa.
Experimente ou execute todos os casos de teste no TIO
fonte
Perl 6 , 89 bytes
Experimente online!
Eu acho que há mais alguns bytes a serem jogados fora disso ...
fonte
C # (Compilador interativo do Visual C #) ,
159158154 bytesChamado como
f(tiles)(scores)
Se apenas
System.Void
é realmente um tipo de retorno e não apenas um espaço reservado para reflexão. Eu seria capaz de substituirif(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);
comvar t=a>1?m.Add(s.Count<1?0:s.Pop()):s.Push(a);
, salvando dois bytes.Experimente online!
fonte
Ruby , 77 bytes
Experimente online!
fonte
JavaScript (Node.js) , 80 bytes
A mesma lógica da versão ES6, mas usa os blocos como uma máscara de bits BigInt e as pontuações como uma matriz de BigInts.
Experimente online!
JavaScript (ES6),
100 98 9487 bytesToma entrada como
(tiles)(scores)
. Os ladrilhos podem ser passados em qualquer ordem.Experimente online!
Comentado
fonte
Carvão , 35 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Loop sobre as pontuações.
Procure o ladrilho mais alto disponível.
Se existir, então ...
... retire o ladrilho do meio ...
... e adicione-o à pilha.
Caso contrário, se a pilha não estiver vazia ...
Remova o bloco mais recente da pilha e retorne-o ao meio.
Imprima a pilha resultante da mais antiga para a mais nova.
fonte
Python 2 , 120 bytes
Experimente online!
fonte
05AB1E ,
2722 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
fonte
Pitão, 32 bytes
Experimente on-line aqui ou verifique todos os casos de teste de uma vez aqui .
Deve haver espaço para melhorias aqui em algum lugar - qualquer sugestão seria muito apreciada!
fonte
Perl 5
-apl -MList:Util=max
, 97 bytesTIO
lê partituras e blocos na próxima linha e imprime a saída.
Quão
-apl
:-p
fazer um loop sobre linhas e imprimir,-a
divisão automática,-l
para mastigar da entrada e adicionar caracteres de nova linha à saída$_=$".<>
: para ler a próxima linha (blocos) e colocar um espaço no var padrão$_
for$i(@F){
...}
laço$i
mais@F
campos da linha atual (pontuação)(
..?
..:
..).=$&
append jogo anterior para l-valor ternário($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$s
caso o valor máximo encontrado e removido dos blocos ($_
) o valor l seja scores ($s
)$s=~s/ \d+$//?$_
caso contrário, se o último número puder ser removido da pontuação, são peças:$G
finalmente é lixo porque não pode ocorrer$_=$s;s/ //
para definir pontuações como var padrão e remover o espaço inicialfonte