C (N) अंकों के साथ A (N) / B (N) की गणना करें


15

तीन संख्या अनुक्रमों पर विचार करें A, Bऔर C:

  • A: पुनरावृत्ति संबंधों पर आधारित एक अनुक्रम f(n) = f(n-1)+f(n-2), के साथ शुरू होता है f(1) = 3, f(2) = 4। तो, अनुक्रम इस तरह शुरू होता है:3 4 7 11 18 29 47 76 ...
  • B: समग्र संख्या , जो सभी पूर्णांक हैं जो कि primes (या 1) नहीं हैं:4 6 8 9 10 12 14 15 16 ...
  • C: पाई के अंक: 3 1 4 1 5 9 2 6 5 ...

एक सकारात्मक पूर्णांक को देखते हुए N < 50, या तो फ़ंक्शन तर्क या STDIN के रूप में, दशमलव बिंदु के बाद अंकों के A(N)/B(N)साथ अंश का दशमलव मान लौटाएं C(N)। गोलाई के सामान्य नियम लागू होते हैं (यदि N + 1'th अंक 5 या उससे अधिक है)। यदि piशून्य अंक शून्य है, तो एक पूर्णांक मुद्रित किया जाना चाहिए। वैज्ञानिक संकेतन / मानक रूप 1000 से अधिक संख्या के लिए स्वीकार किया जाता है।

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा जवाब है।

कुछ उदाहरण:

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

बेशक, मानक कोड गोल्फ नियम लागू होते हैं।

फ़ंक्शन को किसी भी आधुनिक लैपटॉप पर दो मिनट से कम समय में समाप्त करना होगा।


जब आप C(n)अंक कहते हैं , तो क्या हमें 0 की अनुगामी शामिल करना है?
माल्टीसेन

समय सीमा किस इनपुट पर लागू होती है?
डेनिस

@ डेनिस, क्या आपका मतलब है N? यदि हां, तो N = 49 तक या कुछ और?
स्टीवी ग्रिफ़िन

जावास्क्रिप्ट में 16 की एक सीमित फ्लोटिंग पॉइंट सटीकता है। विगत में आपको गलत परिणाम मिलने लगेंगे। यह ठीक है?
22

1
@vihan मेरा समाधान (अप्रकाशित एटीएम) एक स्ट्रिंग में पाई के पहले 49 अंकों को संग्रहीत करता है। और आपको परिणाम में सटीकता के 9 अंकों से अधिक की आवश्यकता नहीं है, यदि आप इसके बारे में चिंतित हैं।
ETHproductions

जवाबों:


9

पायथ, 60 57 58 बाइट्स

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

दोहन ​​परीक्षण

यह बहुत सीधा है - पी, गणना श्रृंखला और कंपोजिट, सी (एन) अंकों के लिए गोल, पैड से सी (एन) अंकों के साथ-साथ दशमलव बिंदु अंकों का स्थान, किया गया।

एक (एन): hu,eGsGQjT7

बी (एन): e.ftPZQ)

