ক্ষেত্রের উপাদানগুলি ফিট করুন


11

1000 এর নীচে একটি ধনাত্মক পূর্ণসংখ্যা দেওয়া, সেই অঞ্চলটির সাথে সমস্ত সম্ভাব্য আয়তক্ষেত্রগুলি প্রদর্শন করুন।

কার্য

আসুন ধরা যাক ইনপুটটি 20 We আমরা 20 × 1, 10 × 2, বা 5 × 4 একটি আয়তক্ষেত্র তৈরি করতে পারি, সুতরাং এটি একটি বৈধ আউটপুট:

********************

**********
**********

*****
*****
*****
*****

নোট করুন যে প্রতিটি সম্ভাব্য আয়তক্ষেত্র ঠিক একবারে উপস্থিত হবে।

আয়তক্ষেত্রগুলি যে কোনও ক্রম, প্রবণতা বা অবস্থানের মধ্যে উপস্থিত হতে পারে তবে কোনও দুটি আয়তক্ষেত্র ওভারল্যাপ বা স্পর্শ করতে পারে না এমনকি কোণেও। নিম্নলিখিতগুলিও বৈধ:

********************

            ****
**********  ****
**********  ****
            ****
            ****

স্কোরিং

একটি আউটপুটের বাউন্ডিং-বক্স অঞ্চল (বিবিএ) হ'ল নূন্যতম আয়তক্ষেত্রের ক্ষেত্র যা সমস্ত আয়তক্ষেত্রকে ঘিরে থাকে। প্রথম উদাহরণ আউটপুটে, আকারটি 20 × 9, সুতরাং বিবিএ 180 হয় the দ্বিতীয় উদাহরণ আউটপুটে, আকারটি 20 × 7, সুতরাং বিবিএ মাত্র ১৪০।

ইনপুট 60, 111, 230, 400, এবং 480 হয়ে গেলে আউটপুটটির বিবিএ সন্ধান করুন এবং সেগুলি যুক্ত করুন। বাইটগুলিতে আপনার কোডের আকার দিয়ে এই যোগফলকে গুণ করুন p ফলাফলটি আপনার স্কোর; সর্বনিম্ন স্কোর জয়।

বিধি

  • প্রোগ্রাম (বা ফাংশন) 1000 এর নীচে যে কোনও ধনাত্মক পূর্ণসংখ্যার জন্য বৈধ আউটপুট উত্পাদন করতে হবে।
  • আউটপুটে অবশ্যই কেবল অ্যাসিরিস্টক ( *), স্পেস ( ) এবং নিউলাইনগুলি থাকতে হবে।
  • আয়তক্ষেত্রগুলির মধ্যে যে কোনও পরিমাণের স্থান থাকতে পারে, তবে এটি বিবিএর পক্ষে গণনা করে।
  • শীর্ষস্থানীয় বা পিছনের লাইন বা কলামগুলি, যদি তাদের কেবল ফাঁকা জায়গা থাকে তবে বিবিএর দিকে গুনবেন না।

বিশেষ ক্ষেত্রে হার্ডকড করা যায়?
ক্যালভিনের

@ ক্যালভিনের শখগুলি হ্যাঁ, তবে আমি এটি সন্দেহ করি যে এটি অনেক সাহায্য করবে।
Ypnypn

3
@ ক্যালভিনের শখগুলি দ্য ফক্সওগেন সমাধান।
স্তর নদী সেন্ট

উত্তর:


3

রুবি, 228 বাইট * 21895 = 4992060

->n{a=(0..n*2).map{$b=' '*n}
g=0
m=n*2
(n**0.5).to_i.downto(1){|i|n%i<1&&(m=[m,n+h=n/i].min
g+=h+1
g<m+2?(a[g-h-1,1]=(1..h).map{?**i+$b}):(x=(m-h..m).map{|j|r=a[j].rindex(?*);r ?r:0}.max 
(m-h+1..m).each{|j|a[j][x+2]=?**i}))}
a}

অবহেলিত কোড থেকে বেশ কয়েকটি পরিবর্তন। বৃহত্তম এক হ'ল mবর্গক্ষেত্রের আয়তক্ষেত্রের উচ্চতা থেকে বর্গক্ষেত্রের আয়তক্ষেত্রের প্লাসের উচ্চতা পর্যন্ত পরিবর্তনকের অর্থের পরিবর্তন n

তুচ্ছভাবে, *40পরিবর্তিত করা হয়েছে *nযার অর্থ বড়দের ডানদিকে অনেকগুলি অপ্রয়োজনীয় সাদা জায়গা n; এবং -2এটিতে পরিবর্তিত হয়েছে 0যার অর্থ নীচে জুড়ে প্লট করা আয়তক্ষেত্র সর্বদা প্রথম দুটি কলাম মিস করে (এর ফলস্বরূপ সংখ্যার জন্য দরিদ্র প্যাকিংয়ের ফলস্বরূপ (n/2)*2)

ব্যাখ্যা

অবশেষে আমি এটি ফিরে পেতে সময় পেয়েছি।

