การสร้างจตุรัสโดยประมาณ


11

พื้นหลัง

ฉันมีกล่องสี่เหลี่ยมจตุรัสขนาดเท่ากันและเนื่องจากฉันเป็นคนเรียบร้อยฉันต้องการจัดเรียงมันให้เป็นรูปสี่เหลี่ยมจัตุรัส อย่างไรก็ตามจำนวนของพวกมันไม่จำเป็นต้องเป็นสี่เหลี่ยมจัตุรัสดังนั้นฉันอาจต้องประมาณรูปสี่เหลี่ยม ฉันต้องการให้คุณพบกับฉันการจัดเรียงที่น่าพอใจมากที่สุด - โดยทางโปรแกรมแน่นอน

อินพุต

ข้อมูลที่คุณป้อนเป็นจำนวนเต็มบวกเดียวkแทนจำนวนช่อง

เอาท์พุต

โปรแกรมของคุณจะเลือกจำนวนเต็มบวกสองตัวm, nที่m*(n-1) < k ≤ m*nเก็บไว้ มันแสดงถึงความกว้างและความสูงของรูปร่างสี่เหลี่ยมจัตุรัสขนาดใหญ่ที่เรากำลังจัด เนื่องจากเรากำลังมองหารูปทรงที่ชื่นชอบ aestethically ปริมาณจะมีเพียงเล็กน้อยเพื่อให้รูปร่างอยู่ใกล้กับตารางและพื้นที่อยู่ใกล้กับ หากยังมีผู้สมัครหลายคนสำหรับคู่เลือกหนึ่งที่ความกว้างสูงสุด(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

ลองออนไลน์

crux คือฉันจัดเรียง 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 แต่ไม่ว่าคุณจะลดขนาดได้โดยลดขนาดย่อหน้าจากสี่ช่องว่างเป็นหนึ่งช่องว่าง มันจะทำงานเหมือนเดิม
Alex A.

นี่เป็นเครื่องมือที่มีประโยชน์สำหรับการนับจำนวนไบต์ของคุณ โดยวิธีการส่งที่ดีและยินดีต้อนรับสู่เว็บไซต์!
Alex A.

:หายไปที่บรรทัดที่ 5 เครื่องหมายจุลภาคคือสิ่งที่กำหนด tuple วงเล็บ()สามารถลบได้ที่บรรทัด 6 ช่องว่างระหว่าง)และ ( ifหรือfor) เกินไป maxสามารถรับตัวสร้างเป็นพารามิเตอร์ดังนั้นวงเล็บจึง[]ซ้ำซ้อน คุณย้ำกว่าคีย์เพื่อให้คุณได้อย่างปลอดภัยสามารถใช้d d[i]
ตรัง Oul

คุณสามารถบันทึกไบต์ที่สองการเปลี่ยนแปลง(i+1)*xไปหรือ-~i*x i*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.