Résoudre les actions de doublage et de triplement dans Dominion

14

Inspiration

Cette question est inspirée des cartes Throne Room et King's Court du célèbre jeu de cartes Dominion .

Salle du Trône Cour du Roi

Dans le cadre de son tour, on joue une séquence d'actions. Ces deux actions particulières font répéter l'action jouée suivante deux ou trois fois *. D'autres actions "génériques" provoquent des effets de jeu spécifiques, mais nous ne nous intéresserons pas aux détails, simplement en les étiquetant avec des lettres.

Le cas intéressant est lorsqu'une salle du trône ou une cour du roi affecte une autre salle du trône de la cour du roi, ce qui provoque le doublement ou le triplement de l'effet de doublage ou de triplement. Les longues chaînes de salles du trône, les cours royales et les actions multipliées peuvent dérouter même les joueurs expérimentés du Dominion.

Votre objectif est d'écrire du code qui résout correctement ces chaînes, en utilisant le moins d'octets possible. Je décrirai les exigences du programme avant d'expliquer comment les chaînes se résolvent dans les règles de Dominion.

* Techniquement, vous choisissez l'action affectée dans le cadre de la résolution de la salle du trône ou de la cour du roi, mais cette vue est plus claire pour ce défi.

Exigences du programme

Écrivez un programme ou une fonction nommée . Il doit prendre en compte la chaîne d'actions jouée (STDIN ou entrée de fonction), et produire ou imprimer la chaîne d'actions résultante à partir des effets du doublement et du triplement. Le moins d'octets gagne.

Contribution

Une chaîne représentant la séquence d'actions jouées. Les actions génériques sont représentées par des majuscules à Atravers Z. L'action de doublage spéciale Salle du trône est représentée par le personnage 2, et l'action de triplement King's Court par 3,

Le nombre de caractères (actions) sera compris entre 1 et 30 inclus. Vous pouvez avoir la fin de l'entrée dans une nouvelle ligne si vous le souhaitez.

Exemple d'entrée: WA23G3GA

Production

Une chaîne de lettres majuscules Aà Z. Cela devrait être la séquence d'actions génériques qui résulte de la résolution des effets de doublement et de triplement, dans l'ordre où ils se produisent.

Vous pouvez avoir la sortie en fin de ligne si vous le souhaitez. Sinon, il ne devrait pas y avoir de caractères supplémentaires.

Exemple de sortie: WAGGGGGGAAA.

Fonctionnement du doublement et du triplement dans Dominion

Ici, je vais passer en revue le fonctionnement des chaînes de salles du trône 2et des cours du roi 3conformément aux règles du Dominion.

Après avoir joué un 2, l'action suivante à résoudre se produit deux fois. Donc, si vous jouez d' abord 2, puis A, on se Apasse deux fois.

2A -> AA

De même,

A2BC -> ABBC
3DE -> DDDE
3N2BC3XY2 -> NNNBBCXXXY

Notez dans le dernier exemple que la finale 2n'avait rien à doubler, donc elle n'a eu aucun effet.

La chose intéressante se produit lorsque les effets doublant ou triplant sont eux-mêmes doublés ou triplés. Par exemple,

22AB -> AABB

D'abord, vous jouez 2. Ensuite, vous jouez un autre 2, qui est doublé par rapport au précédent 2. En conséquence, les deux actions suivantes sont doublées. Tout d'abord, les deux copies de Arésoudre. Ensuite, les copies de Brésoudre.

Notez que ce An'est pas quadruplé: après la première copie des 2actes sur la première A, la copie suivante agit sur la prochaine action non résolue, qui est B. Sans le B, nous aurions

22A -> AA

où la deuxième copie de 2attend la prochaine action pour doubler, mais aucune action ne vient.

Enfin, regardons un exemple complexe.

223BCDE -> BBBCCCDDE

Comme précédemment, le premier 2fait 2doubler le second . Ainsi, les deux prochaines actions seront doublées. La première copie de 2double l'action suivante 3, qui doit être résolue complètement avant de résoudre la copie suivante de 2. La première copie des 3triplets Bet la deuxième copie des triplets C. Maintenant, la deuxième copie encore en attente de 2double l'action suivante non résolue, qui est D. Après cela, aucun effet de doublement ou de triplement ne subsiste et l'action finale Ese produit simplement.

Cas de test

Ils sont donnés sous forme de (input,output).

(FY, FY)
(A2BC, ABBC)
(3DE, DDDE)
(3N2BC3XY2, NNNBBCXXXY)
(WA23G3GA, WAGGGGGGAAA)
(32, )
(33RST, RRRSSSTTT)
(2A32B2CDEFG, AABBCCDDEEFG)
(A2A323AB2CD2D2E3ABC, AAAAAABBBCCDDDDEEAAABBBC)
(P22LL3Q2Q22T, PLLLLQQQQQTT)
(322322ABCDEFGHIJKLMN, AABBCCDDEEEFFGGHHIJKLMN)
xnor
la source

Réponses:

5