প্রদত্ত nক্ষুদ্র ক্ষেত্রের জন্য দীর্ঘতম আয়তক্ষেত্র 1*nএবং বর্গক্ষেত্র আয়তক্ষেত্র উভয়ের জন্য পর্যাপ্ত স্থান থাকতে হবে x*y। এটি স্পষ্ট হওয়া উচিত যে উভয় আয়তক্ষেত্রগুলির দীর্ঘ দিক একই दिशानिर्देशযুক্ত হলে সর্বোত্তম বিন্যাসটি অর্জন করা যায়।

আয়তক্ষেত্রগুলির মধ্যে সাদা জায়গার প্রয়োজনীয়তা উপেক্ষা করে আমরা দেখতে পাই যে মোট অঞ্চলটি হয় হয় (n+y)*x = (n+n/x)*xবা হয় n*(x+1)। যেভাবেই হোক, এটি মূল্যায়ন করে n*x + n। শ্বেত স্পেস সহ, আমরা xযদি আয়তক্ষেত্রগুলি শেষের দিকে রাখি, বা nআমরা যদি আয়তক্ষেত্র পাশাপাশি রাখি , তবে একটি অতিরিক্ত অন্তর্ভুক্ত করতে হবে । প্রাক্তন তাই ভাল।

এটি (n+y+1)*xমাঠের ক্ষেত্রের জন্য নীচের নিম্নবর্ণগুলি দেয় :

n     area
60    71*6=426
111  149*3=447
230  254*10=2540
400  421*20=8240
480  505*20=10100

এটি নিম্নলিখিত অ্যালগরিদমের পরামর্শ দেয়:

Find the value (n+y+1) which shall be the field height
Iterate from the squarest rectangle to the longest one
  While there is space in the field height, draw each rectangle, one below the other, lined up on the left border.
  When there is no more space in the field height, draw the remaining rectangles, one beside the other, along the bottom border, taking care not to overlap any of the rectangles above.
  (Expand the field rightwards in the rare cases where this is necessary.)

উল্লিখিত নিম্ন সীমানার মধ্যে প্রয়োজনীয় পরীক্ষার ক্ষেত্রে সমস্ত আয়তক্ষেত্র পাওয়া সম্ভব 60 এর ব্যতীত, যা নিম্নলিখিত 71 * 8 = 568 আউটপুট দেয়। দু'টি পাতলা আয়তক্ষেত্রটি ডান এক স্কোয়ার এবং তারপরে উপরে সরিয়ে এটি 60 * 9 = 540 এ সামান্য উন্নতি করা যেতে পারে তবে সঞ্চয়টি ন্যূনতম, সুতরাং সম্ভবত এটি কোনও অতিরিক্ত কোডের মূল্য নয়।

10
12
15
20
30
60
******
******
******
******
******
******
******
******
******
******

*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
*****  *
       *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
****   *
       *
***    *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
*** ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *
    ** *

এটি 21895 এর মোট অঞ্চল দেয়।

অবহেলিত কোড

f=->n{
  a=(0..n*2).map{' '*40}                                      #Fill an array with strings of 40 spaces
  g=0                                                         #Total height of all rectangles
  m=n                                                         #Height of squarest rectangle (first guess is n) 
  (n**0.5).to_i.downto(1){|i|n%i<1&&(puts n/i                 #iterate through widths. Valid ones have n%i=0. Puts outputs heights for debugging.
    m=[m,h=n/i].min                                           #Calculate height of rectangle. On first calculation, m will be set to height of squarest rectangle.
    g+=h+1                                                    #Increment g
    g<n+m+2?                                                  #if the rectangle will fit beneath the last one, against the left margin
      (a[g-h-1,1]=(1..h).map{'*'*i+' '*40})                      #fill the region of the array with stars
    :                                                         #else  
      (x=(n+m-h..n+m).map{|j|r=a[j].rindex('* ');r ?r:-2}.max    #find the first clear column
      (n+m-h+1..n+m).each{|j|a[j][x+2]='*'*i}                    #and plot the rectangle along the bottom margin
    )
  )}
a}                                                            #return the array

puts f[gets.to_i]


1

রুবি, 56 বাইট

90385 * 56 = 5061560 আউটপুট মার্টিনের সমান হিসাবে ধরে নিচ্ছে (আমি বিশ্বাস করি এটি))

->n{1.upto(n){|i|i*i<=n&&n%i==0&&puts([?**(n/i)]*i,'')}}

একটি দরকারী পরীক্ষা প্রোগ্রামে, এখানে আরও একটি দরকারী ফাংশন

f=->n{1.upto(n){|i|i*i<=n&&n%i==0&&print(n/i,"*",i,"\n")};puts}

f[60];f[111];f[230];f[400];f[480]

যা রেফারেন্সের জন্য নিম্নলিখিত আউটপুট দেয়:

60*1
30*2
20*3
15*4
12*5
10*6

111*1
37*3

230*1
115*2
46*5
23*10

400*1
200*2
100*4
80*5
50*8
40*10
25*16
20*20

480*1
240*2
160*3
120*4
96*5
80*6
60*8
48*10
40*12
32*15
30*16
24*20
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.