পাই প্রেরণ করুন… অবিকল


11

পাইয়ের মন্টি কার্লো অনুমানকারীকে অনুসরণ করে এই চ্যালেঞ্জটি ধ্রুবক পাইয়ের জন্য সংক্ষিপ্ততম কোড তৈরি করা produce এখানে বাদে আপনার কোড অবশ্যই পির টানা অঙ্কের আউটপুট দিতে হবে।

এটি কোড গল্ফ, সুতরাং সংক্ষিপ্ততম জমা (বাইটে) জেতে ব্যতীত এটি যুক্তিসঙ্গত পিসিতে 10 সেকেন্ডেরও কম সময়ে প্রথম 10,000 ডিজিট আউটপুট করতে হবে এবং এটি কখনই শেষ করতে হবে না।

আপনি পাই বা ট্রিগ ফাংশনগুলির জন্য কোনও বিল্ট-ইন ব্যবহার করতে পারবেন না।


কোড আকারে কঠোর সীমা সরিয়ে ফেলা হয়েছে।


1
টুইটের দ্বারা, আপনি কি বোঝাতে চান যে কোডটি অবশ্যই 140 টির চেয়ে কম বর্ণের হতে হবে?
Ypnypn

5
চরিত্রের সীমাবদ্ধতা ব্যতীত নিজেই সমস্যাটি চ্যালেঞ্জিং বলে মনে হচ্ছে।
বব দ্য অসাধারণ

1
@ BobTheAwesome জনপ্রিয় চাহিদা অনুসারে চরিত্রের সীমা সরিয়ে ফেলেছে।

1
@ mbomb007 দশমিক পয়েন্টটি অবশ্যই প্রিন্ট করা উচিত, বা অঙ্কগুলি সাদা স্থানের দ্বারা পৃথক করা যায় না তা মোটেই সুস্পষ্ট নয়। চ্যালেঞ্জটি কেবল "পাই এর পরপর সংখ্যাগুলি আউটপুট করা"। দশমিক বিন্দুটি কোনও অঙ্ক নয়। 3141...তা হ'ল পাইয়ের একটানা সংখ্যা।
orlp

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

উত্তর:


7

সিজোম - 48

3.1o{1YAZ2*:Z#*{_2$*2$2*)/@)\}h*]:+sX2*:X>X<o1}g

এটি বৃহত্তর এবং বৃহত্তর নির্ভুলতার সাথে 2 sum সমষ্টি হিসাবে (কে! / (2 কে + 1) !!) হিসাবে গণনা করে এবং প্রতিটি পদক্ষেপে যেখান থেকে এটি ছেড়ে গিয়েছিল সেখান থেকে একগুচ্ছ অঙ্কগুলি মুদ্রণ করে।

আপনি অনলাইনে এমন একটি পরিবর্তিত সংস্করণ চেষ্টা করতে পারেন যা কেবল 8 টি (বহিরাগত লুপ) পুনরাবৃত্তি করে এবং 512 অঙ্ক মুদ্রণ করে, বা আসল জিনিসের জন্য জাভা ইন্টারপ্রেটার ব্যবহার করতে পারে। আমার ল্যাপটপে এটি প্রায় 6 সেকেন্ডের মধ্যে 16384 অঙ্কে পৌঁছে যায়।

দ্রষ্টব্য: এই প্রোগ্রামটি খুব স্মৃতি-ক্ষুধার্ত; একটি ভাল আচরণ করা হলেও কিছুটা দীর্ঘ সংস্করণ হ'ল:

3.1o{T2AZ2*:Z#*1{@2$+@2$*2$2*)/@)1$}g;;sX2*:X>X<o1}g

ব্যাখ্যা:

3.1o              print 3.1
{…1}g             repeat indefinitely
    1YA           push 1, 2 and 10 (Y=2, A=10)
    Z2*:Z         push Z*2 (Z=3 initially) and store back in Z
    #*            calculate 2*10^Z (2 from the formula and 10^Z for precision)
                  this is the term for k=0, and the earlier 1 represents k
    {…}h          do-while
                  at each iteration, the stack contains: terms, k, last-term
        _2$*      copy the previous term and k and multiply them
        2$2*)/    divide the previous number by 2*k+1
                  this is the current term of the series
        @)\       increment k and move it before the current term
                  the current term now serves as the loop condition
                  so the loop terminates when the term becomes 0
    *             multiply k and the last term (0), to get rid of k
    ]:+s          put all the terms in an array, add them and convert to string
                  we obtain an approximation of π*10^Z
    X2*:X         push X*2 (X=1 initially) and store back in X
    >X<o          print X digits starting from the X position

8

পাইথন, 138 বাইট

q,r,t,i=1,180,60,2
while 1:u,y=27*i*(i+1)+6,(q*(27*i-12)+5*r)//(5*t);print(y,end="");q,r,t,i=10*q*i*(2*i-1),10*u*(q*(5*i-2)+r-y*t),t*u,i+1

