Contando iconos para juegos de innovación

11

La innovación es un juego de cartas en el que los jugadores luchan a través de las edades, desde la prehistoria hasta los tiempos modernos, en un intento de obtener logros más rápido que sus oponentes.

Cada carta en Innovación es única y proporciona al jugador una serie de iconos. Si tratamos cada tarjeta como una cuadrícula de 2x3, entonces tres de las cuatro ranuras en los bordes izquierdo e inferior siempre estarán ocupadas por iconos (los símbolos en hexágonos negros no se cuentan).

ingrese la descripción de la imagen aquí

El juego tiene 6 tipos de íconos (castillos, coronas, hojas, bombillas, fábricas y relojes), que representaremos arbitrariamente usando los caracteres 012345. Usando #para representar el hexágono negro, podemos usar cuatro caracteres para representar los iconos en cada tarjeta. Por ejemplo, las cartas de arriba son

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

Ahora, en Innovación, las cartas en el área de juego se agrupan en pilas * que se dividen en una de cuatro formas. Para cada ejemplo, usaremos las cartas de arriba, suponiendo que la carta más a la izquierda 03#0esté en la parte superior de la pila.

Sin separación: solo se ve la carta superior

0..
3#0

Separar a la izquierda : la carta superior es totalmente visible, así como el tercio derecho de todas las cartas de abajo

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

Separar a la derecha : la carta superior es totalmente visible, así como el tercio izquierdo de todas las cartas de abajo

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

Separar : la carta superior es totalmente visible, así como la mitad inferior de todas las cartas de abajo.

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

El reto

La entrada será una sola cadena separada por espacios que consta de dos partes:

  • Una dirección de separación, que es una !<>^, que no representa separación, separación hacia la izquierda, separación hacia la derecha o hacia arriba, respectivamente.
  • Una lista de tarjetas no vacía, cada una de las cuales tiene 4 caracteres y consta de los caracteres 012345#. La carta más a la izquierda está en la parte superior de la pila, y cada carta contiene exactamente una #.

Las respuestas pueden ser funciones, programas completos o equivalentes . Puede elegir si la dirección de la separación es la primera o la última, es decir, elegir uno de los dos formatos a continuación:

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

La salida será una lista de seis números que representan el recuento de cada icono, por ejemplo, para las tarjetas de ejemplo anteriores:

! 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 ejemplo, el caso sin pantalla tenía dos 0íconos y un 3ícono mostrando, dando la primera línea. Tenga en cuenta que no contamos #s, ya que los hexágonos negros no son iconos.

Puede elegir cualquier forma razonable y no ambigua de representar la lista, por ejemplo, separada por delimitadores o utilizando la representación de la lista natural de su idioma.

Casos de prueba

! 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

Tenga en cuenta que algo como esto !es una entrada no válida, ya que la lista está garantizada como no vacía.


* Para los propósitos de este desafío, estamos ignorando los colores de la pila.

Sp3000
fuente

Respuestas:

5

CJam, 44 37 36 bytes

Gracias a Sp3000 por recordarme que estoy complicando demasiado las cosas y ahorrando 7 bytes.

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

Pruébalo aquí.

Explicación

Algunas observaciones

  • Siempre queremos contar toda la primera carta.
  • Todas las reproducciones darán como resultado un prefijo o un sufijo de los iconos eliminados. !elimina todos ellos (que es un prefijo o un sufijo de cuatro caracteres), <elimina los primeros tres caracteres, >elimina los dos últimos caracteres, ^elimina el primer carácter.

Entonces, todo lo que necesitamos es una forma corta de asignar el modo de reproducción al truncamiento correcto:

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 los fragmentos de truncamiento en realidad tienen mucha estructura. Cada modo de reproducción se asigna a un número en [0 1 2 3](específicamente, en orden "!^><"), y dos de ellos tienen >y dos tienen <. Esperaba encontrar dos hashes que produjeran mágicamente estas partes por separado, ya que eso ahorraría un montón de bytes, pero hasta ahora no pude encontrar nada. Puedo asignar "!^><"a números de paridad alterna con 31%(para seleccionar el carácter correcto "<>"), pero no he encontrado nada que los asigne cuidadosamente [0 1 2 3]en ese orden. (Excepto la ingenua solución de la "!^><"#cual desafortunadamente no guarda ningún byte).

También tenga en cuenta que en realidad es un poco más flexible. !También se puede implementar como n>para cualquier n > 3(descartando todo como prefijo). Desafortunadamente, tampoco he podido encontrar ninguna función simple para dicho mapa.

Martin Ender
fuente
0

Pyth, 39 36 33 31 bytes

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

Pruébalo en línea. Banco de pruebas.

Explicación

  • Jtczd: divide la entrada por espacios, elimina la primera parte y guarda el resto en J.
  • m6: Repita lo siguiente para los números del 0 al 5.
    • mtJ: Repita lo siguiente para todas las tarjetas excepto la primera.
      • Chz: obtiene el punto de código del primer carácter en la entrada.
      • %*%33T19: Asigna los puntos de código de !<>^(33, 60, 62, 94) a los números 0, 4, 5, 14. El cálculo exacto realizado es cp % 33 * 10 % 19.
      • yk: obtiene el conjunto de potencia de la tarjeta actual. Esta es una lista de todas las subsecuencias de la tarjeta.
      • @: obtiene el elemento del conjunto de potencia correspondiente al índice calculado anteriormente.
    • +hJ: agrega la primera carta al resultado.
    • s: concatenar las tarjetas procesadas juntas.
    • /`d: Cuenta las ocurrencias del número actual en el resultado.
PurkkaKoodari
fuente