近似方阵


11

背景

我有一堆相等大小的正方形盒子,由于我是个整洁的人,所以我想将它们全部排列成正方形。但是,它们的数量不一定是完美的正方形,因此我可能不得不近似正方形。我希望您找到我最美的安排-当然是通过编程。

输入值

您的输入是一个正整数k,代表盒子的数量。

输出量

您的程序应选择两个正整数m, n使之m*(n-1) < k ≤ m*n成立。它们代表了我们正在排列的大正方形形状的宽度和高度。由于我们正在寻找具有美学美感的形状,因此数量应尽可能少,以使形状接近正方形,并且面积接近。如果该对还有几个候选者,请选择宽度最大的那个。(m - n)2 + (m*n - k)2k(m, n)m

现在,您的实际输出将不是数字mn。取而代之的是,您应使用字符#来表示框来打印框的排列。更具体地说,您应打印n-1行,每行包含m字符#,然后打印一行k - m*(n-1)字符#。请注意,输出中完全包含k字符#

规则和计分

输出中不得包含任何前导或尾随空格,除非需要,最后一行可以用尾随空格填充,该尾随空格的长度应为length m。可能只有一个尾随的换行符,但没有前面的换行符。#如果需要,可以使用任何可打印的ASCII字符代替。

您可以编写完整的程序,或从函数返回字符串。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

这是一些输入值的正确输出。

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

Answers:


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个字节。但是无论如何,您可以通过将缩进大小从4个空格减小到1个空格来减少它。会一样的。
Alex A.

是获取字节数的便捷工具。顺便说一句,很好的提交,欢迎光临本站!
Alex A.

:第5行缺少。逗号定义了一个元组,()第6行可以删除括号。)和(iffor)之间也有空格。max可以将生成器作为参数,因此括号[]是多余的。您可以遍历d键,因此可以放心使用d[i]
董里(Trang Oul)2015年

您可以保存更改(i+1)*x-~i*x或的两个字节i*x+x
卡德,2015年

您在(i*x+x... 处有多余的无效括号
FlipTack

2

CJam(44 42字节)

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

在线演示

我本来希望有一个涉及平方根的更简单的解决方案,但它并不是那么简单。例如,输入31行的宽度比平方根的上限大2倍;对于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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.