N পর্যন্ত আকারের বর্গক্ষেত্রের জন্য সবচেয়ে ছোট আয়তক্ষেত্রের ক্ষেত্রটি সন্ধান করুন


19

এটি OEIS সিকোয়েন্স A038666 এর ক্ষেত্রে প্রয়োগ হিসাবে এটি সাধারণ ধরণের ক্রম প্রশ্ন । এটি হল, নিম্নলিখিতগুলির মধ্যে একটি করুন:

  • না বা কোনও ইনপুট গ্রহণ করুন এবং মহাবিশ্বের তাপের মৃত্যুর আগ পর্যন্ত A038666 আউটপুট দিন।
  • ধনাত্মক পূর্ণসংখ্যা ইনপুট হিসাবে গ্রহণ করুন এবং A038666 এর n ম পদটি বা এর প্রথম n পদগুলিকে আউটপুট দিন । ( 0 ব্যবহার করে - পরিবর্তে1 সূচকতবে অবশ্যই আপনাকে ইনপুটতে আউটপুটও দিতে1হবে0।)

A038666 এর n ম পদটি আয়তক্ষেত্রগুলির মধ্যে স্বল্পতম অঞ্চল যা 1 × 1 , 2 × 2 , আকারের নন-ওভারল্যাপিং স্কোয়ার ধারণ করে n × n1×1,2×2,n×n যদি আপনি ব্যবহার করছেন 1 -indexing।

উদাহরণ:

ক্ষুদ্রতম অঞ্চল আয়তক্ষেত্র যা 4 × 4 এর মাধ্যমে 1×1 এর আকারের নন-ওভারল্যাপিং স্কোয়ারগুলি ধারণ করতে পারে এর মাত্রা 7 × 5 :4×47×5

4 4 4 4 3 3 3
4 4 4 4 3 3 3
4 4 4 4 3 3 3
4 4 4 4 2 2 1
x x x x 2 2 x

অতএব, a(4)=7×5=35 ( 1 ইনডেক্সড)।

একইভাবে, অন্তত-অঞ্চল আকারের অ ওভারল্যাপিং স্কোয়ার ধারণকারী আয়তক্ষেত্র 1×1 মাধ্যমে 17×17 মাত্রা আছে 39×46 , তাই a(17)=39×46=1794 ( 1 -indexed)।

উত্তর:


10

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

@ জোনাথন অ্যালান (আদি উত্তরে 4 বাইট সংরক্ষণও করে) প্রস্তাবিত ধীরে হলেও সংক্ষিপ্ত সংস্করণ পরামর্শ:

f=(n,A,S=(n,c)=>n>=0?c(n)||S(n-1,c):0)=>S(A,w=>(F=(l,n)=>n?S(w-n,x=>S(A/w-n,y=>l.some(([X,Y,W])=>X<x+n&X+W>x&Y<y+n&Y+W>y)?0:F([...l,[x,y,n]],n-1))):A%w<1)([],n))?A:f(n,-~A)

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


আসল উত্তর,  209 183 178  174 বাইট

রিটার্নস এন ক্রম শব্দ, 1-ইন্ডেক্স।

f=(n,A,S=(n,c)=>n>=0?c(n)||S(n-1,c):0)=>S(A,w=>A%w?0:(F=(l,n)=>n?S(w-n,x=>S(A/w-n,y=>l.some(([X,Y,W])=>X<x+n&X+W>x&Y<y+n&Y+W>y)?0:F([...l,[x,y,n]],n-1))):1)([],n))?A:f(n,-~A)

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

মন্তব্য

সহায়ক ফাংশন

আমরা প্রথমে একটি সহায়ক ফাংশন S সংজ্ঞায়িত করি যা এন থেকে 0 এর জন্য একটি কলব্যাক ফাংশন আহ্বান করে (উভয় অন্তর্ভুক্ত) এবং কলটি সত্যবাদী মান ফেরত হওয়ার সাথে সাথেই বন্ধ হয়ে যায়।n0

S = (n, c) =>               // n = integer, c = callback function
  n >= 0 ?                  // if n is greater than or equal to 0:
    c(n) ||                 //   invoke c with n; stop if it's truthy
    S(n - 1, c)             //   or go on with n - 1 if it's falsy
  :                         // else:
    0                       //   stop recursion and return 0

প্রধান ফাংশন

আমরা A=1 দিয়ে শুরু করি ।

(w,h)w×h=A1×1n×n সংশ্লিষ্ট অঞ্চলে (আসলে সবচেয়ে বড়টি দিয়ে শুরু করে) এর , যাতে তারা এমনভাবে থাকে একে অপরের সাথে ওভারল্যাপ করবেন না

