मेरे वर्गों को लगभग


10

से प्रेरित होकर इस वीडियो द्वारा tecmath

किसी भी संख्या के वर्गमूल का xएक पूर्णांक पूर्णांक वर्गमूल s(जैसे कि सबसे बड़ा पूर्णांक s * s ≤ x) और फिर गणना करके पाया जा सकता है s + (x - s^2) / (2 * s)। आइए हम इस सन्निकटन को कहते हैं S(x)। (नोट: यह न्यूटन-रैपसन विधि के एक चरण को लागू करने के बराबर है)।

हालांकि इसमें क्वर्क होता है, जहां S (n ^ 2 - 1) हमेशा n (n ^ 2) रहेगा, लेकिन आम तौर पर यह बहुत सटीक होगा। कुछ बड़े मामलों में, इसमें> 99.99% सटीकता हो सकती है।

इनपुट और आउटपुट

आप किसी भी सामान्य प्रारूप में एक नंबर लेंगे।

उदाहरण

प्रारूप: इनपुट -> आउटपुट

2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37               // actually 4.37       + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91               // actually 6.91       + 1/300
57 -> 7.57               // actually 7.57       + 1/700
2612 -> 51.10            // actually 51.10      + 2/255
643545345 -> 25368.19    // actually 25,368.19  + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481

विशेष विवरण

  • आपका आउटपुट कम से कम निकटतम सौवें पर होना चाहिए (अर्थात यदि उत्तर 47.2851 है, तो आप 47.29 आउटपुट कर सकते हैं)

  • यदि आपके उत्तर में एक संपूर्ण संख्या है (यानी 125.00 को 125 और 125.0 के रूप में भी आउटपुट किया जा सकता है) तो आपके आउटपुट में निम्न शून्य और दशमलव बिंदु नहीं होना चाहिए।

  • आपको 1 से नीचे किसी भी संख्या का समर्थन करने की आवश्यकता नहीं है।

  • आपको गैर-पूर्णांक इनपुट का समर्थन करने की आवश्यकता नहीं है। (यानी 1.52 आदि ...)

नियम

मानक ढीले निषिद्ध हैं।

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



3
नोट:s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
जुंगह्वान मिन ऑक्ट


क्या कम से कम 2 अंकों के लिए सटीक होना आवश्यक है?
पूरी तरह से

@totallyhuman हाँ। 47.2851 को 47.28 के रूप में दर्शाया जा सकता है, लेकिन अधिक गलत नहीं है।
स्टेन स्ट्रम

जवाबों:


2

जेली ,  8  7 बाइट्स

ओलिवियर ग्रेजायर के सरलीकृत गणितीय सूत्र के लिए -1 बाइट धन्यवाद - उनके जावा उत्तर को देखें

÷ƽ+ƽH

इसे ऑनलाइन आज़माएं!

कैसे?

÷ƽ+ƽH - Link: number, n
 ƽ     - integer square root of n  -> s
÷       - divide                    -> n / s
    ƽ  - integer square root of n  -> s
   +    - add                       -> n / s + s
      H - halve                     -> (n / s + s) / 2

7 बाइट्स: ÷ƽ+ƽHपहली बार जेली का उपयोग करने की कोशिश कर रहा हूं तो मैं गलत हो सकता हूं। काश, मैं यह जानता कि कैसे स्टोर करना है ƽ, हालांकि, इसे दोहराना नहीं। यह एक और बाइट बचा सकता है।
ओलिवियर ग्रेगोइरे

धन्यवाद @ ओलिवियरग्रेयर! ƽɓ÷⁹+Hपूर्णांक रूट को पुनर्गणना नहीं करेगा, लेकिन यह भी 7. ɓबदली हुई दलीलों के साथ एक नई dyadic श्रृंखला शुरू करता है और फिर उस श्रृंखला के सही तर्क (यानी का परिणाम ƽ) को संदर्भित करता है । ƽɓ÷+⁹Hयहां भी काम करेंगे।
जोनाथन एलन


4

जावा (ओपनजेडके 8) , 32 बाइट्स

n->(n/(n=(int)Math.sqrt(n))+n)/2

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण

कोड इसके बराबर है:

double approx_sqrt(double x) {
  double s = (int)Math.sqrt(x);  // assign the root integer to s
  return (x / s + s) / 2
}

पीछे गणित:

s + (x - s²) / (2 * s)  =  (2 * s² + x - s²) / (2 * s)
                        =  (x + s²) / (2 * s)
                        =  (x + s²) / s / 2
                        =  ((x + s²) / s) / 2
                        =  (x / s + s² / s) / 2
                        =  (x / s + s) / 2

यह विनिर्देश को संभालने के लिए प्रकट नहीं होता है: आपका आउटपुट कम से कम निकटतम सौवें दौर में होना चाहिए
Ayb4btu

2
खैर, यह निकटतम सौवें से कम करने के लिए गोल है, इसलिए यह पूरी तरह से वैध है।
ओलिवियर ग्रेजायर

