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?APL (Dyalog Classic) , 21 bytes
Pruébalo en línea!
Este es un tren equivalente a
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
da la permutación del argumento derecho⍵
en el argumento izquierdo⍺
1,2>/
comparar pares consecutivos con>
y anteponer un 1⍺⊂⍨
use la máscara booleana anterior para dividir⍺
en grupos; 1s en la máscara marcan el inicio de un nuevo grupo,\
concatenaciones acumulativas de los grupos(⊂⍵)~¨
complemento de cada uno con respecto a⍵
⍵,
anteponer⍵
∊
aplanar como una sola cadenafuente
Lote, 155 bytes
Toma el objetivo y se apila como entradas en STDIN.
fuente
JavaScript (ES6), 54 bytes
Toma el objetivo como una cadena y la pila como una matriz de caracteres. Devuelve una cadena.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
En cada iteración, extraemos el carácter
c
en la parte superior de la pila y lo agregamos al resultado final. Luego realizamos una llamada recursiva cuyos parámetros dependen del resultado dec == t[0]
, dondet[0]
es el siguiente carácter esperado.Si
c
coincidet[0]
:c
de la cadena de destino pasandot.slice(1)
c
de la pila pasandos
sin cambiosSi
c
no coincidet[0]
:t.slice(0)
c
hacia atrás al final de la pilafuente
Python 2 , 73 bytes
Pruébalo en línea!
Sospecho que esto es muy golfable.
fuente
Python 2 , 65 bytes
Pruébalo en línea!
fuente
Haskell ,
4946 bytesPruébalo en línea!
Bastante sencillo. El argumento izquierdo es el "objetivo" y el derecho es la pila. Si la cabeza de la portería coincide con la parte superior de la pila, la anteponemos y repetimos con el resto de la portería y la pila (sin volver a agregar el elemento en la parte superior). De lo contrario, anteponemos el elemento superior y repetimos con el mismo objetivo, leyendo el elemento superior hasta el final de la pila. Cuando el objetivo está vacío, la coincidencia de patrones elige la segunda línea y se devuelve la lista vacía.
EDITAR: -3 bytes gracias a @GolfWolf y @Laikoni!
fuente
Limpio , 85 bytes
Pruébalo en línea!
Define la
f
toma parcial de funciones[Char]
y[Char]
, donde el primer argumento es el objetivo y el segundo es la pila.fuente
Java 8, 88 bytes
Entradas como
char[]
yjava.util.LinkedList<Character>
(java.util.Queue
implementación)Explicación:
Pruébalo en línea.
fuente
> <> ,
3832 bytesEditar: Teal pelican tiene un
><>
enfoque mucho mejor aquí que intercambia los métodos de entradaPruébalo en línea!
Toma el orden de las letras a través de la
-s
bandera y la pila a través de la entrada.Cómo funciona:
fuente
Perl 5 , 42 + 2 (
-pl
) = 44bytesPruébalo en línea!
fuente
> <> ,
2116 bytesPruébalo en línea!
El flujo cambió para utilizar los espacios vacíos y eliminar el redireccionamiento de código adicional. (-5 bytes) - Gracias a @JoKing
> <> , 21 bytes
Pruébalo en línea!
La otra respuesta> <> se puede encontrar aquí.
Explicación
La pila comienza con un conjunto inicial de caracteres usando la bandera -s. La entrada es el orden de caracteres dado por el usuario. Esta explicación seguirá el flujo del código.
fuente
Perl, 62 bytes
Toma su primer argumento, el orden, como una lista de caracteres y su segundo, la pila, como una cadena.
Sin golf:
¿Alguna vez te has preguntado para qué sirven todas esas oscuras variables regex? Claramente, fueron diseñados para este desafío exacto. Coincidimos con el personaje actual
$x
(que desafortunadamente tiene que escaparse en caso de que sea un carácter especial regex). Esto divide convenientemente la cadena en "antes del partido"$`
, "el partido"$&
y "después del partido"$'
. En la búsqueda cíclica, vimos claramente a todos los personajes antes del partido y los volvimos a colocar en la pila. También vimos el personaje actual pero no lo volvimos a poner. Entonces agregamos "antes del partido" a la lista "visto"$z
y construimos la pila de "después del partido" seguido de "antes del partido".fuente
SNOBOL4 (CSNOBOL4) , 98 bytes
Pruébalo en línea!
Imprime cada letra en una nueva línea. Use esta versión para imprimir todo en la misma línea. Toma la entrada como pila, luego objetivo, separada por una nueva línea.
fuente
Perl, 44 bytes
Incluye
+4
para-lF
Dé entrada como en STDIN como destino y luego apile (este es el orden inverso de los ejemplos):
Si no le importa una nueva línea final, esto
40
funciona:fuente