কোড-গল্ফ: একটি বৃত্তের ভিতরে জাল পয়েন্ট


15

নিম্নলিখিত ছবিটি সমস্যাটি দেখায়:

এখানে চিত্র বর্ণনা লিখুন

বৃত্তের ব্যাসার্ধ হিসাবে পূর্ণসংখ্যা প্রদত্ত একটি ফাংশন লিখুন, কেন্দ্রিক বৃত্তের ভিতরে সীমানা (সীমানা সহ) জাল পয়েন্টগুলির সংখ্যা গণনা করে ।

চিত্রটি দেখায়:

f[1] = 5  (blue points)
f[2] = 13 (blue + red points)  

আপনার চেকিং / ডিবাগিংয়ের জন্য অন্যান্য মানগুলি:

f[3]    = 29
f[10]   = 317
f[1000] = 3,141,549
f[2000] = 12,566,345  

একটি যুক্তিসঙ্গত কর্মক্ষমতা থাকতে হবে। আসুন চ [1000] এর জন্য এক মিনিটেরও কম সময় বলি।

সংক্ষিপ্ততম কোড জিতেছে। সাধারণ কোড-গল্ফ বিধি প্রযোজ্য।

উদাহরণস্বরূপ চ [1001] এর গণনা এবং সময় পোস্ট করুন।



উত্তর:


9

জে, 21 19 18

+/@,@(>:|@j./~@i:)

-X-xj থেকে x + xj পর্যন্ত কমপ্লেক্স তৈরি করে এবং মাত্রা নেয়।

সম্পাদনা: সাথে >:

সম্পাদনা 2: হুক এবং monadic সহ ~। কোনও কারণে কয়েকবার ধীর গতিতে চলে তবে এখনও f (1000) এর জন্য 10-ইশ সেকেন্ড।


ওহে, আমি সম্পর্কে জানতাম না i:, আমি এত চুরি করছি যে, ধন্যবাদ!
জেবি

@JB: হ্যাঁ, ভাল ... আমি চুরি করছি >:ডের্প
জেসি মিলিকান

আশা করি আমি ক্যাপগুলি খুব ভালভাবে চুরি করার জন্য যথেষ্ট বুঝতে পেরেছি :-)
জেবি

এই উত্তরটি হতাশাজনকভাবে সংক্ষিপ্ত (যার পক্ষে কখনও একটি ছোট এবং / বা গল্ফিং ল্যাং শিখতে বিরক্ত করা হয়নি) >:। তবে আরে, এ তো দুর্দান্ত উত্তর! :)
তহবিল মনিকার লসুইট

5

জে, 27 21

3 :'+/,y>:%:+/~*:i:y'

খুব নিষ্ঠুর: নির্ণয় SQRT (x² + + y²) উপর [-n, এন] পরিসীমা এবং গন্য আইটেম ≤n । 1000 এর জন্য এখনও খুব গ্রহণযোগ্য সময়।

সম্পাদনা : এর i:yচেয়ে খানিকটা খাটো y-i.>:+:y। ধন্যবাদ জেসি মিলিকান !


হা! একটি শালীন পারফরম্যান্স জিজ্ঞাসা পিছনে যে ধারণা ছিল! শুধু কৌতূহলী: 1000 এর সময়সীমাটি কী?
ডাঃ বেলিসারিয়াস

1
@ বিলেসারিয়াস: 0.86 এস। 10 বছরের পুরানো হার্ডওয়্যারটিতে। 2000 এর জন্য 3.26s।
জেবি

4

রুবি ১.৯, 62 58 54 টি অক্ষর

f=->r{1+4*eval((0..r).map{|i|"%d"%(r*r-i*i)**0.5}*?+)}

উদাহরণ:

f[1001]
=> 3147833

t=Time.now;f[1001];Time.now-t
=> 0.003361411

4

পাইথন 55 চর

f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))

f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))সংক্ষিপ্ত 17 অক্ষর।
ভেন্টোরো

3

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

f n=1+4*sum[floor$sqrt$n*n-x*x|x<-[0..n]]

চতুষ্কোণে পয়েন্ট গণনা x>=0, y>0করে, 4 দ্বারা গুণিত হয়, কেন্দ্র পয়েন্টের জন্য 1 যোগ করে।


2

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

f n|w<-[-n..n]=sum[1|x<-w,y<-w,x*x+y*y<=n*n]

আমি হাস্কেলের কাছে নতুন: আপনি w<-[-n..n]যেখানে লিখতে পারেন (সাধারণত) সেখানে বুলিয়ান মান রয়েছে?
flawr

