Zählsymbole für Innovation Splays

11

Innovation ist ein Kartenspiel, bei dem Spieler durch die Jahrhunderte kämpfen, von der Vorgeschichte bis zur Neuzeit, um schneller als ihre Gegner Erfolge zu erzielen.

Jede Karte in Innovation ist ein Unikat und bietet einem Spieler eine Reihe von Symbolen. Wenn wir jede Karte als 2x3-Raster behandeln, werden drei der vier Steckplätze am linken und unteren Rand immer von Symbolen belegt (die Symbole in schwarzen Sechsecken werden nicht gezählt).

Geben Sie hier die Bildbeschreibung ein

Das Spiel hat 6 Arten von Symbolen (Burgen, Kronen, Blätter, Glühbirnen, Fabriken und Uhren), die wir willkürlich mit den Zeichen darstellen 012345. Um #das schwarze Sechseck darzustellen, können wir vier Zeichen verwenden, um die Symbole auf jeder Karte darzustellen. Zum Beispiel sind die obigen Karten

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

In Innovation werden die Karten im Spielbereich jetzt in Stapel * gruppiert, die auf eine von vier Arten gespreizt werden. Für jedes Beispiel verwenden wir die obigen Karten, vorausgesetzt, die Karte ganz links 03#0befindet sich oben auf dem Stapel.

Keine Spreizung: Nur die oberste Karte ist sichtbar

0..
3#0

Links anzeigen : Die oberste Karte ist vollständig sichtbar, ebenso das rechte Drittel aller Karten darunter

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

Rechts spielen : Die oberste Karte ist vollständig sichtbar, ebenso das linke Drittel aller Karten darunter

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

Aufspielen : Die oberste Karte ist vollständig sichtbar, ebenso die untere Hälfte aller Karten darunter.

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

Die Herausforderung

Die Eingabe erfolgt durch eine einzelne durch Leerzeichen getrennte Zeichenfolge, die aus zwei Teilen besteht:

  • Eine Spreizrichtung, die !<>^keine Spreizung darstellt, die keine Spreizung, Spreizung nach links, Spreizung nach rechts oder Spreizung nach oben darstellt.
  • Eine nicht leere Liste von Karten, von denen jede 4 Zeichen lang ist und aus den Zeichen besteht 012345#. Die Karte ganz links befindet sich oben auf dem Stapel und jede Karte enthält genau eine #.

Antworten können Funktionen, vollständige Programme oder gleichwertige sein . Sie können wählen, ob die Spreizrichtung zuerst oder zuletzt ist, dh eines der beiden folgenden Formate wählen:

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

Die Ausgabe wird eine Liste von sechs Zahlen sein, die die Anzahl für jedes Symbol darstellen, z. B. für die obigen Beispielkarten:

! 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

Zum Beispiel hatte der Fall ohne Spreizung zwei 0Symbole und ein 3Symbol, das die erste Zeile ergab. Beachten Sie, dass wir #s nicht zählen , da die schwarzen Sechsecke keine Symbole sind.

Sie können eine vernünftige und nicht mehrdeutige Art der Darstellung der Liste wählen, z. B. durch Trennzeichen getrennt oder unter Verwendung der natürlichen Listendarstellung Ihrer Sprache.

Testfälle

! 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

Beachten Sie, dass so etwas wie !eine ungültige Eingabe ist, da die Liste garantiert nicht leer ist.


* Für diese Herausforderung ignorieren wir Stapelfarben.

Sp3000
quelle

Antworten:

5

CJam, 44 37 36 Bytes

Vielen Dank an Sp3000, der mich daran erinnert hat, dass ich Dinge zu kompliziert mache und 7 Bytes spare.

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

Testen Sie es hier.

Erläuterung

Einige Beobachtungen:

  • Wir wollen immer die gesamte erste Karte zählen.
  • Alle Splays führen dazu, dass entweder ein Präfix oder ein Suffix der Symbole entfernt wird. !Entfernt alle (entweder ein Präfix oder ein Suffix aus vier Zeichen), <entfernt die ersten drei Zeichen, >entfernt die letzten beiden Zeichen und ^entfernt das erste Zeichen.

Wir brauchen also nur einen kurzen Weg, um den Spreizmodus der richtigen Kürzung zuzuordnen:

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.

Wir können feststellen, dass die Kürzungsschnipsel tatsächlich viel Struktur haben. Jeder Spreizmodus ist einer Nummer in [0 1 2 3](speziell in der Reihenfolge "!^><") zugeordnet, und zwei von ihnen haben >und zwei haben <. Ich hatte gehofft, zwei Hashes zu finden, die diese Teile auf magische Weise separat produzieren, da dies eine Menge Bytes sparen würde, aber bisher konnte ich nichts finden. Ich kann "!^><"Nummern mit abwechselnder Parität zuordnen 31%(um das richtige Zeichen auszuwählen "<>"), aber ich habe nichts gefunden, das sie [0 1 2 3]in dieser Reihenfolge ordentlich abbildet . (Außer der naiven Lösung, bei "!^><"#der leider keine Bytes gespeichert werden.)

Beachten Sie auch, dass es tatsächlich etwas flexibler ist. !kann auch wie n>für jedes implementiert werden n > 3(alles als Präfix verwerfen). Leider konnte ich auch für eine solche Karte keine einfache Funktion finden.

Martin Ender
quelle
0

Pyth, 39 36 33 31 Bytes

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

Probieren Sie es online aus. Testsuite.

Erläuterung

  • Jtczd: Teilen Sie die Eingabe nach Leerzeichen, entfernen Sie den ersten Teil und speichern Sie den Rest in J.
  • m6: Wiederholen Sie die folgenden Schritte für die Nummern 0 bis 5.
    • mtJ: Wiederholen Sie die folgenden Schritte für alle Karten mit Ausnahme der ersten.
      • Chz: Ermittelt den Codepunkt des ersten Zeichens in der Eingabe.
      • %*%33T19: Ordnen Sie die Codepunkte von !<>^(33, 60, 62, 94) den Zahlen 0, 4, 5, 14 zu. Die genaue Berechnung lautet cp % 33 * 10 % 19.
      • yk: Holen Sie sich das Powerset der aktuellen Karte. Dies ist eine Liste aller Teilsequenzen der Karte.
      • @: Holen Sie sich das Element des Powersets, das dem zuvor berechneten Index entspricht.
    • +hJ: Hänge die erste Karte an das Ergebnis an.
    • s: Verketten Sie die verarbeiteten Karten miteinander.
    • /`d: Zählen Sie die Vorkommen der aktuellen Zahl im Ergebnis.
PurkkaKoodari
quelle