গণনা ইউনিটের স্কোয়ার সার্কেলটি পেরিয়ে যায়


24

একটি প্রোগ্রাম বা ফাংশন লিখতে দেওয়া একটি পূর্ণসংখ্যা ব্যাসার্ধ যে আয় ইউনিট বর্গের সংখ্যা ব্যাসার্ধ দিয়ে বৃত্ত উৎপত্তি কেন্দ্রীভূত মাধ্যমে প্রেরণ করা হয়। যদি বৃত্তটি গ্রিডের ঠিক এমন একটি বিন্দুর মধ্য দিয়ে যায় যা সংলগ্ন ইউনিট স্কোয়ারগুলির মধ্য দিয়ে যায় না।

এখানে r = 5 এর একটি চিত্র রয়েছে :

চিত্রণ ওইআইএস-তে পাওয়া কিভাল এনগোকরাজং এর চিত্রণ Ill

উদাহরণ:

0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020



@ লুক আমি কেবল এটি সন্ধান করতে গিয়েছিলাম তবে মনে হচ্ছে এটি কিছুটা আলাদা সংজ্ঞা ব্যবহার করেছে (কমপক্ষে এটি তাতে একমত নয় N = 50)।
মার্টিন এন্ডার

1
বাউন্ডিং স্কোয়ারে গণনা করে @ এসএমএলএস। নিশ্চিত করুন যে আপনি যেখানে স্কোয়ারটি কেবল কোনও কোণে স্পর্শ করেন সেখানে স্কোয়ারগুলি গণনা করেন না। ওইআইএস-এর নম্বরগুলি ভুল, আমার এখনই পর্যালোচনায় একটি সংশোধন আছে।
orlp

2
আমার আবার হঠাৎ মাইনক্রাফটে গম্বুজগুলি তৈরি করার তাগিদ আছে ...
প্যাট্রিক রবার্টস

2
আপনি কি একজন সহকর্মী 3 ব্লু 1 ব্রাউন দর্শক?
nitro2k01

উত্তর:


12

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

f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)

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

কম গল্ফড (55 বাইট) ( টিআইও )

lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))

এটি আউটপুট হিসাবে অনুমান করে 8*r, তারপরে ভার্টেক্স ক্রসিংয়ের জন্য সংশোধন করে। ফলাফলটি 8*r-g(r*r)যেখানে দুটি স্কোয়ারের যোগফল (বাদে ) লেখার বিভিন্ন উপায়ের সংখ্যাg(x) গণনা করে ।xg(0)=0

চেনাশোনাটি যদি কখনও কোনও শীর্ষে না যায় তবে স্পর্শ করা কক্ষের সংখ্যাটি অতিক্রম করা প্রান্তের সমান হবে। চেনাশোনাটি 2*rউল্লম্ব গ্রিডলাইন এবং 2*rঅনুভূমিক গ্রিডলাইনগুলির মধ্য দিয়ে যায় এবং মোট দুটির জন্য উভয় দিকেই প্রতিটি পাশ করে 8*r

তবে, কেবল একটি নতুন ঘরে প্রবেশ করার সময় একটি শীর্ষে প্রতিটি ক্রসিংকে দুটি প্রান্তের ক্রসিং হিসাবে গণনা করা হয়। সুতরাং, আমরা ভারটিেক্স ক্রসিংয়ের সংখ্যা বিয়োগ করে ক্ষতিপূরণ করি। এই অক্ষ উপর পয়েন্ট পছন্দ অন্তর্ভুক্ত (r,0)সেইসাথে পিথাগোরাস মত triples (4,3)জন্য r=5

আমরা একক কোয়াড্রেন্ট পয়েন্টগুলি (x,y)সাথে x>=0এবং তার y>0সাথে x*x+y*y==nগণনা করি, তারপরে 4 দিয়ে গুণ করব We আমরা বিরতিতে sqrt(r*r-x*x)পুরো সংখ্যাটির সংখ্যাটি গণনা করে এটি করি ।x[0,r)


5

গণিত, 48 বাইট

