उच्च परिशुद्धता धातु के साधन


13

पृष्ठभूमि

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

प्राकृतिक संख्या के लिए , धात्विक माध्य द्विघात समीकरण की जड़ है

जड़ें हमेशा होती हैं

लेकिन धात्विक माध्य को आमतौर पर सकारात्मक मूल के रूप में दिया जाता है। तो इस सवाल के लिए यह द्वारा परिभाषित किया जाएगा:

के लिए परिणाम प्रसिद्ध सुनहरे अनुपात है:


चुनौती

आपके कोड को 2 इनपुट लेने चाहिए: n और p (जब तक यह सुसंगत नहीं है तब तक ऑर्डर महत्वपूर्ण नहीं है)

  • n एक प्राकृतिक संख्या है जो दर्शाता है कि किस धातु का मतलब है
  • p एक प्राकृतिक संख्या है जो यह बताती है कि परिशुद्धता के कितने दशमलव स्थान हैं

आपका कोड p दशमलव स्थानों को सटीक करने के लिए nth धात्विक माध्य का उत्पादन करना चाहिए।

वैधता

यदि यह n और p के मान से 1 से 65,535 के लिए काम करता है तो आपका कोड मान्य है।

आपको फॉर्म में दशमलव का उत्पादन करना होगा

अंक (s) .digit (s) (रिक्त स्थान के बिना)

उदाहरण के लिए, 9 दशमलव स्थानों का सुनहरा मतलब है

१.६१,८०,३३,९८८

गोलाई के बिना अंतिम अंक प्रदर्शित करें, क्योंकि यह एक लंबे दशमलव विस्तार में दिखाई देगा। सुनहरे माध्य में अगला अंक एक 7 है, लेकिन उदाहरण में अंतिम 8 को 9 तक नहीं होना चाहिए।

दशमलव अंकों की संख्या p होनी चाहिए, जिसका अर्थ है कि किसी भी अनुगामी शून्य को भी शामिल किया जाना चाहिए।

फार्म के उत्तर

मान्य नहीं हैं - आपको एक दशमलव विस्तार का उपयोग करना चाहिए।

आप 1 अग्रणी न्यूलाइन तक और 1 अनुगामी न्यूलाइन तक आउटपुट कर सकते हैं। आप अंकों और एकल बिंदु / पूर्ण विराम / अवधि के अलावा किसी भी स्थान, या किसी अन्य वर्ण का उत्पादन नहीं कर सकते हैं।

स्कोर

यह मानक कोड गोल्फ है: आपका स्कोर आपके कोड में बाइट्स की संख्या है।


लीडरबोर्ड

( मार्टिन लीडरबोर्ड स्निपेट का उपयोग करते हुए )

जवाबों:


17

डीसी, १२

?kdd*4+v+2/p
  • ? स्टैक पर n और p दबाएं
  • k p पर सटीक सेट करें
  • dd डुप्लिकेट n दो बार (कुल तीन प्रतियां)
  • * गुणा * n
  • 4+ 4 जोड़ें
  • v वर्गमूल लें
  • + n जोड़ें (स्टैक पर अंतिम प्रतिलिपि)
  • 2/ 2 से विभाजित करें
  • p प्रिंट

परीक्षण का मामला:

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$

7
नौकरी के लिए सही उपकरण।
डेनिस

5
@ डेनिस को यह पहली बार मिला जब सीजेएम लगभग 3 बार है जब तक कुछ और ;-)
डिजिटल ट्रॉमा

2

आर, 116 बाइट्स

library(Rmpfr);s=scan();n=mpfr(s[1],1e6);r=(n+(4+n^2)^.5)/2;t=toString(format(r,s[2]+2));cat(substr(t,1,nchar(t)-1))

यह STDIN से दो पूर्णांक पढ़ता है और परिणाम को STDOUT में प्रिंट करता है। आप इसे ऑनलाइन आज़मा सकते हैं ।

असंगठित + स्पष्टीकरण:

# Import the Rmpfr library for arbitrary precision floating point arithmetic
library(Rmpfr)

# Read two integers from STDIN
s <- scan()

# Set n equal to the first input as an mpfr object with 1e6 bits of precision
n <- mpfr(s[1], 1e6)

# Compute the result using the basic formula
r <- (n + sqrt(4 + n^2)) / 2

# Get the rounded string representation of r with 1 more digit than necessary
t <- toString(format(r, s[2] + 2))

# Print the result with p unrounded digits
cat(substr(t, 1, nchar(t) - 1))

यदि आपके पास Rmpfrपुस्तकालय स्थापित नहीं है , तो आप कर सकते हैं install.packages("Rmpfr")और आपके सभी सपने सच हो जाएंगे।


1

गणितज्ञ, 50 बाइट्स

