ВЫЗОВ
Учитывая набор сгруппированных букв, расположите их на доске так, чтобы они полностью покрывали область.
Представительство в Совете (также известное как КОРАБЛЬНАЯ ПАЛУБА)
- Доска представляет собой сетку 6х6.
- Там всегда будет 36 полных квадратов.
- Колонки помечены AF.
- Ряды отмечены 1-6.
Пример:
A B C D E F
+---+---+---+---+---+---+
1 : : : : : : :
+---+---+---+---+---+---+
2 : : : : : : :
+---+---+---+---+---+---+
3 : : : : : : :
+---+---+---+---+---+---+
4 : : : : : : :
+---+---+---+---+---+---+
5 : : : : : : :
+---+---+---+---+---+---+
6 : : : : : : :
+---+---+---+---+---+---+
INPUT (он же ящики)
- Многострочная строка, содержащая набор сгруппированных букв.
- Ящики изготовлены из групп одинаковых букв.
- Ящики являются НЕМЕРТНЫМИ, то есть их нельзя поворачивать или переворачивать.
- Начальная точка для каждого ящика находится в верхнем левом углу (это необходимо учитывать при перемещении ящика на палубу).
- От верхней левой точки ящика следующие одинаковые квадраты могут быть только справа или снизу.
- Любая буква может быть использована для обозначения ящика. Ящики всегда начинаются с буквы
[a]
и перемещаются вверх по алфавиту. - Ящики помечены их буквой (т.е. ящик A, ящик B и т. Д.)
- Количество ящиков может варьироваться (не всегда 10, несмотря на приведенные примеры).
- Есть 24 символа, отделяющих каждый блок ящиков в строке. (начало от [a] до начала [b], разделенных 24 символами и т. д.)
Пример:
[a][a][a] [b] [c][c]
[a] [b][b][b] [c]
[a] [b][b]
[d] [e] [f][f][f][f][f]
[d][d] [e]
[d][d] [e]
[e]
[e][e]
[g] [h] [i]
[g] [i]
[i]
ВЫВОД
Требуется распечатать серию команд, которые помещают ящики в положения на палубе так, чтобы она полностью закрывалась (без пустых мест).
Формат команды выглядит так:
HAUL <crate> TO <column> <row>
то есть HAUL E TO A 1
Для пояснения, всегда будет решение для данного ввода.
ТЕСТОВЫЕ СЛУЧАИ <- Нажмите, чтобы узнать больше.
вход
[a][a][a] [b] [c][c][c]
[a][a] [b]
[a] [b][b]
[b][b]
[d] [e] [f]
[d] [f]
[d] [f]
[d]
[d]
[g][g] [h] [i]
[i][i]
[i]
[i][i]
[j][j][j]
Вывод
HAUL I TO A 1
HAUL B TO A 3
HAUL A TO B 1
HAUL J TO D 6
HAUL D TO F 1
HAUL F TO E 1
HAUL C TO C 5
HAUL G TO D 4
HAUL E TO D 3
HAUL H TO C 6
Результат:
A B C D E F
+---+---+---+---+---+---+
1 : i : a : a : a : f : d :
+---+---+---+---+---+---+
2 : i : i : a : a : f : d :
+---+---+---+---+---+---+
3 : b : i : a : e : f : d :
+---+---+---+---+---+---+
4 : b : i : i : g : g : d :
+---+---+---+---+---+---+
5 : b : b : c : c : c : d :
+---+---+---+---+---+---+
6 : b : b : h : j : j : j :
+---+---+---+---+---+---+
SCORING
Это код-гольф, поэтому выигрывает самый короткий ответ в символах.
code-golf
sequence
decision-problem
parsing
board-game
Джонатан Пиказо
источник
источник
Ответы:
Python 3,6,
435437385331 байтПозвоните
F()
со строкой ящика.Удалось поиграть в гольф намного больше:
re
библиотеки.Реструктурирован код для удаления лишних циклов.
Предыдущий код создавал список всех позиций ящика
F()
и затем перебирал список вR()
. Новый код создает одну позицию в ящикеF()
иR()
пробует все возможные позиции.В предыдущем коде
R()
собрал возможное решениеa
иF()
затем перебрал возвращенное решение. В новом кодеR()
печатает команды HAUL напрямуюобъяснение
Основная идея состоит в том, чтобы представить палубу корабля и ящики в виде битовых карт. При использовании растровых изображений перемещение ящика становится сдвигом его растрового изображения, а проверка на совпадение между ящиками становится побитовым И и проверяется на ноль.
Код Ungolfed:
F()
анализирует строку определения ящика и строит битовые карты. Регулярное выражение ищет (строка 9) каждую строку строки определения ящика для ящиков (буква, за которой следует ']'). Когда совпадение найдено, соответствующий (строка, столбец) добавляется в словарь, снабженный буквой (строки 11-13). Для примера определения строки ящика, приведенного в задаче:Координаты каждого ящика нормализованы (строка 17), поэтому каждый ящик начинается с (0,0), а каждый блок имеет ширину в одну единицу (вместо 3 a la '[a]').
Затем для каждого ящика создается растровое изображение на основе нормализованных координат (строка 18).
Колода рассматривается как сетка 7 х 7. Столбец G и строка 7 используются для определения, когда форма выходит за пределы доски. Растровое изображение имеет 1, если ящики занимают соответствующий квадрат на колоде. Биты с 48 по 42 соответствуют квадратам с A1 по A7, биты с 41 по 35 соответствуют квадратам с B1 по B7 и так далее.
R(used, bitmaps)
затем использует растровые изображения для рекурсивного поиска мест размещения ящиков, которые не пытаются поместить два ящика в один и тот же квадрат.used
является битовой маской, указывающей, какие квадраты нельзя использовать, потому что они уже заняты ящиком или потому, что они находятся за бортом (то есть столбец G и строка 7).bitmaps
список ящиков, которые еще нужно разместитьБазовый случай для рекурсии - это когда ящиков больше нет на месте, т. Е. Они
bitmaps
пустые (строка 23). В этом случае возвращается значение True, чтобы указать, что решение найдено.В противном случае имя ящика и его растровое изображение выталкиваются из списка растровых изображений (строка 26). Пока растровое изображение ящика не пустое (строка 28), проверьте, не конфликтует ли текущее размещение ящика, представленное растровым изображением ящика, с любыми ранее помещенными ящиками. В строке 29,
not used & crate_bitmap
это значение False , еслиused
иcrate_bitmap
оба имеют 1 в той же битовой позиции, что указывает на конфликт. Если конфликта нет,R()
вызывается рекурсивно (строка 30), чтобы попытаться разместить оставшиеся ящики.Если рекурсивный вызов
R()
возвращает значение True, это означает, что решение найдено и что текущее размещение ящиков является частью этого решения. Таким образом, соответствующая команда для перемещения ящиков печатается, и True распространяется вверх по рекурсивным вызовам (строки 31-32).При создании в
F()
каждый битовый массив ящиков представляет квадраты колод, которые будут заняты ящиками, если они будут размещены в позиции A1. Сдвиг растрового изображения на один бит вправо соответствует перемещению ящиков в положение A2. Сдвиг вправо на семь бит соответствует перемещению ящиков на B1 и т. Д. Например, следующие битовые карты представляют ящики «a» в различных положениях:Если возможное размещение ящиков не работает из-за того, что оно конфликтует с ранее помещенным ящиком (строка 30) или из-за неправильного размещения оставшихся ящиков (строка 31). Ящики перемещаются в другое положение, сдвигая битовую маску вправо на один бит (строка 35).
Shift
отслеживает, сколько мест битовая карта была сдвинута, что соответствует текущей позиции ящиков.Если растровое изображение пусто (ноль), это означает, что все возможные размещения были опробованы. Возвращается значение false (строка 37), указывающее на сбой, так что вызов
R()
ранее в рекурсии попытается найти другое место для своих ящиков.Чтобы ящики не выходили за пределы палубы, биты, соответствующие столбцу G и строке 7, установлены
used
для начального вызоваR()
(строка 20).4432676798719
это пустая колода, соответствующая0b0000001000000100000010000001000000100000011111111
источник
Python 2 , 864 байта
Попробуйте онлайн!
объяснение
Большое количество байтов используется для разбора двумерных ящиков, введенных через одну строку. Ящики представляются в виде вложенного списка логических значений.
После разбора ящиков функция рассматривает все возможные положения всех ящиков. Для этого он итеративно вызывает себя. Когда он находит невозможное положение (если ящик будет размещен вне колоды или поверх другого ящика), он убивает текущую ветвь дерева рекурсии для повышения производительности.
Когда он видит, что определенная комбинация размещений приводит к полностью закрытой колоде, он печатает записанную историю размещения ящиков и глобально выходит, пытаясь безнадежно разделиться. Распечатанные инструкции по перевозке даже сортируются в алфавитном порядке.
Python 2 , 812 байт
Попробуйте онлайн!
объяснение
Строка ящика анализируется и преобразуется в перечисленное гнездо логических значений, представляющее каждый ящик.
Итерационная функция генерирует все возможные списки длины, равные количеству заданных ящиков, содержащих целые числа
0 <= x < 36
(все возможные положения палубы корабля). Каждый список интерпретируется как инструкция по размещению всех ящиков и проверяется. Если в результате проверки списка инструкций колода не содержит пустых мест, список инструкций должен быть действительным и печататься.Будучи крайне неэффективным, я не тестировал его на предоставленном тестовом примере, хотя в сценариях с меньшим количеством ящиков (см. Ссылку TIO). Поскольку алгоритм просматривает все возможные варианты, он пытается посмотреть на
36**10 = 3.656e15
них. Тем не менее, в теории это все еще должно работать.источник
H
/M
из объявления функции, поскольку их наличие в объявлении делает функции не пригодными для повторного использования. Добрый старый Питон.[i]
с[b]
, это работает . Алгоритм можно улучшить, предварительно отсортировав ящики так, чтобы более крупные тестировались раньше, чем маленькие.JavaScript, 366
Примечание: эта функция может анализировать более компактный ввод, поскольку она не заботится о расстоянии между 24 символами, и отверстия в ящиках разрешены.
Я думаю, что это может быть немного больше в гольфе, но теперь оно короткое и не слишком медленное, поэтому мне нравится, как есть
Меньше гольфа
Тестовых наборов их много
источник