1
@ ফ্লোয়ার এগুলি প্যাটার্ন গার্ড , যা কোনও প্যাটার্নটি মিলে গেলে সফল হয়, তবে আরও খাটো হিসাবে গল্ফিংয়ে ব্যবহার করা যেতে পারে। এই টিপ দেখুন ।
xnor

ধন্যবাদ, আমি এই থ্রেড সম্পর্কে সচেতন ছিলাম না!
flawr

1

জাভাস্ক্রিপ্ট (ES6), 80 বাইট (অ-প্রতিযোগী কারণ ES6 খুব নতুন)

n=>(a=[...Array(n+n+1)].map(_=>i--,i=n)).map(x=>a.map(y=>r+=x*x+y*y<=n*n),r=0)|r

বিকল্প সংস্করণ, এছাড়াও 80 বাইট:

n=>[...Array(n+n+1)].map((_,x,a)=>a.map((_,y)=>r+=x*x+(y-=n)*y<=n*n,x-=n),r=0)|r

ES7 সংস্করণ, এছাড়াও 80 বাইট:

n=>[...Array(n+n+1)].map((_,x,a)=>a.map((_,y)=>r+=(x-n)**2+(y-n)**2<=n*n),r=0)|r

1

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

f=lambda n,i=0:i>n or(n*n-i*i)**.5//1*4+f(n,i+1)

FR0DDY এর সমাধানের মতো তবে পুনরাবৃত্ত এবং একটি ফ্লোট ফেরত দেয়। কোন ইনটার রিটার্ন করা 51 বাইট:

f=lambda n,i=0:i>n or 4*int((n*n-i*i)**.5)+f(n,i+1)


1

এপিএল (ডায়ালগ প্রসারিত) , 14 বাইট

{≢⍸⍵≥|⌾⍀⍨⍵…-⍵}

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

i:জে এর অন্তর্নির্মিত (-n থেকে এন পর্যন্ত) অন্তর্ভুক্ত থাকা সত্ত্বেও , এপিএল এক্সটেন্ডেডের অন্যান্য অঞ্চলে সংক্ষিপ্ত বাক্য গঠন রয়েছে।

{≢⍸⍵≥|⌾⍀⍨⍵…-⍵}            Monadic function taking an argument n.
           ⍵…-⍵             n, n-1, ..., -n
      ⌾⍀                   Make a table of complex numbers
                            (equivalent to ∘.{⍺+1J×⍵} in Dyalog APL)
                           with both real and imaginary parts from that list.
      |                       Take their magnitudes.
    ⍵≥                        1 where a magnitude are is at most n, and 0 elsewhere.
                            Get all indices of truthy values.
                            Find the length of the resulting list.

1

জাপট -x , 12 বাইট

òUn)ï Ëx²§U²

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

ব্যাখ্যা:

òUn)            #Get the range [-input ... input]
    ï           #Get each pair of numbers in that range
      Ë         #For each pair:
       x        # Get the sum...
        ²       # Of the squares
         §      # Check if that sum is less than or equal to...
          U²    # The input squared
                #Output the number of pairs that passed the check


1

পিএইচপি, 85 83 বাইট

কোড:

function f($n){for($x=$n;$x;$c+=$x,$y++)for(;$n*$n<$x*$x+$y*$y;$x--);return$c*4+1;}

