স্কোয়ারগুলি গণনা করুন


18

চ্যালেঞ্জ

অরিগামি (ভাঁজ কাগজ) শিল্পের একটি সৃজনশীল ফর্ম। যতদূর আমি জানি, অরিগামির মাস্টার স্কোয়ার পেপার পছন্দ করেন। আসুন শুরু থেকে শুরু করা যাক - একটি আয়তক্ষেত্রাকার কাগজটিকে বর্গাকারে রূপান্তর করুন।

সুতরাং কাগজটি স্কোয়ারে বিভক্ত। আমরা বৃহত্তম স্কোয়ারটি সরিয়ে ফেলি যা ধাপে ধাপে বর্তমান আকারের সাথে একটি ছোট প্রান্ত ভাগ করে দেয় (নীচের চিত্রটি দেখুন) shape এবং যদি এক ধাপের পরে অবশিষ্ট অংশটি কম বা সমান হয় 0.001 * (area of the original paper)তবে কাগজটি আর ভাগ করা যায় না। এটা সম্ভব যে কিছুই শেষ হয় না।

আপনার কাজটি প্রক্রিয়া চলাকালীন কত স্কোয়ার তৈরি করা হয় তা গণনা করা। শেষ ধাপে বর্গ যা কাগজকে বিভক্ত করতে অক্ষম করে তোলে তাকে আউটপুটে গণনা করা হয়।

উদাহরণ ( 1.350প্রস্থ / উচ্চতার একটি কাগজ ), আউটপুট 10:

টুকরো উদাহরণ

ইনপুট এবং আউটপুট

ইনপুট: আয়তক্ষেত্রাকার পত্রিকাটির জন্য প্রস্থ / উচ্চতা অনুপাত, থেকে এক দশমিক (অথবা ডট ছাড়া একটি পূর্ণসংখ্যা) 1.002থেকে 1.999একটি সংক্ষিপ্ত ধাপ 0.001। আপনি অনুপাত বর্ণনা করে অন্য কোনও যুক্তিসঙ্গত বিন্যাসও ব্যবহার করতে পারেন। আপনার উত্তরে এটি উল্লেখ করুন।

আউটপুট: বর্গ গণনা, একটি পূর্ণসংখ্যা।

উদাহরণ I / O

পৃষ্ঠাটি পরিষ্কার রাখার জন্য একটি ম্যাপিং ফর্ম্যাট ব্যবহার করা হয়, যখন আপনার কোডটির কোনও তালিকা ইনপুট সমর্থন করতে বা ম্যাপিং ফাংশন হওয়ার দরকার নেই।

1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100

সমস্ত উত্তরের তালিকা

@ লুইস মেন্ডোকে ধন্যবাদ, উত্তরের গ্রাফ এখানে।

চিত্রলেখ

মন্তব্য

  • এটি একটি কোড-গল্ফ তাই সংক্ষিপ্ততম কোডের জয়
  • মান ফাঁকগুলিতে মনোযোগ দিন
  • কীভাবে ইনপুট এবং আউটপুট মোকাবেলা করবেন তা সিদ্ধান্ত নেওয়ার স্বাধীনতা কিন্তু তাদের মানক সীমাবদ্ধতা অনুসরণ করা উচিত।

যাইহোক ...

  • চ্যালেঞ্জ সম্পর্কে আপনার কাছে কিছু অস্পষ্ট থাকলে মন্তব্য করুন
  • আপনি যদি কোনও গল্ফিং ভাষা ব্যবহার করেন তবে ব্যক্তিগতভাবে আমি উত্তর দিয়েছি যে আপনার উত্তরটিতে একটি ব্যাখ্যা রয়েছে
  • @ গ্রেগমার্টিনকে ধন্যবাদ, চ্যালেঞ্জের জন্য একটি ভাল গাণিতিক ব্যাখ্যার জন্য তাঁর উত্তরটি পড়ুন।

উদাহরণ কোড

এখানে সি ++ কোডের একটি অদৃশ্য সংস্করণ রয়েছে:

#include <iostream>
#include <utility>

int f (double m)
{
    double n = 1, k = 0.001;
    int cnt = 0;
    k *= m;                       // the target minimum size
    while(m*n >= k)
    {
        m -= n;                   // extract a square
        if(n > m)
            std::swap(n, m);      // keep m > n
        ++ cnt;
    }
    return cnt;
}

