Приблизна формація площі


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

Пітон 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
батько

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.