4Count[Range@#~Tuples~2,l_/;Norm[l-1]<#<Norm@l]&

প্রথম চতুর্ভুজটি দেখে এবং গ্রিড কোষগুলির সংখ্যা গণনা করে যার জন্য ইনপুটটি কোষের নীচের বাম এবং উপরের ডান কোণগুলির আদর্শের মধ্যে পড়ে (অবশ্যই ফলাফলটি 4 দ্বারা গুণ করে)।


আরেকটি পদ্ধতি 8#-SquaresR[2,#^2]Sign@#&xnor এর পোস্টের উপর ভিত্তি করে
মাইল

@ মাইলস ওহ বাহ, আমার কোনও ক্লু ছিল না SquaresR। নিজেকে নির্দ্বিধায় পোস্ট করুন (বা এটি xnor পোস্ট করতে দিন)।
মার্টিন এন্ডার


3

জেলি , 21 13 12 11 বাইট

R²ạ²Æ²SạḤ×4

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

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

R²ạ²Æ²SạḤ×4  Main link. Argument: r

R            Range; yield [1, 2, ..., r].
 ²           Square; yield [1², 2², ..., r²].
   ²         Square; yield r².
  ạ          Absolute difference; yield [r²-1², r²-2², ..., r²-r²].
    Ʋ       Test if each of the differences is a perfect square.
      S      Sum, counting the number of perfect squares and thus the integer
             solutions of the equation x² + y² = r² with x > 0 and y ≥ 0.
        Ḥ    Un-halve; yield 2r.
       ạ     Subtract the result to the left from the result to the right.
         ×4  Multiply by 4.

2

পার্ল 6, 61 বাইট

->\r{4*grep {my &n={[+] $_»²};n(1 X+$_)>r²>.&n},(^r X ^r)}

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

->\r{                                                    } # Lambda (accepts the radius).
                                                (^r X ^r)  # Pairs from (0,0) to (r-1,r-1),
                                                           #   representing the bottom-left
                                                           #   corners of all squares in
                                                           #   the top-right quadrant.
       grep {                                 }            # Filter the ones matching:
             my &n={[+] $_»²};                             #   Lambda to calculate the norm.
                              n(1 X+$_)>r²                 #   Top-right corner is outside,
                                          >.&n             #   and bottom-left is inside.
     4*                                                    # Return length of list times 4.

1

এডাব্লুকে, 90 বাইট

{z=$1*$1
for(x=$1;x>=0;x--)for(y=0;y<=$1;y++){d=z-x*x-y*y
if(d>0&&d<2*(x+y)+2)c++}$0=4*c}1

ব্যবহার:

awk '{z=$1*$1
    for(x=$1;x>=0;x--)for(y=0;y<=$1;y++){d=z-x*x-y*y
    if(d>0&&d<2*(x+y)+2)c++}$0=4*c}1' <<< 5525

চক্রটি ছেদ করবে এমন সমস্ত বাক্স সন্ধানের জন্য চতুর্ভুজ 1 এর মাধ্যমে কেবল একটি সাধারণ অনুসন্ধান। প্রতিসাম্যটি 4 দ্বারা গুণনের জন্য অনুমতি দেয় -$1 to $1তবে যেতে পারে তবে এটি আরও বাইট নেয় এবং কম দক্ষ হবে। স্পষ্টতই এটি অ্যালগরিদমের সবচেয়ে বেশি দক্ষ নয়, তবে এটি আমার মেশিনে 5525 কেস চালাতে প্রায় 16 সেকেন্ড সময় নেয়।


1

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

f n=sum[4|x<-[0..n],y<-[0..n],(1+n-x)^2+(1+n-y)^2>n^2,(n-x)^2+(n-y)^2<n^2]

খুব সোজা হয়ে, (0,0) এবং (n, n) এর মাঝে স্কোয়ারের সংখ্যা গণনা করুন যেখানে নীচের বামটি বৃত্তের ভিতরে রয়েছে এবং উপরের ডানটি বৃত্তের বাইরে রয়েছে, তারপরে 4 দিয়ে গুণ করুন ly


0

পাইথ , 29 বাইট

Lsm*ddb*4lf}*QQrhyTym+1dT^UQ2

