有効数字はいくつですか?


10

入力として数値を与えて、それがいくつの有意な数字を持っているかを決定します。特別なフォーマットを行う必要があるため、この数値は文字列として解釈する必要があります。すぐに私の意味がわかります(私は思う)。

以下の少なくとも1つが当てはまる場合、数字はsig-figです。

  • ゼロ以外の数字は常に重要です。
  • 2つの有効数字の間のゼロはすべて有効です。
  • 小数部分の最後のゼロまたは後続のゼロのみが重要です。
  • 小数点以下に何もない場合は、すべての桁が有効です。
  • ゼロしかない場合、最後のゼロ以外はすべて先行ゼロと見なされます

入力

数値の文字列または文字列配列。末尾に小数点のない小数点がある場合があります。小数点がまったくない場合があります。

出力

いくつのsig-figsがあります。

1.240 -> 4
0. -> 1
83900 -> 3
83900.0 -> 6
0.025 -> 2
0.0250 -> 3
2.5 -> 2
970. -> 3
0.00 -> 1

関連しているが、a)回答がなく、b)式に対する回答を計算することに関するもの
Daniel


ゼロのみがある場合、最後のゼロを除くすべてが先行桁と見なされることを明示的に言及することができます(最初のゼロ以外はすべて後続桁と見なされます)。
マーティンエンダー

なぜ0.00-> 1なのですか?小数点以下の2つのゼロは有意ではありません(「小数点以下の最後のゼロまたは後続のゼロは有意である」によると)。
Penguino

@ Penguino、Martin Enderが正しく言ったように、0しかない場合、最後の数字以外はすべて先行ゼロと見なされます
Daniel

回答:




1

バッチ、204 202バイト

@set/ps=
:t
@if %s:.=%%s:~-1%==%s%0 set s=%s:~,-1%&goto t
@set s=%s:.=%
:l
@if not %s%==0 if %s:~,1%==0 set s=%s:~1%&goto l
@set n=0
:n
@if not "%s%"=="" set/an+=1&set s=%s:~1%&goto n
@echo %n%

STDINで入力を受け取ります。数値にが含まれていない場合は末尾のゼロを削除し.、次に.ゼロのみがある場合を除いて、先頭とゼロを削除します。最後に、残りの文字列の長さが使用されます。


私の%人生でこれほど多くのsを見たことがありません:O
user41805

1
@KritixiLithos以前に1行で16を管理したことがある:codegolf.stackexchange.com/a/86608/17602
Neil

0

Scala、90バイト

& =>(if(&contains 46)&filter(46!=)else&.reverse dropWhile(48==)reverse)dropWhile(48==)size

説明:

& =>               //define an anonymous function with a parameter called &
  (
  if(&contains 46) //if & contains a '.'
    &filter(46!=)    //remove all periods
  else             //else
    &.reverse        //reverse the string
    dropWhile(48==)  //remove leading zeros
    reverse          //and reverse again
  )
  dropWhile(48==) //remove leading zeros
  size            //return the length

0

C#6、163バイト

using System.Linq;
int a(string s)=>System.Math.Max(s.Contains('.')?(s[0]<'1'?s.SkipWhile(x=>x<'1').Count():s.Length-1):s.Reverse().SkipWhile(x=>x<'1').Count(),1);

未ゴルフ

int a(string s)=>                                  
    System.Math.Max(
        s.Contains('.')                                // Has decimal place?
            ?(                                         // Has decimal place!
                s[0]<'1'                               // Start with '0' or '.'?
                    ?s.SkipWhile(x=>x<'1').Count()     // Yes: Skip leading '0' and '.', then count rest... But gives 0 for "0." and "0.00"
                    :s.Length-1)                       // No: Count length without decimal place
            :s.Reverse().SkipWhile(x=>x<'1').Count()   // No decimal place: Skip trailing '0' and count rest
    ,1);                                               // For "0." and "0.00"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.