fundo
Baseado em um jogo que meu filho de quatro anos ganhou do rabino.
O "objetivo" é "encontrar" as letras em uma determinada ordem, por exemplo aecdb
. Você recebe uma pilha de cartas, por exemplo daceb
. Você só pode pesquisar na pilha na ordem especificada, embora de forma cíclica. Quando você encontra uma carta de que precisa, tira-a da pilha.
Objetivo
Dada uma ordem e uma pilha (permutações livres de duplicatas), encontre a sequência das letras da pilha superior (é tudo ASCII imprimível) que você vê durante o jogo.
Exemplo passo a passo
Precisamos encontrar a ordem aecdb
, dada a pilha daceb
:
Topo da pilha d
: Não é o que nós estamos procurando ( a
), de modo que adicioná-lo à sequência: d
e girar para obter a pilha: acebd
.
Topo da pilha a
: Sim! assim nós adicioná-lo à sequência: da
e removê-lo da pilha: cebd
.
Topo da pilha c
: Não é o que nós estamos procurando ( e
), de modo que adicioná-lo à sequência: dac
e girar para obter a pilha: ebdc
.
Topo da pilha e
: Sim! assim nós adicioná-lo à sequência: dace
e removê-lo da pilha: bdc
.
Topo da pilha b
: Não é o que nós estamos procurando ( c
), de modo que adicioná-lo à sequência: daceb
e girar para obter a pilha: dcb
.
Topo da pilha d
: Não é o que nós estamos procurando ( c
), de modo que adicioná-lo à sequência: dacebd
e girar para obter a pilha: cbd
.
Topo da pilha c
: Sim! assim nós adicioná-lo à sequência: dacebdc
e removê-lo da pilha: bd
.
Topo da pilha b
: Não é o que nós estamos procurando ( d
), de modo que adicioná-lo à sequência: dacebdcb
e girar para obter a pilha: db
.
Topo da pilha d
: Sim! assim nós adicioná-lo à sequência: dacebdcbd
e removê-lo da pilha: b
.
Topo da pilha b
: Sim! assim nós adicioná-lo à sequência: dacebdcbdb
e removê-lo da pilha: .
E nós terminamos. O resultado é dacebdcbdb
.
Implementação de referência
def letters(target, stack):
string = ''
while stack:
string += stack[0]
if stack[0] == target[0]:
stack.pop(0)
target = target[1:]
else:
stack.append(stack.pop(0))
return string
print letters('aecdb', list('daceb'))
Casos de teste
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
especificamente?APL (Dyalog Classic) , 21 bytes
Experimente online!
Este é um trem equivalente a
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
dá a permutação do argumento da direita⍵
no argumento da esquerda⍺
1,2>/
compare pares consecutivos com>
e adicione um 1⍺⊂⍨
use a máscara booleana acima para dividir⍺
em grupos; 1s na máscara marcam o início de um novo grupo,\
concatenações cumulativas dos grupos(⊂⍵)~¨
complemento de cada um com relação a⍵
⍵,
preceder⍵
∊
achatar como uma única cordafonte
Lote, 155 bytes
Leva o alvo e empilha como entradas no STDIN.
fonte
JavaScript (ES6), 54 bytes
Leva o alvo como uma sequência e a pilha como uma matriz de caracteres. Retorna uma string.
Casos de teste
Mostrar snippet de código
Quão?
A cada iteração, extraímos o caractere
c
no topo da pilha e o anexamos ao resultado final. Em seguida, executamos uma chamada recursiva cujos parâmetros dependem do resultado dec == t[0]
, ondet[0]
é o próximo caractere esperado.Se
c
correspondert[0]
:c
da string de destino passandot.slice(1)
c
da pilha passandos
inalteradosSe
c
não correspondert[0]
:t.slice(0)
c
volta no final da pilhafonte
Python 2 , 73 bytes
Experimente online!
Eu suspeito que isso é muito altamente jogável.
fonte
Python 2 , 65 bytes
Experimente online!
fonte
Haskell ,
4946 bytesExperimente online!
Relativamente simples. O argumento da esquerda é o "objetivo" e o da direita é a pilha. Se a cabeça da meta corresponder ao topo da pilha, nós a precederemos e recorremos novamente ao restante da meta e à pilha (sem adicionar novamente o item na parte superior). Caso contrário, anexamos o item superior e recorremos com o mesmo objetivo, lendo o item superior até o final da pilha. Quando a meta está vazia, a correspondência de padrões escolhe a segunda linha e a lista vazia é retornada.
EDIT: -3 bytes graças a @GolfWolf e @Laikoni!
fonte
Limpo , 85 bytes
Experimente online!
Define a função parcial
f
assumida[Char]
e[Char]
, onde o primeiro argumento é o destino e o segundo é a pilha.fonte
Java 8, 88 bytes
Entradas como
char[]
ejava.util.LinkedList<Character>
(java.util.Queue
implementação)Explicação:
Experimente online.
fonte
> <> ,
3832 bytesEdit: Teal pelican tem uma
><>
abordagem muito melhor aqui que troca os métodos de entradaExperimente online!
Leva a ordem das letras pela
-s
bandeira e a pilha pela entrada.Como funciona:
fonte
Perl 5 , 42 + 2 (
-pl
) = 44 bytesExperimente online!
fonte
> <> ,
2116 bytesExperimente online!
O fluxo foi alterado para utilizar os espaços vazios e remover o redirecionamento de código extra. (-5 bytes) - Graças a @JoKing
> <> , 21 bytes
Experimente online!
A outra resposta> <> pode ser encontrada aqui.
Explicação
A pilha começa com um conjunto inicial de caracteres usando o sinalizador -s. Entrada é a ordem de caracteres fornecida pelo usuário. Esta explicação seguirá o fluxo do código.
fonte
Perl, 62 bytes
Leva seu primeiro argumento, a ordem, como uma lista de caracteres, e o segundo, a pilha, como uma sequência.
Ungolfed:
Você já se perguntou para que servem todas essas variáveis obscuras de expressão regular? Claramente, eles foram projetados para esse desafio exato. Combinamos com o personagem atual
$x
(que infelizmente precisa ser escapado caso seja um personagem especial de regex). Isso convenientemente divide a string em "antes da partida"$`
, "a partida"$&
e "após a partida"$'
. Na busca cíclica, vimos claramente todos os personagens antes da partida e os colocamos de volta na pilha. Também vimos o personagem atual, mas não o colocamos de volta. Portanto, anexamos "antes da partida" à lista de "vistos"$z
e construímos a pilha de "após a partida", seguida de "antes da partida".fonte
SNOBOL4 (CSNOBOL4) , 98 bytes
Experimente online!
Imprime cada letra em uma nova linha. Use esta versão para obter tudo para imprimir na mesma linha. Recebe a entrada como pilha e, em seguida, destino, separados por uma nova linha.
fonte
Perl, 44 bytes
Inclui
+4
para-lF
Dê entrada como em STDIN como destino e empilhe (esta é a ordem inversa dos exemplos):
Se você não se importa com uma nova linha final, isso
40
funciona:fonte