পাই এর যুক্তিসঙ্গত আনুমানিক


22

একটি প্রোগ্রাম লিখুন যা ডিনোমিনেটর <1000000 এর সাথে পাই এর সমস্ত ভাল যুক্তিসঙ্গত অনুমানগুলি প্রিন্ট করে, ক্রমবর্ধমান ক্রমানুসারে। a/bপাই এর একটি "ভাল যুক্তিযুক্ত আনুমানিকতা" এটি যদি পাই এর কাছাকাছি হয় তবে ডিনমিনেটরের সাথে অন্য কোনও যুক্তিযুক্ত এর চেয়ে বড় হয় না b

আউটপুটটিতে মোট ১7 lines টি লাইন থাকা উচিত এবং এর মতো শুরু এবং শেষ হওয়া উচিত:

3/1
13/4
16/5
19/6
22/7
179/57
...
833719/265381
1146408/364913
3126535/995207

সংক্ষিপ্ততম প্রোগ্রামের জয়।

উত্তর:


23

গল্ফস্ক্রিপ্ট, 71 70 69 অক্ষর

2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;

(ধরে নিন যে আপনি স্টিডিনে এটি কোনও কিছু পাস করবেন না)

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

পটভূমির জন্য http://en.wikedia.org/wiki/Continued_fration# Best_rational_approximations দেখুন ।

# No input, so the stack contains ""
2\!:^2^..292^15.2/3]
# ^ is used to store 1 because that saves a char by allowing the elimination of whitespace
# Otherwise straightforward: stack now contains [2 1 2 1 1 1 292 1 15 7 3]
# Pi as a continued fraction is 3+1/(7+1/(15+1/(...)))
# If you reverse the array now on the stack you get the first 10 continuants followed by 2
# (rather than 3)
# That's a little hack to avoid passing the denominator 1000000

{
    # Stack holds: ... [c_n c_{n-1} ... c_0]
    (.)2/.9>+
    # Stack holds ... [c_{n-1} ... c_0] c_n (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
    # (1+c_n)/2 > 9 is an ad-hoc approximation of the "half rule"
    # which works in this case but not in general
    # Let k = (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
    # We execute the next block k times
    {
        # ... [c_{n-1} ... c_0] z
        \+.((
        # ... [z c_{n-1} ... c_0] [c_{n-1} ... c_0] z-1
    }*
    # So we now have ... [c_n c_{n-1} ... c_0] [(c_n)-1 c_{n-1} ... c_0] ...
    #                    [(c_n)-k+1 c_{n-1} ... c_0] [c_{n-1} ... c_0] c_n-k
    ;
    # Go round the loop until the array runs out
    .
}do

# Stack now contains all the solutions as CFs in reverse order, plus two surplus:
# [2 1 2 1 1 1 292 1 15 7 3] [1 2 1 1 1 292 1 15 7 3] ... [6 3] [5 3] [4 3] [3] [2] []
# Ditch the two surplus ones, bundle everything up in an array, and reverse it
;;]-1%

# For each CF...
{
    # Stack holds ... [(c_n)-j c_{n-1} ... c_0]
    # We now need to convert the CF into a rational in canonical form
    # We unwind from the inside out starting with (c_n)-j + 1/infinity,
    # representing infinity as 1/0
    ^0@
    # ... 1 0 [c_n-j c_{n-1} ... c_0]
    # Loop over the terms of the CF
    {
        # ... numerator denominator term-of-CF
        2$*+\
        # ... (term-of-CF * numerator + denominator) numerator
    }/

    # Presentation
    "/"\n
    # ... numerator "/" denominator newline
}/

# Pop that final newline to avoid a trailing blank line which isn't in the spec
;

1
ঠিক আছে, প্রযুক্তিগতভাবে গল্ফস্ক্রিপ্টে ফাইটিং পয়েন্ট সংখ্যা এবং পিআইয়ের জন্য ধ্রুবক উভয়ই রয়েছে। এটি বলা হয় "#{Math.PI}"
কনরাড বোরোস্কি

2
@ গ্লিচএমআর, কোনভাবে স্ট্রিং একটি ভাসমান পয়েন্ট সংখ্যা?
পিটার টেলর

আমি মন্তব্য সহ এটি নিবন্ধভুক্ত দেখতে সত্যিই চাই।
প্রিমো

অ্যামেজিং। প্রথম লাইনটি 2\!:^2^..292^15.2/3]ইতিমধ্যে আমার মনকে উড়িয়ে দিয়েছে।
primo

@PeterTaylor বাঁধা । আমরা কি আরও ভাল করতে পারি?
এভেলেক্স

11

গণিত, 67 63

এটি দ্রুত হতে যাচ্ছে না, তবে আমি বিশ্বাস করি এটি প্রযুক্তিগতভাবে সঠিক।

