Если положительное целое число меньше 1000, отобразите все возможные прямоугольники с этой областью.
задача
Допустим, ввод равен 20. Мы можем сделать прямоугольник 20 × 1, 10 × 2 или 5 × 4, так что это правильный вывод:
********************
**********
**********
*****
*****
*****
*****
Обратите внимание, что каждый возможный прямоугольник появляется ровно один раз.
Прямоугольники могут появляться в любом порядке, ориентации или положении, но никакие два прямоугольника не могут пересекаться или касаться даже в углах. Следующее также верно:
********************
****
********** ****
********** ****
****
****
счет
Область ограничительной рамки (BBA) выходных данных - это область минимального прямоугольника, охватывающего все прямоугольники. В первом примере вывода размер равен 20 × 9, поэтому BBA равен 180. Во втором примере вывода размер равен 20 × 7, поэтому BBA составляет всего 140.
Найдите BBA выхода, когда входной сигнал равен 60, 111, 230, 400 и 480, и сложите их. Умножьте эту сумму на размер вашего кода в байтах. Результатом является ваш счет; выигрывает самый низкий балл.
правила
- Программа (или функция) должна выдавать правильные выходные данные для любого натурального числа ниже 1000.
- Вывод должен содержать только звездочки (
*
), пробелы () и переводы строк.
- Между прямоугольниками может быть любое пространство, но это имеет значение для BBA.
- Начальные или конечные строки или столбцы, если они имеют только пробелы, не учитываются в BBA.
источник
Ответы:
Рубин, 228 байт * 21895 = 4992060
Несколько изменений по сравнению с неоплаченным кодом. Самым большим является изменение значения переменной
m
от высоты прямоугольника до высоты прямоугольника плюсn
.Тривиально,
*40
был изменен,*n
что означает много ненужных пробелов справа для большогоn
; и-2
изменяется на то,0
что означает, что прямоугольники, нанесенные поперек нижней части, всегда пропускают первые два столбца (это приводит к ухудшению упаковки для чисел, чья единственная факторизация(n/2)*2
)объяснение
Я наконец нашел время, чтобы вернуться к этому.
Для данного
n
наименьшего поля должно быть достаточно места как для самого длинного прямоугольника, так1*n
и для самого квадратного прямоугольникаx*y
. Должно быть очевидно, что наилучшая компоновка может быть достигнута, если оба прямоугольника имеют длинные стороны, ориентированные в одном направлении.Игнорируя требование пробела между прямоугольниками, мы находим, что общая площадь равна
(n+y)*x = (n+n/x)*x
илиn*(x+1)
. В любом случае, это оценивается какn*x + n
. Включая пробельные символы, мы должны включить дополнительные,x
если мы помещаем прямоугольники вплотную илиn
размещаем прямоугольники рядом. Поэтому первое предпочтительнее.Это дает следующие нижние границы
(n+y+1)*x
для области поля:Это предполагает следующий алгоритм:
На самом деле можно получить все прямоугольники для требуемых тестовых случаев в указанных выше нижних границах, за исключением 60, что дает следующий результат 71 * 8 = 568. Это можно немного улучшить до 60 * 9 = 540, переместив два самых тонких прямоугольника вправо на один квадрат, а затем вверх, но экономия минимальна, поэтому, вероятно, не стоит никакого дополнительного кода.
Это дает общую площадь 21895.
Код без правил
источник
CJam, 90385 * 31 байт = 2801935
Проверьте это здесь. Используйте этот скрипт для расчета BBAs.
Это просто наивное решение, чтобы начать работу.
источник
Рубин, 56 байт
90385 * 56 = 5061560 при условии, что результат такой же, как у Мартина (я так думаю).
Вот еще одна полезная функция, в полезной тестовой программе
Который дает следующий вывод, для справки:
источник