আপনার চেয়ারগুলি কীভাবে সাজানো উচিত?


20

আপনি কীভাবে তাদের চেয়ারগুলি সাজানো হয়েছে তার জন্য আকর্ষণীয় অগ্রাধিকার সহ এক শ্রেণির শিক্ষার্থীদের পড়ান। চেয়ারগুলি কীভাবে সাজানো হয় তার জন্য তাদের রয়েছে 3 অত্যন্ত নির্দিষ্ট প্রয়োজনীয়তা:

  1. এগুলি বেশিরভাগটি একটি আয়তক্ষেত্রের মধ্যে সাজানো থাকে, এর অর্থ কিছু চেয়ার খালি হয়ে যায়।

  2. যতটা সম্ভব খালি চেয়ার থাকতে হবে।

  3. এগুলি যথাসম্ভব "চৌকো" হতে হবে। স্কোয়ার-নেসটি আয়তক্ষেত্রের প্রস্থ এবং উচ্চতার মধ্যবর্তী দূরত্ব দ্বারা নির্ধারিত হয়, কম ভাল হয়। উদাহরণস্বরূপ, একটি আয়তক্ষেত্র যা 4x73 এর স্কোয়ার-নেস থাকে।

আরও সুনির্দিষ্টভাবে বলতে গেলে, বিন্যাসের "স্কোর" হ'ল প্রস্থ এবং উচ্চতা এবং খালি যে চেয়ারগুলির সংখ্যা রয়েছে তার মধ্যে দূরত্ব।

একটি উদাহরণ নেওয়া যাক। ধরা যাক আপনার 13 ছাত্র রয়েছে। আপনি এই যে কোনও উপায়ে চেয়ারগুলি সাজিয়ে রাখতে পারেন:

1x13
2x7
3x5
4x4

1x13খুব চতুর নয়। আসলে, 1 এবং 13 পৃথক 12, তাই আমরা এই বিন্যাসটি 12 পয়েন্ট দিই give এটিতে 0 টি খালি চেয়ার রয়েছে, সুতরাং আমরা 0 পয়েন্ট যুক্ত করি, এই ব্যবস্থাটি 12 এর স্কোর প্রদান করে that যে দুর্দান্ত নয়।

2x7অবশ্যই ভাল। 2 এবং 7 কেবল 5 টি পৃথক, তাই আমরা এই বিন্যাসটি 5 পয়েন্ট দেব। তবে, আপনি যদি সাতটি চেয়ারের 2 টি সারিটি সাজিয়ে রাখেন তবে 14 টি চেয়ার লাগবে যার অর্থ একটি চেয়ার খালি থাকবে। সুতরাং আমরা একটি বিন্দু যুক্ত করি, এই বিন্যাসটি 6 স্কোর দিয়ে।

আমরাও করতে পারতাম 3x5। 3 এবং 5 2 টি পৃথক, সুতরাং +2 পয়েন্ট। এটি 15 টি চেয়ার নেয়, যার অর্থ আমাদের দুটি অতিরিক্ত চেয়ার থাকবে, সুতরাং 4 এর স্কোরের জন্য আরও একটি +2 পয়েন্ট।

শেষ বিকল্প 4x4,। 4 এবং 4 0 টি পৃথক, তাই আমরা এই +0 পয়েন্ট দিই। 4x4 16 টি চেয়ার নেয়, সুতরাং 3 টি মোট 3 স্কোরের জন্য খালি খালি যায়, এটি সর্বোত্তম সমাধান।

টাইয়ের ক্ষেত্রে, সর্বোত্তম সমাধানটি হ'ল কম খালি চেয়ার।

চ্যালেঞ্জ

আপনাকে অবশ্যই এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা একটি পূর্ণসংখ্যা গ্রহণ করে এবং সেই সংখ্যক শিক্ষার্থীর জন্য চেয়ারের সর্বোত্তম ব্যবস্থাটি আউটপুট করে। আইও যে কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে। এখানে 1 থেকে 100 পর্যন্ত যে কোনও সংখ্যক শিক্ষার্থীর নমুনা আউটপুট দেওয়া হচ্ছে:

1:  (1, 1)
2:  (1, 2)
3:  (2, 2)
4:  (2, 2)
5:  (2, 3)
6:  (2, 3)
7:  (3, 3)
8:  (3, 3)
9:  (3, 3)
10: (2, 5)
11: (3, 4)
12: (3, 4)
13: (4, 4)
14: (4, 4)
15: (4, 4)
16: (4, 4)
17: (3, 6)
18: (3, 6)
19: (4, 5)
20: (4, 5)
21: (3, 7)
22: (5, 5)
23: (5, 5)
24: (5, 5)
25: (5, 5)
26: (4, 7)
27: (4, 7)
28: (4, 7)
29: (5, 6)
30: (5, 6)
31: (4, 8)
32: (4, 8)
33: (6, 6)
34: (6, 6)
35: (6, 6)
36: (6, 6)
37: (5, 8)
38: (5, 8)
39: (5, 8)
40: (5, 8)
41: (6, 7)
42: (6, 7)
43: (5, 9)
44: (5, 9)
45: (5, 9)
46: (7, 7)
47: (7, 7)
48: (7, 7)
49: (7, 7)
50: (5, 10)
51: (6, 9)
52: (6, 9)
53: (6, 9)
54: (6, 9)
55: (7, 8)
56: (7, 8)
57: (6, 10)
58: (6, 10)
59: (6, 10)
60: (6, 10)
61: (8, 8)
62: (8, 8)
63: (8, 8)
64: (8, 8)
65: (6, 11)
66: (6, 11)
67: (7, 10)
68: (7, 10)
69: (7, 10)
70: (7, 10)
71: (8, 9)
72: (8, 9)
73: (7, 11)
74: (7, 11)
75: (7, 11)
76: (7, 11)
77: (7, 11)
78: (9, 9)
79: (9, 9)
80: (9, 9)
81: (9, 9)
82: (7, 12)
83: (7, 12)
84: (7, 12)
85: (8, 11)
86: (8, 11)
87: (8, 11)
88: (8, 11)
89: (9, 10)
90: (9, 10)
91: (7, 13)
92: (8, 12)
93: (8, 12)
94: (8, 12)
95: (8, 12)
96: (8, 12)
97: (10, 10)
98: (10, 10)
99: (10, 10)
100: (10, 10)

