Contando ícones para splays de inovação

11

A inovação é um jogo de cartas em que os jogadores lutam ao longo dos tempos, da pré-história aos tempos modernos, na tentativa de obter conquistas mais rapidamente do que seus oponentes.

Cada carta da Innovation é única e fornece ao jogador vários ícones. Se tratarmos cada cartão como uma grade 2x3, três dos quatro slots nas bordas esquerda e inferior sempre serão ocupados por ícones (os símbolos em hexágonos pretos não são contados).

insira a descrição da imagem aqui

O jogo possui 6 tipos de ícones (castelos, coroas, folhas, lâmpadas, fábricas e relógios), que representaremos arbitrariamente usando os caracteres 012345. Usando #para representar o hexágono preto, podemos usar quatro caracteres para representar os ícones em cada cartão. Por exemplo, os cartões acima são

0.. #.. 3.. 1..  -> 03#0 #331 355# 144#
3#0 331 55# 44#

Agora, em Inovação, as cartas na área de jogo são agrupadas em pilhas *, dispostas de uma das quatro maneiras. Para cada exemplo, usaremos as cartas acima, assumindo que a carta mais à esquerda 03#0, está no topo da pilha.

Sem dispersão: apenas a carta do topo é visível

0..
3#0

Espalhe para a esquerda : a carta superior é totalmente visível e o terço direito de todas as cartas abaixo

0..|.|.|.|
3#0|1|#|#|

Espalhe para a direita : a carta superior é totalmente visível, assim como o terço esquerdo de todas as cartas abaixo

1|3|#|0..
4|5|3|3#0

Espalhe para cima : a carta superior é totalmente visível, assim como a metade inferior de todas as cartas abaixo.

0..
3#0
---
331
---
55#
---
44#

O desafio

A entrada será uma única string separada por espaço, composta por duas partes:

  • Uma direção de espalhamento, que é uma das !<>^opções, que não representa, espalhou para a esquerda, espalhou para a direita ou espalhou para cima, respectivamente.
  • Uma lista não vazia de cartões, cada um com 4 caracteres e constituído pelos caracteres 012345#. A carta mais à esquerda está no topo da pilha e cada carta contém exatamente uma #.

As respostas podem ser funções, programas completos ou equivalente . Você pode escolher se a direção de exibição é a primeira ou a última, ou seja, escolha um dos dois formatos abaixo:

> 03#0 #331 355# 144#
03#0 #331 355# 144# >

A saída será uma lista de seis números representando a contagem de cada ícone, por exemplo, para os cartões de exemplo acima:

! 03#0 #331 355# 144#  ->  2 0 0 1 0 0
< 03#0 #331 355# 144#  ->  2 1 0 1 0 0
> 03#0 #331 355# 144#  ->  2 1 0 3 1 1
^ 03#0 #331 355# 144#  ->  2 1 0 3 2 2

Por exemplo, o caso no splay tinha dois 0ícones e um 3ícone aparecendo, dando a primeira linha. Observe que não contamos #s, pois os hexágonos pretos não são ícones.

Você pode escolher qualquer maneira razoável e não ambígua de representar a lista, por exemplo, separada por delimitador ou usando a representação natural da lista do seu idioma.

Casos de teste

! 113#  ->  0 2 0 1 0 0
< 113#  ->  0 2 0 1 0 0
> 113#  ->  0 2 0 1 0 0
^ 113#  ->  0 2 0 1 0 0
! 000# 12#2  ->  3 0 0 0 0 0
< 000# 12#2  ->  3 0 1 0 0 0
> 000# 12#2  ->  3 1 1 0 0 0
^ 000# 12#2  ->  3 0 2 0 0 0
! 000# 111# 222#  ->  3 0 0 0 0 0
< 000# 111# 222#  ->  3 0 0 0 0 0
> 000# 111# 222#  ->  3 2 2 0 0 0
^ 000# 111# 222#  ->  3 2 2 0 0 0
! 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 0 0 2 0 1
< 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  1 1 2 5 1 1
> 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 3 3 7 1 1
^ 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  2 4 4 10 1 2

