Yaklaşık Kare Oluşumu


11

Arka fon

Eşit büyüklükte bir grup kare şekilli kutum var ve düzgün bir insan olduğumdan, hepsini kare bir forma yerleştirmek istiyorum. Ancak, sayıları mutlaka mükemmel bir kare değildir, bu yüzden kare şeklini yaklaşık olarak tahmin etmek zorunda kalabilirim. En estetik açıdan en hoş düzenlemeyi bulmanı istiyorum - tabii ki programlı olarak.

Giriş

Girişiniz kkutu sayısını temsil eden tek bir pozitif tam sayıdır .

Çıktı

Programınız iki pozitif tamsayılar seçecektir m, nşekilde m*(n-1) < k ≤ m*ntutar. Düzenlediğimiz büyük kare benzeri şeklin genişliğini ve yüksekliğini temsil ediyorlar. Estetik açıdan hoş şekiller aradığımız için miktar minimum olacak, böylece şekil bir kareye yakın ve alanı yakın olacak . Çift için hala birkaç aday varsa , genişliğin en fazla olduğu adayı seçin .(m - n)2 + (m*n - k)2k(m, n)m

Şimdi, gerçek çıktı eder değil numaralarını olmak mve n. Bunun yerine, #bir kutuyu temsil eden karakteri kullanarak kutuların düzenini yazdırmalısınız . Daha spesifik olarak, n-1her biri mkarakterlerden oluşan satırlar #ve ardından bir k - m*(n-1)karakter satırı yazdırırsınız #. Çıktının tam olarak kkarakterler içerdiğini unutmayın #.

Kurallar ve Puanlama

Çıktıda herhangi bir ön veya arka boşluk olmamalıdır, ancak son satır mistenirse uzunluğunda boşluk olacak şekilde doldurulabilir . Sonunda bir satırsonu olabilir, ancak bir satırsonu yoktur. #İstenirse, herhangi bir yazdırılabilir ASCII karakteri kullanabilirsiniz .

Tam bir program yazabilir veya bir işlevden dize döndürebilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test Durumları

Birkaç giriş değeri için doğru çıkışlar.

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

Yanıtlar:


6

Pyth, 28 bayt

jbc*\#Qho.a,,N*NJ_/_QN,JQ_SQ

Çevrimiçi deneyin.

Asıl mesele şu m üzerinde potansiyel m sıralaması:

(m - ceil(k/m))^2 + (m*ceil(k/m) - k)^2

Toplam yokluğuna dikkat edin n. Toplam şekil yalnızca ile tanımlanır m. Sonra yukarıdaki özelliği bir kez daha dönüştürdüm ve son sıralama ağırlığım aşağıdaki iki nokta arasındaki Öklid mesafesi olarak tanımlandı:

(m, m*ceil(k/m)) and (ceil(k/m), k)

Bu ağırlık değerlerini değiştirir, ancak sıralarını değiştirmez.


3

Python 3, 202 bayt

CJam veya Pyth çözümlerinden daha uzun olduğunu biliyorum, ancak yine de, bu sorunu Python'da çözmenin bir yolu:

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)]

Temel ilke, m ve n'nin k'den küçük olduğunu biliyoruz. Ayrıca, m * n> = k. Bu, k'de büyük olan değerler hariç olmak üzere, tüm m, n <k için meydan okumada verilen ifadenin minimumunu bulabileceğimiz anlamına gelir.


Aslında kaynağınızda 231 bayt sayıyorum, 234 değil. Ama ne olursa olsun, girinti boyutunuzu dört boşluktan bir boşluğa küçülterek azaltabilirsiniz. Aynı şekilde çalışacaktır.
Alex

Bu , bayt sayımı almak için kullanışlı bir araçtır. Bu arada, güzel teslim ve siteye hoş geldiniz!
Alex

:5. satırda eksik virgül. Bir tupu tanımlayan, parantez ()6. satırda çıkarılabilir. )ve ( ifveya for) arasındaki boşluklar da. maxjeneratörü parametre olarak alabilir, böylece parantez []yedeklidir. dAnahtarlar üzerinde yineleme yaparsınız, böylece güvenle kullanabilirsiniz d[i].
Trang Oul

Sen değişen iki bayt kaydedebilirsiniz (i+1)*xetmek -~i*xveya i*x+x.
Kade

Ekstra, geçersiz bir (i*x+x
paranız var

2

CJam ( 44 42 bayt)

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

Çevrimiçi demo

Daha çok kare kökleri içeren daha basit bir çözüm olmasını bekliyordum, ama hiç de o kadar basit değil. Örneğin, giriş 31için satır genişliği kare kökün tavanından iki daha büyüktür; için 273(sadece 16.5 üzerinde kare kökü) en iyi yaklaşık kare mükemmel 21x13 dikdörtgendir.


1

CJam, 42 bayt

li:K_,f-{:XdK\/m]:YX-_*XY*K-_*+}$0='#K*/N*

Çevrimiçi deneyin

Açıklama:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.