おおよその正方形の形成


11

バックグラウンド

私は同じサイズの正方形の箱をたくさん持っています。私はきちんとした人なので、それらをすべて正方形の形に整理したいと思います。ただし、その数は必ずしも完全な正方形ではないため、正方形の形状を近似する必要があります。もちろん、プログラム的には、最も審美的に楽しいアレンジを見つけてほしい。

入力

入力は、kボックスの数を表す単一の正の整数です。

出力

プログラムはm, nm*(n-1) < k ≤ m*n成立するような2つの正の整数を選択します。これらは、配置する大きな正方形のような形状の幅と高さを表します。審美的に楽しい形状を探しているので、形状は正方形に近く、その面積はに近くなるように、量は最小限にします。ペアの候補がまだいくつかある場合は、幅が最大になるものを選択します。(m - n)2 + (m*n - k)2k(m, n)m

これで、実際の出力は数字とになりません。代わりに、ボックスを表す文字を使用して、ボックスの配置を印刷する必要があります。具体的には、あなたは印刷するもので構成され、それぞれが、行を文字、その後の1行の文字。出力には正確に文字が含まれていることに注意してください。mn#n-1m#k - m*(n-1)#k#

ルールとスコアリング

出力に先頭または末尾の空白があってはなりません。ただしm、必要に応じて、最後の行の末尾に空白を追加してlength にすることができます。末尾に改行が1つある場合がありますが、先行する改行はありません。#必要に応じて、の代わりに印刷可能な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ます。次に、上記のプロパティをもう一度変換し、最終的な並べ替えの重みを次の2点間のユークリッド距離として定義します。

(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より大きい値は除外されます。


実際、ソースでは234バイトではなく231バイトをカウントします。ただし、インデントサイズを4つのスペースから1つのスペースに減らすことで、削減できます。同じように動作します。
アレックスA.

これは、バイトカウントを取得するための便利なツールです。ちなみに、素敵な投稿とサイトへようこそ!
アレックスA.

:5行目で欠落しています。カンマはタプルを定義します。ブラケット()は6行目で削除できます。and )と(ifまたはfor)の間のスペースも削除できます。maxジェネレータをパラメータとして取得できるため、括弧[]は冗長です。dキーを反復処理するため、を安全に使用できますd[i]
トランオウル

またはに変更(i+1)*xして2バイト保存できます。-~i*xi*x+x
カデ

あなたが余分に、無効な括弧を持っている(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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.