Observe que algo como !é entrada inválida, pois a lista é garantida como não vazia.


* Para os propósitos deste desafio, estamos ignorando as cores da pilha.

Sp3000
fonte

Respostas:

5

CJam, 44 37 36 bytes

Agradeço ao Sp3000 por me lembrar que estou complicando demais as coisas e economizando 7 bytes.

rci7%"3>0<2<1>"2/=6,slS%{W$~+}*fe=p;

Teste aqui.

Explicação

Algumas observações:

  • Sempre queremos contar o primeiro cartão inteiro.
  • Todas as dispersões resultarão em um prefixo ou um sufixo dos ícones removidos. !remove todos eles (que é um prefixo ou um sufixo de quatro caracteres), <remove os três primeiros caracteres, >remove os dois últimos caracteres, ^remove o primeiro caractere.

Então, tudo o que precisamos é uma maneira curta de mapear o modo splay para o truncamento correto:

rci   e# Read the splay mode and convert to its character code.
7%    e# Take modulo 7. This maps "<!>^" to [4 5 6 3], respectively. Modulo 4 those are
      e# are all distinct (namely [0 1 2 3], respectively).
"3>0<2<1>"
      e# Push this string.
2/    e# Split it into chunks of 2, ["3>" "0<" "2<" "1>"]. Each chunk is CJam code which
      e# performs one of the truncations.
=     e# Select the correct snippet. This works, because array indexing is cyclic in CJam.
6,s   e# Push the string "012345".
lS%   e# Read the remainder of the input and split into space-separated tokens.
{     e# Now we're abusing the fold operation to apply our snippet to every card except
      e# the first, while also combining them all back into a single string.
  W%  e#   Copy the bottom of the stack (the truncation snippet).
  ~   e#   Evaluate it.
  +   e#   Append it the string we're building.
}*
fe=   e# For each character in "012345", count the occurrences in our new string.
p     e# Pretty-print the array.
;     e# Discard the truncation snippet which was still at the bottom of the stack.

Podemos notar que os trechos de truncamento realmente têm muita estrutura. Cada modo de exibição é mapeado para um número [0 1 2 3](especificamente, em ordem "!^><"), e dois deles têm >e dois têm <. Eu esperava encontrar dois hashes que magicamente produzissem essas partes separadamente, pois isso economizaria um monte de bytes, mas até agora não consegui encontrar nada. Posso mapear "!^><"para números de paridade alternada com 31%(para selecionar o caractere correto "<>"), mas não encontrei nada que os mapeie ordenadamente [0 1 2 3]nessa ordem. (Exceto a solução ingênua da "!^><"#qual infelizmente não salva bytes.)

Observe também que, na verdade, é um pouco mais flexível. !também pode ser implementado como n>para qualquer n > 3(descartando tudo como um prefixo). Infelizmente, também não consegui encontrar nenhuma função simples para esse mapa.

Martin Ender
fonte
0

Pitão, 39 36 33 31 bytes

Jtczdm/s+hJm@yk%*%Chz33T19tJ`d6

Experimente online. Suíte de teste.

Explicação

  • Jtczd: divida a entrada por espaços, remova a primeira parte e salve o restante em J.
  • m6: Repita o seguinte para os números de 0 a 5.
    • mtJ: Repita o seguinte para todos os cartões, exceto o primeiro.
      • Chz: obtém o ponto de código do primeiro caractere na entrada.
      • %*%33T19: Mapeie os pontos de código de !<>^(33, 60, 62, 94) para os números 0, 4, 5, 14. O cálculo exato realizado é cp % 33 * 10 % 19.
      • yk: obtém o conjunto de potência da placa atual. Esta é uma lista de todas as subsequências do cartão.
      • @: obtém o item do conjunto de poderes correspondente ao índice calculado anteriormente.
    • +hJ: anexa o primeiro cartão ao resultado.
    • s: concatene os cartões processados ​​juntos.
    • /`d: Conte as ocorrências do número atual no resultado.
PurkkaKoodari
fonte