Я хочу попробовать новую форму кода гольф здесь. Подобно бонусам, не все части задания должны быть выполнены, но каждый ответ должен реализовывать подмножество определенного размера (и есть ядро, которое должен реализовывать каждый ответ). Так что помимо игры в гольф эта задача также включает в себя выбор набора функций, которые хорошо сочетаются друг с другом.
Правила
Kingdom Builder - настольная игра, в которую играют на (остроконечной) гекс-сетке. Доска состоит из четырех (рандомизированных) квадрантов, каждый из которых имеет 10x10 шестнадцатеричных ячеек (таким образом, полная доска будет 20x20). Для целей этого задания каждая гекс-клетка содержит либо воду ( W
), гору ( M
) город ( T
), замок ( C
), либо пусто ( .
). Таким образом, квадрант может выглядеть
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
Второй ряд всегда будет смещен вправо от первого ряда. Игроки 1
в 4
можно разместить до 40 пунктов по каждой из пустых клеток (после некоторых правил , которые мы будем игнорировать для этой задачи). Возможная доска в конце игры следующая:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
Мы будем обозначать квадранты как
1 2
3 4
Ваша задача будет забить такую доску. Существует один основной счет, который всегда используется, и 8 дополнительных очков, 3 из которых выбираются для каждой игры. † Далее я опишу все 9 баллов и воспользуюсь приведенной выше настройкой в качестве примера того, сколько очков наберет каждый игрок.
† В реальной игре 10 очков, но я пропущу два, потому что никто не хочет играть в них.
Основная оценка. Игрок получает 3 очка за каждый C
центр, рядом с которым находится поселение. Пример оценки: 18, 0, 15, 12.
Необязательные оценки.
Игрок получает 1 очко за каждый горизонтальный ряд, в котором у него есть хотя бы одно поселение.
Пример оценки: 14, 20, 12, 16.
Для каждого игрока найдите горизонтальный ряд, в котором он большую часть своих поселений (выберите любой в случае ничьей). Игрок получает 2 очка за каждое поселение в этом ряду.
Пример оценки: 14 (строка 16), 8 (строка 4, 5 или 6), 28 (строка 11), 10 (строка 1).
Игрок получает 1 очко за каждое поселение, которое строится рядом с
W
Атером.Пример оценки: 13, 21, 10, 5.
Игрок получает 1 очко за каждое поселение рядом с
M
фонтаном.Пример оценки: 4, 12, 8, 4.
Подсчитайте поселения каждого игрока в каждом квадранте. За квадрант игроки с наибольшим количеством поселений получают по 12 очков , а игроки с вторым по величине поселением получают 6 очков .
Пример оценки: 18 (6 + 0 + 6 + 6), 36 (12 + 12 + 0 + 12), 12 (0 + 0 + 12 + 0), 18 (12 + 6 + 0 + 0).
Для каждого игрока определите квадрант, в котором он имеет наименьшее количество поселений. Игрок получает 3 очка за каждое поселение в этом квадранте.
Примеры оценок: 18 (квадрант 2), 0 (квадрант 3), 15 (квадрант 1 или 2), 27 (квадрант 3).
Игрок получает 1 очко за каждую подключенную группу населенных пунктов.
Пример оценки: 7, 5, 6, 29.
Игрок получает 1 очко за каждые 2 поселения в самой большой группе связанных поселений игрока.
Пример оценки: 4, 10, 8, 2.
Соревнование
Как и в игре, вы выберете 3 из дополнительных очков и оцените заданную доску на основе основного счета и этих трех очков. Ваш код должен составить список из 4 баллов. Тем не менее, есть одно ограничение на выбор: я сгруппировал оценки в 3 группы, и вы должны реализовать одну из каждой группы:
- Реализуйте один из 1 и 2 .
- Реализуйте один из 3, 4, 5 и 6 .
- Реализуйте один из 7 и 8 .
Вы можете написать программу или функцию, используя ввод через STDIN, аргумент командной строки, приглашение или параметр функции. Вы можете вернуть результат или распечатать его в STDOUT.
Вы можете выбрать любой удобный 1D или 2D список / формат строки для ввода. Вы не можете использовать граф с полной информацией о смежности. Вот хорошее чтение по шестигранным сеткам, если вам нужно вдохновение.
Ваш вывод также может быть в любом удобном, однозначном списке или строковом формате.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Дальнейшие предположения
Вы можете предположить, что ...
- ... у каждого игрока есть как минимум 1 поселение, и у каждого игрока не более 40 поселений.
- ... каждый квадрант содержит либо один город и два замка, либо два города и один замок.
- ... города и замки достаточно далеко друг от друга, так что ни одно поселение не может быть соседним с двумя из них.
Тестовые случаи
Все еще используя вышеупомянутую доску, вот отдельные оценки для всех возможных вариантов механизмов подсчета очков:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51
источник
Ответы:
Python 2, 367 байт
Программа использует оценки 1, 3, 7. Ввод представляет собой список списков символов, представляющих каждую ячейку. Чтобы легко проверить пример платы, мы можем сделать:
Обработка шестнадцатеричной сетки
Поскольку мы находимся на шестнадцатеричной сетке, мы должны иметь дело с соседями немного по-другому. Если мы используем традиционную двумерную сетку в качестве нашего представления, то у
(1, 1)
нас есть:При ближайшем рассмотрении мы понимаем, что смещения зависят от четности строки, в которой вы находитесь. Приведенный выше пример для нечетных строк, но для четных строк смещения
Единственное, что изменилось, это то, что у 1-й, 2-й, 5-й и 6-й пары вторая координата была уменьшена на 1.
Лямбда-функция
N
принимает пару координат(row, col)
и возвращает всех соседей ячейки в сетке. Внутреннее понимание генерирует вышеуказанные смещения, извлекая их из простого базового кодирования 3, увеличивая вторую координату, если строка нечетная, и добавляет смещения к рассматриваемой ячейке, чтобы получить соседей. Внешнее понимание затем фильтруется, оставляя только соседей, которые находятся в пределах сетки.Ungolfed
источник
def F
быть отдельная функция, а не внутренняя функция? Не можетk
быть удален изdef F:
?F
- это функция заливки и ей нужен доступJ
, поэтому она позволяет сэкономить при передачеJ
в качестве параметра (я немного поэкспериментирую, чтобы узнать, можно ли обойти глубокое копирование).k
Хотя вы правы , спасибо :) (однако новый код выглядит немного странно из-за короткого замыкания)Программирование набора ответов, 629 байт
ASP относится к семейству языков логического программирования, воплощенному здесь фреймворком Potassco , в частности Clingo (Grounder Gringo + solver Clasp). Из-за ограничения парадигмы, он не может принимать данную плату напрямую в качестве вывода, поэтому необходима предварительная обработка данных (здесь выполняется на python). Эта предварительная обработка не учитывается в общем значении байта.
Это мой первый гольф-код, и цель состоит в том, чтобы показать язык, который я люблю, которого я никогда не видел в гольфе, а не выиграть игру. Более того, я далеко не эксперт в ASP, поэтому многие оптимизации кода, безусловно, могут быть выполнены для получения результатов в меньшем количестве байтов.
представление знаний
Существует код Python, который преобразует плату в атомы:
Например, атомы b (для __b__oard), указанные для первой строки примерной доски, являются следующими:
Где b (0,0,3) - это атом, который описывает, что у игрока 3 есть расчет в координатах (0; 0).
ASP решение
Существует код ASP с множеством реализованных необязательных оценок:
Эту программу можно запустить с помощью команды:
И найдет только одно решение (это доказательство того, что есть только один способ распределить точки):
Где s (7,3,6) говорит, что игрок 3 набирает 6 очков с дополнительным счетом 7, а s (t, 4,62) говорит, что игрок 4 набирает в общей сложности 62 очка (ядро + 1 + 3 + 7).
Легко разобрать, чтобы иметь модный стол!
источник