int main()
{
    double p;
    std::cin >> p;
    std::cout << f(p);
    return 0;
}

উদাহরণ কোড সম্পর্কিত সমস্ত গণনাগুলির 6 দশমিক অঙ্কের যথার্থতা প্রয়োজন যা অন্তর্ভুক্ত float


অনুপাত গঠনকারী দুটি সংখ্যা কি ইনপুট হিসাবে ব্যবহার করা যেতে পারে?
লুইস মেন্ডো

@ লুইস মেন্ডো হ্যাঁ, আপনার ইচ্ছা হিসাবে।
কিউ গান

2
ঝরঝরে চ্যালেঞ্জ!
flawr

5
উত্তরের তালিকাটি একটি দুর্দান্ত গ্রাফ
লুইস মেন্ডো

1
@ কেয়ুগান অবশ্যই, এগিয়ে যান! আপনার যদি অন্য কোনও ফর্ম্যাট সহ কোনও সংস্করণ প্রয়োজন হয় তবে আমাকে জানান
লুইস মেন্ডো

উত্তর:


2

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

`SZ}y-htG/p1e-3>}x@

ইনপুট দুই যেমন মূল অনুপাত সংজ্ঞা নম্বর, সঙ্গে একটি অ্যারে [1, 1.009]। (এটি প্রয়োজনীয় নয় যে সংখ্যাগুলি বাছাই করা বা তাদের মধ্যে একটি হতে 1)

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

ব্যাখ্যা

`        % Do...while loop
  S      %   Sort array. Takes 1×2 array as input (implicit) the first time
  Z}     %   Split array into its 2 elements: first the minimum m, then the maximum M
  y      %   Duplicate m onto the top of the stack. The stack now contains m, M, m
  -      %   Subtract. The stack now contains m, M-m
  h      %   Concatenate into [m, M-m]. This is the remaining piece of paper
  t      %   Duplicate
  G/     %   Divide by input, element-wise
  p      %   Product of array. Gives ratio of current piece's area to initial area
  1e-3>  %   True if this ratio exceeds 1e-3. In that case the loop continues
}        % Finally (execute after last iteration, but still within the loop)
  x      %   Delete last piece of paper
  @      %   Push current loop counter. This is the result
         % End (implicit)
         % Display (implicit)

6

হাস্কেল , 71 70 65 63 62 61 58 56 বাইট

কিছু উদ্ভাবনী উন্নতির জন্য @ এক্সনরকে ধন্যবাদ!

