n Sigイチジクへのラウンド


20

チャレンジ

数を考えるxと数n、ラウンド数xn大きな数字と出力結果を。

有効数字

数値の有効数字は、その測定分解能に寄与する意味を持つ数字です。これには、先行ゼロを除くすべての数値が含まれます。

小数点以下の先行ゼロはまだ重要ではないことに注意してください。

数字を丸めるときに、次の数字が5以上の場合は、ゼロから丸める必要があります。

小数点の後のすべての末尾のゼロは、重要としてカウントされます。

入力

最初の数値はx、丸められる数値です。2番目の数値は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
私はそれが持っている3 SIGイチジク対2になるだけのことだとして、それは、あると信じてい@GregMartin
Suever

3
@BetaDecayいいえ、そうではありません。そのためには小数点が必要です。
mbomb007

3
「200のみONE有効数字があると考えられる」 - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLoscそのため、それが実際にとして記述された結果である場合2.0 x 10^2、2つのsigfigsを表示します。
mbomb007

回答:


3

Python 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()関数の浮動小数点の不正確さが原因です。十分に一見した場合にも、「小数点以下0桁に丸める」方法を破るテストケースを見つけることができると思われます。

したがって、私の解決策はおそらくすべての場合に100%正確ではなく、10進数で計算されない限りそうではないようです。したがって、この問題は、FP算術演算を使用するすべての言語のソリューションに影響する可能性があります。


の本体をs同じ行に配置し、セミコロンを使用して、いくつかのバイトを保存します。def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
チョイス

また、スペースを削除しimport *て作成することもできますimport*
チョイス

私の答えは大丈夫ではありません。なぜなら、「数字をn個の有効数字に丸めることができる組み込み関数とライブラリは許可されていません」というルールがあるからです。そして、あなたは= 0 nは、ラウンド関数を使用する
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バイトバージョンに属している
ヨルグHülsermann16年

ライブラリラウンドを使用しない場合はOK ....
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

説明:.パラメーターがまだない場合は、パラメーターの末尾にa を付けて開始し、(保存されている)記号と先行ゼロを削除します。結果の変数mは、結果の望ましい大きさを教えてくれるので、後で保存されます。.その後、すべてのsが削除され、さらに先行ゼロが生じる可能性があるため、それらも削除されます。nゼロに接尾辞を付けて、丸めるのに十分な桁があることを確認してから、nthおよび最初のn桁が抽出されます。nthの桁が4以下でない場合、面倒なことに小数点の後に追加します。大きさがまだ小さい場合、小数点以下のゼロを結果にコピーしますが、1に文字列にします。文字列がオーバーフローした場合、aをプレフィックスとして大きさを増やしますが、元の大きさ1よりも小さい場合0.1は、1追加したばかりの011以上の場合、回答の整数部分を抽出し、必要に応じて小数点に到達するために余分なゼロを追加します(小数点は不正確な精度を示すため削除されます)。最後に、符号、整数部分、小数点、および小数部分が連結されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.