आह, मैं देख रहा हूं, मेरी गलतफहमी।
अयब ४ बट्टू २

4

पायथन 2 , 47 ... 36 बाइट्स

-3 बाइट्स का शुक्रिया @JungHwanMin
-1 बाइट की बदौलत @HyperNeutrino
-2 बाइट्स का शुक्रिया @JonathanFrech
-3 बाइट्स का शुक्रिया @ OlivierGrégoire

def f(x):s=int(x**.5);print(x/s+s)/2

इसे ऑनलाइन आज़माएं!


-2 बाइट्स: s+(x-s*s)/s/2से(x+s*s)/s/2
जुंगवान मिन ऑक्ट

एक फ़ंक्शन का उपयोग करते हुए -2 बाइट्स
हाइपरन्यूट्रिनो

@ हीपरनेट्रिनो मुझे केवल 1 बाइट
ओवस

ओह क्षमा करें, मैंने गलती से एक चरित्र को परीक्षण के बाद हटा दिया और फिर बाइट्स को गिना: पी हां सिर्फ -1
येह

आप छोड़ नहीं सकते +.0और की जगह /s/2के साथ/2./s दो बाइट की बचत के ?
जोनाथन फ्रीच


3

आर, 43 बाइट्स 29 बाइट्स

x=scan()
(x/(s=x^.5%/%1)+s)/2

नए समीकरण के लिए @Giuseppe का धन्यवाद और पूर्णांक विभाजन समाधान के साथ 12 बाइट्स के गोल्फिंग में मदद। स्कैन के लिए फ़ंक्शन कॉल को स्वैप करके, मैंने एक और युगल बाइट्स को गोल्फ दिया।

इसे ऑनलाइन आज़माएं!


1
35 बाइट्स ; अधिक सामान्यतः, आप TIO के "हेडर" फ़ील्ड का उपयोग कर सकते हैं और f <- फ़ंक्शन असाइन करने के लिए एक डाल सकते हैं। लेकिन फिर भी, अच्छा समाधान, सुनिश्चित करें कि आप मौका मिलने पर आर में गोल्फ के लिए टिप्स पढ़ें !
Giuseppe



2

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

x=>(s=x**.5|0)/2+x/s/2

हमें वास्तव में एक मध्यवर्ती चर की आवश्यकता नहीं है, इसलिए इसे वास्तव में इस प्रकार लिखा जा सकता है:

x=>x/(x=x**.5|0)/2+x/2

परीक्षण के मामलों


2

सी, 34 बाइट्स

@Olivier Grégoire को धन्यवाद!

s;
#define f(x)(x/(s=sqrt(x))+s)/2

केवल floatइनपुट्स के साथ काम करता है।

इसे ऑनलाइन आज़माएं!

सी,  41   39  37 बाइट्स

s;
#define f(x).5/(s=sqrt(x))*(x+s*s)

इसे ऑनलाइन आज़माएं!

C,  49   47   45  43 बाइट्स

s;float f(x){return.5/(s=sqrt(x))*(x+s*s);}

इसे ऑनलाइन आज़माएं!


@ बिंगवान मिन को दो बाइट बचाने के लिए धन्यवाद!


1
47 बाइट्स ; संपादित करें: धन्यवाद, लेकिन क्रेडिट @JungHwanMin कि खोजने के लिए।
स्टेन स्ट्रोम



2

AWK , 47 44 38 बाइट्स

{s=int($1^.5);printf"%.2f",$1/2/s+s/2}

इसे ऑनलाइन आज़माएं!

नोट: TIO की तरह के लिए 2 अतिरिक्त बाइट्स है \n आउटपुट प्रीटियर बनाने के । :)

ऐसा लगता है कि वर्गमूल को खोजने के लिए sqrt का उपयोग करने के लिए थोड़ा सा धोखा दिया जा सकता है, इसलिए यहां कुछ और बाइट्स के साथ एक संस्करण है जो नहीं करता है।

{for(;++s*s<=$1;);s--;printf("%.3f\n",s+($1-s*s)/(2*s))}

इसे ऑनलाइन आज़माएं!


1
अच्छी तरह से आप कह सकते हैं कि यह AWKward है। मैं खुद को दिखाऊंगा। संपादित करें: मूल रूप से मैंने sqrt का उपयोग करते हुए इस प्रश्न के लिए योजना बनाई थी, लेकिन बहुत सारे उत्तर हैं और यदि मैं इसे बदल देता हूं तो मुझे बहुत बुरा लगेगा।
स्टेन स्ट्रम

'एडब्ल्यूके' सजा मजेदार हैं :)
रॉबर्ट बेन्सन

इसके बजाय sqrt($1)आप का उपयोग कर सकते हैं$1^.5
Cabbie407

धन्यवाद @ Cabbie407 पता नहीं क्यों मैंने ऐसा नहीं सोचा था।
रॉबर्ट बेन्सन