(n#m)e|e>n*m*1e3=0|n<m=m#n$e|d<-n-m=(d#m)e+1
n!m=n#m$n*m

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


এটি মনে করে m==nযে শেষটি হতে পারে 1>0কারণ এটিই কেবল সম্ভাবনা বাকি। বা, হতে পারে কেসগুলি এখানে পুনরায় বাঁধার অনুমতি দেওয়ার জন্য পুনরায় সাজানো যেতে পারে।
xnor

আসলে, সমতা মামলা কি প্রয়োজন? যদি n>mপ্রসারিত হয় n>=mএবং প্রথম চেকটি লিখিত হয় e>m*n*1000, এটি 1সমতার জন্য দেওয়া উচিত ।
xnor

@ এক্সনোর ভাল ধারণা, আপনাকে ধন্যবাদ!
flawr

1
56 এর জন্য রক্ষীদের (n#m)e|e>n*m*1e3=0|n<m=m#n$e|d<-n-m=(d#m)e+1;n!m=n#m$n*m
ঘোরাফেরা করা

বাহ, ব্যবহার d<-n-mহিসাবে otherwiseসত্যিই ঝরঝরে !!!
flawr

4

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

f=(m,n=!(k=m/1e3,c=0))=>m*n<k?c:(c++,m-=n)<n?f(n,m):f(m,n)

পরীক্ষা


4

গণিত, অ-প্রতিদ্বন্দ্বী (21 বাইট)

এই উত্তরটি প্রতিদ্বন্দ্বিতামূলক কারণ এটি জিজ্ঞাসিত প্রকৃত প্রশ্নের উত্তর দেয় না! তবে এটি প্রশ্নের বিভিন্ন রূপের উত্তর দেয় এবং কিছু আকর্ষণীয় গণিত হাইলাইট করার জন্য একটি অজুহাত সরবরাহ করে।

Tr@*ContinuedFraction

প্রতীকী ফাংশন ইনপুট হিসাবে ধনাত্মক যুক্তিযুক্ত সংখ্যা গ্রহণ করে (যার সংখ্যক এবং ডিনোমিনেটর মূল কাগজের মাত্রাগুলি উপস্থাপন করে) এবং ইতিবাচক পূর্ণসংখ্য ফেরত। উদাহরণস্বরূপ, Tr@*ContinuedFraction[1350/1000]ফেরৎ 10। ( ContinuedFractionযথার্থ সমস্যাগুলির কারণে ভাসমান-পয়েন্ট সংখ্যাগুলিতে আলাদাভাবে কাজ করে, যার কারণে এই প্রসঙ্গে ইনপুট হিসাবে যুক্তিযুক্ত সংখ্যার প্রয়োজন হয়))

সমস্যাটিতে বর্ণিত জ্যামিতিক পদ্ধতির একটি আকর্ষণীয় ব্যাখ্যা (বারবার একটি আয়তক্ষেত্রটি স্কোয়ার কাটা) এটি হ'ল এটি সর্বশ্রেষ্ঠ সাধারণ বিভাজনগুলি সন্ধানের জন্য ইউক্যালিডিয়ান অ্যালগরিদমের একটি বাস্তবায়ন! অনুপাত সহ প্রশ্নটিতে নিজেই উদাহরণটি বিবেচনা করুন1.35, যা মাত্রার (1350,1000) কাগজের টুকরো রেখে মডেল করা যায়। প্রতিবার একটি বর্গ কেটে দেওয়া হয়, ছোট সংখ্যা বৃহত্তর সংখ্যা থেকে বিয়োগ করা হয়; সুতরাং এই উদাহরণস্বরূপ ফলাফল প্রাপ্ত আয়তক্ষেত্রগুলির মাত্রা (350,1000), তারপরে (350,650), তারপরে (350,300), তারপরে (50,300), তারপর (50,250) এবং (50,200) এবং (50,150) এবং (50,100) এবং (50, 100) রয়েছে 50), এবং এছাড়াও (50,0) একবার আমরা নিজের থেকে শেষ বর্গটি সরিয়ে ফেলব। ইউক্লিডিয়ান অ্যালগোরিদম ঠিক এভাবেই পরিচালনা করে (বিভাগ এবং পুনরাবৃত্ত বিয়োগের মধ্যে পার্থক্যকে চিহ্নিত করে) এবং আমরা দেখতে পাই যে 50 আসলেই 1350 এবং 1000 এর জিসিডি।

সাধারণত ইউক্যালিডিয়ান অ্যালগরিদমে, কেউ এই মধ্যবর্তী মাত্রাগুলি ট্র্যাক করে রাখে এবং বিয়োগের সংখ্যাটি বাতিল করে দেয়; তবে, পার্থক্যটি খুব ছোট হওয়ার আগে আমরা একটি সংখ্যার চেয়ে অন্যবার একটি সংখ্যা কতবার বিয়োগ করে রেকর্ড করতে পারি এবং আমরা কী বিয়োগ করছি তা স্যুইচ করতে হবে। রেকর্ডিংয়ের সেই পদ্ধতিটি হ'ল যুক্তিযুক্ত সংখ্যার অবিরত ভগ্নাংশ। (অযৌক্তিক সংখ্যার অব্যাহত ভগ্নাংশ, যা কখনই শেষ হয় না, এটি দুর্দান্ত শীতল, তবে এখানে প্রাসঙ্গিক নয়) উদাহরণস্বরূপ, 1350/1000 উদাহরণে, আমরা 1000 1সময়, তারপরে 350 2বার, পরে 300 1বার, তারপরে 50 6বার বিয়োগ করেছি ; সুতরাং 1350/1000 অবিরত ভগ্নাংশ হয় {1,2,1,6}। গাণিতিকভাবে, আমরা 1350/1000 আবার 1+ 1 / ( 2+ 1 / ( 1+ 1 / / হিসাবে লিখেছি)6)), যা আপনি যাচাই করতে পারেন।

সুতরাং এই সমস্যার জন্য, যদি স্কোয়ারগুলি নির্দিষ্ট থ্রেশহোল্ডের চেয়ে ছোট হয়ে যায় তবে থামবে না, তবে থামার আগে সমস্ত চূড়ান্তভাবে অনেকগুলি বর্গক্ষেত্র গণনা করুন, তবে মোট স্কোয়ারের সংখ্যা মোট বিয়োগফলের সমান সংখ্যার সমান, যা বলে অবিচ্ছিন্ন ভগ্নাংশে সমস্ত পূর্ণসংখ্যার যোগফল - এবং এটি হ'ল ফাংশনগুলির সংমিশ্রণটি Tr@*ContinuedFraction! (প্রদত্ত উদাহরণের জন্য 1.35, এটি ওপি'র ইচ্ছার উত্তর পেয়েছে, কারণ চূড়ান্ত বর্গটি এত বড় যে সমস্ত স্কোয়ার গণনা করা হয়েছিল But তবে Tr@*ContinuedFraction[1001/1000]উদাহরণস্বরূপ, ফলন 1001, যেহেতু এটি একটি বিশাল বর্গ এবং ছোট 1x1000 বর্গের সমস্ত 1000 গণনা করে ।)


