Я хочу попробовать новую форму кода гольф здесь. Подобно бонусам, не все части задания должны быть выполнены, но каждый ответ должен реализовывать подмножество определенного размера (и есть ядро, которое должен реализовывать каждый ответ). Так что помимо игры в гольф эта задача также включает в себя выбор набора функций, которые хорошо сочетаются друг с другом.
Правила
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