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: dy giran para conseguir la pila: acebd.
Parte superior de la pila a: ¡Sí! así que agregamos a la secuencia: day 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: dacy giran para conseguir la pila: ebdc.
Parte superior de la pila e: ¡Sí! así que agregamos a la secuencia: dacey 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: daceby 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: dacebdy giran para conseguir la pila: cbd.
Parte superior de la pila c: ¡Sí! así que agregamos a la secuencia: dacebdcy 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: dacebdcby giran para conseguir la pila: db.
Parte superior de la pila d: ¡Sí! así que agregamos a la secuencia: dacebdcbdy sacarlo de la pila: b.
Parte superior de la pila b: ¡Sí! así que agregamos a la secuencia: dacebdcbdby 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
99específicamente?