Contando le icone per gli spettacoli di innovazione


11

L'innovazione è un gioco di carte in cui i giocatori combattono attraverso i secoli, dalla preistoria ai tempi moderni, nel tentativo di ottenere risultati più velocemente dei loro avversari.

Ogni carta in Innovation è unica e fornisce al giocatore un numero di icone. Se trattiamo ogni carta come una griglia 2x3, allora tre delle quattro fessure sui bordi sinistro e inferiore saranno sempre occupate da icone (i simboli negli esagoni neri non vengono conteggiati).

inserisci qui la descrizione dell'immagine

Il gioco ha 6 tipi di icone (castelli, corone, foglie, lampadine, fabbriche e orologi), che rappresenteremo arbitrariamente usando i caratteri 012345. Usando #per rappresentare l'esagono nero, possiamo usare quattro caratteri per rappresentare le icone su ogni carta. Ad esempio, le carte sopra sono

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

Ora, in Innovation, le carte nell'area di gioco sono raggruppate in pile * che sono divise in quattro modi. Per ogni esempio useremo le carte sopra, assumendo la carta più a sinistra 03#0, è in cima al mazzo.

Nessuna azione: è visibile solo la carta in alto

0..
3#0

Splay a sinistra : la carta in alto è completamente visibile, così come il terzo di destra di tutte le carte in basso

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

Splay a destra : la carta in alto è completamente visibile, così come il terzo sinistro di tutte le carte in basso

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

Splay up : la carta in alto è completamente visibile, così come la metà inferiore di tutte le carte in basso.

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

La sfida

L'input sarà una singola stringa separata da spazio composta da due parti:

  • Una direzione di splay, che è una delle due !<>^, che rappresenta rispettivamente nessuna splay, splay a sinistra, splay a destra o in alto.
  • Un elenco di carte non vuoto, ognuna delle quali è lunga 4 caratteri e composta dai caratteri 012345#. La carta più a sinistra si trova nella parte superiore del mazzo e ogni carta ne contiene esattamente una #.

Le risposte possono essere funzioni, programmi completi o equivalenti . Puoi scegliere se la direzione dello splay è la prima o l'ultima, ovvero scegli uno dei due formati seguenti:

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

L'output sarà un elenco di sei numeri che rappresentano il conteggio per ciascuna icona, ad esempio per le carte di esempio sopra:

! 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

Ad esempio, il caso no splay aveva due 0icone e 3un'icona che mostrava la prima riga. Nota che non contiamo #s, poiché gli esagoni neri non sono icone.

Puoi scegliere qualsiasi modo ragionevole e non ambiguo di rappresentare l'elenco, ad es. Separato da delimitatori o utilizzando la rappresentazione dell'elenco naturale della tua lingua.

Casi test

! 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

Si noti che qualcosa di simile !non è un input valido, poiché l'elenco è garantito non vuoto.


* Ai fini di questa sfida, ignoriamo i colori delle pile.

Risposte:


5

CJam, 44 37 36 byte

Grazie a Sp3000 per avermi ricordato che sto complicando troppo le cose e risparmiando 7 byte.

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

Provalo qui.

Spiegazione

Alcune osservazioni:

  • Vogliamo sempre contare l'intera prima carta.
  • Tutti gli spettacoli produrranno un prefisso o un suffisso delle icone rimosse. !rimuove tutti (che è un prefisso o un suffisso di quattro caratteri), <rimuove i primi tre caratteri, >rimuove gli ultimi due caratteri, ^rimuove il primo carattere.

Quindi tutto ciò di cui abbiamo bisogno è un modo breve per mappare la modalità di visualizzazione sul troncamento corretto:

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.

Possiamo notare che gli snippet di troncamento in realtà hanno molta struttura. Ogni modalità di visualizzazione è associata a un numero [0 1 2 3](in particolare, in ordine "!^><") e due di essi hanno >e due hanno <. Speravo di trovare due hash che magicamente producessero queste parti separatamente, poiché ciò avrebbe salvato un mucchio di byte, ma finora non sono riuscito a trovare nulla. Posso mappare "!^><"a numeri di parità alternata con 31%(per selezionare il carattere corretto da "<>"), ma non ho trovato nulla che li mappa ordinatamente [0 1 2 3]in quell'ordine. (Tranne la soluzione ingenua di "!^><"#cui purtroppo non salva alcun byte.)

Si noti inoltre che in realtà è un po 'più flessibile. !può anche essere implementato come n>per qualsiasi n > 3(scartando tutto come prefisso). Sfortunatamente, non sono stato in grado di trovare alcuna funzione semplice per una simile mappa.


0

Pyth, 39 36 33 31 byte

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

Provalo online. Suite di test.

Spiegazione

  • Jtczd: dividere l'input per spazi, rimuovere la prima parte e salvare il resto in J.
  • m6: Ripeti quanto segue per i numeri da 0 a 5.
    • m... tJ: ripeti quanto segue per tutte le carte tranne la prima.
      • Chz: ottiene il punto di codice del primo carattere nell'input.
      • %*%33T19: Associa i punti di codice di !<>^(33, 60, 62, 94) ai numeri 0, 4, 5, 14. Il calcolo esatto eseguito è cp % 33 * 10 % 19.
      • yk: ottiene il powerset della carta corrente. Questo è un elenco di tutte le sottosequenze della carta.
      • @: ottiene l'elemento del powerset corrispondente all'indice calcolato in precedenza.
    • +hJ: aggiungi la prima carta al risultato.
    • s: concatena le carte processate insieme.
    • /... `d: conta le occorrenze del numero corrente nel risultato.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.