राउंड टू एन सिग अंजीर


20

चुनौती

एक संख्या xऔर एक संख्या n, महत्वपूर्ण आंकड़ों के xलिए गोल संख्या nऔर परिणाम को देखते हुए ।

महत्वपूर्ण आंकड़े

किसी संख्या के महत्वपूर्ण आंकड़े ऐसे अंक हैं जो अर्थ को उसके मापन संकल्प में योगदान देते हैं। इसमें अग्रणी शून्य को छोड़कर सभी संख्याएं शामिल हैं ।

ध्यान रखें कि एक दशमलव बिंदु के बाद अग्रणी शून्य अभी भी नगण्य आंकड़े हैं।

यदि कोई अंक राउंडिंग कर रहा है, तो आपको शून्य से दूर राउंड करना होगा यदि निम्न अंक पांच से अधिक या बराबर है।

दशमलव बिंदु के बाद सभी अनुगामी शून्य को महत्वपूर्ण के रूप में गिना जाता है।

इनपुट

पहला नंबर होगा x, राउंड किया जाने वाला नंबर। दूसरा नंबर होगा n, आपको जितने महत्वपूर्ण आंकड़े चाहिए, उतने राउंड xलगाने चाहिए ।

x-1,000,000,000 और 1,000, 000,000 समावेशी के बीच एक संख्या होगी (आपका कोड पूर्णांक और फ्लोटिंग पॉइंट दोनों को संभालना चाहिए)। n1 और 50 समावेशी के बीच एक सकारात्मक पूर्णांक होगा। nमें अंकों के शून्य से अधिक कभी नहीं होगा x

इनपुट कभी भी 0या किसी भी रूप में नहीं होगा 0, जैसे 0.000या 000

उदाहरण

Inputs: 2.6754, 2
Output: 2.7

एक आउटपुट 2.7000अमान्य होगा क्योंकि दशमलव बिंदु के बाद अनुगामी शून्य को महत्वपूर्ण आंकड़ों के रूप में गिना जाता है।


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

ध्यान दें कि इसमें दशमलव बिंदु नहीं होना चाहिए।


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

यदि आप चाहें, तो आप 520.इसके बजाय आउटपुट कर सकते हैं लेकिन नहीं 520.0


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

नियम

बिल्ट-इन फ़ंक्शन और लाइब्रेरी जो आपको nमहत्वपूर्ण संख्याओं के लिए एक संख्या को गोल करने की अनुमति देते हैं, वे अस्वीकृत हैं।

जीतना

बाइट्स में सबसे छोटा कोड जीतता है।


4
के लिए Inputs: 520.3, 3, उत्तर में दशमलव बिंदु 520.महत्वपूर्ण नहीं है?
ग्रेग मार्टिन

5
@GregMartin मुझे विश्वास है कि यह है, क्योंकि यह केवल एक चीज है जो इसे बनाता है 3 sig अंजीर बनाम 2
स्वेपर

3
@BetaDecay नहीं यह नहीं है। उसके लिए दशमलव बिंदु आवश्यक होगा।
mbomb007

3
"200 को केवल एक महत्वपूर्ण आंकड़ा माना जाता है" - रसायन विज्ञान।
bd.psu.edu/jircitano/sigfigs.html

4
@DLosc यही कारण है कि अगर परिणाम था कि आप वास्तव में इसे लिखने के रूप में 2.0 x 10^2, 2 sigfigs दिखा रहा है।
mbomb007

जवाबों:


3

पायथन 3, 83 बाइट्स

(PHP उत्तर के समान)

from math import *
def s(x,n):
 y=10**(ceil(log10(abs(x)))-n)
 return y*round(x/y)

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

tests = [(2.6754,2), (0.00034551, 4), (50237.1238, 3),
        (2374905, 1), (543.0489, 4), (15, 1), (520.3, 3), (-53.87, 2)]

print ([s(x,n) for x,n in tests])

आउटपुट:

[2.7, 0.0003455, 50200, 2000000, 543.0, 20, 520, -54]

थोड़ा लंबा होने के अलावा, एक और दृष्टिकोण जो मैंने माना:

from math import *
def s(x,n):
 z=ceil(log10(abs(x)))
 return "%.*f"%(n-z,10**z*round(x/10**z,n))

... (15, 1) के इनपुट के लिए एक गलत आउटपुट उत्पन्न करता है:

['2.7', '0.0003455', '50200', '2000000', '543.0', '10', '520', '-54']

... round()फंक्शन में फ्लोटिंग पॉइंट इंप्रेशन के कारण । यह मेरे लिए संभावना है कि मुझे ऐसे परीक्षण मामले मिल सकते हैं जो "गोल से शून्य दशमलव स्थानों तक" को तोड़ देंगे, अगर मैं काफी कठिन लग रहा था।

इस प्रकार, यह मुझे लगता है कि मेरा समाधान शायद सभी मामलों के लिए 100% सही नहीं है और यह तब तक नहीं होगा जब तक कि इसकी गणना दशमलव में नहीं की जाती। इसलिए यह समस्या किसी भी भाषा में एफपी अंकगणित का उपयोग करने वाले समाधानों को प्रभावित कर सकती है।


sएक ही लाइन पर शरीर को रखकर कुछ बाइट्स बचाएं , फिर अर्धविरामों का उपयोग करें। def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
साइओस