GolfScript ( 29 26 octets)

](1/{\1+(3&@*.23-\1$-@+}/;

Démo en ligne

Dissection

Cela abuse légèrement du typage lâche de GolfScript. La pile de combien de fois répéter les actions suivantes commence comme un tableau et se retourne plus tard dans une chaîne - mais 1+ajoute un 1 et (3&affiche la première valeur et correctement met dans la gamme 0à 3quel que soit le changement de type.

](         # Push an empty array under the input string to serve as rep stack
1/{        # Loop over the input string as a series of 1-char strings
           #   Stack is ... reps ch
           #   where the ... covers zero or more strings which will be output
  \        #   Bring the rep stack to the top
  1+(      #   Push a `1` on the bottom of it to avoid underflow and then pop
  3&       #   Coerce to correct range, because if rep stack is a string then
           #   we just got an ASCII value
  @*       #   Apply repetition to the 1-char string: it's now an n-char string
  .23-     #   Duplicate it and remove chars '2' and '3': this becomes output
  \1$-     #   Get the original copy and remove the output string's chars
           #   So the stack is now ... reps output non-output
           #   where non-output is either an empty string or a string of '2's
           #   or '3's
  @+       #   Push non-output onto the repetition stack
}/         # Loop
;          # Pop whatever's left of the repetition stack
Peter Taylor
la source
J'aime votre astuce de pousser 1les sous de la pile pour traiter les actions non multipliées de la même manière que les actions multipliées. Pourriez-vous expliquer davantage comment jongler avec les différentes piles? En particulier, que fait \ pour "amener la pile de représentants au sommet"?
xnor
@xnor, voici la référence intégrée . \ échange les deux premiers éléments de la pile.
Peter Taylor
Merci, je n'avais pas compris que chaque élément de pile était sa propre pile; J'imaginais une seule pile concaténée.
2014 à 6h59
@xnor, ce n'est pas que chaque élément de pile soit sa propre pile; c'est que la pile de répétition est stockée sous forme de tableau ou de chaîne (qui est toujours un tableau, mais traitée différemment par certains éléments intégrés). Démo de débogage qui imprime le contenu de la pile GS juste avant la fin de la boucle principale.
Peter Taylor
4

Javascript - 162 152 octets

Minifié:

F=I=>{L=c=>S.length;p=c=>L()?S.shift():d=>{};S=[(x=>/\d/.test(x)?(c,b)=>{for(c=p(),b=x;b--;)c();}:c=>s+=x)(m)for(m of I)];for(s='';L();)p()();return s;}

Étendu:

F = I => {
    L = c => S.length;
    p = c => L() ? S.shift() : d => {};
    S = [ (x => /\d/.test( x ) ?
        (c,b) => {
            for( c = p(), b = x; b--; )
                c();
        } : c =>
            s += x
        )(m) for( m of I ) ];

    for( s = ''; L(); )
        p()();

    return s;
}

Je suppose que les langages de golf basés sur la pile tueront celui-ci, car il s'agit essentiellement d'un exercice d'empilement de fonctions. : P

Exemples de sorties

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""
COTO
la source
1
Je suis surpris de voir à quel point votre interprétation des cartes en tant que fonctions est exacte. Je m'attendais à une pile, mais pas à une pile d'appels de fonctions! N'existe-t-il pas un moyen plus concis d'appeler une fonction plusieurs fois? Mieux encore, un nombre variable de fois pour gérer les 2/3cas ensemble?
xnor
@xnor: Je pensais que c'était intelligent. ;) Quant à votre suggestion, votre intuition était correcte. J'ai combiné les deux cas pour une économie de 10 octets. Ce serait idéalement 18, mais je suis tombé sur ce que je crois être un bug dans Firefox. Je devrais être capable de manipuler xdirectement sans d'abord le copier dans une variable bportée sur le lambda interne, mais Firefox n'évalue pas correctement la condition de la boucle. Plus précisément, xdevient négatif et le navigateur se bloque. Essayez de remplacer , b = x; b--;par ; x--;et exécutez l'entrée A2A323AB2CD2D2E3ABC. Si quelqu'un qui lit ceci peut comprendre pourquoi, ...
COTO
... Je serais très intéressé de savoir. Peut-être que je manque quelque chose sur la façon dont les fermetures sont censées fonctionner.
COTO
3

C, 115 111 octets

Utilise une entrée / sortie standard.

Enregistré 4 en utilisant memsetet en faisant aller la pile dans l'autre sens.

char*i,X[222],*s=X+99;main(){for(gets(i=X);*i;i++)*i<55?s=memset(s-*s,*i-49,*s+1):putchar(*i)**s?--*s,--i:++s;}

Non golfé

#include <stdio.h>
#include <stdlib.h>
char I[99], S[99], *i = I, *s = S+66;
int n;
int main()
{
    gets(I);
    for(;*i;)
    {
        if(*i < '5') {
            n = *s;
            s[0] = s[1] = s[2] = *i - '1';
            s += n;
            i++;
        } else {
            putchar(*i);
            if(*s)
                --*s;
            else
                --s, ++i;
        }
    }
    return 0;
}
feersum
la source
0

Python (84)

S='1'*99
R=''
for c in input():q=int(S[0])*c;S=q*(c<'A')+S[1:];R+=q*(c>'3')
print(R)

Sest la pile de multiplicateurs (haut si avant). Il est initialisé avec suffisamment 1de pour gérer les actions non multipliées.

Selon que l'action en cours cest générique ou non, nous ajoutons son résultat multiplié soit à la sortie, Rsoit à la pile de multiplicateurs S.

Tout est représenté sous la forme d'une chaîne plutôt que d'une liste de caractères. Parce que les chaînes sont immuables, nous ne pouvons malheureusement pas utiliser popni attribution d'élément sur elles.

xnor
la source