Подсчет значков для инновационных сплайнов

11

Инновация - карточная игра, в которой игроки сражаются на протяжении веков, от предыстории до современности, в попытке заработать достижения быстрее, чем их противники.

Каждая карта в Innovation уникальна и предоставляет игроку ряд значков. Если мы будем рассматривать каждую карту как сетку 2x3, то три из четырех слотов слева и снизу всегда будут заняты значками (символы в черных шестиугольниках не учитываются).

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

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

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

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

Без рекламы: видна только верхняя карта

0..
3#0

Splay left : верхняя карта полностью видна, а также правая треть всех карт ниже

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

Splay right : верхняя карта полностью видна, а также левая треть всех карт ниже

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

Например, в случае без сплайсинга были две 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

Обратите внимание, что что-то вроде !недопустимого ввода, поскольку список гарантированно не является пустым.


* Для целей этой задачи мы игнорируем цвета ворса.

Sp3000
источник

Ответы:

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.
  • m...6 : Повторить следующее для чисел от 0 до 5.
    • mtJ: Повторить следующее для всех карт, кроме первой.
      • Chz: получить кодовую точку первого символа на входе.
      • %*%33T19: Сопоставьте кодовые точки !<>^(33, 60, 62, 94) с числами 0, 4, 5, 14. Точный расчет выполнен cp % 33 * 10 % 19.
      • yk: получить powerset текущей карты. Это список всех подпоследовательностей карты.
      • @: получить элемент powerset, соответствующий индексу, рассчитанному ранее.
    • +hJ: добавьте первую карту к результату.
    • s: объединить обработанные карты вместе.
    • /`d: Подсчитать вхождения текущего числа в результате.
PurkkaKoodari
источник