যথারীতি, এটি কোড-গল্ফ, সুতরাং মানক লুফোলগুলি প্রয়োগ হয় এবং বিজয়ী হ'ল বাইটগুলির মধ্যে সংক্ষিপ্ত উত্তর।


উত্তর:


8

জেলি , 16 15 14 বাইট

÷RĊ,Rµạ/+PỤḢịZ

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

÷RĊ,Rµạ/+PỤḢịZ  Main link. Argument: n

 R              Range; yield [1, ..., n].
÷               Divide n by each k in [1, ..., n].
  Ċ             Ceil; round the quotients up to the nearest integer.
    R           Range; yield [1, ..., n].
   ,            Pair; yield A := [[ ⌈n ÷ 1⌉, ..., ⌈n ÷ n⌉ ], [ 1, ..., n ]].
     µ          Begin a new, monadic chain. Argument: A
      ạ/        Reduce A by absolute difference.
                This yields [ |⌈n ÷ 1⌉ - 1|, ..., |⌈n ÷ n⌉ - n| ].
         P      Product; reduce A by multiplication.
                This yields [ ⌈n ÷ 1⌉ × 1, ..., ⌈n ÷ n⌉ × n].
       +        Add the results to left and right, element by element. This yields
                [ |⌈n ÷ 1⌉ - 1| + ⌈n ÷ 1⌉ × 1, ..., |⌈n ÷ n⌉ - n| + ⌈n ÷ n⌉ × n ].
          Ụ     Grade up; sort the indices of the list of sums by their values.
           Ḣ    Head; extract the first value, which corresponds to the smallest
                sum. Grading up is stable, so this selects the first index of all
                with the smallest sum in case of a tie. In this event, the first
                index will have the highest absolute difference of all indices
                with the smallest sum, meaning that it has the lowest product and,
                therefore, the lowest number of empty chairs.
             Z  Zip; transpose A's rows and columns.
                This yields [[ ⌈n ÷ 1⌉, 1 ], ..., [ ⌈n ÷ n⌉, n ]].
            ị   Retrieve the pair at that index.

4

পাইথন 2, 68 বাইট

lambda n:min((abs(~i-n/~i)+n/~i*~i,i+1,0-n/~i)for i in range(n))[1:]

আরও "সুস্পষ্ট" সমতুল্য:

lambda n:min([(i+1,0-n/~i)for i in range(n)],key=lambda(p,q):abs(p-q)+p*q)

আমার উত্তরেrange(-n,0) যেমন করা হয় তেমনি পুনরাবৃত্তি করে আপনি তিনটি বাইট সংরক্ষণ করতে পারেন । পরীক্ষা স্যুট.
ডেনিস

3

হাস্কেল, 65 বাইট

f x=snd$minimum[((a*b+a-b,a*b),(b,a))|a<-[1..x],b<-[1..a],a*b>=x]

ব্যবহারের উদাহরণ: map f [1..5]-> [(1,1),(1,2),(2,2),(2,2),(2,3)]

একটি বাইরের লুপ মাধ্যমে যায় aথেকে 1থেকে x(-> ছাত্র সংখ্যা x) এর একটি ভেতরের লুপ bথেকে 1থেকে a। আমাদের সর্বনিম্ন সন্ধান করতে হবে এমন ডিকোসোগ্রাফিকাল ক্রম অনুসরণ করে এবং (b,a)যেখানে a*b>=xজোড়া তৈরি করে তা সব রাখে ((arrangement points,seats left), (b,a))। দ্রষ্টব্য: aসর্বদা এর চেয়ে বড় b, তাই আমাদের absস্কোয়ারনেসের প্রয়োজন হয় না । x"আসন বাম" স্কোর থেকে বিয়োগ করার দরকার নেই , কারণ কেবল আপেক্ষিক আদেশের বিষয়টি বিবেচনা করে। অবশেষে আমরা স্কোর জুটিটি সাথে সরিয়ে নিই snd


কেন শুধু (একটি বি + আব, (খ, ক)) নয়? আপনি যদি স্কোরটি ন্যূনতম করেন তবে অবশ্যই আপনি একটি খ কে ন্যূনতম করুন , বা আমি কিছু মিস করছি?
justinpc

