Підрахунок піктограм для інноваційних знаків


11

Інновації - це карткова гра, де гравці б’ються у віках, починаючи від доісторії до сучасності, намагаючись заробляти досягнення швидше, ніж їхні супротивники.

Кожна картка в Інновації унікальна і надає гравцеві ряд піктограм. Якщо ми розглядаємо кожну карту як сітку 2x3, то три з чотирьох прорізів лівого та нижнього краю завжди займатимуться значками (символи у чорних шестикутниках не враховуються).

введіть тут опис зображення

У грі є 6 видів піктограм (замки, корони, листя, лампочки, фабрики та годинники), які ми будемо представляти довільно, використовуючи символи 012345. Використовуючи #для зображення чорного шестикутника, ми можемо використовувати чотири символи для зображення піктограм на кожній картці. Наприклад, наведені вище картки

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

Тепер, в інноваціях, карти в ігровій зоні згруповані в палі *, які розміщуються одним із чотирьох способів. Для кожного прикладу ми будемо використовувати картки вище, припускаючи, що найменша ліва карта 03#0знаходиться у верхній частині купи.

Немає гри: видно лише верхню карту

0..
3#0

Грайте ліворуч : верхню карту повністю видно, як і праву третину всіх карт внизу

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

Грайте праворуч : верхню карту видно повністю, а також ліву третину всіх карт внизу

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

Підгортання : верхня карта повністю видна, а також нижня половина всіх карт внизу.

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

Змагання

Введенням буде окремий пробіл, що складається з двох частин:

  • Напрямок !<>^відтворення , який є одним із символів, що не містить відтворення, зліва зліва, звідти праворуч або ззаду відповідно.
  • Непорожній список карток, кожна з яких має 4 символи і складається з символів 012345#. Найменша ліва карта знаходиться у верхній частині купи, і кожна карта містить точно одну #.

Відповіді можуть бути функціями, повноцінними програмами або аналогічними . Ви можете вибрати, перший чи останній напрямок відтворення, тобто вибрати один із двох форматів нижче:

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

Виведенням буде список з шести чисел, що представляють кількість для кожної піктограми, наприклад для прикладних карт вище:

! 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

Наприклад, у футлярі без splay було дві 0піктограми та одна 3піктограма, що показує перший рядок. Зауважте, що ми не рахуємо #s, оскільки чорні шестикутники не є іконками.

Ви можете вибрати будь-який розумний і неоднозначний спосіб подання списку, наприклад, розділеним роздільником або використанням природного представлення списку вашої мови.

Тестові справи

! 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

Зауважте, що щось на зразок !недійсне введення, оскільки список гарантовано не порожній.


* Для цілей цього завдання ми ігноруємо ворсисті кольори.

Відповіді:


5

CJam, 44 37 36 байт

Спасибі Sp3000 за те, що нагадав мені, що я надмірно ускладнюю речі та економлю 7 байт.

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

Тестуйте це тут.

Пояснення

Деякі зауваження:

  • Ми завжди хочемо порахувати всю першу карту.
  • Усі сплески призведуть до видалення префікса або суфіксу піктограм. !видаляє всі вони (що є або префіксом, або суфіксом з чотирьох символів), <видаляє перші три символи, >видаляє останні два символи, ^видаляє перший символ.

Тому все, що нам потрібно - це короткий спосіб зіставити режим відтворення на правильне усічення:

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.

Можна помітити, що фрагменти усікання насправді мають багато структури. Кожен режим відтворення відображається на одне число в [0 1 2 3](конкретно, в порядку "!^><"), і два з них мають >і два мають <. Я сподівався знайти два хеши, які магічно створюють ці частини окремо, що дозволить заощадити купу байтів, але поки що я нічого не зміг знайти. Я можу зіставити "!^><"номери з чергуванням парності 31%(щоб вибрати правильний символ з "<>"), але я не знайшов нічого, що чітко відображає їх [0 1 2 3]у такому порядку. (За винятком наївного рішення, "!^><"#яке, на жаль, не економить жодного байту.)

Також зауважте, що насправді це трохи більш гнучко. !також може бути реалізований як n>для будь-якого n > 3(відкидання всього як префікса). На жаль, я не зміг знайти жодної простої функції для такої карти.


0

Pyth, 39 36 33 31 байт

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

Спробуйте в Інтернеті. Тестовий набір.

Пояснення

  • Jtczd: розділіть введення на пробіли, видаліть першу частину, а решту збережіть у J.
  • m6: Повторіть наступне для чисел від 0 до 5.
    • mtJ: Повторіть наступне для всіх карт, крім першої.
      • Chz: отримати кодову точку першого символу на вході.
      • %*%33T19: Зіставіть кодові точки !<>^(33, 60, 62, 94) до чисел 0, 4, 5, 14. Точний розрахунок виконано cp % 33 * 10 % 19.
      • yk: отримати пристрій живлення поточної карти. Це перелік усіх послідовностей картки.
      • @: отримайте елемент набору потужності, відповідний індексу, обчисленому раніше.
    • +hJ: додайте першу карту до результату.
    • s: об'єднайте оброблені картки разом.
    • /`d: Підраховують вхідні дані поточного числа в результаті.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.