Inspiração
Essa pergunta é inspirada nas cartas Throne Room e King's Court do popular jogo de cartas Dominion .
Como parte de sua vez, desempenha-se uma sequência de ações. Essas duas ações específicas fazem com que a próxima ação seja repetida duas ou três vezes *. Outras ações "genéricas" causam efeitos específicos no jogo, mas não estaremos interessados nos detalhes, simplesmente rotulá-los com letras.
O caso interessante é quando uma Sala do Trono ou Corte do Rei afeta outra Sala do Trono da Corte do Rei, fazendo com que o efeito de duplicação ou triplicação seja duplicado ou triplicado. Longas cadeias de salas do trono, cortes do rei e ações multiplicadas podem confundir até jogadores experientes do Dominion.
Seu objetivo é escrever um código que resolva corretamente essas cadeias, usando o mínimo de bytes possível. Descreverei os requisitos do programa antes de explicar como as cadeias se resolvem nas regras de domínio.
* Tecnicamente, você escolhe a ação afetada como parte da resolução da Sala do Trono ou da Corte do Rei, mas essa visão é mais limpa para esse desafio.
Requisitos do programa
Escreva um programa ou função nomeada . Ele deve incluir a cadeia de ações executadas (STDIN ou entrada de função) e gerar ou imprimir a cadeia de ações resultante a partir dos efeitos da duplicação e triplicação. Menos bytes ganha.
Entrada
Uma sequência que representa a sequência de ações executadas. Ações genéricos são representados por letras maiúsculas A
através Z
. A ação especial de duplicação, Throne Room, é representada pelo personagem 2
, e a ação triplicadora de King's Court por 3
,
O número de caracteres (ações) estará entre 1 e 30, inclusive. Você pode ter a entrada final em uma nova linha, se desejar.
Exemplo de entrada: WA23G3GA
Resultado
Uma sequência de letras maiúsculas A
para Z
. Essa deve ser a sequência de ações genéricas que resultam da resolução dos efeitos de duplicação e triplicação, na ordem em que ocorrem.
Você pode ter a saída final em uma nova linha, se desejar. Caso contrário, não deve haver caracteres adicionais.
Exemplo de saída: WAGGGGGGAAA
.
Como duplicar e triplicar funciona em Dominion
Aqui, mostrarei como as cadeias de salas do trono 2
e as cortes do rei 3
funcionam de acordo com as regras do domínio.
Depois de jogar a 2
, a próxima ação a ser resolvida acontece duas vezes. Então, se você primeiro jogar 2
, então A
, você começa A
a acontecer duas vezes.
2A -> AA
Similarmente,
A2BC -> ABBC
3DE -> DDDE
3N2BC3XY2 -> NNNBBCXXXY
Observe no último exemplo que a final 2
não teve nada para dobrar, por isso não teve efeito.
O interessante acontece quando os efeitos de duplicação ou triplicação são eles mesmos duplicados ou triplicados. Por exemplo,
22AB -> AABB
Primeiro você joga 2
. Então, você joga outro 2
, que é duplicado do anterior 2
. Como resultado, as próximas duas ações são duplicadas. Primeiro, as duas cópias da A
resolução. Então, as cópias da B
resolução.
Observe que A
não é quadruplicado: após a primeira cópia dos 2
atos no primeiro A
, a próxima cópia atua na próxima ação não resolvida, que é B
. Sem o B
, teríamos
22A -> AA
onde a segunda cópia de 2
está aguardando a próxima ação dobrar, mas nenhuma ação ocorre.
Finalmente, vejamos um exemplo complexo.
223BCDE -> BBBCCCDDE
Como antes, o primeiro 2
faz com que o segundo 2
seja dobrado. Portanto, as próximas duas ações serão duplicadas. A primeira cópia de 2
duplica a próxima ação 3
, que deve ser resolvida completamente antes de resolver a próxima cópia de 2
. A primeira cópia de 3
triplos B
e a segunda cópia triplica C
. Agora, a segunda cópia ainda em espera 2
dobra a próxima ação ainda não resolvida, que é D
. Depois disso, nenhum efeito de duplicação ou triplicação permanece, e a ação final E
simplesmente acontece.
Casos de teste
Estes são dados como (input,output)
.
(FY, FY)
(A2BC, ABBC)
(3DE, DDDE)
(3N2BC3XY2, NNNBBCXXXY)
(WA23G3GA, WAGGGGGGAAA)
(32, )
(33RST, RRRSSSTTT)
(2A32B2CDEFG, AABBCCDDEEFG)
(A2A323AB2CD2D2E3ABC, AAAAAABBBCCDDDDEEAAABBBC)
(P22LL3Q2Q22T, PLLLLQQQQQTT)
(322322ABCDEFGHIJKLMN, AABBCCDDEEEFFGGHHIJKLMN)
1
para baixo da pilha para tratar ações não multiplicadas da mesma forma que ações multiplicadas. Poderia, por favor, explicar mais sobre como você manipula as várias pilhas? Em particular, o que \ faz para "trazer a pilha de repetições para o topo"?Javascript -
162152 bytesMinificado:
Expandido:
Suponho que as linguagens de golfe baseadas em pilha serão eliminadas nesta, pois é basicamente um exercício de empilhamento de funções. : P
Saídas de amostra
fonte
2/3
casos juntos?x
diretamente sem primeiro copiá-lo para uma variável comb
escopo definido para o lambda interno, mas o Firefox não avalia a condição do loop corretamente. Especificamente,x
fica negativo e o navegador trava. Tente substituir, b = x; b--;
por; x--;
e execute a entradaA2A323AB2CD2D2E3ABC
. Se alguém ler este pode descobrir o porquê ...C,
115111 bytesUsa entrada / saída padrão.
Salvo 4, usando
memset
e fazendo a pilha ir na outra direção.Ungolfed
fonte
Python (84)
S
é a pilha de multiplicadores (superior se frontal). É inicializado com o suficiente1
para lidar com ações não multiplicadas.Dependendo se a ação atual
c
é genérica ou não, adicionamos seu resultado multiplicado à saídaR
ou à pilha de multiplicadoresS
.Tudo é representado como uma string, e não como uma lista de caracteres. Como as strings são imutáveis, infelizmente não podemos usar
pop
ou atribuir elementos a elas.fonte