Berapa angka signifikan?

10

Diberi nomor sebagai input, tentukan berapa banyak angka signifikan yang dimilikinya. Nomor ini harus diambil sebagai string karena Anda harus melakukan beberapa format khusus. Anda akan melihat apa yang saya maksud segera (saya pikir).

Digit adalah sig-fig jika setidaknya salah satu dari yang berikut ini berlaku:

  • Digit bukan nol selalu signifikan.
  • Setiap nol di antara dua digit signifikan adalah signifikan.
  • nol akhir atau nol tambahan di bagian desimal hanya signifikan.
  • semua digit signifikan jika tidak ada yang mengikuti tempat desimal.
  • ketika hanya ada nol, semua kecuali nol terakhir dianggap nol

Memasukkan

String atau string array nomor. Mungkin memiliki titik desimal di bagian akhir tanpa angka setelahnya. Mungkin tidak memiliki titik desimal sama sekali.

Keluaran

Ada berapa banyak ara-ara.

Contohnya

1.240 -> 4
0. -> 1
83900 -> 3
83900.0 -> 6
0.025 -> 2
0.0250 -> 3
2.5 -> 2
970. -> 3
0.00 -> 1
Daniel
sumber
terkait tetapi a) tidak memiliki jawaban dan b) adalah tentang menghitung jawaban atas suatu ungkapan
Daniel
Terkait
Adnan
Anda mungkin ingin menyebutkan secara eksplisit di suatu tempat bahwa jika hanya ada nol maka semua kecuali nol terakhir dianggap digit terdepan (sebagai lawan dari semua kecuali nol pertama dianggap tertinggal digit).
Martin Ender
Mengapa 0,00 -> 1? Bukankah kedua nol yang mengikuti titik desimal signifikan (menurut "nol akhir atau tertinggal di bagian desimal hanya signifikan").
Penguino
@Penguino, seperti yang dikatakan Martin Ender dengan benar, jika hanya ada 0, semua digit terakhir dianggap nol
Daniel

Jawaban:

1

05AB1E , 11 10 byte

D.ïi0Ü}þïg

Cobalah online! atau sebagai Test suite

Penjelasan

D            # duplicate
 .ïi  }      # if it is an integer
    0Ü       # remove trailing zeroes
       þ     # remove the "." if present
        ï    # convert to int
         g   # length
Emigna
sumber
4

Retina, 29 27 byte

Disimpan 2 byte berkat @MartinEnder

^0\.0*.|^\d(\d*?)0+$
1$1
\d

Cobalah online! | Suite uji

Produksi ETH
sumber
1

Batch, 204 202 byte

@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%

Mengambil input pada STDIN. Bekerja dengan menghapus nol trailing jika nomor tidak mengandung ., lalu menghapus .nol dan memimpin, kecuali hanya ada nol, dalam hal ini meninggalkan nol. Akhirnya dibutuhkan panjang dari string yang tersisa.

Neil
sumber
Saya belum pernah melihat begitu banyak %dalam seumur hidup saya: O
user41805
1
@KritixiLithos Saya sudah mengelola 16 pada satu baris sebelumnya: codegolf.stackexchange.com/a/86608/17602
Neil
0

Scala, 90 byte

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

Penjelasan:

& =>               //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
corvus_192
sumber
0

C # 6, 163 byte

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

Tidak disatukan

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"
Tautan Ng
sumber