এর ফলাফল ( একাধিক পিএইচপি সংস্করণের জন্য https://3v4l.org/bC0cY দেখুন ):

f(1001)=3147833
time=0.000236 seconds.

অবারিত কোড:

/**
 * Count all the points having x > 0, y >= 0 (a quarter of the circle)
 * then multiply by 4 and add the origin.
 *
 * Walk the lattice points in zig-zag starting at ($n,0) towards (0,$n), in the
 * neighbourhood of the circle. While outside the circle, go left.
 * Go one line up and repeat until $x == 0.
 * This way it checks about 2*$n points (i.e. its complexity is linear, O(n))
 *
 * @param int $n
 * @return int
 */
function countLatticePoints2($n)
{
    $count = 0;
    // Start on the topmost right point of the circle ($n,0), go towards the topmost point (0,$n)
    // Stop when reach it (but don't count it)
    for ($y = 0, $x = $n; $x > 0; $y ++) {
        // While outside the circle, go left;
        for (; $n * $n < $x * $x + $y * $y; $x --) {
            // Nothing here
        }
        // ($x,$y) is the rightmost lattice point on row $y that is inside the circle
        // There are exactly $x lattice points on the row $y that have x > 0
        $count += $x;
    }
    // Four quarters plus the center
    return 4 * $count + 1;
}

একটি নিখুঁত বাস্তবায়ন যা $n*($n+1)পয়েন্টগুলি পরীক্ষা করে (এবং 1000 ধীরে ধীরে চলতে পারে তবে f(1001)0.5 শতাংশের মধ্যে কমপিট করে) এবং পরীক্ষার স্যুট (প্রশ্নের মধ্যে দেওয়া নমুনা ডেটা ব্যবহার করে) গিথুবটিতে পাওয়া যায় ।


0

ক্লোজার / ক্লোজার স্ক্রিপ্ট, 85 টি অক্ষর

#(apply + 1(for[m[(inc %)]x(range 1 m)y(range m):when(<=(+(* x x)(* y y))(* % %))]4))

ব্রুট প্রথম অক্ষরকে y অক্ষ সহ নয় তবে x অক্ষ সহ জোর করে। প্রতি পয়েন্টের জন্য একটি 4 উত্পন্ন করে, তারপরে তাদের উত্সের জন্য 1 যুক্ত করে with 1000 এর ইনপুটটির জন্য 2 সেকেন্ডের মধ্যে চলে।

forএকটি ভেরিয়েবল সংজ্ঞায়িত করতে এবং কয়েকটি অক্ষর সংরক্ষণ করার জন্য নরককে অপব্যবহার করুন । কোনও উপাত্ত rangeসংরক্ষণের জন্য একই উপকরণটি কোনও অক্ষর সংরক্ষণ করে না (এবং এটি উল্লেখযোগ্যভাবে ধীর হয়ে চলেছে), এবং এটি বোধ হয় না যে আপনি কোনও স্কোয়ার ফাংশন করে কোনও কিছু সংরক্ষণ করতে যাচ্ছেন।


এটি বেশ পুরানো প্রশ্ন, আপনি কি নিশ্চিত যে এই উত্তরটি সেই সময়ে কাজ করত?
নীল

@ মুডিফিশ আমি বয়সটি লক্ষ্য করিনি, কেবল এটি শীর্ষের কাছাকাছি দেখেছি। Clojure প্রশ্নের পূর্বাভাস দেয়, তবে ভাষা পরিবর্তন সম্পর্কে আমি তার ইতিহাসটি যথেষ্ট জানতে পারি না।
ম্যাটপুটনাম


0

গণিত, 35 অক্ষর

f[n_]:=Sum[SquaresR[2,k],{k,0,n^2}]

Https://oeis.org/A000328 থেকে উত্তোলন করা হয়েছে

https://reference.wolfram.com/language/ref/SquaresR.html

SquaresR[2,k]কে কে দুটি বর্গের যোগফল হিসাবে উপস্থাপনের বিভিন্ন উপায়, যা কে ius 2 এর ব্যাসার্ধের জাল পয়েন্টগুলির সমান। ব্যাসার্ধের n এর বৃত্ত বা তার ভিতরে সমস্ত পয়েন্ট খুঁজতে k = 0 থেকে k = n ^ 2 যোগফল।


1
2~SquaresR~k~Sum~{k,0,#^2}&এটি আরও সংক্ষিপ্ত করতে
জায়েং

0

টিসিএল, 111 বাইট

lassign {1001 0 -1} r R x
while {[incr x]<$r} {set R [expr {$R+floor(sqrt($r*$r-$x*$x))}]}
puts [expr {4*$R+1}]

চতুর্ভুজ I এর উপরে সরল বিচ্ছিন্ন এক্স লুপ, প্রতিটি ধাপে পাইথাগোরিয়ান উপপাদ ব্যবহার করে বৃহত্তম y গণনা করা । সমষ্টি প্লাস ওয়ান (কেন্দ্র পয়েন্টের জন্য) 4 গুণ ফলাফল।

প্রোগ্রামটির আকার আর এর মানের উপর নির্ভর করে । প্রতিস্থাপন {1001 0 -1}সঙ্গে "$argv 0 -1"এবং আপনার জন্য কোন কমান্ড লাইন আর্গুমেন্ট মান সঙ্গে এটি চালাতে পারেন

Computes f (1001) 3147833.0about প্রায় 1030 মাইক্রোসেকেন্ডে, এএমডি সেম্প্রন 130 2.6GHz 64-বিট প্রসেসর, উইন্ডোজ 7।

স্পষ্টতই, বৃহত্তর ব্যাসার্ধ, পিআই এর সান্নিধ্যের কাছাকাছি: f (10000001) প্রায় 30 সেকেন্ডে চলে 15-ডিজিটের মান তৈরি করে, যা একটি আইইইই দ্বিগুণের নির্ভুলতা সম্পর্কে।


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