Yuvarlak-n Sig İncir


20

Meydan okuma

Bir numara Verilen xve bir numara n, yuvarlak sayı xiçin nanlamlı rakama ve çıkış sonucu.

Önemli rakamlar

Bir sayının önemli rakamları, ölçüm çözünürlüğüne katkıda bulunan anlam taşıyan rakamlardır. Bu, baştaki sıfırlar hariç tüm sayıları içerir .

Ondalık noktadan sonra baştaki sıfırların hala önemsiz rakamlar olduğunu unutmayın.

Bir rakamı yuvarlarken, aşağıdaki rakam beşten büyük veya ona eşitse sıfırdan uzaklaşmanız gerekir.

Ondalık basamaktan sonraki tüm sıfırlar anlamlı sayılır.

Giriş

İlk sayı, xyuvarlanacak sayı olacaktır . İkinci sayı, nyuvarlamanız gereken önemli rakamların sayısı olacaktır x.

x-1.000.000.000 ve 1.000, 000.000 dahil bir sayı (kodunuz hem tamsayıları hem de kayan noktaları işlemelidir) olacaktır. n1 ile 50 arasında pozitif bir tamsayı olacaktır. nasla rakamların rahibesinden daha büyük olamaz x.

Girdi asla olmayacak 0veya herhangi bir şekilde olmayacak 0, örneğin 0.000veya 000.

Örnekler

Inputs: 2.6754, 2
Output: 2.7

Bir çıkışı 2.7000ondalık noktadan sonra arka sıfır anlamlı rakama olarak sayılır, çünkü hatalı olacaktır.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Bunun ondalık işareti olmamalıdır.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

İsterseniz 520.bunun yerine çıktı alabilirsiniz 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

kurallar

Bir sayıyı nönemli rakamlara yuvarlamanızı sağlayan yerleşik işlevlere ve kitaplıklara izin verilmez.

Kazanan

Bayt cinsinden en kısa kod kazanır.


4
Çünkü Inputs: 520.3, 3cevaptaki ondalık nokta 520.çok önemli değil mi?
Greg Martin

5
@GregMartin Ben olduğuna inanıyorum, çünkü 3 sig incir vs 2
Suever

3
@BetaDecay Hayır değil. Bunun için ondalık nokta gerekir.
mbomb007

3
"200'ün yalnızca bir anlamlı figürü olduğu kabul edilir" - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLosc Bu yüzden eğer 2.0 x 10^22 sigfigs göstererek sonuç olarak yazacak olsaydınız.
mbomb007

Yanıtlar:


3

Python 3, 83 bayt

(PHP yanıtına benzer)

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

Test senaryoları:

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])

Çıktı:

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

Biraz daha uzun olmanın yanı sıra, düşündüğüm başka bir yaklaşım:

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) girişi için yanlış çıktı üretir:

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

... round()fonksiyondaki kayan nokta belirsizliğinden dolayı . Yeterince sert göründüysem "sıfır ondalık basamağa yuvarla" yöntemini kıracak test senaryoları bulabilirim.

Dolayısıyla, bana öyle geliyor ki, çözümüm muhtemelen tüm vakalar için% 100 doğru değildir ve ondalık olarak hesaplanmadıkça olmaz. Bu nedenle bu sorun FP aritmetiği kullanan herhangi bir dildeki çözümleri etkileyebilir.


Vücudu saynı satıra koyarak ve ardından noktalı virgül kullanarak bazı baytlar kaydedin . def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

Ayrıca, bunu import *yapmak için alanı kaldırabilirsinizimport*
Cyoce

benim için cevabınız iyi değil çünkü kurallar şöyle diyor: "Bir sayıyı n önemli rakama yuvarlamanızı sağlayan yerleşik işlevlere ve kitaplıklara izin verilmiyor." Ve n = 0 ile yuvarlak fonksiyon kullanıyorsunuz
RosLuP

@RosLuP: round()İşlev önemli rakamlara ndeğil ondalık basamaklara yuvarlanır n, bu nedenle bu golf etkinliğine izin verilir.
Simon

5

PHP, 130 Bayt

<?=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 Bayt, önemli rakamlar için <1 değerleri ile çalışır

<?=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 Bayt çalışıyor ancak gereksiz sıfırları atlıyor

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

Birisi PHP'de yuvarlak işlevi çaldı veya sildi! Meydan okumayı daha ilginç hale getirmek için. 127 Bayt

<?=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);

O da gereksiz bir Zeros'u atlar. Ben sadece şaka için PHP yerli yuvarlak fonksiyon kullanmak değil bir versiyonudur. Tercih edeceğim 56 Bayt Sürümüne ait
Jörg Hülsermann

Kütüphane turu kullanmazsanız tamam ....
RosLuP

3

Toplu, 660 652 bayt

@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

Açıklama: .Önceden yoksa, parametreye a sonekini ekleyerek başlar , ardından işareti (kaydedilen) ve baştaki sıfırları keser. Sonuçta ortaya çıkan değişken mdaha sonra saklanır, çünkü bize sonucun istenen büyüklüğünü söyler. Daha .sonra herhangi bir s çıkarılır, bu da önde gelen sıfırlarla sonuçlanabilir, bu yüzden de kaldırılır. nsıfırlar, yuvarlamak için yeterli basamak, sonra nth ve ondalık noktadan sonra ilk olacak şekilde eklenir . Büyüklük hala küçükse ondalık noktadan sonra sıfırları sonuca kopyalarız, ancakn basamaklar çıkarılır. Eğer nth basamağı 4 veya daha az değilse 1, dizeye sıkıcı bir şekilde ekleriz . Dize taşarsa 1, a önekini ekleyerek büyüklüğünü artırırız , ancak başlangıçta 0.1yaptığımızdan daha az olsaydı, 1yeni ekledik ve011 veya daha fazla ise, cevabın tamsayı kısmını çıkarır ve ondalık noktaya ulaşmak için gerekirse ekstra sıfır ekleriz (daha sonra yanlış hassasiyet gösterdiğinden silinir). Son olarak işaret, tamsayı kısmı, ondalık nokta ve ondalık kısım birleştirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.