대략적인 정사각형


11

배경

나는 같은 크기의 정사각형 모양의 상자가 많이 있으며, 깔끔한 사람이기 때문에 모두 사각형 모양으로 배열하고 싶습니다. 그러나 그 숫자가 반드시 완벽한 정사각형은 아니므로 정사각형 모양과 비슷해야합니다. 물론 프로그램 적으로 가장 미학적으로 즐거운 배치를 찾아 주길 바랍니다.

입력

입력은 k상자 수를 나타내는 단일 양의 정수 입니다.

산출

프로그램 m, nm*(n-1) < k ≤ m*n보유 할 양의 정수 두 개를 선택해야합니다 . 그것들은 우리가 배열하는 큰 사각형 모양의 너비와 높이를 나타냅니다. 우리는 쾌적하게 만족스러운 모양을 찾고 있기 때문에 수량 이 최소가되어 모양이 정사각형에 가까우며 면적이에 가까워집니다 . 쌍에 대한 후보가 여전히 여러 개인 경우 너비 가 최대 인 후보를 선택하십시오 .(m - n)2 + (m*n - k)2k(m, n)m

지금, 당신의 실제 출력은해야 하지 숫자를 수 m하고 n. 대신 문자 #를 사용하여 상자를 나타내는 상자 배열을 인쇄해야합니다 . 보다 구체적으로, n-1m문자 가 문자 로 구성된 #다음 한 행의 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 솔루션보다 길지만 파이썬 에서이 문제를 해결하는 방법이 있습니다.

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입니다. 이는 우리가 곱이 k보다 큰 값을 제외하고 모든 m, n <k에 대해 챌린지에 주어진 최소 표현을 간단히 찾을 수 있음을 의미합니다.


실제로 234 바이트가 아닌 소스에서 231 바이트를 계산합니다. 그러나 상관없이 들여 쓰기 크기를 4 칸에서 1 칸으로 줄이면 줄일 수 있습니다. 동일하게 작동합니다.
Alex A.

이것은 바이트 수를 얻는 편리한 도구입니다. 그건 그렇고, 좋은 제출 및 사이트에 오신 것을 환영합니다!
Alex A.

:쉼표는 튜플을 정의하는 ()것으로 6 행에서 괄호 를 제거 할 수 있습니다 . )및 ( if또는 for) 사이의 공백 도 있습니다. max발전기를 매개 변수로 얻을 수 있으므로 대괄호 []는 중복됩니다. d키를 반복하여 안전하게 사용할 수 있습니다 d[i].
Trang Oul

또는로 변경 (i+1)*x하여 2 바이트를 저장할 수 있습니다 . -~i*xi*x+x
Kade

당신은 여분의, 유효하지 않은 괄호가 있습니다 (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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.