@ জেপকোপার: a*b(মূল আসন সংখ্যা) টাই ব্রেকার যদি মূল স্কোর সমান হয়। যেমন n=43: ক) a=7, b=7, স্কোর: (49,49)খ) a=9, b=5, স্কোর: (49,45)। মূল স্কোর সমান, টাই ব্রেকার সিদ্ধান্ত নেয়, খ) জিতল।
নিমি

তুমি ঠিক বলছো. আমার বর্ণনাটি আরও ভাল করে পড়া উচিত ছিল।
justinpc

@ জেপকোপার: এক মিনিট অপেক্ষা করুন ... আমি যদি টাই ব্রেকারটি সরিয়ে ফেলি তবে a*bযে সংখ্যাগুলি আমার নিজের (b,a)মতো করে চালাতে হবে তা টাই ব্রেকার হিসাবে কাজ করে এবং (কমপক্ষে) একই ফলাফল দেয় n=1..300। কোনও পণ্য (এখানে b) ছোট হলে কোনও পণ্য ছোট হয় small তবে যতক্ষণ না আমার কাছে কোনও আনুষ্ঠানিক প্রমাণ নেই, আমি এই সত্যটি ব্যবহার করতে চাই না। আমি খুঁজে পাই কিনা তা দেখি।
নিমি

ভাল যুক্তি. এটি সঠিক বলে মনে হচ্ছে এবং প্রমাণ হিসাবে উপস্থিত হওয়া খুব বেশি কঠিন হওয়া উচিত নয়। আমি ভাবতে শুরু করি যদিও এই সমস্যার কোনও রৈখিক সমাধান হতে পারে কিনা।
justinpc

2

রুবি, 64 বাইট

->n{(1..n).map{|w|h=(n+w-1)/w;[(h-w).abs+h*w,w*h,w,h]}.min[2,3]}

একটি লাম্বাডা যা সংখ্যার হিসাবে লোকের সংখ্যা নেয় এবং অনুকূল সমাধানের প্রস্থ এবং উচ্চতা সহ একটি অ্যারে প্রদান করে।


w*hআপনার অ্যারেতে দ্বিতীয় উপাদান হিসাবে কেন দরকার ? আমি মনে করি না যে আপনি কল করার সময় এটি বিশেষভাবে কোনও পরিবর্তন হয় minকারণ আপনি প্রথম উপাদানটিকে স্কোরকে ন্যূনতম করেন।
মান কালি

প্রশ্ন থেকে @ কেভিনলউ-নোট In case of a tie, the optimal solution is the one with less empty chairs
কেনি

2

এমএটিএল , 18 বাইট

:Gy/Xkvtd|yp+&X<Z)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

:      % Implicit input number N. Range [1 2 ... N]
G      % Push N again
y      % Duplicate second-from-top: push [1 2 ... N] again
/Xk    % Divide and round up
v      % Vertically concatenate. Gives 2×N array of rectangle sizes
td|    % Duplicate. Absolute difference of each column
y      % Duplicate second-from-top: push 2×N array again
p      % Product of each column
+      % Sum absolute differences and products
&X<    % Arg min
Z)     % Use as column index into the 2×N array. Implicitly display

2

জাভাস্ক্রিপ্ট, 98 বাইট

আমার প্রথম কোড গল্ফ, তাই আমি যাইহোক পোস্ট!

f=n=>{for(o=1/0,i=1;i<=n;i++)for(j=n;i*j>=n;j--)t=i*j-n+Math.abs(i-j),o>t&&(o=t,a=[i,j]);return a}

প্রথমদিকে আমার oএকটি খালি অবজেক্ট ছিল এবং আমি খালি কিনা তা যাচাই করেছিলাম o.a, তাই এটি প্রথম দফায় একটি বিশেষ কেস। তবে আমি অসীমের পরিবর্তনশীল আরম্ভ করার জন্য edc65 এর উত্তরটিতে 1/0 টি কৌশল পেয়েছি।


এবং আমি অস্থায়ী ফলাফল সংরক্ষণ করার জন্য কোনও অবজেক্টটি ব্যবহার করার কৌশলটি চেষ্টা করব
edc65

1

পাইথ, 24 22 21 বাইট

সম্পাদনা করুন : বাছাইয়ের কীতে, আমি বুঝতে পারি যে খালি চেয়ারগুলির সংখ্যা খুঁজে পাওয়ার দরকার নেই। এটি মোট চেয়ার সংখ্যা স্কোর সমতুল্য। এটি আমার 2 বাইট সংরক্ষণ করেছে

h.m_+B*FbaFbm,d.EcQdS

এটি অনলাইন চেষ্টা করুন!


1

মতলব(174) (146)121

  function g(n),f=@(n,i)ceil(n/i);x=[];for i=1:n,x=[sortrows(x); f(n,i)*i-1/(f(n,i)*i)+abs(f(n,i)-i) i f(n,i)];end,x(1,2:3)
  • কৌশল 1: আমি পরিমাণটি 1-1/length*widthটাই-স্কোরিং হিসাবে যুক্ত করেছি added

  • কৌশল 2: আমি number_students/lengthআয়তক্ষেত্রের প্রস্থের জন্য সিলিং গণনা করেছি , উপরের গণ্ডিটি বর্গক্ষেত্র তবে সিলিংও

  • আমি নিশ্চিত এটি আরও গল্ফ করা যেতে পারে ...

