Antecedentes
Basado en un juego que mi hijo de cuatro años obtuvo de su rabino.
El "objetivo" es "encontrar" las letras en un orden dado, por ejemplo aecdb
. Le dan una pila de cartas, por ejemplo daceb
. Solo puede buscar en la pila en el orden dado, aunque cíclicamente. Cuando encuentras una carta que necesitas, la sacas de la pila.
Objetivo
Dado un orden y una pila (permutaciones libres de duplicados entre sí), encuentre la secuencia de letras de la pila superior (todo es ASCII imprimible) que ve al jugar el juego.
Ejemplo paso a paso
Necesitamos encontrar el orden aecdb
, dada la pila daceb
:
La parte superior de la pila d
: No es lo que estamos buscando ( a
), por lo que lo añadimos a la secuencia: d
y giran para conseguir la pila: acebd
.
Parte superior de la pila a
: ¡Sí! así que agregamos a la secuencia: da
y sacarlo de la pila: cebd
.
La parte superior de la pila c
: No es lo que estamos buscando ( e
), por lo que lo añadimos a la secuencia: dac
y giran para conseguir la pila: ebdc
.
Parte superior de la pila e
: ¡Sí! así que agregamos a la secuencia: dace
y sacarlo de la pila: bdc
.
La parte superior de la pila b
: No es lo que estamos buscando ( c
), por lo que lo añadimos a la secuencia: daceb
y giran para conseguir la pila: dcb
.
La parte superior de la pila d
: No es lo que estamos buscando ( c
), por lo que lo añadimos a la secuencia: dacebd
y giran para conseguir la pila: cbd
.
Parte superior de la pila c
: ¡Sí! así que agregamos a la secuencia: dacebdc
y sacarlo de la pila: bd
.
La parte superior de la pila b
: No es lo que estamos buscando ( d
), por lo que lo añadimos a la secuencia: dacebdcb
y giran para conseguir la pila: db
.
Parte superior de la pila d
: ¡Sí! así que agregamos a la secuencia: dacebdcbd
y sacarlo de la pila: b
.
Parte superior de la pila b
: ¡Sí! así que agregamos a la secuencia: dacebdcbdb
y sacarlo de la pila: .
Y ya hemos terminado. El resultado es dacebdcbdb
.
Implementación de referencia
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 prueba
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
específicamente?