1
आपका स्वागत है। कुछ अन्य चीजें: आपको \nआउटपुट प्राप्त करने की आवश्यकता नहीं है , awk में प्रिंटफ को कोष्ठक की आवश्यकता नहीं है और सूत्र को छोटा किया जा सकता है s/2+$1/s/2, जिसके परिणामस्वरूप {s=int($1^.5);printf"%.2f",s/2+$1/s/2}। क्षमा करें यदि यह टिप्पणी अशिष्ट लगती है।
कैबी 407

1

रैकेट , 92 बाइट्स

टिप्पणी अनुभाग में टिप के लिए @JungHwan मिन का धन्यवाद

(λ(x)(let([s(integer-sqrt x)])(~r(exact->inexact(/(+ x(* s s))(* 2 s)))#:precision'(= 2))))

इसे ऑनलाइन आज़माएं!

Ungolfed

(define(fun x)
  (let ([square (integer-sqrt x)])
    (~r (exact->inexact (/ (+ x (* square square)) (* 2 square)))
        #:precision'(= 2))))

1

पॉवरशेल , 54 बाइट्स

param($x)($x+($s=(1..$x|?{$_*$_-le$x})[-1])*$s)/(2*$s)

इसे ऑनलाइन आज़माएं! या कुछ परीक्षण मामलों को सत्यापित करें

इनपुट लेता है $xऔर फिर वही करता है जो अनुरोध किया जाता है। |?बात यह है कि अधिक से अधिक पूर्णांक पाता है, जब चुकता है, -lईएसएस-से-या- eइनपुट करने के लिए qual $x, तो हम आवश्यक परिकलन। आउटपुट निहित है।


वाह। मैं कभी भी यह समझने में सक्षम नहीं हुआ कि लोग Windows Powershell
Stan Strum

@StanStrum आप अकेले नहीं हैं, योग्य हैं। : D
AdmBorkBork

1

भूसी , 9 बाइट्स

½Ṡ§+K/(⌊√

इसे ऑनलाइन आज़माएं!

इस उत्तर में अभी भी कुछ बदसूरत है, लेकिन मुझे इसका कोई हल नहीं मिल रहा है।

व्याख्या

मैं न्यूटन के एल्गोरिथ्म के एक चरण को लागू कर रहा हूं (जो इस प्रश्न में प्रस्तावित एक के बराबर है)

½Ṡ§+K/(⌊√
  §+K/       A function which takes two numbers s and x, and returns s+x/s
 Ṡ           Call this function with the input as second argument and
      (⌊√    the floor of the square-root of the input as first argument
½            Halve the final result

मुझे लगता है कि आप वास्तविक विभाजन चाहते हैं, बजाय÷
H.PWiz

@ H.PWiz वूप्स, मैं करता हूं, धन्यवाद। अन्य समाधानों को खोजने के लिए एक प्रयोग से यह बना रहा
सिंह

1

पाइट , 11 10 बाइट्स

←Đ√⌊Đ↔⇹/+₂

व्याख्या

code                explanation                        stack
←                   get input                          [input]
 Đ                  duplicate ToS                      [input,input]
  √⌊                calculate s                        [input,s]
    Đ               duplicate ToS                      [input,s,s]
     ↔              reverse stack                      [s,s,input]
      ⇹             swap ToS and SoS                   [s,input,s]
       /            divide                             [s,input/s]
        +           add                                [s+input/s]
         ₂          halve                              [(s+input/s)/2]
                    implicit print

बस यह देखा और यह एक अच्छा मिनट था जब तक मुझे एहसास हुआ कि यह पायथ नहीं है। बहुत बढ़िया जवाब।
स्टेन स्ट्रम

हाँ, यह थोड़ी सी भाषा है जिसके बारे में मैं कुछ समय से सोच रहा था और बस वास्तव में बनाने का फैसला किया।
मडकिप २०

क्या टॉप-ऑफ-स्टैक ... और यदि हां, तो क्या है?
स्टेन स्ट्रम

ToS स्टैक के ऊपर है, और
SoS

अच्छा, मैं देखूंगा कि क्या मैं इस भाषा में बोल सकता हूं; मुझें यह पसंद है!
स्टेन स्ट्रम

1

आकाशगंगा , 17 14 बाइट्स

ओलिवियर ग्रेजायर के सूत्र का उपयोग करके -3 बाइट्स

^^':2;g:>/+2/!

इसे ऑनलाइन आज़माएं!

व्याख्या

code              explanation                   stack layout

^^                clear preinitialized stack    []
  ':              push input and duplicate it   [input, input]
    2;            push 2 and swap ToS and SoS   [input, 2, input]
      g           nth root                      [input, s=floor(sqrt(input))]
       :          duplicate ToS                 [input, s, s]
        >         rotate stack right            [s, input, s]
         /        divide                        [s, input/s]
          +       add                           [s+input/s]
           2/     divide by 2                   [(s+input/s)/2]
             !    output                        => (s+input/s)/2

छत के बजाय फर्श नहीं होना चाहिए?
मडकिप २०

@ mudkip201 अपडेट, धन्यवाद
ovs

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