এটি চেষ্টা করুন


সম্পাদনা: @ স্টেভিগ্রিফিনের মন্তব্যগুলিতে উল্লেখ করা।

সম্পাদনা 2:

  • 1এবং nসামগ্রিক স্কোর এঁদের যোগ করার প্রয়োজনের ধ্রুবকগুলি নেই।
  • একটি ফাংশন স্টিন স্ট্যান্ড্যালোন প্রোগ্রামের চেয়ে কয়েক বাইট কম।
  • আমি আরোহী বাছাই করার কৌশলটি ব্যবহার করেছি এটি যদিও খুব বেশি বাইট সংরক্ষণ করে।

সম্পাদনা 3: peformance পরীক্ষা।


@ স্টেভি গ্রিফিন যে বড় বিষয় নয়, এটি ব্যবহার করে সমাধান করা যেতে পারেunique
Abr001am

1
আমি মনে করি এই সমস্যার জন্য কিছু দুর্দান্ত গাণিতিক অনুবাদ আমি অর্ধেক করে
রেখেছি

এ সম্পর্কেও ভেবেছি। জুলিয়া উদাহরণ দেখুন।
এমএসচাউয়ার

1

পাইথন 2, 64 বাইট

lambda n:max((~-i*~min(i,n/i),0-n/i,-i)for i in range(-n,0))[1:]

এটি @ লিনের পাইথন উত্তরটির সংমিশ্রণ (যেখানে আমি max(...)[1:]কৌশলটি নিয়েছি ) এবং আমার জুলিয়া উত্তর থেকে অ্যালগরিদম (যা কিছুটা সংক্ষিপ্ত বাস্তবায়ন করতে দেয়)।

আইডিয়নে এটি পরীক্ষা করুন ।


1

জুলিয়া, 61 59 55 53 52 বাইট

/ =cld
n->[m=indmax([~i*~-max(i,n/i)for i=1:n]),n/m]

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

কোডটি নিম্নোক্ত, অগলিত সংস্করণের সমান, যেখানে cldসিলিং বিভাগ রয়েছে।

function chairs(n)
    m = indmin([(i + 1) * (max(i, cld(n, i)) - 1) for i in 1:n])
    return [m, cld(n, m)]
end

অনুকূল ব্যবস্থা খুঁজে নিতে, এটা পরিষ্কারভাবে জোড়া পরীক্ষা করার যথেষ্ট [আমি, ঞ] , যেখানে 1 ≤ আমি ≤ এন এবং ঞ = ⌈n / i⌉

এই জাতীয় বিন্যাসের জন্য স্কোর | জে - আই | + (আইজ - এন) , যেখানে দ্বিতীয় যোগফলটি খালি চেয়ারগুলির সংখ্যা। প্রকৃত স্কোরগুলির পরিবর্তে, আমরা আইজি + | জে - আই | এর মতো ধ্রুবক দ্বারা বাড়ানো স্কোরগুলি তুলনা করতে পারি can + 1

এটা তোলে জোড়া বিবেচনা করতে যথেষ্ট [আমি ঞ] যেখানে আমি ≤ ঞ ব্যবস্থা যেহেতু [আমি ঞ] এবং [ঞ, আমি] সমানভাবে বৈধ। পরিবর্তে j = সর্বোচ্চ (/n / i⌉, i) নির্ধারণ করে আমরা কঠোরভাবে অবতীর্ণ জোড়গুলির সাথে মোকাবিলা করি , যা নিশ্চিত করে যে j ≥ i এবং যদি /n / i⌉ <i হয় তবে সাব-থিমাল স্কোর অর্জন করবে ।

যেহেতু জে - আই ≥ 0 , আমাদের আইজি + | জে - আই | + 1 = ij + j - i + 1 = (i + 1) × (জে - 1) , যা কোডের কম বাইটে গণনা করা যায়।

অবশেষে indmin/ indmaxসূচক দেয় মি (এবং এইভাবে মান আমি অনুকূল ব্যবস্থা, যা এর) মি দ্বারা ⌈n / m⌉ । টাইগুলি প্রথম সংঘটন দ্বারা বিভক্ত হয়, যা i এর সর্বনিম্ন মানের সাথে মিলে যায় , সুতরাং j - i এর সর্বোচ্চ মান এবং সুতরাং ij - n (খালি চেয়ার) এর সর্বনিম্ন মান ।


1

জাভাস্ক্রিপ্ট (ES6) 74 78

থিম্টের উত্তর থেকে ধার করা ২ টি বারের পরিবর্তে অস্থির ফলাফলকে অ্যারে হিসাবে সম্পাদনা করুন

n=>(z=>{for(x=0;y=-~(~-n/++x),x<=y;)(s=y-x+x*y-n)>=z||(z=s,r=[x,y])})()||r

কম গল্ফড

n=>{
  z = 1/0
  for (x=0; y=(n-1)/++x+1|0, x <= y; )
  {
    s = y-x+x*y-n;
    if (s<z)
      z=s, r=[x,y]
  }
  return r
}

পরীক্ষা

f=n=>(z=>{for(x=0;y=-~(~-n/++x),x<=y;)(s=y-x+x*y-n)>=z||(z=s,r=[x,y])})()||r

out=x=>O.textContent+=x+'\n'