सी (एन): e/u+/*GHhyHy^TQr99ZZT

60 -> 57: पी गणना में एन = 1 विशेष मामले को साफ किया।

५n't -> ५ increased: संपूर्ण इनपुट रेंज के लिए पीआई के लिए उच्च पर्याप्त प्रीस्केशन का उपयोग नहीं किया गया था - ९९ पुनरावृत्तियों को बढ़ाकर १००० पुनरावृत्तियों तक ले आया।

गोलाई पर ध्यान दें: यह पाइथन के "निकटतम समांतर" राउंडिंग सिस्टम का उपयोग करता है, न कि ओपी द्वारा निर्दिष्ट "इनफिनिटी" सिस्टम की ओर। हालाँकि, अंतर केवल तभी मायने रखता है जब राउंडिंग पॉइंट के तुरंत बाद के अंक हैं 5000..., उदाहरण के लिए 1.25 राउंड से 1 अंक। मैंने इनपुट रेंज की जाँच की, और ऐसा कभी नहीं होता है, इसलिए सही परिणाम वापस आ जाता है।


2

PowerShell, 420 बाइट्स (ayyyyyyyyy) 378 बाइट्स

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

41 बाइट्स बचाने के लिए इसाॅक का धन्यवाद , यह गणना करने के लिए कि प्रश्न कैसे राउंडिंग करता है। इसका मतलब है कि मुझे भयावह को शामिल नहीं करना [MidpointRounding]::AwayFromZeroथा और स्पष्ट रूप से एक के रूप में डालने की आवश्यकता नहीं थी [double]

यह एक बहुत मजेदार था!

विस्तारित:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

PowerShell में पुनरावर्तन है ... धीमा, हम कहेंगे, इसलिए हमें A(N)दूसरी दिशा का निर्माण करना होगा और इसे एक सरणी में संग्रहीत करना होगा, फिर इसे अनुक्रमित करना होगा।


पुराना

इसके अलावा, पवित्र गाय, क्या उत्पादन आवश्यकताओं ने इसे मार दिया। PowerShell एक / k / एक बैंकर के राउंडिंग को निकटतम करने के लिए चूक करता है, जो राउंडिंग शैलियों[MidpointRounding]::AwayFromZero को स्विच करने के लिए असाधारण रूप से क्रिया का उपयोग करने की आवश्यकता है । उस के शीर्ष पर, हमें तब जीरो पैड पैडिंग की आवश्यकता होती है, यदि कोई हो। उन दो आवश्यकताओं को 20 बाइट्स से अंतिम बाइट्स को 102 बाइट्स (से ) तक करने के लिए संयुक्त ... वाह। [math]::Round($r,$q)$s=""+$s)


शानदार विवरण / टिप्पणी! [MidpointRounding]::AwayFromZeroअकेले के लिए 32 चार्ट लगभग बहुत अच्छा / बुरा सच है ... =)
स्टिव ग्रिफिन

1
मेरे उत्तर में राउंडिंग पर मेरा नोट देखें। PowerShell डिफ़ॉल्ट राउंडिंग ठीक होनी चाहिए।
isaacg

1

जावास्क्रिप्ट (ईएस 6), 302 बाइट्स

एक शब्द: अधूरा

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

पीआई के पहले 49 अंक एक स्ट्रिंग में संग्रहीत किए जाते हैं, और अन्य दो अनुक्रम ऑटो-जनरेट किए जाते हैं। यह लगभग आधा हो गया है; मैं (लगभग) यकीन है कि मैं इसे से बाहर एक और 50 बाइट्स निचोड़ सकता है।

सभी परीक्षण मामलों के लिए काम करता है, और बाकी के लिए काम करना चाहिए। 49 से अधिक या 0 से कम किसी भी चीज़ पर क्रैश (यह इन स्थितियों को कभी भी सामना नहीं करना चाहिए)। मैं विशेष रूप से 0 के लिए इसका परिणाम पसंद करता हूं:

NaN.

यह अधूरा क्यों है?
बीटा डेके

@ BetaDecay का मतलब है कि मैंने इसे अभी तक पूरा नहीं किया है। जैसे ही मेरे पास समय होगा मैं करूंगा।
ETHproductions

1

सप्टक, 276 236 बाइट्स

सबसे पहले मैंने सोचा था कि इन गणितीय साधनों में कुछ असीमित सटीकता का उपयोग करने के लिए (और इसके बारे में कुछ ज्ञान को ताज़ा करने के लिए) अच्छा होगा, इसलिए मैंने कुछ एल्गोरिदम लिखना शुरू किया और फिर अंत में पता चला कि piमूल्य इतना सटीक नहीं है कि मैं फिर से सरणी का उपयोग करना होगा। तो फिर से, कोई बड़ी सफलता नहीं:

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

अभी भी काफी पठनीय है, है ना?

प्रयोग

ऑक्टेव में कॉपी-पेस्ट फ़ंक्शन, cआवश्यक मान के तर्क के साथ कॉल फ़ंक्शन :

>>> c(1)
0.750
>>> c(49)
407880480.04348

अनुकूलन:

  • स्थानापन्न endif, endforऔर इसी तरह से endजिसके साथ काम करता है
  • iएक-एक बाइट को घटाकर परिवर्तनशील
  • num2str(str2num(p(A)))बकवास हटाओ :)

मुझे पसंद है कि आपने एक ऑक्टेव समाधान पोस्ट किया (मैं खुद एक MATLAB आदमी हूँ!)। ध्यान दें कि यह कोड केवल Octave है, MATLAB नहीं। MATLAB का उपयोग करता है end, नहीं endif, तो कई बाइट्स सहेजे गए हैं। यदि आप MATLAB के लिए प्रतीकात्मक टूलबॉक्स के लिए भी होते हैं, तो आप vpaपाई के लिए पर्याप्त दशमलव अंक प्राप्त करने के लिए उपयोग कर सकते हैं vpa(sym(pi),49):। मेरे पास इस लैपटॉप में नहीं है, इसलिए मुझे यकीन नहीं है कि अगर symवहाँ आवश्यक है, लेकिन वैसे भी कुछ बाइट्स =) को बचाना चाहिए और कोड गोल्फ =) में पठनीय होना जरूरी नहीं है।)
स्टीवी ग्रिफिन

x ++ भी MATLAB कमांड नहीं है। मुझे नहीं पता था कि दोनों के बीच इतने बड़े अंतर थे ... IMO, यह नहीं होना चाहिए। मुझे लगता है कि ऑक्टेव में लिखे गए सभी कोड MATLAB के लिए पोर्टेबल होने चाहिए (लेकिन जरूरी नहीं कि जिस तरह MATLAB के पास अधिक विकल्प हों)।
स्टीवी ग्रिफिन

अपना संपादन स्वीकृत किया। मेरे पास यहाँ चारों ओर मतलबी नहीं है इसलिए मैं इसका परीक्षण करने में असमर्थ था। मैं सप्तक में अधिक पाई दशमलव प्राप्त करने के लिए समाधान खोज रहा था, लेकिन दुर्भाग्य से कुछ भी नहीं था। लेकिन ommiting whileसे endwhileऔर इसी तरह काम करता है ठीक है, इसलिए मैं कुछ कम पात्रों के साथ :) जवाब को अद्यतन करने कर रहा हूँ
Jakuje
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.