Http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf এর বাস্তবায়ন ।


আমাকে 5 মিনিটের মধ্যে
মারধর করুন

এটা অসাধারণ. আমি তবে আশা করছিলাম যে অঙ্কগুলি সমস্ত এক লাইনে থাকবে। অন্য কথায়, যে আউটপুট পাই মত দেখতে হবে।

2
@ ল্যাম্বিক আমি আমার উত্তর পরিবর্তন করেছি - 7 বাইট দীর্ঘ, তবে এখন সমস্ত এক লাইনে।
orlp

5

গল্ফস্ক্রিপ্ট (৮১ টি চর)

1:i:^3{3i):i*(.(*3*.@*.5*3$27i*12-*+@^*:^5*/.print^*2$5i*2-*--\10*i*2i*(*\10*.}do

অনলাইন ডেমো (এটি একটি যুক্তিসঙ্গত ডেস্কটপের তুলনায় অনেক ধীর গতির এবং এতে সীমাবদ্ধ সংখ্যার লুপে তুচ্ছ কোড পরিবর্তন হয়)।

আমি অবশ্যই স্পিগট অ্যালগরিদম ব্যবহার করেছি যা আমি পূর্বের মন্তব্যে উল্লেখ করেছি, তবে এটি আমার সন্তুষ্টিতে কিছুটা সময় নিয়েছিল to গিবনসের কাগজে উপস্থাপিত আলগোরিদিমটি হ'ল (সিউডোকোড)

q = 1; r = 180; t = 60; i = 2
while (true) {
    u = 3*(3*i+1)*(3*i+2)
    y = (q*(27*i-12)+5*r) / (5*t)
    print y
    r += q*(5*i-2)-y*t
    r *= 10*u
    q *= 10*i*(2*i-1)
    t *= u
    i += 1
}

উপরের গল্ফস্ক্রিপ্ট (সিউডোকোড) এর সমতুল্য

t = i = q = 1; r = 3
while (true) {
    u = 3*(3*i+1)*(3*i+2)
    i += 1
    r *= u
    t *= u
    y = (q*(27*i-12)+5*r) / (5*t)
    print y
    r -= y*t - q*(5*i-2)
    q *= 10*i*(2*i-1)
    r *= 10
}

যা সূচনা এবং স্ট্যাক পরিচালনায় কিছু অক্ষর সংরক্ষণ করে।


4

পাইথ - 87 85 বাইট

Http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf এর আর একটি অনুবাদ । আমি পাইথন করতে যাচ্ছিলাম তবে @ আরপ্প আমাকে এতে মারধর করেছিল, তাই আমি পাইথটি করেছি। একটি টুইট মধ্যে ফিট করার জন্য যথেষ্ট ছোট।

=H3=d1=bd=Gd#K+**hb27b6~b1=H*HK=d*dKJ/+*-*27b12G*5H*5d=H*T-H-*Jd*-*5b2G=G***GTbtybpkJ

এটি প্রিন্ট সেটিং থেকে আসা প্রিন্ট বাফারের কারণে মাঝে মাঝে পদক্ষেপে স্টাডাউটকে আউটপুট দেয় end=""। অনুমানটি "একটানা অঙ্কগুলি" বলার কারণে আমি বর্তমানে দশমিক পয়েন্টটি মুদ্রণ করি না। এটি আমার স্কোরকে মেরে ফেলছে assign

=H3                     Set H to 3
=d1                     Set d to 1
=bd                     Set b to d which is 1
=Gd                     Set G to d which is 1
#                       Infinte Loop
  K                     Set K to
    +**hb27b6           27*b*(b+1)+6
  ~b1                   b+=1
  =H*HK                 H*=K
  =d*dK                 d*=K
  J                     Set J to
    /                   Integer division
      +*-*27b12G*5H     G*(27*b-12)+5*H
      *5d               5*d
  =H                    Set H to
    *T-H-*Jd*-*5b2G     10*(H-(J*d -G*(5*b-2)))
  =G                    Set G to
    ***GTbtyb           G*10*b*(2*b-1)
  pkJ                   Print J with the end as "", not a newline

এখানে চেষ্টা করুন । (দ্রষ্টব্য: যেহেতু অনলাইন অনুবাদক কেবলমাত্র সম্পূর্ণ ফলাফল দেয়, তাই অসীম লুপটি আউট হয়ে যায়, তাই এটি কেবল প্রথমে 100 টি প্রিন্ট করে যা কোডের আকার বৃদ্ধি করে inf অসীম চেষ্টা করার জন্য, স্থানীয় দোভাষীটি ডাউনলোড করুন))

টাইমিং

আমার গুগল ক্লাউড গণনা মাইক্রো উদাহরণস্বরূপ, gnu সময় অনুযায়ী এটি গ্রহণ করেছে: real: 0m2.062sসুতরাং এটি সম্ভবত যথেষ্ট দ্রুত is


3

স্কালা, 599 বাইট

নীচের কোডটি পাই এর অঙ্কগুলির জন্য এ স্পিগট অ্যালগরিদমের অ্যাপেন্ডিক্স 2 এর পাস্কল কোডের একটি সোজা বন্দর । স্পষ্টত খুব সামান্য গল্ফিং এখনও করা হয়েছে। কোডটি 10 ​​সেকেন্ডের সাথে 10 সেকেন্ডের মধ্যে 10,000 সংখ্যার উত্পন্ন করে piSpigot(10000)এবং যদি একটির অসীম স্মৃতি থাকে তবে অনেকগুলি অঙ্ক তৈরি করতে পরামিতি করা যায়, তবে অসীম নয়। আমি নিশ্চিত নই যে এটি সমস্যার সীমাবদ্ধতাগুলি পূরণ করছে কিনা তাই দয়া করে প্রতিক্রিয়া জানান।

def piSpigot(n: Int): Unit = {
  val len=10*n/3
  var nines=0
  var predigit=0
  val a=Array.fill(len)(2)
  (1 to n).foreach {_=>
    var q=0
    (1 to n).reverse.foreach{i=>
      var x=10*a(i)+q*i
      a(i)=x%(2*i-1)
      q=x/(2*i-1)
    }
    a(1)=q%10
    q/=10
    if (q==9) {
      nines+=1
    } else if (q==10) {
      print(predigit+1)
      1.to(nines).foreach(_=>print(0))
      predigit=0
      nines=0
    } else {
      print(predigit)
      predigit=q
      if (nines!=0) {
        1.to(nines).foreach(_=>print(9))
        nines=0
      }
    }
  }
  println(predigit)
}
piSpigot(10000)

5
আমি মনে করি যে বিজ্ঞাপনের ইনফিনিটাম ডিজিটের উত্পাদনের প্রয়োজনীয়তার অর্থ প্যারামিটার গ্রহণের পরিবর্তে আপনার স্ট্রিমিং অ্যালগরিদম ব্যবহার করা উচিত n। উদাহরণস্বরূপ দেখুন cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdf
পিটার টেলর

অসীম স্মৃতি এবং অসীম সময়ের জন্য একটি অসীম সংখ্যা দেওয়া উচিত।

1

বেফুঞ্জ -98 (পাইফুঞ্জ), 120 বাইট

cf*10p'<20p11>00p1+:30p:::*+39**6+:30g39**c-00g*10gv
>:2*1-*00g*a*^
^:p02*g02p01*a*-*g02\+g01*g00-2*5g03,+*86:/*5g02+*5<

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

এটি সময়সীমার ক্ষেত্রে সীমান্তরেখা। 10,000 ডিজিটগুলি আমার ল্যাপটপে প্রায় 11 সেকেন্ড সময় নেয়, তবে আমি নিশ্চিত যে একটি "যুক্তিসঙ্গত" পিসি থাকতে হবে যা এর চেয়ে দ্রুত এটি করতে পারে।

তবে, আপনি যদি টিআইও দিয়ে চেষ্টা করে দেখেন তবে মনে রাখবেন যে second০ সেকেন্ড টাইম সীমাটি হিট না হওয়া পর্যন্ত এটি কোনও কিছুই ফিরিয়ে আনবে না, যেহেতু অ্যালগরিদম চিরতরে চলে যাওয়ার জন্য ডিজাইন করা হয়েছে। ততক্ষণে আপনার কাছে 10,000 টিরও বেশি সংখ্যা থাকবে।

আমি জেরেমি গিবন স্পিগট অ্যালগরিদম ব্যবহার করছি, যা আমি এখানে অন্যান্য উত্তরগুলির মতোই বলে মনে করি। যাইহোক, নোট এই ব্যাখ্যাকারী নির্বিচারে স্পষ্টতা মেমরির কোষ থাকার উপর নির্ভর করে যে, এবং শুধুমাত্র বাস্তবায়ন আমি যে সমর্থন যে সচেতন আছি PyFunge

ব্যাখ্যা

cf*10p                     Initialise r to 180.
      '<20p                Initialise t to 60.
           11              Initialise i and q on the stack to 1.

>                          Start of the main loop.
 00p                       Save the current value of q in memory.
    1+:30p                 Increment i and save a copy in memory.      
          :::*+39**6+      Calculate u = 27*(i*i+i)+6.
                     :     Make a duplicate, since we'll need two copies later.

       30g39**c-00g*10gv   Calculate y = (q*(27*i-12)+5*r)/(5*t).
              /*5g02+*5<
        ,+*86:             Convert y to a character so we can output it.

*a*-*g02\+g01*g00-2*5g03   Calculate r = 10*u*(q*(i*5-2)+r-y*t)

         p01               Save the updated r.
     *g02                  Calculate t = t*u
  p02                      Save the updated t.

>:2*1-*00g*a*              Calculate q = 10*q*i*(i*2-1).
^:
             ^             Return to the start of the main loop.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.