আমরা তাদের অবস্থান সাথে স্কোয়ারগুলির তালিকাটি ট্র্যাক করি(X,Y)Wl[ ]

AA+1

f = ( n,                    // n = input
      A ) =>                // A = candidate area (initially undefined)
S(A, w =>                   // for w = A to w = 0:
  A % w ?                   //   if w is not a divisor of A:
    0                       //     do nothing
  : (                       //   else:
    F = (l, n) =>           //     F = recursive function taking a list l[] and a size n
      n ?                   //       if n is not equal to 0:
        S(w - n, x =>       //         for x = w - n to x = 0
          S(A / w - n, y => //           for y = A / w - n to y = 0:
            l.some(         //             for each square in l[]
            ([X, Y, W]) =>  //             located at (X, Y) and of width W:
              X < x + n &   //               test whether this square is overlapping
              X + W > x &   //               with the new square of width n that we're
              Y < y + n &   //               trying to insert at (x, y)
              Y + W > y     //
            ) ?             //             if some existing square does overlap:
              0             //               abort
            :               //             else:
              F([ ...l,     //               recursive call to F:
                  [x, y, n] //                 append the new square to l[]
                ],          //
                n - 1       //                 and decrement n
              )             //               end of recursive call
          )                 //           end of iteration over y
        )                   //         end of iteration over x
      :                     //       else (n = 0):
        1                   //         success: stop recursion and return 1
    )([], n)                //     initial call to F with an empty list of squares
) ?                         // end of iteration over w; if it was successful:
  A                         //   return A
:                           // else:
  f(n, -~A)                 //   try again with A + 1

2
পুনরাবৃত্তি টিআইওর লেজের hদিকে পরীক্ষাটি সংজ্ঞায়িত এবং সরিয়ে না দিয়ে 6 * সংরক্ষণ করুন । অবশ্যই এটি অনেক ধীর। (* কমপক্ষে - আমি কোনও জাভাস্ক্রিপ্ট বিশেষজ্ঞ নই!)a%w<1
জোনাথন অ্যালান

@ জোনাথান অ্যালান ধন্যবাদ :) আসলে, আমি ভাবছি যদি ন্যায়বিচারের a%w<1সাথে প্রতিস্থাপন করা যায় 1। আমাকে এটি পরে ডাবল-চেক করতে হবে।
আর্নল্ড

0

পাইথন 2 (পিপিপি) , 250 236 বাইট

-14 বাইট ধন্যবাদ এমএস 210 এর পরামর্শগুলির ।

অনুক্রমের 1-সূচকযুক্ত নবম পদের আউটপুট দেয়।

n=input()
r=range
k=n*-~n*(n-~n)/6
m=k*k
for Q in r(m):
 P={0}
 for X in r(n,0,-1):P|=([x for x in[{(x+a,y+b)for a in r(X)for b in r(X)}for x in r(Q%k-X+1)for y in r(Q/k-X+1)]if not x&P]+[{0}])[0]
 if len(P)>k:m=min(Q%k*(Q/k),m)
print m

এটি অনলাইন চেষ্টা করুন! N> 4 এর জন্য, এটি অনেক সময় নেয়। আমি ফলাফল স্থানীয়ভাবে এন = 7 পর্যন্ত যাচাই করেছি।


এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা সহ আপনি কি আপত্তি করবেন? এছাড়াও, আমি কল্পনা করেছি আপনি সাতটির পরিবর্তে একবারে একটি স্পেস ইনডেন্ট করে বাইট শেভ করতে পারবেন (দ্বিতীয় ইনডেন্টেশনের জন্য)। (আসলে, আমি মনে করি সম্ভবত দুটি forলাইন এক লাইনে থাকতে পারে এবং আপনার কেবল একবার ইনডেন্ট করা দরকার))
এমএস 210

1
@ এমএস 210 "7 স্পেস" আসলে একটি ট্যাব, পাইথন 2 তে আপনি প্রথমে কোনও স্পেস দিয়ে, তারপরে একটি ট্যাব যুক্ত করতে পারেন। দু'টিকে একটি লাইনে লুপের জন্য রাখা দুর্ভাগ্যক্রমে অবৈধ সিনট্যাক্স হবে।
আরবো

1
@ msh210 লুপের জন্য এগুলিকে একত্রিত করার জন্য আমি একটি ভিন্ন উপায় খুঁজে পেয়েছি। এই 7 টি স্পেস যেখানে কেবল লাইনে রয়েছে, ধরা দেওয়ার জন্য ধন্যবাদ। আমি আগামীকাল একটি ব্যাখ্যা লেখার চেষ্টা করব
ovs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.