Приблизительная квадратная формация


11

Фон

У меня есть куча коробок квадратной формы одинакового размера, и, поскольку я аккуратный человек, я хочу собрать их все в квадратную форму. Однако их число не обязательно является идеальным квадратом, поэтому мне, возможно, придется приблизиться к квадратной форме. Я хочу, чтобы вы нашли для меня наиболее эстетически приятную договоренность - программно, конечно.

вход

Ваш ввод представляет собой одно положительное целое число k, представляющее количество блоков.

Выход

Ваша программа должна выбрать два положительных целых числа m, n, которые m*(n-1) < k ≤ m*nсохраняются. Они представляют ширину и высоту большой квадратной формы, которую мы размещаем. Поскольку мы ищем эстетически приятные формы, количество должно быть минимальным, чтобы форма была близка к квадрату, а ее площадь была близка . Если для пары еще есть несколько кандидатов , выберите тот, где ширина максимальна.(m - n)2 + (m*n - k)2k(m, n)m

Теперь ваш фактический вывод не должен быть числами mи n. Вместо этого вы должны напечатать расположение ящиков, используя символ #для представления ящика. Более конкретно, вы должны напечатать n-1строки, каждая из которых состоит из mсимволов #, а затем одна строка k - m*(n-1)символов #. Обратите внимание, что вывод содержит ровно kсимволы #.

Правила и оценки

В выходных данных не должно быть начальных или конечных пробелов, за исключением того, что последняя строка может быть дополнена конечными пробелами, чтобы иметь длину m, если это необходимо. Может быть один завершающий символ новой строки, но нет предшествующих символов новой строки. При #желании вы можете использовать любой печатный символ ASCII вместо .

Вы можете написать полную программу или вернуть строку из функции. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Тестовые случаи

Вот правильные выходы для нескольких входных значений.

1
#
2
##
3
##
#
4
##
##
8
###
###
##
13
#####
#####
###
17
######
######
#####
18
#####
#####
#####
###
20
#####
#####
#####
#####
21
######
######
######
###
22
######
######
######
####
23
#####
#####
#####
#####
###

Ответы:


6

Pyth, 28 байт

jbc*\#Qho.a,,N*NJ_/_QN,JQ_SQ

Попробуйте онлайн.

Суть в том, что я сортирую потенциал m по следующему свойству:

(m - ceil(k/m))^2 + (m*ceil(k/m) - k)^2

Обратите внимание на полное отсутствие n. Общая форма определяется просто m. Затем я преобразую вышеупомянутое свойство еще раз, и мой конечный вес сортировки определяется как евклидово расстояние между следующими двумя точками:

(m, m*ceil(k/m)) and (ceil(k/m), k)

Это изменяет значения веса, но не их порядок.


3

Python 3, 202 байта

Я знаю, что это дольше, чем решения CJam или Pyth, но, тем не менее, вот способ решения этой проблемы в Python:

k=int(input())
r,d,s=range(k+1),{},'#'*k
for n in r:
 for m in r:
  if m*n>=k:
   d[m,n]=(m-n)**2+(m*n-k)**2
x,y=max(i for i in d.keys()if d[i]==min(d.values()))
[print(s[i*x:(i*x+x])for i in range(y+1)]

Основной принцип заключается в том, что мы знаем, что m и n меньше k. Также m * n> = k. Это означает, что мы можем просто найти минимум выражения, заданного в задаче, для всех m, n <k, исключая значения, произведение которых больше k.


Я на самом деле считаю 231 байт в вашем источнике, а не 234. Но независимо от этого, вы можете уменьшить его, уменьшив размер отступа с четырех пробелов до одного пробела. Это будет работать так же.
Алекс А.

Это удобный инструмент для подсчета байтов. Кстати, приятной регистрации и добро пожаловать на сайт!
Алекс А.

:отсутствует в строке 5. Запятая - это то, что определяет кортеж, скобки ()могут быть удалены в строке 6. Пробелы между )и ( ifили for) тоже. maxможно получить генератор в качестве параметра, таким образом, скобки []являются избыточными. Вы перебираете dключи, чтобы вы могли безопасно их использовать d[i].
Транг Оул

Вы можете сохранить два байта, изменяя (i+1)*xна -~i*xили i*x+x.
Каде

У вас есть лишний, недействительный парень в (i*x+x...
FlipTack

2

CJam ( 44 42 байта)

qi_,{)_2$d\/m]_2$-_*@@*2$-_*+~}$W=)'#@*/N*

Онлайн демо

Я скорее ожидал, что будет более простое решение, включающее квадратные корни, но это не так просто. Например, для ввода 31ширина строки в два раза больше потолка квадратного корня; для 273(квадратный корень чуть более 16,5) лучший примерный квадрат - это идеальный прямоугольник 21x13.


1

CJam, 42 байта

li:K_,f-{:XdK\/m]:YX-_*XY*K-_*+}$0='#K*/N*

Попробуйте онлайн

Объяснение:

li    Get and interpret input.
:K    Store in variable K for later use.
_     Copy.
,     Build sequence [0 .. K-1].
f-    Subtract from K, to get sequence [K .. 1]. Larger values have to come
      first so that they are ahead in ties when we sort later.
{     Begin block for calculation of target function for sort.
  :X    Store width in variable X.
  d     Convert to double.
  K\/   Calculate K/X.
  m]    Ceiling.
  :Y    Store height in variable Y.
  X-    Calculate Y-X.
  _*    Square it.
  XY*   Calculate X*Y...
  K-    ... and X*Y-K
  _*    Square it.
  +     Add the two squares.
}$    Sort by target function value.
0=    Get first element, this is the best width.
'#K*  Build string of K '# characters.
/     Split using width.
N*    Join with newlines.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.