1
যদিও এটি সত্যিই আকর্ষণীয়, অ-প্রতিদ্বন্দ্বী লেবেল এমন ভাষাগুলির জন্য সংরক্ষিত রয়েছে যা চ্যালেঞ্জের চেয়ে নতুন । স্বতন্ত্রভাবে, সমস্ত উত্তরের চ্যালেঞ্জটি সমাধান করা দরকার। সুতরাং, এই উত্তরটি সত্যই মুছে ফেলা উচিত। আপনি কি অবিরত ভগ্নাংশের তালিকাটি পুনর্গঠন করতে সক্ষম হবেন যেখানে এটি কেটে ফেলা হবে যাতে এটি একটি সমান আকর্ষণীয় তবে বৈধ সমাধানে রূপান্তরিত হয়?
মার্টিন এেন্ডার

1
এই উত্তরটি লেখার সময় আমার স্ক্র্যাচ করার মানসিক চুলকানি হয়েছিল তবে আমি সম্মত হই যে এটি সম্প্রদায়ের মানদণ্ড অনুসারে একটি মুছে ফেলার যোগ্য উত্তর। (আপনার মৃদু তবুও সঠিক প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ!) টিপিটিবি যদি 24 ঘন্টা এর মুছতে মুছতে দেরি করে মনে করে তবে আমি সঠিক উত্তর দেওয়ার জন্য পদ্ধতির প্রশংসা করতে সক্ষম হতে পারি ... যদি তা না হয় তবে মুছে ফেলুন এবং কোনও কঠোর অনুভূতি নেই।
গ্রেগ মার্টিন

3

গণিত, 64 53 বাইট

({t=1,#}//.{a_,b_}/;1000a*b>#:>Sort@{++t;a,b-a};t-1)&

একটি অত্যাবশ্যক (সি-স্টাইল) সমাধান হুবহু একই দৈর্ঘ্য:

(For[t=a=1;b=#,1000a*b>#,If[a>b,a-=b,b-=a];++t];t-1)&

2

সি (জিসিসি / কলং), 61 59 বাইট

c,k;f(m,n){for(k=m*n;m*n/k;m>n?(m-=n):(n-=m))++c;return c;}

ইনপুট বিন্দু ছাড়াই দুটি পূর্ণসংখ্যার (প্রস্থ এবং উচ্চতা), যেমন f(1999,1000)

আমি আশা করি যে কেউ 58 বাইট ক্লাবের সি বাইকে এক বাইট বাঁচাতে পারে। ;)


চারপাশে প্রথম বন্ধনী সরানোর পরামর্শ দিন m-=n
সিলিংক্যাট

1

সি, 59 বাইট

s,a,n=1e3;C(m){for(a=m;m*n>a;s++)m>n?m-=n:(n-=m);return s;}

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

ইনপুটটি একটি পূর্ণসংখ্যা যা প্রস্থ / উচ্চতার অনুপাত হাজারতম (যেমন 10000: 1.002: 1 এর জন্য)।

উদার সংস্করণ

int C(int m)
{
    int n = 1000;
    int a = m;
    int s = 0;

    while (m * n > a)
    {
        if (m > n)
            m -= n;
        else
            n -= m;

        s++;
    }

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