Вступление
Nine Mens's Morris (также называемый Mills) - настольная игра для двух игроков, в которую играют на следующей доске (изображение взято со связанной страницы Википедии):
У каждого игрока есть 9 человек, окрашенных в черно-белый цвет. Конкретные правила не важны для этой задачи, но проверьте страницу Википедии, если вы заинтересованы.
Соревнование
Задав в качестве входных данных сетку, представляющую определенное состояние платы, выведите общее количество фрез m
с 0<=m<=8
.
Три человека одного цвета образуют мельницу, когда они находятся в прямом ряду соединенных точек. b2
чтобы f2
не мельница , так как люди разного цвета. Кроме того, d2
чтобы d5
не образовывать мельницу , так как три точки должны быть подключены.
Доска на изображении выше содержит две мельницы, например. Один от f2
до f6
и один от e3
до e5
.
вход
Плата представлена в виде двумерной сетки с 24 точками, которые соединены, как показано на рисунке выше. В примере используются буквы from a-g
для столбцов и цифры from 1-7
для строк, но вы можете выбрать любой разумный формат ввода, если он отображает 24 уникальные координаты в одно из следующих состояний:
- пустой
- Взятый черным
- Взято белым
Конкретное представление зависит от вас, вы не ограничены "b" или "w" для цветов.
Кроме того, ваш вклад может не содержать никакой дополнительной информации.
Дополнительные замечания
- Вам не нужно отображать точки по каким-либо значениям. Если вы хотите принять входные данные в виде двумерного массива, это тоже хорошо. Но имейте в виду, что не все точки там используются, и что вы должны учитывать связи между ними.
- Вход может быть пустым, в этом случае вы должны вывести ноль (пустая доска -> без фрез).
- Поскольку у каждого игрока по 9 человек, входные данные никогда не будут содержать более 18 взятых очков.
- Вы можете не указывать emtpy точки на входе и, следовательно, только те входные точки, которые взяты.
- Ввод можно заказать любым способом. Вы не можете полагаться на конкретный заказ.
- Вы можете предположить, что ввод всегда будет действительным. Это означает, что не будет более 9 человек каждого цвета, и что каждая точка будет уникальной.
правила
- Уточните, какой формат ввода вы используете в своем решении. Предоставление примера запуска вашей программы приветствуется.
- Функция или полная программа разрешены.
- Правила по умолчанию для ввода / вывода.
- Применяются стандартные лазейки .
- Это код-гольф , поэтому выигрывает меньшее количество байт. Tiebreaker является более ранним представлением.
Контрольные примеры
Формат ввода здесь представляет собой список кортежей с координатами, как в примере выше, в качестве первого элемента и состоянием точки второго элемента. Точка, выбранная белым цветом, помечена как «w», а точка, обозначенная черным, как «b». Все остальные точки опущены и пусты.
[( "А4", "ш"), ( "b2", "б"), ( "b4", "б"), ( "с4", "б"), ( "d1", "ш") , ( "d2", "ш"), ( "е3", "ш"), ( "е4", "ш"), ( "е5", "ш"), ( "F2", "б") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2 [( "A1", "б"), ( "а4", "б"), ( "а7", "б"), ( "b4", "б"), ( "с4", "б") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3 [] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8
Удачного кодирования!
источник
d3
иd5
не связаны. Правила говорят:Three men of the same color form a mill when they are in a straight row of connected points.
. Я добавил несколько примеров в этот раздел, чтобы прояснить ситуацию, спасибо за комментарий!Ответы:
APL (Dyalog Classic) ,
2625 байт-1 спасибо FrownyFrog
Попробуйте онлайн!
Аргументом является массив 3x3x3
1
(черный),¯1
(белый) и0
(пустой). Первое измерение находится вдоль глубины вложенности концентрических квадратов. Два других измерения расположены вдоль вертикальной и горизонтальной оси.У нас есть мельница всякий раз, когда суммирование по любой оси дает
3
или или¯3
, за исключением того, что мы должны отбросить четыре угла при суммировании по первой оси.{}
это функция с неявным аргументом⍵
↓⍵
является раскол - в нашем случае это превращает 3x3x3 куб в виде матрицы 3х3 вложенных длины 3 векторов⍵⍪↓⍵
берет исходный куб и склеивает 3х3 матрицу из 3 векторов под ним, поэтому мы получаем смешанный массив скаляров и векторов 4х3х3+/
суммы по последней оси; это объединяет эффект суммирования исходного куба по последней оси (+/⍵
) и суммирования его по средней оси из-за того, что мы делим (+/↓⍵
)Теперь мы должны позаботиться о специальном случае для первой оси.
+⌿⍵
суммы по первой оси, возвращающие матрицу 3х34 2⍴
но мы не должны подсчитывать углы, поэтому мы изменим форму матрицы 4x2 следующим образом:теперь нас интересует только последний столбец (
BDFH
), поэтому мы используем идиому⊢/
,
объединяетсяBDFH
с матрицей, которую мы получили ранее для 2-й и 3-й оси (BDFH
и матрица, как оказалось, имеет начальный размер 4)∊
сглаживает все, что мы получили до сих пор, в один вектор|
принимает абсолютные значения{ }∩≢
фильтрует только тройки - длина (≢) входа всегда равна 3≢
считает ихисточник
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢
короче :)JavaScript (ES6),
276228125117105 байт(приведенный выше содержит некоторые непечатаемые символы ascii, которые здесь не отображаются, так что вот версия без той,
btoa
которую можно скопировать и запустить)Разбивает справочную строку на буквенные триплеты, совпадающие с ключами группы мельниц. Ввод осуществляется в форме объекта, где клавиши - это буквы
a-x
, начиная с левого нижнего края и заканчивая правым верхним, сначала перемещаясь слева направо. Значения1
для белого,-1
черного и0
пустого.пример
Эти примеры взяты из примеров OP, преобразованы в объект буквы-ключа и числа-значения. Первый из примера изображения, в то время как другие из примера набора.
источник
atob
.btoa
. Также обнаружены некоторые другие улучшения, которые снижают его еще больше.Mathematica,
217131 байтХотя я уверен, что это не особенно конкурентоспособно, вот запись для вас.
Пример ввода:
Разрешение односимвольных имен координат тривиально удаляет 51 символ, делая это 166-байтовое решение. Называя игроков 1 и 2, а не «w» и «b», вычеркивает 17 других персонажей.
Итак, мы получаем
источник
1
и2
. использовался примерw
иb
, но я вполне уверен, что мы не ограничены этим.APL (Dyalog Unicode) , 50 байтов
«Решение объектов»
Хотя он длиннее (29 символов), чем решение @ ngn , он использует совершенно другой подход: вход имеет ту же общую структуру, что и это решение, но все слоты представлены как объекты. Пустые слоты (включая несуществующий центральный столбец) должны быть пустыми объектами. в то время как все черные люди должны быть ссылками на объект «черный человек», а все белые люди должны быть ссылками на объект «белый человек». Все объекты могут необязательно иметь хороший D жаемого F ОРМ с для удобства чтения, и , следовательно, центральный столбец может быть необязательно сделан невидимым.
Попробуйте онлайн!
+/
сумма1=(
...)
те, в≢¨(
...)
подсчет,
сглаженный (сплющенный)∪/
уникальные наборы по,
соединенный с∪⌿⍤2
уникальные сеты,(
... соединены)
с⊢/
самый правый столбец4 2⍴
, преобразованный в четыре строки и два столбца,∪⌿
уникальные столбчатые множестваНа вершину оператора, прилагаемый с AGL (
ä
), был бы довести длину до 27 символов .источник