চেষ্টা করে দেখুন!

ব্যাখ্যা

Lsm*ddb*4lf}*QQrhyTym+1dT^UQ2  # implicit input: Q
Lsm*ddb                        # define norm function
 s                             # sum
  m   b                        #     map each coordinate to
   *dd                         #                            its square
                         ^UQ2  # cartesian square of [0, 1, ..., Q - 1]
                               #     -> list of coordinates of all relevant grid points
          f                    # filter the list of coordinates T where:
           }*QQ                # square of Q is in
               r               #     the range [
                hyT            #         1 + norm(T),
                               #                  ^ coordinate of lower left corner
                   ym+1dT      #         norm(map({add 1}, T))
                               #              ^^^^^^^^^^^^^^^ coordinate of upper right corner
                               #     ) <- half-open range
         l                     # size of the filtered list
                               #     -> number of passed-through squares in the first quadrant
       *4                      # multiply by 4
                               # implicit print

0

ব্যাচ, 147 বাইট

@set/an=0,r=%1*%1
@for /l %%i in (0,1,%1)do @for /l %%j in (0,1,%1)do @set/a"i=%%i,j=%%j,a=i*i+j*j-r,i+=1,j+=1,a&=r-i*i-j*j,n-=a>>31<<2
@echo %n%

কিছুটা এডাব্লুকে এবং হাস্কেল উত্তর দ্বারা অনুপ্রাণিত।


খুশি আমি কাউকে কিছুটা অনুপ্রাণিত করতে পারি :)
রবার্ট বেনসন

0

বাশ + ইউনিক্স ইউটিলিটিস, 127 বাইট

c()(d=$[(n/r+$1)**2+(n%r+$1)**2-r*r];((d))&&echo -n $[d<0])
r=$1
bc<<<`for((n=0;n<r*r;n++));{ c 0;c 1;echo;}|egrep -c 01\|10`*4

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

প্রথম চতুর্ভুজটিতে সমস্ত পয়েন্টের মধ্য দিয়ে যান, তাদের গণনা করুন এবং 4 দিয়ে গুণ করুন এটি খুব ধীর হতে পারে তবে এটি কার্যকর হয়।


0

জাভাস্ক্রিপ্ট (ES7), 76 বাইট

n=>4*(G=k=>k<n?Math.ceil((n**2-k++**2)**0.5)-(0|(n**2-k**2)**0.5)+G(k):0)(0)

আপনি সম্ভবত nনীচে থেকে পুনরাবৃত্তি করে কয়েকটা বাইট ছাঁটাই করতে পারেন 0?
নীল

@ নীল আমি চেষ্টা করেছিলাম কিন্তু কোনও উপায় দেখতে পেলাম না। মাত্র একটি ফাংশন ব্যবহার করতে চেয়েছিল কিন্তু তবুও nব্যাসার্ধ এবং kপুনরাবৃত্তি উভয়ই সংরক্ষণ করতে হবে এবং সমস্ত প্রচেষ্টা একই বাইটগুলি প্রকাশিত হয়েছিল
জর্জ রিথ

@ নীল আহ আমি আপনারা যা বলছেন তা দেখতে পাচ্ছি k<n?...তবে আমি সেই বাইটগুলিকে পুনরায় অর্ডার করেই হারিয়ে ফেলছি n**2-k++**2কারণ বিপরীতে যাওয়ার সময় অপারেটর অগ্রাধিকারটি ভুল এবং বিয়োগফল হয় না তাই বাম দিকটি সর্বদা প্রয়োজন k-1এবং বন্ধনীগুলির প্রয়োজন। আপনি যদি কোন উপায় না পেয়ে থাকেন?
জর্জ রিথ 31'17

আহ, আমি বিয়োগটিকে অবহেলা করেছি ... সম্ভবত আপনি পুরোটি 4-এর পরিবর্তে 4-দিয়ে গুণতে পারেন তার চারপাশে কাজ করার জন্য? (যদিও এটি এখনও আপনার সঞ্চয়ী হিসাবে খেয়ে যেতে পারে ...)
নীল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.