Liczenie ikon dla innowacji

11

Innowacja to gra karciana, w której gracze walczą przez wieki, od prehistorii po współczesność, starając się zdobywać osiągnięcia szybciej niż ich przeciwnicy.

Każda karta w Innowacji jest unikalna i zapewnia graczowi kilka ikon. Jeśli traktujemy każdą kartę jako siatkę 2x3, wówczas trzy z czterech miejsc na lewej i dolnej krawędzi zawsze będą zajmowane przez ikony (symbole w czarnych sześciokątach nie są liczone).

wprowadź opis zdjęcia tutaj

Gra ma 6 rodzajów ikon (zamki, korony, liście, żarówki, fabryki i zegary), które będziemy reprezentować dowolnie za pomocą znaków 012345. Używając #do przedstawienia czarnego sześciokąta, możemy użyć czterech znaków do reprezentowania ikon na każdej karcie. Na przykład powyższe karty to

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

Teraz w Innowacjach karty w obszarze gry są pogrupowane w stosy *, które są rozłożone na jeden z czterech sposobów. Dla każdego przykładu użyjemy powyższych kart, zakładając, że karta znajdująca się najbardziej na lewo 03#0, znajduje się na górze stosu.

Bez gry: widoczna jest tylko górna karta

0..
3#0

Rozgrywka po lewej : górna karta jest w pełni widoczna, podobnie jak prawa trzecia karta poniżej

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

Rozegraj w prawo : górna karta jest w pełni widoczna, a także lewa jedna trzecia wszystkich kart poniżej

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

Rozgrywka : górna karta jest w pełni widoczna, a także dolna połowa wszystkich kart poniżej.

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

Wyzwanie

Dane wejściowe będą ciągiem znaków oddzielonym spacją, składającym się z dwóch części:

  • Kierunek rozstawiania, który jest jednym z !<>^, nie reprezentuje odpowiednio rozstawu, rozstawu w lewo, rozstawu w prawo lub rozstawieniu odpowiednio.
  • Niepusta lista kart, z których każda ma 4 znaki i składa się z znaków 012345#. Karta najbardziej na lewo znajduje się na górze stosu, a każda karta zawiera dokładnie jedną #.

Odpowiedzi mogą być funkcjami, pełnymi programami lub równoważnymi . Możesz wybrać, czy kierunek wyświetlania będzie pierwszy, czy ostatni, tj. Wybierz jeden z dwóch poniższych formatów:

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

Wyjście będzie listą sześciu liczb reprezentujących liczbę dla każdej ikony, np. Dla przykładowych kart powyżej:

! 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

Na przykład, skrzynka no splay miała dwie 0ikony i jedną 3ikonę pokazującą pierwszą linię. Zauważ, że nie liczymy #s, ponieważ czarne sześciokąty nie są ikonami.

Możesz wybrać dowolny rozsądny i niejednoznaczny sposób reprezentowania listy, np. Oddzielony separatorem lub używając naturalnej reprezentacji listy w twoim języku.

Przypadki testowe

! 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

Zauważ, że coś w rodzaju !jest nieprawidłowym wejściem, ponieważ na pewno lista jest niepusta.


* Na potrzeby tego wyzwania ignorujemy kolory stosów.

Sp3000
źródło

Odpowiedzi:

5

CJam, 44 37 36 bajtów

Dzięki Sp3000 za przypomnienie mi, że nadmiernie komplikuję rzeczy i oszczędzam 7 bajtów.

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

Sprawdź to tutaj.

Wyjaśnienie

Niektóre spostrzeżenia:

  • Zawsze chcemy policzyć całą pierwszą kartę.
  • Wszystkie splay spowodują usunięcie prefiksu lub sufiksu ikon. !usuwa wszystkie z nich (który jest albo przedrostkiem, albo przyrostkiem czterech znaków), <usuwa pierwsze trzy znaki, >usuwa ostatnie dwa znaki, ^usuwa pierwszy znak.

Potrzebujemy więc tylko krótkiego sposobu na zmapowanie trybu rozgrywki do prawidłowego obcięcia:

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.

Możemy zauważyć, że fragmenty obcięcia mają w rzeczywistości dużą strukturę. Każdy tryb rozgrywki jest przypisany do jednej liczby w [0 1 2 3](konkretnie w kolejności "!^><"), a dwie z nich mają, >a dwie mają <. Miałem nadzieję znaleźć dwa skróty, które magicznie wytwarzają te części osobno, ponieważ pozwoliłoby to zaoszczędzić sporo bajtów, ale jak dotąd nie byłem w stanie nic znaleźć. Mogę odwzorować "!^><"na liczby na przemian z parzystością 31%(aby wybrać właściwy znak "<>"), ale nie znalazłem niczego, co porządnie odwzorowuje je [0 1 2 3]w tej kolejności. (Z wyjątkiem naiwnego rozwiązania, "!^><"#którego niestety nie oszczędza się żadnych bajtów.)

Pamiętaj też, że jest to trochę bardziej elastyczne. !można również zaimplementować jak n>dla każdego n > 3(odrzucając wszystko jako prefiks). Niestety nie znalazłem też żadnej prostej funkcji dla takiej mapy.

Martin Ender
źródło
0

Pyth, 39 36 33 31 bajtów

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

Wypróbuj online. Zestaw testowy.

Wyjaśnienie

  • Jtczd: podziel dane wejściowe na spacje, usuń pierwszą część i zapisz resztę J.
  • m6: Powtórz następujące czynności dla liczb od 0 do 5.
    • mtJ: Powtórz następujące czynności dla wszystkich kart oprócz pierwszej.
      • Chz: pobierz kod pierwszego znaku na wejściu.
      • %*%33T19: Zamapuj punkty kodowe !<>^(33, 60, 62, 94) na liczby 0, 4, 5, 14. Dokładne wykonane obliczenie to cp % 33 * 10 % 19.
      • yk: pobierz zestaw mocy bieżącej karty. To jest lista wszystkich podsekwencji karty.
      • @: pobierz element zestawu mocy odpowiadający obliczonemu wcześniej indeksowi.
    • +hJ: dołącz pierwszą kartę do wyniku.
    • s: połącz przetwarzane karty razem.
    • /`d: Policz wystąpienia bieżącego numeru w wyniku.
PurkkaKoodari
źródło