इसके अलावा, आप import *इसे बनाने के लिए जगह को हटा सकते हैंimport*
Cyoce

मेरे लिए आपका जवाब ठीक नहीं है क्योंकि नियम कहते हैं: "बिल्ट-इन फ़ंक्शंस और लाइब्रेरियाँ जो आपको एक नंबर को एन महत्वपूर्ण आंकड़ों के लिए राउंड करने की अनुमति देती हैं।" और आप n = 0 के साथ राउंड फ़ंक्शन का उपयोग करते हैं
RosLuP

@RosLuP: round()फ़ंक्शन महत्वपूर्ण nस्थानों पर नहीं बल्कि दशमलव स्थानों पर घूमता है n, इसलिए इसे इस गोल्फ इवेंट के लिए अनुमति दी गई थी।
साइमन

5

PHP, 130 बाइट्स

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-ceil(log(abs($i),10))),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 133 बाइट्स महत्वपूर्ण आंकड़ों के लिए मूल्यों <1 के साथ काम करता है

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-floor(log(abs($i),10))-1),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 56 बाइट्स काम करता है लेकिन अनावश्यक ज़ीरो को छोड़ देता है

<?=round($i=$argv[1],$argv[2]-floor(log(abs($i),10))-1);

किसी ने PHP में राउंड फ़ंक्शन को चुरा लिया है या हटा दिया है! चुनौती को और दिलचस्प बनाने के लिए। 127 बाइट्स

<?=ceil($x=($i=$argv[1])*10**(($r=$argv[2])-($l=floor(log(abs($i),10))+1)))-$x<=0.5?ceil($x)*10**($l-$r):floor($x)*10**($l-$r);

यह एकरूपता शून्य को भी छोड़ देता है। यह एक ऐसा संस्करण है जहां मैं केवल मजाक के लिए PHP में देशी दौर फ़ंक्शन का उपयोग नहीं करता हूं। यह 56 बाइट संस्करण के अंतर्गत आता है, जिसे मैं पसंद करूंगा
जोर्ग हल्सरमन

ठीक है अगर लाइब्रेरी राउंड का उपयोग नहीं किया गया ....
RosLuP

3

बैच, 660 652 बाइट्स

@echo off
set m=%1.
set s=
if %m:~,1%==- set s=-&set m=%m:~1%
:m
if %m:~,1%==0 set m=%m:~1%&goto m
set d=%m:.=%
:d
if %d:~,1%==0 set d=%d:~1%&goto d
for /l %%i in (1,1,%2) do call set d=%%d%%0
call set r=%%d:~%2,1%%
call set d=%%d:~,%2%%
if %r% leq 4 goto r
set r=
:i
set/ai=1+%d:~-1%
set r=%i:~-1%%r%
set d=%d:~,-1%
if %i% leq 9 set d=%d%%r%&goto r
if not "%d%"=="" goto i
set d=1%r:~1%
set m=1%m%
set m=%m:1.0=.%
:r
if %m:~,2%==.0 set m=%m:.0=.%&set d=0%d%&goto r
set i=0
set p=.
:l
if %m:~,1%==. echo %s%%i%%p%%d%&exit/b
if %i%==0 set i=
if "%d%"=="" set d=0&set p=
set i=%i%%d:~,1%
set d=%d:~1%
set m=%m:~1%
goto l

स्पष्टीकरण: .यदि किसी के पास पहले से ही यह पैरामीटर नहीं है, तो एक प्रत्यय लगाकर शुरू होता है , फिर साइन (जो सहेजा जाता है) और किसी भी अग्रणी शून्य को ट्रिम कर देता है। परिणामी चर mको बाद के लिए सहेजा जाता है क्योंकि यह हमें परिणाम की वांछित मात्रा बताएगा। किसी भी .एस को हटा दिया जाता है, जिसके परिणामस्वरूप आगे के अग्रणी शून्य हो सकते हैं, इसलिए उन्हें भी हटा दिया जाता है। nशून्य को यह सुनिश्चित करने के लिए प्रत्यय दिया जाता है कि गोल करने के लिए पर्याप्त अंक हैं, फिर nवें और पहले nअंक निकाले जाते हैं। यदि nवें अंक 4 या उससे कम नहीं है, तो हम मुश्किल 1से स्ट्रिंग में जोड़ते हैं । यदि स्ट्रिंग ओवरफ्लो हो जाती है तो हम ए को उपसर्ग करके परिमाण को बढ़ाते हैं 1, लेकिन यदि यह मूल रूप से कम है तो 0.1हम ऐसा करते हैं कि 1हम हटाए गए को जोड़ते हैं और एक भी0दशमलव बिंदु के बाद। यदि परिमाण अभी भी कम है, 1तो हम परिणाम के दशमलव बिंदु के बाद शून्य की प्रतिलिपि बनाते हैं, हालांकि यदि यह है 1या अधिक है तो हम उत्तर के पूर्णांक भाग को निकालते हैं, यदि दशमलव बिंदु तक पहुंचने के लिए आवश्यक हो तो अतिरिक्त शून्य जोड़ते हैं (जो तब है) हटा दिया गया क्योंकि यह गलत सटीकता दिखाएगा)। अंत में हस्ताक्षर, पूर्णांक भाग, दशमलव बिंदु और दशमलव भाग समवर्ती होते हैं।

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