вход
Ваш вход в этот вызов представляет собой список целочисленных пар. Они представляют юго-западные углы единичных квадратов на плоскости, а список представляет их объединение как подмножество плоскости. Например, список
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
представляет красный набор на этой картинке:
Выход
Yor output - это список целочисленных четверок, представляющих прямоугольные подмножества плоскости. Более конкретно, четверка (x,y,w,h)
повторяет прямоугольник ширины w > 0
и высоты h > 0
, юго-западный угол которого равен (x,y)
. Прямоугольники должны формировать точное покрытие входной области, в том смысле, что каждый из единичных квадратов является подмножеством некоторого прямоугольника, каждый прямоугольник является подмножеством области, и два прямоугольника могут перекрываться только на своих границах. Чтобы запретить тривиальные решения, покрытие не должно содержать два прямоугольника, которые можно объединить в больший прямоугольник.
Например, список
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
представляет собой юридическое покрытие
указанного региона, тогда как покрытие
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
является незаконным, поскольку соседние квадраты 1 на 1 могут быть объединены:
правила
Вы можете дать полную программу или функцию. Точное форматирование ввода и вывода не имеет значения, в пределах разумного. Самый короткий счет байтов побеждает, и стандартные лазейки запрещены. Вам предлагается предоставить объяснение вашего алгоритма и некоторые примеры выходных данных.
Тестовые случаи
U-образная область:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Большой треугольник:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Квадрат с отверстиями:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Отключенные регионы:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
контрольник
Используйте эту программу Python 2, чтобы проверить ваше решение. Он берет из STDIN список кортежей (входные данные) и список четверок (ваши выходные данные), разделенные запятой.
Я также написал эту программу на Python 2 для генерации картинок, и вы тоже можете ее использовать. Он берет из STDIN список кортежей или четверок и создает файл с именем out.png
. Требуется библиотека PIL. При желании вы можете изменить размер ячеек сетки и ширину линий опоясывания.
3-h
на~h
?Питон -
272261258251224Я думаю, что я могу играть в гольф это больше.
Я почти уверен, что это работает, но я еще не закончил тестировать его на всех тестах.Я закончил тестирование. Это работает для всех тестовых случаев.Я работаю над добавлением изображений результатов.Изменить: Вот результаты из примера и тестовых случаев:Я пытаюсь написать это на Perl, но я не могу понять, как получить многомерные массивы из stdin без огромного количества символов. У кого-нибудь есть предложения?
источник
(i[0]+w,i[1]+j)not in c
чтобы{(i[0]+w,i[1]+j)}-c
и вы можете перейтиw=h=1
кc=set(a)-set(b)
линииb+=[(j+i[0],k+i[1])]
чтобыb+=(j+i[0],k+i[1]),
и вы используетеrange
три раза, так что короче назначитьr=range
x,y=i
затем с помощьюx
иy
вместоi[0]
иi[1]
? Это сэкономит много байтов.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
использованияwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Python 2, 139
Программа принимает списки упорядоченных пар, окруженных фигурными скобками, на стандартный ввод. Например,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
Часто раздражает (не только в гольфе), что Python не позволяет выполнять задания внутри циклического теста. Чтобы обойти это, я использовал операции форматирования строки.
источник
Mathematica -
315 285267 байтС некоторой помощью @ MartinBüttner.
Ungolfed:
Использование:
Тестовые случаи
U-образная область
Большой треугольник
Квадрат с отверстиями
Отключенные регионы
источник
Хаскелл, 158
тестовые случаи и изображения будут здесь в ближайшее время.
Алгоритм: возьмите первый квадрат. Доберитесь до крайнего правого угла, не встречая квадрата, отсутствующего на входе. Затем достигните как можно большего расстояния, не имея квадрата на входе. Теперь у нас есть прямоугольник без пропущенного квадрата. Добавьте его к выводу, удалите все его квадраты из ввода и вызовите рекурсивно.
источник
not$all(\x->elem(x,i)s)
наany(\x->notElem(x,i)s)
.JavaScript (ES6) 148
155 199Edit2 Еще немного тюнинга
Edit Некоторые игры в гольф + переписать с помощью рекурсии. Не ожидал такого сокращения. Теперь немного сложно следовать, но алгоритм тот же.
Алгоритм похож на ответ @jakube.
Да? Первый элемент растет, второй элемент стирается, начните снова с шага 2,
иначе перейдите к следующему элементу
Тест во фрагменте
источник
Mathematica,
153 151 144 136133Пример:
Входные данные:
Выход:
Входные данные:
Выход:
Алгоритм:
Покройте область единичными квадратами, затем объедините их.
источник