Настольная игра
В настольной игре « Каркассон » игроки размещают плитки, сопоставляя их края, и получают самые высокие баллы, создавая большие непрерывные участки местности. Ниже приведены (примерно) типы и количество плиток, включенных в игру:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
Задание
Вы должны поместить плитку, сопоставляя края, пытаясь сохранить как можно больше смежных областей местности.
размещение
- Плитки могут быть размещены только в одном из (до 4) пустых мест рядом с любой существующей плиткой (или плитками) в игровой зоне.
- Плитка может поворачиваться на 90, 180 или 270 градусов.
Edge-согласование
- Края размещенной плитки должны соответствовать соприкасающимся краям (до 4) соседних плиток, т. Е. Сенсорные пиксели имеют одинаковый цвет.
Смежная местность
- «Закрытие области местности» относится к размещению плитки таким образом, чтобы любая непрерывная цветная область не могла быть затем продолжена при дальнейшем размещении плитки.
- Если возможно альтернативное размещение, оно должно быть выбрано над любым размещением плитки, которое будет закрывать область местности.
- Если вам нужно выбрать из нескольких мест закрытия, выберите любое. Если вам нужно выбрать между несколькими закрытыми местами размещения, выберите любое.
- Не учитывать # ff00ff (угловые пиксели) при расчете смежных областей. Также не обращайте внимания на здания, то есть участки цвета, которые уже полностью заключены в плитку.
вход
Ввод двух изображений:
Игровая площадка.
- Начальная игровая зона состоит из плитки
#11
(одной плитки). - Расширенная игровая зона, созданная как выходная, также должна поддерживаться как входная.
- Начальная игровая зона состоит из плитки
Плитка для размещения.
- Все примеры плиток должны поддерживаться в качестве входных данных.
Определите совпадающие края / смежную местность, используя только эти данные изображения. Нет жесткого кодирования.
Выход
- Выход - изображение, показывающее результирующую игровую зону после размещения плитки.
- Изображение должно быть совместимо с вашей собственной программой, т. Е. Оно может использоваться как вход игровой зоны.
- Если невозможно разместить плитку, верните ошибку.
Вы можете предположить, что
- Плитка всегда 55 пикселей на 55 пикселей
- Плитки будут только отображать цвета, используемые в данный момент в примерах плиток.
Заметки
- Ваш ответ должен содержать пример вывода по крайней мере через 2 прохода (рекомендуется больше).
- Это частичный и неточный рендеринг оригинальной настольной игры, вам не нужно применять какие-либо правила или тактики, не упомянутые здесь.
Гол
- Ваша оценка - это количество байтов вашей заявки.
- Данные изображения не включены в ваш счет.
- Самый низкий балл побеждает.
Играть в полную игру
Вы можете написать сценарий, который использует ваше подчинение, чтобы играть в полную игру, которая может состоять из:
- Размещение плитки выбрано псевдослучайно из полного набора 85.
- Возврат плитки к набору, если она не может быть размещена.
- Повторяется до тех пор, пока не будет размещена каждая плитка - или пока две плитки подряд не могут быть размещены.
Он не будет включен в ваш счетчик байтов или улучшит ваш счет, но я, скорее всего, предложу вознаграждение за такой ответ.
Ответы:
Perl 5 с PerlMagick:
875 789763Я не посчитал линию, начинающуюся с
sub w
, которая используется для сортировки позиций на расстоянии до центра, чтобы отдать предпочтение компактным решениям (теперь работает правильно). В этой версии закрытие избегается, как требуется, но я считаю, что противоположность более интересна и верна игре. Для этого измените строку$s=$t if!grep...
на$s=$t if grep...
.Использование:
perl car.pl board.png tile.png
. Результат сохранен вcar.png
. Статус выхода равен 1, если плитка не может быть размещена.Скрипт для запуска полной игры. Он принимает код , указанный выше в файле
car.pl
и плитки хранятся вtiles
каталоге с именем01.png
в25.png
.Это работает довольно медленно сейчас. 8-12 минут на моей машине. С закрытием предпочтительнее: с закрытием избегать (примечание ничего не закрыто).
источник
Common Lisp,
26502221199211861111 байтОбновление: «Легкая» игра в гольф теперь сделана, дальнейшие достижения потребуют больших изменений.Обновление 2: с усилением конкуренции новая версия больше не поддерживает позиции внутри текущего прямоугольника игрового поля (это будет на 57 байт дополнительно). Эта опция, как и простая оптимизация скорости, по умолчанию включена в загружаемой версии с симулятором, но не в официальном ответе ниже.Обновление 3: Незначительные изменения интерфейса для увеличения числа основных байтов.
Я также создал простой веб-интерфейс. Полный пакет (один файл LISP и изображения листов) может быть скачать здесь . Для того, чтобы попробовать, установить
hunchentoot
,zpng
иpng-read
с quiclisp, нагрузки вcarcassonne.lisp
, и подключиться кlocalhost:8080
. Код был протестирован на CCL / Windows и SBCL / Linux. Вышеупомянутые библиотеки нужны только для части пользовательского интерфейса / симулятора; Само решение является простым ANSI Common Lisp.Все переводы строк и межстрочный интервал предназначены только для косметики, чтобы обеспечить удобочитаемость и не учитываются в общей сумме.
Вы должны вызвать функцию
c
с двумя аргументами: текущим игровым полем и плиткой для размещения. Оба должны быть 2D-массивами; плитка 55x55 и поле, кратное этому. Кроме того, массив полей должен быть настраиваемым. Функция возвращает двухэлементный список с новым полем в качестве первого аргумента. Второй элемент,NIL
если плитку нельзя разместить, или иным образом список, содержащий координаты верхнего левого угла и поворот самой последней плитки в этом массиве и счет для этой плитки. Эта информация может использоваться для целей визуализации.Обратите внимание, что при дальнейших вызовах вы должны использовать новое поле, возвращаемое
c
даже если второй элемент списка равенNIL
(возможно, исходный массив былadjust-array
отредактирован и, таким образом, признан недействительным).Код теперь немного медленный, оптимизация подсчета байтов приводит к избыточным вычислениям. Пример ниже завершен примерно через три минуты в моей системе.
Пример прогона для всех 85 плиток:
Скриншот веб-интерфейса:
источник
DarkBASIC Pro:
207819321744 байтаОБНОВЛЕНИЕ: просто больше усилий в гольф
ОБНОВЛЕНИЕ: теперь полностью соответствует спецификации, в том числе предпочитая не закрывающий выбор.
Я выбрал DarkBASIC, потому что, хотя он довольно многословный, он предоставляет чрезвычайно простой и простой набор команд для работы с изображениями.
Я загрузил EXE для людей, у которых нет компилятора DarkBASIC ( Windows ).
источник