for(i=1;i<=100;i++)out(i+' :( '+f(i)+' )')
<pre id=O></pre>


1

পিএইচপি, 129 বাইট

function f($i){$s=INF;for($x=1;$x<$i;$x++){if($s>$t=(abs($x-$e=ceil($i/$x))-$i+($e*$x))){$s=$t;$d[0]=$x;$d[1]=$e;}}var_dump($d);}

Ungolfed:

function f ($i){
    $s=INF;
    for($x=1; $x<$i; $x++){ // for every number less than the input
        if( $s > $t=( abs($x-$e=ceil($i/$x))-$i+($e*$x) ) ){ 
            // determine the other dimension, the score, and compare to the minimum score
            $s=$t;
            $d[0]=$x;
            $d[1]=$e;
        }
    }
    var_dump($d);
}

1

পিএইচপি, 104 বাইট

যে সমস্যাটি সমাধান করে সেই অ্যালগরিদমটি সহজ এবং এটি সম্ভবত পিএইচপি (জাভাস্ক্রিপ্ট, ফে) এর অনুরূপ ভাষায় অন্যান্য উত্তর ব্যবহার করে:

  • প্রাথমিক স্কোরের জন্য একটি বড় মান দিয়ে শুরু করুন; nযথেষ্ট পরিমাণে বড় ( nইনপুট মানটি কোথায় ); প্রথম পুনরাবৃত্তিতে ( 1, n) গণনা করা বিন্যাসের স্কোর হ'ল (n-1)+0;
  • এর মধ্যে 1এবং প্রস্থের সমস্ত মানের জন্য পুনরাবৃত্তি করুন n; ন্যূনতম উচ্চতা ceil(n/width)গণনা করুন, প্রশ্নের (যেমন abs(width - height) + (width * height - n)) প্রদত্ত সূত্র ব্যবহার করে বিন্যাস স্কোর গণনা করুন ; স্কোর যদি আগের সেরা স্কোরের চেয়ে ভাল হয় তবে প্রস্থ, উচ্চতা এবং নতুন সেরা স্কোরটি মনে রাখবেন; width * height - nনতুন সেরা ব্যবস্থা সনাক্তকরণের জন্য বন্ধনগুলি বর্তমান ব্যবস্থা এবং পূর্ববর্তী সেরা ব্যবস্থার জন্য মূল্য ব্যবহার করে ;
  • এখানেই শেষ.

গল্ফ করার পরে, এই অ্যালগরিদম এমন কিছু তৈরি করে (এখানে পাঠযোগ্যতার জন্য আবৃত):

