Эта задача вдохновлена этим приложением . Контрольные примеры заимствованы из этого приложения.
Это задача с быстрым кодом , цель которой состоит в том, чтобы решить самые большие тестовые случаи за наименьшее количество времени. Предусмотрено несколько небольших тестовых случаев, чтобы люди могли быстрее тестировать свои алгоритмы.
Вам будет дана квадратная входная сетка с размерами n-на-n, где 9 <= n <= 12 . Эта сетка будет разделена на n областей, где ячейки каждой области имеют уникальные идентификаторы (я буду использовать строчные буквы от al в тексте здесь, но вы можете выбрать все, что вам нравится, например, целые числа 1-12 ) ,
Входные данные могут выглядеть следующим образом (необязательный формат ввода):
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
Или проще визуализировать:
Вызов:
Вы должны разместить 2 * n деревьев в этом парке в соответствии со следующими правилами:
- Там должно быть ровно 2 дерева в столбце и 2 дерева в строке
- На всех участках должно быть ровно 2 дерева.
- Ни одно дерево не может быть смежным с другим деревом по вертикали, горизонтали или диагонали.
Решение макета выше:
Примечание: есть только одно решение для каждой головоломки
Дополнительные правила:
- Форматы ввода и вывода не являются обязательными
- Например, выходные данные могут быть списком индексов, сеткой с 1/0, указывающей, есть ли в этой позиции дерево, или модифицированной версией входных данных, где указаны деревья.
- Время выполнения должно быть детерминированным
- Программа должна завершиться в течение 1 минуты на компьютере @ isaacg
- Характеристики: 4 процессора, процессор i5-4300U @ 1,9 ГГц, 7,5 ГБ ОЗУ.
- Если ваша программа не может решить два самых больших тестовых случая за одну минуту, то время для второго по величине ( n = 11 ) будет вашим счетом. Вы проиграете против решения, которое решает самый большой случай.
Тестовые случаи:
Я мог бы отредактировать этот список, если кажется, что представления адаптированы под эти тестовые случаи.
12 на 12 :
--- Input ---
aaaaabccccdd
aaaaabccccdd
aaaaabbbbddd
eeeafffgbghh
eeaafffgbghh
eefffffggghh
eeefijffghhh
iieiijjjjkhh
iiiiijjjjkhk
lljjjjjjjkkk
llllllkkkkkk
llllllkkkkkk
--- Solution ---
aaaaabcccCdD
aaaaaBcCccdd
aAaaabbbbdDd
eeeaffFgBghh
eeAaFffgbghh
eefffffGgGhh
EeefijffghhH
iiEiIjjjjkhh
IiiiijjjjkHk
lljJjJjjjkkk
lLllllkkKkkk
lllLllKkkkkk
11 на 11 :
--- Input ---
aaaaaaabbcc
adddabbbbcc
edddbbbbbbc
eddddbbbbbb
effffggghhh
effffgghhii
eefffjjhhii
eeeejjjhhii
eeejjjjkiii
jjjjjjkkiii
jjjjjkkkiii
--- Solution ---
aaAaaaabbCc
adddAbBbbcc
eDddbbbbbbC
eddDdBbbbbb
effffggGhHh
eFfffGghhii
eefFfjjhHii
EeeejjjhhiI
eeEjjjjKiii
JjjjJjkkiii
jjjjjkKkIii
10-по-10
--- Input ---
aaaaabccdd
aeaabbbccd
aeaabfbgcd
eeeaafggcd
eeeaafghcd
eeeiifghcd
ieiiigghcd
iiijighhcd
jjjjighhcd
jjjggghhdd
--- Solution ---
aaAaabccdD
aeaaBbBccd
aEaabfbgcD
eeeaaFgGcd
eEeAafghcd
eeeiiFghCd
IeiIigghcd
iiijigHhCd
JjJjighhcd
jjjgGghHdd
9-по-9
--- Input ---
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
--- Solution ---
aAbBbbbcc
adddbbBcC
adEeEcccc
AdddefgCc
hhhDiFggg
hDddifffG
hhhiIfFfg
HiHiifffg
iiiiiIgGg
--- Input ---
aaabbbccc
aaaabbccc
aaaddbcce
ffddddcce
ffffddeee
fgffdheee
fggfhhhee
iggggheee
iiigggggg
--- Solution ---
aaAbBbccc
AaaabbcCc
aaaDdBcce
fFddddcCe
fffFdDeee
fGffdheeE
fggfHhHee
IggggheeE
iiIgggGgg
источник
There shall be exactly 2 trees per column, and 2 trees per row
таким образом, грубая сила, вероятно, невозможна.Ответы:
JavaScript (ES6), 271 байт
Принимает ввод как массив массивов символов. Возвращает массив битовых масок (целых чисел), описывающих положение деревьев в каждой строке, где младший значащий бит является самой левой позицией.
Отформатировано и прокомментировано
Контрольные примеры
Этот фрагмент содержит дополнительную функцию для отображения результатов в более удобочитаемом формате. Это слишком медленно, чтобы решить последний контрольный пример.
Ожидаемое время выполнения: ~ 5 секунд.
Показать фрагмент кода
источник
C, официальное время: 5 мс для 12x12
Собран с GCC 7 , используя
-O3
и-fopenmp
флаги. Должны иметь аналогичные результаты на любой версии GCC с установленным OpenMP.Формат ввода и вывода, как указано в вопросе.
На моей машине это займет
0,009 с0,008 с0,005 с для примера 12x12 и0,022 с0,020 с0,019 с для запуска всех примеров. На тестовом компьютере isaacg сообщает 5 мс для примера 12x12, используя оригинальную (не поточную) версию кода.Использование:
Просто простой переборщик, работающий по одному ряду за раз. Он работает с хорошей скоростью, распознавая невозможные ситуации на раннем этапе (например, не осталось ни одной ячейки региона, но менее двух деревьев в регионе).
Первое обновление улучшает попадание в кэш, помещая связанные данные близко друг к другу в памяти, и делает вычисления возможных оставшихся в сегменте деревьев немного умнее (теперь учитывается тот факт, что деревья не могут быть смежными). Он также извлекает самый внешний цикл, так что в самой горячей части алгоритма требуется меньше особых случаев.
Второе обновление заставляет внешний цикл работать параллельно между доступными процессорами (используя OpenMP), обеспечивая линейное увеличение скорости. Это возможно только при n> = 11, поскольку накладные расходы на порождающие потоки перевешивают преимущества для меньших сеток.
источник
Java (OpenJDK 8) , Официальный тайминг: 1.2s на 12x12
редактировать: больше не код гольф
Попробуйте онлайн!
Ссылка TIO предназначена для теста 12x12. TIO сообщает о 2,429 с за время выполнения.
Принимает массив целых чисел в качестве входных данных и модифицирует массив так, чтобы он содержал 1 для деревьев и 0 для не-деревьев.
Это работает для всех тестовых случаев. Самый большой тестовый тест выполняется на моей машине менее чем за секунду, хотя у меня довольно мощная машина
Тестовый код для 12x12, можно изменить для других
Производит это на моей машине:
источник
Clingo , ≈ 7 мс для 12 × 12, 116 байт
(Новые строки необязательны и не учитываются.)
Запустите с
clingo plant.lp - -c n=<n>
где<n>
размер сетки. Входной формат представляет собой списокc(X,Y,Z).
утверждений для каждой ячейки (X
,Y
) цветнойZ
, с 1 ≤X
,Y
,Z
≤n
, разделенные пробелами необязательными. Вывод включает в себяt(X,Y)
для каждого дерева в (X
,Y
).Время довольно бессмысленно, так как в основном это просто время запуска, так что считайте это голосом для более крупных тестовых случаев.
демонстрация
Чтобы облегчить работу с форматом ввода / вывода, вот программы на Python для преобразования в формат, указанный в задании.
вход
Выход
источник