Round[π,1/Range@1*^6]//.x_:>First/@Split[x,#2≥#&@@Abs[π-{##}]&]

Round[π, x]এর পদক্ষেপে নিকটতম ভগ্নাংশ দেয় x। এটি "তালিকাভুক্ত" তাই Round[π,1/Range@1*^6]এটি সমস্ত ভগ্নাংশের জন্য 1/10^6ক্রমানুসারে চলে। অনেকগুলি "খারাপ" যুক্তিযুক্ত আনুষঙ্গিকতার সাথে ফলাফলের তালিকাটি তারপরে বারবার ( //.) পূর্ববর্তীগুলির চেয়ে from থেকে আরও বেশি কিছু উপাদান সরিয়ে নিয়ে প্রক্রিয়া করা হয়।


খুব সুন্দর, তবে আমি এটি পরীক্ষা করতে পারছি না কারণ আমার গাণিতিক নেই।
কিথ র্যান্ডাল

@ কিথ, এখানে যুক্তি রয়েছে। পদক্ষেপে Round[Pi, x]নিকটতম ভগ্নাংশ দেয় । এটি "তালিকাভুক্ত" তাই এটি সমস্ত ভগ্নাংশের জন্য 1/10 ^ 6 এর নিচে থাকে। অনেকগুলি "খারাপ" যুক্তিযুক্ত আনুষঙ্গিকতার সাথে ফলাফলের তালিকাটি এরপরে বার বার ( ) পূর্ববর্তীগুলির চেয়ে পাই থেকে আরও দূরে থাকা কোনও উপাদানগুলি সরিয়ে প্রক্রিয়া করা হয়। PixRound[Pi,1/Range@1*^6]//.
মিঃ উইজার্ড

গল্ফস্ক্রিপ্ট মারছে ম্যাথামেটিকা ​​a ঝরঝরে।
বানান

Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
In১

ইয়ার, মাটি এই কোডটিতে থার ম্যাজিক হোন।
মাইকেল স্টার্ন

7

পার্ল, 77 টি অক্ষর

$e=$p=atan2 0,-1;($f=abs$p-($==$p*$_+.5)/$_)<$e&&($e=$f,say"$=/$_")for 1..1e6

একটি ছোট্ট চ্যালেঞ্জ হ'ল পার্লের অন্তর্নির্মিত π ধ্রুবক উপলব্ধ নেই, তাই আমাকে প্রথমে এটি হিসাবে গণনা করতে হয়েছিল atan2(0,-1)। আমি নিশ্চিত যে এই কাজের জন্য আরও উপযুক্ত ভাষা দ্বারা এটি মারবে, তবে এটি মূলত পাঠ্য প্রক্রিয়াজাতকরণের জন্য তৈরি করা ভাষার পক্ষে খারাপ নয়।


1
আপনি 3 টি অক্ষরে পরিবর্তন এবং সংরক্ষণ করতে 999999পারেন 1e6
টোটো

@ এম 42: ধন্যবাদ! এখন এখন ৮২ টি চর।
ইলমারি করোনেন

সত্যই সুন্দর, ger = পূর্ণসংখ্যা পেতে। দুঃখিত, আমি দুবার upvote করতে পারবেন না।
টোটো

আমি এটি চালাতে পারি না:String found where operator expected at prog.pl line 1, near "say"$=/$_""
কীথ র্যান্ডাল

@ কিথরান্ডাল: কমান্ডের -M5.01জন্য আপনার সুইচ (এবং পার্ল 5.10.0 বা তার পরে) প্রয়োজন later sayউল্লেখ না করার জন্য দুঃখিত।
ইলমারি করোনেন

5

পাইথন, 96 93 89 টি অক্ষর

a=b=d=1.
while b<=1e6:
 e=3.14159265359-a/b;x=abs(e)
 if x<d:print a,b;d=x
 a+=e>0;b+=e<0

পাইথন, 95 93 টি অক্ষর, বিভিন্ন অ্যালগরিদম

p=3.14159265359;d=1
for a in range(3,p*1e6):
 b=round(a/p);e=abs(p-a/b)
 if e<d:print a,b;d=e

দ্রষ্টব্য: এটি লেখার p=3.14159265359;চেয়ে কম অক্ষর ছিল from math import*। ভয়ঙ্কর word শব্দযুক্ত আমদানি!


1
কিছু সংক্ষিপ্তকরণ: 1.0-> 1., 10**6->1e6
কিথ র্যান্ডাল

আমি আপনার উন্নতি সঙ্গে আপডেট করেছি। অনেক ধন্যবাদ.
স্টিভেন রাম্বালস্কি

@ কিথরান্ডাল, কিন্তু এর মধ্যে দ্বিতীয়টি আউটপুটটি লঙ্ঘন করে।
পিটার টেলর

দ্বিতীয় পদ্ধতির মধ্যে ভেরিয়েবল পি প্রয়োজন হয় না। এটি 4 টি অক্ষর।
এন্টার

@ পিটারটেলর: আমি বুঝতে পারি না। কীভাবে এটি অনুমানের লঙ্ঘন করে?
স্টিভেন রাম্বালস্কি

4

জেএস (95 টি অক্ষর)

for(i=k=1,m=Math;i<1e6;i++)if((j=m.abs((x=m.round(m.PI*i))/i-m.PI))<k)k=j,console.log(x+'/'+i)

এটি 167 লাইন মুদ্রণ করে না।


4

রুবি 1.9, 84 টি অক্ষর

m=1;(1..1e6).map{|d|n=(d*q=Math::PI).round;k=(n-q*d).abs/d;k<m&&(m=k;puts [n,d]*?/)}

@ পিটার টেলর আপনি ঠিক বলেছেন আপনাকে রুবি ১.৯ ব্যবহার করতে হবে।
হাওয়ার্ড

4

C99, 113 টি অক্ষর

main(d,n){double e=9,p=2*asin(1),c,a=1;for(;n=d*p+.5,c=fabsl(p-a*n/d),d<1e6;++d)c<e&&printf("%d/%d\n",n,d,e=c);}

সংকলন করা প্রয়োজন -lm, এবং সম্ভবত অপরিজ্ঞাত আচরণে পূর্ণ, তবে এটি আমার পক্ষে কাজ করে।


2

স্কালা - 180 অক্ষর

import math._
def p(z:Int,n:Int,s:Double):Unit=
if(n==1e6)0 else{val q=1.0*z/n
val x=if(abs(Pi-q)<s){println(z+"/"+n)
abs(Pi-q)}else s
if(Pi-q<0)p(z,n+1,x)else p(z+1,n,x)}
p(3,1,1)

// নিরবচ্ছিন্ন: 457

val pi=math.Pi
@annotation.tailrec
def toPi (zaehler: Int = 3, nenner: Int = 1, sofar: Double=1): Unit = {
  if (nenner == 1000000) () 
  else {
    val quotient = 1.0*zaehler/nenner
    val diff = (pi - quotient)
    val adiff= math.abs (diff)
    val next = if (adiff < sofar) {
      println (zaehler + "/" + nenner) 
      adiff 
    }
    else sofar
    if (diff < 0) toPi (zaehler, nenner + 1, next) 
    else toPi (zaehler + 1, nenner, next) 
  }  
}

টেলরেক টীকাটি যাচাই করা যায় তা যাচাই করে তা যাচাই করা হয় যা প্রায়শই পারফরম্যান্সের উন্নতি হয়।


আমি এটি কাজ করতে পারি না:pi.scala:1 error: not found: value math
কীথ র্যান্ডাল

আপনি স্কেলা ২.৮ ব্যবহার করছেন?
ব্যবহারকারী অজানা

আমার স্কেলা অদ্ভুত বলে "অজানা সংস্করণ"। আইডোন.কম এ তারা ২.৮.০ ব্যবহার করে এবং তবুও ত্রুটি পাই।
কিথ র্যান্ডাল

এটিকে সহজস্কোলা.কম এ চেষ্টা করুন - আমার জন্য কাজ করে। Scala-2.8 জন্য প্রতিস্থাপন mathসঙ্গে Mathযথেষ্ট হতে পারে। আমি এই মেটাথ্রেডে স্রেফস্কালার উল্লেখ করেছি, যদি আপনি এটি আবার সন্ধান করতে চান: meta.codegolf.stackexchange.com/a/401/373
ব্যবহারকারী অজানা

ঠিক আছে, এটি কাজ করে।
কীথ র্যান্ডাল

2

গণিত 18 18 চর

আমি "সেরা" হিসাবে একটি পরিমাপ হিসাবে ব্যবহার করতে বেছে নেওয়া হয়েছে, অবিরত ভগ্নাংশ উপস্থাপনে পদ সংখ্যা π। এই মানদণ্ড অনুসারে, π এর সর্বোত্তম যুক্তিসঙ্গত অনুমানগুলি হ'ল এর রূপান্তরকারী।

দশ মিলিয়ন এরও কম ডিনোমিনেটর সহ 10 টি রূপান্তরকারী রয়েছে। এটি অনুরোধ করা ১ 167 শর্তাবলীর চেয়ে কম তবে আমি এটি এখানে যুক্ত করছি কারণ এটি অন্যের পক্ষে আগ্রহী হতে পারে।

Convergents[π, 10] 

(* out *)
{3, 22/7, 333/106, 355/113, 103993/33102, 104348/33215, 208341/66317,
312689/99532, 833719/265381, 1146408/364913}

আপনি যদি প্রথম কনভারজেন্টের জন্য ডিনমিনেটরটি দেখতে চান তবে এটির জন্য অতিরিক্ত 11 টি অক্ষর লাগবে:

Convergents[π, 10] /. {3 -> "3/1"}
(* out *)
{"3/1", 22/7, 333/106, 355/113, 103993/33102, 104348/33215,
208341/66317, 312689/99532, 833719/265381, 1146408/364913}

যারা আগ্রহী তাদের জন্য, নিম্নলিখিতটি রূপান্তরকারীদের, আংশিক কোটাটিয়সের এবং continued এর রূপান্তরগুলির অবিরত ভগ্নাংশের প্রকাশের মধ্যে সম্পর্কগুলি দেখায়:

Table[ContinuedFraction[π, k], {k, 10}]
w[frac_] := Row[{Fold[(#1^-1 + #2) &, Last[#], Rest[Reverse[#]]] &[Text@Style[#, Blue, Bold, 14] & /@ ToString /@ ContinuedFraction[frac]]}];
w /@ FromContinuedFraction /@ ContinuedFraction /@ Convergents[π, 10]

অবিরত ভগ্নাংশ

অবিরত ভগ্নাংশের অসঙ্গতিপূর্ণ ফর্ম্যাটিংটি ক্ষমা করুন।


এটি কোনও সমাধানের প্রায় অর্ধেক পথ, তবে এটি সবচেয়ে সহজ অর্ধেক। আমার গল্ফস্ক্রিপ্ট সমাধানটি আরও 2 টি অক্ষরে আরও অব্যাহত ভগ্নাংশের উপযুক্ত উপস্থাপনাটিকে হার্ড-কোড করে।
পিটার টেলর

তবে আপনি এই প্রশ্নের সমাধানের জন্য অবিরত ভগ্নাংশ ব্যবহার করেননি, আপনি কি?
ডেভিডসি

হ্যাঁ। এটি করার সুস্পষ্ট উপায় ছিল।
পিটার টেলর

সংক্ষিপ্ত হওয়ার পাশাপাশি, পোস্ট করা হয়েছে এমন বেশিরভাগ বা অন্যান্য সমাধানগুলির তুলনায় এটি অনেক দ্রুত much
মাইকেল স্টার্ন

1

সি # 140 129 অক্ষর

double n=3,d=1,e=d;while(n<4e5){double w=n/d-Math.PI,a=Math.Abs(w);if(a<e){e=a;Console.WriteLine(n+"/"+d);}if(w>0)d++;else n++;}

সঙ্কুচিত কোড

var numerator = 3d;
var denominator = 1d;
var delta = 4d;
while (numerator < 4e5) 
{
    var newDelta = (numerator / denominator) - Math.PI;
    var absNewDelta = Math.Abs(newDelta);
    if (absNewDelta < delta)
    {
        delta = absNewDelta;
        Console.WriteLine(string.Format("{0}/{1}", numerator, denominator));
    }

    if (newDelta > 0)
    {
        denominator++;
    }
    else
    {
        numerator++;
    }
}

2
varসবসময় আপনার বন্ধু হয় না। এটিকে আপনার পক্ষে সরিয়ে দিয়ে doubleঘোষণাগুলির সংশ্লেষ করার ক্ষমতা অর্জন করুন, দ্বৈত আক্ষরিক ব্যবহারের প্রয়োজনীয়তা হারাবেন এবং 16 টি অক্ষর সংরক্ষণ করতে পারবেন। প্রশ্নটি কোনও প্রোগ্রামের জন্য জিজ্ঞাসা করে, সুতরাং আপনি একটি শ্রেণীর ঘোষণা এবং একটি Mainপদ্ধতি যুক্ত করতে কিছু হারাবেন ।
পিটার টেলর

1

জে, 69 65

নতুন

]`,@.(<&j{.)/({~(i.<./)@j=.|@-l)@(%~(i:3x)+<.@*l=.1p1&)"0>:_i.1e3

এখনও একটি নিষ্ঠুর বলের পদ্ধতির তবে অনেক দ্রুত এবং একটি বাচ্চা খাটো।

পুরাতন

একটি সাধারণ "বর্বর শক্তি":

(#~({:<<./@}:)\@j)({~(i.<./)@j=.|@-l)@(%~(i:6x)+<.@*l=.1p1&)"0>:i.1e3

একটি তালিকা তৈরি a/bs এবং তারপর ঐ যে কিছু π থেকে অধিকতর হয় বাতিল b'<b

নোট: পরিবর্তন 1e3করতে 1e6সম্পূর্ণ তালিকার জন্য। যান অন্য কিছু করুন এবং পরে ফিরে আসুন।

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