SetAccuracy[Floor[(#+Sqrt[4+#^2])/2,10^-#2],#2+1]&

एक अनाम फ़ंक्शन को परिभाषित करता है जो क्रम में nऔर लेता है p। मैं के Floorसाथ गोलाई को रोकने के लिए उपयोग SetAccuracyकरता हूं, जिसे मुझे दशमलव आउटपुट प्राप्त करने की आवश्यकता है।


@Arcinde मैं दुर्भाग्य से मशीन सटीक संख्याओं का उपयोग नहीं कर सकता, क्योंकि वे संभाल नहीं पाएंगे p>15
२०१२ आर्कैंपियन

1

सीजेएम, 35 बाइट्स

1'el+~1$*_2#2$2#4*+mQ+2/1$md@+s0'.t

पहले पी पढ़ता है , फिर एन

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

हम केवल n × 10 p के लिए प्रश्न से सूत्र की गणना करते हैं , परिणाम के पूर्णांक और भिन्नात्मक भाग को 10 p से विभाजित करते हैं , p अंक प्राप्त करने और डॉट द्वारा अलग किए गए भागों को प्रिंट करने के लिए अग्रणी शून्य के साथ आंशिक भाग को पैड करते हैं ।

1'e  e# Push 1 and 'e'.
l+   e# Read a line from STDIN and prepend the 'e'.
~    e# Evaluate. This pushes 10**p (e.g., 1e3 -> 1000) and n.
1$*  e# Copy 10**p and multiply it with n.
_2#  e# Copy n * 10**p and square it.
2$   e# Copy 10**p.
2#4* e# Square and multiply by 4.
+    e# Add (n * 10**p)**2 and 4 * 10**2p.
mQ   e# Push the integer part of the square root.
+2/  e# Add to n * 10**p and divide by 2.
1$md e# Perform modular division by 10**p.
@+s  e# Add 10**p to the fractional part and convert to string. 
0'.t e# Replace the first character ('1') by a dot.

1

पायथन 2, 92 बाइट्स

जैसा कि मैं अब उत्तर देख रहा हूं, ऐसा लग रहा है कि सीजेएम उत्तर भी इसी मूल विधि का उपयोग करता है। इसके लिए उत्तर की गणना करता है n*10**pऔर फिर दशमलव बिंदु में जोड़ता है। यह अविश्वसनीय रूप से अक्षम है जिस तरह से यह वर्गमूल के पूर्णांक भाग की गणना करता है (सिर्फ 1 को जोड़ने तक यह वहां तक ​​पहुंच जाता है)।

n,p=input()
e=10**p;r=0
while(n*n+4)*e*e>r*r:r+=1
s=str((n*e+r-1)/2);print s[:-p]+'.'+s[-p:]

1

PHP, 85 78 बाइट्स

echo bcdiv(bcadd($n=$argv[bcscale($argv[2])],bcsqrt(bcadd(4,bcpow($n,2)))),2);

यह BC गणित गणितीय विस्तार का उपयोग करता है , जो कुछ प्रणालियों पर उपलब्ध नहीं हो सकता है। कमांड लाइन विकल्प को निर्दिष्ट करके संकलन समय पर इसे शामिल करने की आवश्यकता है --enable-bcmath। यह हमेशा विंडोज पर उपलब्ध है और ऐसा लगता है कि यह OSX के साथ बंडल किए गए PHP संस्करण में भी शामिल है।

अपडेट :

मैंने उनकी टिप्पणियों में @blackhole द्वारा सुझाए गए सभी हैक लागू किए (धन्यवाद!) फिर मैंने $nइसके पहले उपयोग (3 और बाइट्स बचाए गए) के इनिशियलाइज़ेशन को निचोड़ लिया और अब कोड ऊपर के कोड बॉक्स में एक पंक्ति में फिट बैठता है।


@ब्लैक होल। 85, वास्तव में। मैंने शायद 86 पढ़ा है (थोड़ा बड़ा चयन किया है) और गलती से 68 लिखा था। अभी तय किया है।
अक्षीय

1
कोई दिक्कत नहीं है :)। आपके पास रास्ते से 1 बाइट कम हो सकती है: चारों ओर कोष्ठक को हटा दें echo, बस इसके बाद एक स्थान छोड़ दें।
ब्लैकहोल

1
और जब से आप bcscaleलौटने की उम्मीद करते हैं true, तो आप $n=$argv[bcscale($argv[2])];2 और बाइट्स का उपयोग और सहेज सकते हैं ।
ब्लैकहोल

यह एक अच्छा हैक है।
अक्षीय

संहिता की गंदगी एक कला है: P। ओह, पिछले एक: के bcpow($n,2)बजाय bcmul($n,$n)आप 1 बाइट बचाता है।
ब्लैकहोल

1

जे, 27 बाइट्स

4 :'}:":!.(2+x)-:y+%:4+*:y'

स्पष्टीकरण:

4 :'                      '   | Define an explicit dyad
                       *:y    | Square y
                     4+       | Add 4
                   %:         | Square root
                 y+           | Add y
               -:             | Half
      ":!.(2+x)               | Set print precision to 2+x
    }:                        | Remove last digit, to fix rounding

इसे इस तरह से कॉल करें:

    9 (4 :'}:":!.(2+x)-:y+%:4+*:y') 1
1.618033988

एक और, थोड़ा कूलर समाधान:

4 :'}:":!.(2+x){.>{:p._1,1,~-y'

जो बहुपद x ^ 2 - nx - 1. की जड़ों की गणना करता है। दुर्भाग्य से, जिस तरह से जम्मू प्रारूप परिणाम वांछित जड़ को थोड़ा लंबा कर देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.