Contexte
Basé sur un jeu que mon fils de quatre ans a obtenu de son rabbin.
Le «but» est de «trouver» les lettres dans un ordre donné, par exemple aecdb
. On vous donne une pile de cartes-lettres, par exemple daceb
. Vous ne pouvez rechercher dans la pile que dans l'ordre indiqué, bien que cycliquement. Lorsque vous rencontrez une lettre dont vous avez besoin, vous la retirez de la pile.
Objectif
Étant donné un ordre et une pile (permutations sans doublons les uns des autres), trouvez la séquence des lettres de la pile supérieure (tout est ASCII imprimable) que vous voyez en jouant.
Exemple pas à pas
Nous devons trouver la commande aecdb
, compte tenu de la pile daceb
:
Haut de la pile d
: Non ce que nous cherchons ( a
), donc nous l' ajouterons à la séquence: d
et alternons pour obtenir la pile: acebd
.
Haut de la pile a
: Oui! si l' on ajoute à la séquence: da
et le retirer de la pile: cebd
.
Haut de la pile c
: Non ce que nous cherchons ( e
), donc nous l' ajouterons à la séquence: dac
et alternons pour obtenir la pile: ebdc
.
Haut de la pile e
: Oui! si l' on ajoute à la séquence: dace
et le retirer de la pile: bdc
.
Haut de la pile b
: Non ce que nous cherchons ( c
), donc nous l' ajouterons à la séquence: daceb
et alternons pour obtenir la pile: dcb
.
Haut de la pile d
: Non ce que nous cherchons ( c
), donc nous l' ajouterons à la séquence: dacebd
et alternons pour obtenir la pile: cbd
.
Haut de la pile c
: Oui! si l' on ajoute à la séquence: dacebdc
et le retirer de la pile: bd
.
Haut de la pile b
: Non ce que nous cherchons ( d
), donc nous l' ajouterons à la séquence: dacebdcb
et alternons pour obtenir la pile: db
.
Haut de la pile d
: Oui! si l' on ajoute à la séquence: dacebdcbd
et le retirer de la pile: b
.
Haut de la pile b
: Oui! si l' on ajoute à la séquence: dacebdcbdb
et le retirer de la pile: .
Et nous avons terminé. Le résultat est dacebdcbdb
.
Implémentation de référence
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'))
Cas de test
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
spécifiquement?APL (Dyalog Classic) , 21 octets
Essayez-le en ligne!
Ceci est un train équivalent à
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
donne la permutation de l'argument droit⍵
dans l'argument gauche⍺
1,2>/
comparer des paires consécutives avec>
et ajouter un 1⍺⊂⍨
utilisez le masque booléen ci-dessus pour vous diviser⍺
en groupes; 1s dans le masque marque le début d'un nouveau groupe,\
concaténations cumulatives des groupes(⊂⍵)~¨
complément de chacun par rapport à⍵
⍵,
ajouter⍵
∊
aplatir comme une seule chaînela source
Lot, 155 octets
Prend la cible et la pile comme entrées sur STDIN.
la source
JavaScript (ES6), 54 octets
Prend la cible comme une chaîne et la pile comme un tableau de caractères. Renvoie une chaîne.
Cas de test
Afficher l'extrait de code
Comment?
À chaque itération, nous extrayons le caractère
c
en haut de la pile et l'ajoutons au résultat final. Nous effectuons ensuite un appel récursif dont les paramètres dépendent du résultat dec == t[0]
, oùt[0]
est le prochain caractère attendu.Si
c
correspondt[0]
:c
de la chaîne cible en passantt.slice(1)
c
de la pile en passants
inchangéSi
c
ne correspond past[0]
:t.slice(0)
c
à la fin de la pilela source
Python 2 , 73 octets
Essayez-le en ligne!
Je soupçonne que c'est très jouable au golf.
la source
Python 2 , 65 octets
Essayez-le en ligne!
la source
Haskell ,
4946 octetsEssayez-le en ligne!
Assez simple. L'argument de gauche est le "but" et celui de droite est la pile. Si la tête du but correspond au haut de la pile, nous le rajoutons au début et nous reproduisons avec le reste du but et la pile (sans rajouter l'élément en haut). Sinon, nous ajoutons l'élément supérieur et réapparaissons avec le même objectif, en lisant l'élément supérieur jusqu'à la fin de la pile. Lorsque l'objectif est vide, la correspondance de modèle choisit la deuxième ligne et la liste vide est renvoyée.
EDIT: -3 octets grâce à @GolfWolf et @Laikoni!
la source
Propre , 85 octets
Essayez-le en ligne!
Définit la
f
prise de fonction partielle[Char]
et[Char]
, où le premier argument est la cible et le second la pile.la source
Java 8, 88 octets
Entrées au fur
char[]
et à mesurejava.util.LinkedList<Character>
(java.util.Queue
mise en œuvre)Explication:
Essayez-le en ligne.
la source
> <> ,
3832 octetsEdit: le pélican bleu canard a une bien meilleure
><>
approche ici qui échange les méthodes d'entréeEssayez-le en ligne!
Prend l'ordre des lettres à travers le
-s
drapeau et la pile à travers l'entrée.Comment ça fonctionne:
la source
Perl 5 , 42 + 2 (
-pl
) = 44 octetsEssayez-le en ligne!
la source
> <> ,
2116 octetsEssayez-le en ligne!
Le flux a été modifié pour utiliser les espaces vides et supprimer le réacheminement du code supplémentaire. (-5 octets) - Merci à @JoKing
> <> , 21 octets
Essayez-le en ligne!
L'autre> <> réponse peut être trouvée ici.
Explication
La pile commence par un ensemble initial de caractères utilisant le drapeau -s. L'entrée est l'ordre de caractères donné par l'utilisateur. Cette explication suivra le flux du code.
la source
Perl, 62 octets
Prend son premier argument, l'ordre, comme une liste de caractères et son second, la pile, comme une chaîne.
Non golfé:
Vous êtes-vous déjà demandé à quoi servaient toutes ces variables d'expression rationnelle obscures? De toute évidence, ils ont été conçus pour ce défi précis. Nous correspondons au caractère actuel
$x
(qui doit malheureusement être échappé dans le cas où il s'agit d'un caractère spécial regex). Cela fractionne commodément la chaîne en "avant la correspondance"$`
, "la correspondance"$&
et "après la correspondance"$'
. Dans la recherche cyclique, nous avons clairement vu tous les personnages avant le match et les avons remis dans la pile. Nous avons également vu le personnage actuel mais ne l'avons pas remis. Nous ajoutons donc "avant la correspondance" à la liste "vu"$z
et construisons la pile à partir de "après la correspondance" suivie de "avant la correspondance".la source
SNOBOL4 (CSNOBOL4) , 98 octets
Essayez-le en ligne!
Imprime chaque lettre sur une nouvelle ligne. Utilisez cette version pour tout imprimer sur la même ligne. Prend l'entrée comme pile, puis cible, séparée par une nouvelle ligne.
la source
Perl, 44 octets
Comprend
+4
pour-lF
Donnez une entrée comme sur STDIN comme cible puis empilez (c'est l'ordre inverse des exemples):
Si cela ne vous dérange pas une nouvelle ligne de fin, cela
40
fonctionne:la source