for($s=$h=$j=$n=$argv[$w=$i=1];$i<=$j;$j=ceil($n/++$i)
{$c=$j-$i+$i*$j-$n;if($c<$s||$c==$s&&$i*$j<$w*$h){$w=$i;$h=$j;$s=$c;}}
echo"$w,$h";

এটি 137 বাইট ব্যবহার করে (যখন কোনও একক লাইনে লাগানো হয়) এবং এটি শিরোনামে বিজ্ঞাপন দেওয়া 104 বাইট থেকে অনেক দূরে। কোডটি সম্ভবত আরও 2-3 বাইট দ্বারা সংক্ষিপ্ত করা যেতে পারে তবে উন্নতির বড় উত্স অন্য কোথাও: অ্যালগরিদমের বিবরণে।

সংশোধিত অ্যালগরিদম:

অজানা কোড সরিয়ে অ্যালগরিদম উন্নত করা যায় এমন বেশ কয়েকটি জায়গা রয়েছে।

  • থেকে প্রস্থ পুনরুক্তি করতে কোন প্রয়োজন নেই 1করার $n; গতির জন্য, প্রস্থ ( $i) এর অবশ্যই পুনরাবৃত্তি হবে 1এবং floor(sqrt($n))এটি কোডটি সংক্ষিপ্ত করার পরিবর্তে আরও দীর্ঘ করে দেয়; তবে প্রস্থটি অতিক্রম না sqrt($n)করলে সর্বনিম্ন উচ্চতা ( $j) সর্বদা বড় হবে sqrt($n)(তাদের পণ্য অবশ্যই কমপক্ষে হতে হবে $n);
  • পূর্ববর্তী বিবৃতিটি $i <= $jলুপের অবসান শর্ত হিসাবে (প্রস্থ <= উচ্চতা) ব্যবহারের অনুমতি দেয় ; এই ভাবে, প্রস্থ থেকে বারবার হবে 1থেকে floor(sqrt($n))এবং উচ্চতা মান দিয়ে শুরু পাবেন $nএবং নিচে যাচ্ছে ceil(sqrt($n))(অগত্যা তাদের সব);
  • প্রস্থটি সর্বদা উচ্চতার চেয়ে ছোট বা সমান হয় তা জানার ফলে আমাদের জানতে হবে যে abs(width - height)সর্বদা height - width( $j-$i); 5 বাইট এইভাবে সংরক্ষণ করেছে;
  • ইনপুট মান $nস্কোরের গণনায় ব্যবহৃত হয় (অব্যক্ত আসনের সংখ্যাটি width * height - n) তবে এটির প্রয়োজন নেই; স্কোরটি প্রদর্শন করার দরকার নেই, এটি কেবল বিন্যাসের সাথে তুলনা করার জন্য গণনা করা হয়; - nস্কোর সূত্রটি সরিয়ে আমরা আরও -$nকিছু না হারিয়ে আরও 3 টি বাইট (পিএইচপি কোডটি ) সংরক্ষণ করি;
  • শেষ দুটি বিবৃতি দেওয়া, স্কোর সূত্র হয়ে যায় height - width + width * height( $j-$i+$i*$j);
  • সংযোগগুলিতে (বর্তমান ব্যবস্থার স্কোর আগের সেরা স্কোরের সমান), নিয়মগুলি কম ফ্রি আসন সহ ব্যবস্থাটি ব্যবহার করতে বলে; যেহেতু প্রস্থ সর্বদা বৃদ্ধি এবং উচ্চতা সর্বদা হ্রাস পায়, height - widthপ্রতিটি ধাপে স্কোরের অংশ হ্রাস পায়;
  • পূর্ববর্তী সেরা স্কোরের সাথে যদি বর্তমান স্কোর সমান হয় তবে পূর্ববর্তী বিবৃতিগুলি আমাদেরকে জানিয়েছে যে বর্তমানের বিন্যাসের মুক্ত আসনের সংখ্যা আগের সেরা ব্যবস্থার তুলনায় বড়; এর অর্থ পূর্বের সেরা ব্যবস্থা টাই জিতে;
  • কারণ সম্পর্কগুলি সর্বদা পূর্ববর্তী সেরা ব্যবস্থায় জয়ী হয়, তার স্কোর পূর্বের সেরাের চেয়ে ছোট হলেই একটি নতুন ব্যবস্থা নতুন সেরা বিন্যাসে পরিণত হয়; সংযোগগুলির জন্য যাচাই করা কোডটি অকেজো এবং এটি সরানো যেতে পারে ( ||$c==$s&&$i*$j<$w*$h- প্রচুর বাইট);
  • -$nস্কোর সূত্র থেকে অপসারণের কারণে, প্রথম ব্যবস্থা ( 1x$n) এর জন্য স্কোরটি $n-1+1*$n(অর্থাত্ 2*$n-1); সেরা স্কোরের প্রাথমিক মান ( $s) এর চেয়ে বড় বা সমান কোনও মান হতে পারে 2*$n; প্রথম পুনরাবৃত্তির একটি আরও ভাল স্কোর রয়েছে এবং এটি শুরুতে সমস্যা ছাড়াই অ্যালগরিদমকে চালিয়ে দেওয়া সর্বোত্তম ব্যবস্থাতে পরিণত হয়।

উপরে বর্ণিত উন্নতিগুলি প্রয়োগ করার পরে নতুন কোড ( 104 বাইট ):

for($s=2*$j=$n=$argv[$i=1];$i<=$j;$j=ceil($n/++$i))
if($s>$c=$j-$i+$i*$j){$w=$i;$h=$j;$s=$c;}echo"$w,$h";

এটি এখানে পঠনযোগ্যতার জন্য আবৃত। পিএইচপি চিহ্নিতকারী দিয়ে উপরের কোডটি প্রস্তুত করুন <?php(প্রযুক্তিগতভাবে, এটি কোডের অংশ নয়), এটি একটি ফাইলে রাখুন (আসুন বলি arrange-your-chairs.php) এবং এটি শূন্যের চেয়ে বড় সংখ্যার সাথে যুক্তি হিসাবে চালান। এটি গণনা করা বিন্যাসের প্রস্থ এবং উচ্চতাটি কমা দ্বারা পৃথক করবে:

$ php arrange-your-chairs.php 1001
28,36

আরেকটি সমাধান (116 বাইট)

অন্য একটি সমাধান যা একটি পৃথক অ্যালগরিদম ব্যবহার করে:

for($n=$argv[1];++$j<=$n;)for($i=0;++$i<=$j;)
if($n<=$k=$i*$j)$a["$i,$j"]=($j-$i+$k-$n)*$n+$k;asort($a);echo key($a);

এটি কমপক্ষে $nআসনের সমস্ত সংমিশ্রণকে একটি সহযোগী তালিকায় রাখে; মূলটি হ'ল বিন্যাসের পাঠ্য উপস্থাপনা, মান হ'ল বিন্যাসের স্কোর। এরপরে তালিকাটি সাজানো (মান অনুসারে আরোহণ) এবং প্রথম প্রবেশের কীটি পায়।

আরও একটি (115 বাইট)

foreach(range(1,$m=$n=$argv[1])as$i)
if(($d=ceil($n/$i))<=$i&&$m>=$s=$i*$d-$n+$i-$d){$m=$s;$w=$d;$h=$i;}echo"$w,$h";

এটি @ নীলের উত্তরের পিএইচপি সংস্করণ (জাভাস্ক্রিপ্ট / ইএস 6, 85 বাইট)।

প্রতিটি ভাষার বৈশিষ্ট্যের কারণে কিছু লক্ষণীয় পার্থক্য রয়েছে:

  • জেএস উত্তরটি n(অপরিবর্তিত) মানগুলির একটি অ্যারে উত্পন্ন করে তার কীগুলি ব্যবহার করে পুনরায় থেকে পুনরুক্তি 0করতে n-1; এটা বৃদ্ধি i( d=(n+i++)/i|0) এটিকে বারবার থেকে করতে 1করতে n; পিএইচপি সমাধানটি বৃদ্ধি করার প্রয়োজন হয় না; এটি range()অ্যারে তৈরি করতে ব্যবহার করে তারপরে এটি পুনরুক্ত করার 1জন্য উত্পন্ন মানগুলি ( থেকে n) ব্যবহার করে ;
  • জেএস উত্তরটি (n+i)/iতারপরে |0ক্ষুদ্রতম পূর্ণসংখ্যার চেয়ে বড়টি পেতে ব্যবহার করে পূর্ণসংখ্যায় মানকে রূপান্তর করে n/i; পিএইচপি উত্তর পিএইচপি ফাংশন দিয়ে সহজেই এই সমস্যাটি সমাধান করে ceil(); জাভাস্ক্রিপ্ট এছাড়াও সরবরাহ করে Math.ceil()তবে এটি নীলের দ্বারা প্রাপ্ত সমাধানের চেয়ে 5 বাইট বেশি ব্যবহার করে;
  • পিএইচপি array_map()কোনওভাবে জেএসের সাথে অনুরূপ ফাংশন সরবরাহ করে Array.map()তবে এটি এখানে সহায়তা করে না; এর বাক্য গঠনটি ভার্বোজ, একটি foreachসংক্ষিপ্ত কোড উত্পাদন করে; এটি জেএস কোডের চেয়ে বড়, যদিও;
  • শর্তগুলিতে অ্যাসাইনমেন্টগুলি মার্জ করে ||পিএইচপি তে সম্ভব নয় কারণ এতে কমা অপারেটরের অভাব রয়েছে; আমি অনূদিত a||b||cমধ্যে if(!a&&!b)cতারপর, কারণ aএবং bতুলনা হয়, আমি তাদের অপারেটার অস্বীকার (প্রতিস্থাপিত <সঙ্গে >=); এটি জেএস সংস্করণের চেয়েও বড় কোড উত্পাদন করে;
  • আরও 23 বাইট যুক্ত করতে হবে কারণ পিএইচপি-তে ভেরিয়েবলের নাম উপস্থাপন করতে হবে $

সব সমাধান এবং পরীক্ষা স্যুট এর ungolfed সংস্করণ পাওয়া যাবে GitHub থেকে


1
এটি এখন পর্যন্ত সবচেয়ে সুনির্দিষ্ট কোড-গল্ফ উত্তর।
DJMcMayhem

0

জাভাসক্রিপ্ট (ES6), 83 বাইট

n=>[...Array(m=n)].map((_,i)=>(d=(n+i++)/i|0)>i||(s=i*d-n+i-d)>m||(m=s,r=[d,i]))&&r

হতে পারে আপনি আমার কৌশলটি প্রয়োগ করতে পারেন (2 বাইট সংরক্ষণ করতে)
লিকি নুন

@ কেনিলাউ আমার মনে হয় না এটি সাহায্য করে; mক্ষতিপূরণ দেওয়ার জন্য আমাকে বাড়াতে হবে।
নিল

0

জুলিয়া, 87

আমি মনে করি যে এটি সমস্যার জন্য একটি যাদু ফাংশন সন্ধানের দিকে দিকের এক ধাপ :

f(i)=(i+n)÷(i+1)|>j->(j*i<n)+j
_=indmin([sqrt(n)<=i?i-f(i)*(1-i):2n for i=1:n])
_,f(_)

এটি কেবল জোড়া দেখায় (i, j=(i+n)/(i+1))বা(i, j+1)


দয়া করে আরও ব্যাখ্যা করুন যে এটি কীভাবে কাজ করে, আপনি আমাকে আপনার ক্রিয়াকলাপটি সম্পর্কে কৌতূহলী করে
তোলেন

2
এটি কীভাবে কাজ করার কথা তা আমি নিশ্চিত নই। আপনি nকোথাও সংজ্ঞায়িত করেন নি এবং আপনি ইনপুট নিচ্ছেন বলে মনে হয় না।
ডেনিস

আহ, দুঃখিত, আমি কেবল nইনপুট হিসাবে নিয়েছি । এটির মধ্যে একটি মুড়িয়ে ফেলা দরকার n->...। চমৎকার যে আপনি এটি কাজ করতে পারে।
এমএসচাউয়ার

0

ওরাকল এসকিউএল 11.2, 173 বাইট

SELECT MIN(x||','||y)KEEP(DENSE_RANK FIRST ORDER BY y-x+(y*x-:1))FROM(SELECT CEIL(LEVEL/:1)x,CEIL(MOD(LEVEL+.1,:1))y FROM DUAL CONNECT BY LEVEL<=:1*:1)WHERE x<=y AND:1<=x*y;

আন golfed

SELECT MIN(x||','||y)KEEP(DENSE_RANK FIRST ORDER BY y-x+(y*x-:1))  -- Keeps the minimal score
FROM   (SELECT CEIL(LEVEL/:1)x,CEIL(MOD(LEVEL+.1,:1))y FROM DUAL CONNECT BY LEVEL<=:1*:1) -- Generate x,y combinations 
WHERE  x<=y AND :1<=x*y  -- Filters out wrong combinations

0

প্রশ্ন 58 বাইট

{c@d?&/d:+/(-/;*/)@\:+c:{((b<a)?1b)#+(b:-_-x%a;a:1+!x)}x}

লাম্বা যা প্রদত্ত মান (x) এর জন্য সর্বনিম্ন ব্যয়ের গণনা করে এবং দুটি মানের (ক্রম, উচ্চতা) এর অনুক্রম দেয়

সেই ল্যাম্বডায় নাম যুক্ত করতে অন্য দুটি চর প্রয়োজন (প্রাক্তন চ: {..} এর পরিবর্তে {..})

পরীক্ষা

{..}'1+!100

যেখানে {..} ল্যাম্বডা। "1+ প্রথম 100 ইনস্টের প্রতিটি মানের জন্য ল্যাম্বদা প্রযোজ্য" হিসাবে পড়ুন (প্রতিটি শব্দে 1..100 এর অন্য কথায়)

উত্পন্ন

1 1
2 1
2 2
2 2
3 2
3 2
3 3
3 3
3 3
5 2
4 3
4 3
4 4
4 4
4 4
4 4
6 3
6 3
5 4
5 4
7 3
5 5
..

ব্যাখ্যা

নেস্টেড লামদ্বা {((b<a)?1b)#+(b:-_-x%a;a:1+!x)}দুটি চেয়ারে (ডাব্লু 1 ডাব্লু 2 ডাব্লু 3 ..; এইচ 1 এইচ 2 এইচ ..) (প্রস্থ এবং উচ্চতা) হিসাবে এক্স চেয়ারগুলির জন্য সমস্ত প্রার্থী (প্রস্থ, উচ্চতা) জোড়া উত্পন্ন করে। বাম থেকে ডানে পড়ুন, তবে ডান থেকে বামে মূল্যায়ন করুন

a:1+!x 1..x মান উত্পন্ন করে এবং সেই অনুক্রমটিকে একটি

-_- নিগৃহীত তল অবহেলা করা, এবং সিল প্রয়োগ করে (সিলটি ভাষার কোনও আদিম নয়)

b:-_-x%aকোনও আইটেম im a দিয়ে বিভক্ত x এর প্রতিটি মানের সিলটি প্রয়োগ করে এবং ফলস্বরূপ ক্রমটি b তে নির্ধারণ করুন। অন্য কথায়, খ প্রতিটি x বিভক্ত সিল হয় প্রতিটি 1..x

+(b;a) সেক এ এবং সেক বি এর সমন্বিত একটি সিকিউরেন্স ফিরিয়ে দিন, তারপরে এটি উল্টে যায় (ফলাফলটি জোড়ের অনুক্রম যেখানে আই-জুটিতে a এর উপাদান i এবং b এর উপাদান i থাকে)

b<a আই এবং বি এর আইটেম দ্বারা আইটেমের তুলনা করে এবং যৌক্তিক মানগুলির সিকিউরেন্স তৈরি করে (প্রতিটি সূচকের জন্য সত্য = 1 বি যেখানে বি [i]

s?xধারা অনুসারে আইটেম এক্সের প্রথম অবস্থানটি প্রদান করে। এর সাথে (b<a)?1bআমরা খ এবং ক এর তুলনায় ক্রমানুসারে 1 বি (সত্য মান) সন্ধান করব এবং খ যেখানে প্রথম স্থান পেলাম

n#sসেক এস থেকে এন প্রথম এন আইটেম নেয়। আমরা সদৃশ জোড়গুলি বাতিল করতে চাই, সুতরাং যখন আমরা প্রথম জোড় <আইটেম আইটেমের প্রথম আইটেমটি বন্ধ করি (উদাহরণস্বরূপ 13,1 বিবেচনা করুন তবে 1,13 নয়) stop

পার্শ্ব প্রতিক্রিয়া হিসাবে, ফলাফলের ক্রমের প্রতিটি জুড়ি ক এবং খের মধ্যে হ্রাসের দূরত্বের (প্রাক্তন (১৩ 1; 7 2; 5 3; 4 4)

নেস্টেড ল্যাম্বদা দ্বারা উত্পন্ন উত্সাহী প্রার্থী গকে নির্ধারিত হয়। তারপরে আমরা সি ফ্লিপ করি (আবার বি, পুনরায় প্রাপ্ত) এবং সেই যুক্তিতে দুটি ফাংশন প্রয়োগ করে: */বহুগুণ, এবং -/বিয়োগফল। এর ফলাফল (-/;*/)@\:+cপ্রতিটি জুটির পার্থক্য এবং পণ্য। +/সমষ্টি শেষ, এবং চূড়ান্ত ব্যয়ের জন্য ক্যালকুলার করে। প্রতিটি প্যাট্রির ব্যয় নির্ধারিত হয় ডি

& / সর্বনিম্ন শেষ, তাই &/ডি সর্বনিম্ন ব্যয়। d?&/dআমরা সর্বনিম্ন ব্যয়ের প্রথম সংঘটনটি d এর সাথে খুঁজে পেয়েছি এবং সি @ সহ .. আমরা সেই অবস্থানে জুটিটি পুনরুদ্ধার করি। যেহেতু প্রতিটি জুটি একটি এবং এন এর মধ্যে দূরত্ব হ্রাস পাচ্ছে, প্রথম পাওয়া সর্বনিম্ন নূন্যতম জোড়া আরও ন্যূনতম জোড় রয়েছে, তাই আমরা টাইয়ের নিয়মটি সঠিকভাবে প্রয়োগ করি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.