Resolver acciones de duplicación y triplicación en Dominion

14

Inspiración

Esta pregunta está inspirada en las cartas Throne Room y King's Court del popular juego de cartas Dominion .

Salón del Trono Corte del rey

Como parte de su turno, uno juega una secuencia de acciones. Estas dos acciones particulares hacen que la acción que se juega a continuación se repita dos o tres veces *. Otras acciones "genéricas" causan efectos específicos del juego, pero no nos interesarán los detalles, simplemente etiquetándolos con letras.

El caso interesante es cuando una Sala del Trono o la Corte del Rey afecta a otra Sala del Trono de la Corte del Rey, haciendo que el efecto de duplicación o triplicación se duplique o triplique. Las largas cadenas de Salas del Trono, los Tribunales del Rey y las acciones multiplicadas pueden confundir incluso a los jugadores de Dominion con experiencia.

Su objetivo es escribir código que resuelva correctamente estas cadenas, utilizando la menor cantidad de bytes posible. Describiré los requisitos del programa antes de explicar cómo se resuelven las cadenas en las reglas de Dominion.

* Técnicamente, eliges la acción afectada como parte de la resolución de Throne Room o King's Court, pero esta vista es más limpia para este desafío.

Requerimientos del programa

Escribir un programa o función con nombre . Debe incluir la cadena de acciones jugadas (STDIN o entrada de función) y generar o imprimir la cadena de acciones resultante de los efectos de duplicar y triplicar. Pocos bytes ganan.

Entrada

Una cadena que representa la secuencia de acciones jugadas. Las acciones genéricas se representan con letras mayúsculas a Através Z. La acción especial de duplicación Throne Room está representada por el personaje 2, y la acción de triplicar King's Court por 3,

El número de caracteres (acciones) estará entre 1 y 30, inclusive. Puede hacer que la entrada finalice en una nueva línea si lo desea.

Entrada de ejemplo: WA23G3GA

Salida

Una cadena de letras mayúsculas Apara Z. Esta debería ser la secuencia de acciones genéricas que resultan de resolver los efectos de duplicación y triplicación, en el orden en que ocurren.

Puede hacer que la salida finalice en una nueva línea si lo desea. No debería haber caracteres adicionales de lo contrario.

Ejemplo de salida: WAGGGGGGAAA.

Cómo funciona duplicar y triplicar en Dominion

Aquí, analizaré cómo funcionan las cadenas de Salas del Trono ( 2's) y Tribunales del Rey ( 3' s) según las reglas de Dominion.

Después de jugar a 2, la siguiente acción a resolver ocurre dos veces. Entonces, si juegas por primera vez 2, entonces Ate Asuceden dos veces.

2A -> AA

Similar,

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

Tenga en cuenta en el último ejemplo que la final 2no tenía nada que duplicar, por lo que no tuvo ningún efecto.

Lo interesante sucede cuando los efectos de duplicación o triplicación se duplican o triplican. Por ejemplo,

22AB -> AABB

Primero juegas 2. Luego, juegas otro 2, que se duplica al anterior 2. Como resultado, las siguientes dos acciones se duplican. Primero, las dos copias de la Aresolución. Luego, las copias de la Bresolución.

Tenga en cuenta que Ano se cuadruplica: después de la primera copia de los 2actos en el primero A, la siguiente copia actúa en la siguiente acción no resuelta, que es B. Sin el B, tendríamos

22A -> AA

donde la segunda copia de 2está esperando que la próxima acción se duplique, pero no se produce ninguna acción.

Finalmente, veamos un ejemplo complejo.

223BCDE -> BBBCCCDDE

Como antes, el primero 2hace que el segundo 2se duplique. Entonces, las siguientes dos acciones se duplicarán. La primera copia de 2duplica la siguiente acción 3, que debe resolverse por completo antes de resolver la siguiente copia de 2. La primera copia de 3triples B, y la segunda copia se triplica C. Ahora, la segunda copia aún pendiente de 2duplica la próxima acción aún sin resolver, que es D. Después de esto, no quedan efectos de duplicación o triplicación, y la acción final Esimplemente sucede.

Casos de prueba

Estos se dan como (input,output).

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

Respuestas:

5

GolfScript ( 29 26 bytes)

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

Demostración en línea

Disección

Esto abusa un poco del tipeo suelto de GolfScript. La pila de cuántas veces se debe repetir las acciones posteriores que empieza como una matriz y giros posteriores en una cadena - pero 1+añade un 1 y (3&aparece el primer valor y correctamente lo pone en el rango de 0hasta 3independientemente del cambio de tipo.

](         # 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
fuente
Me gusta tu truco de empujar 1's debajo de la pila para tratar las acciones no multiplicadas de la misma manera que las multiplicadas. ¿Podrías explicar más acerca de cómo hacer malabares con las diferentes pilas? En particular, ¿qué hace \ para "llevar la pila de repeticiones a la cima"?
xnor
@xnor, aquí está la referencia integrada . \ intercambia los dos primeros elementos de la pila.
Peter Taylor
Gracias, no había entendido que cada elemento de la pila era su propia pila; Estaba imaginando una sola pila concatenada.
xnor
@xnor, no es que cada elemento de la pila sea su propia pila; es que la pila de repetición se almacena como una matriz o una cadena (que sigue siendo una matriz, pero algunos incorporados la tratan de manera diferente). Demostración de depuración que imprime el contenido de la pila GS justo antes del final del ciclo principal.
Peter Taylor
4

Javascript - 162152 bytes

Minified:

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;}

Expandido:

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;
}

Supongo que los lenguajes de golf basados ​​en pila matarán a este, ya que es básicamente un ejercicio de apilamiento de funciones. :PAG

Resultados de muestra

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""
COTO
fuente
1
Me sorprende cuán exacta es su interpretación paralela de las tarjetas como funciones. ¡Esperaba una pila, pero no una pila de funciones de llamada literal! ¿No hay una forma más concisa de llamar una función varias veces? Mejor aún, ¿un número variable de veces para manejar los 2/3casos juntos?
xnor
@xnor: pensé que era inteligente. ;) En cuanto a su sugerencia, su intuición era correcta. He combinado los dos casos para un ahorro de 10 bytes. Idealmente sería 18 pero me he topado con lo que creo que es un error en Firefox. Debería poder manipular xdirectamente sin copiarlo primero en una variable bdelimitada al lambda interno, pero Firefox no evalúa la condición del bucle correctamente. Específicamente, se xvuelve negativo y el navegador se cuelga. Intente reemplazar , b = x; b--;con ; x--;y ejecute la entrada A2A323AB2CD2D2E3ABC. Si alguien que lee esto puede descubrir por qué, ...
COTO
... me interesaría mucho saberlo. Tal vez me estoy perdiendo algo sobre cómo se supone que funcionan los cierres.
COTO
3

C, 115 111 bytes

Utiliza entrada / salida estándar.

Guardado 4 usando memsety haciendo que la pila vaya en la otra dirección.

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;}

Sin 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
fuente
0

Pitón (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)

Ses la pila de multiplicadores (arriba si está al frente). Se inicializa con suficientes 1para manejar acciones no multiplicadas.

Dependiendo de si la acción actual ces genérica o no, agregamos su resultado multiplicado a la salida Ro a la pila de multiplicadores S.

Todo se representa como una cadena en lugar de una lista de caracteres. Debido a que las cadenas son inmutables, desafortunadamente no podemos usar popo asignar elementos en ellas.

xnor
fuente