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

terkait tetapi a) tidak memiliki jawaban dan b) adalah tentang menghitung jawaban atas suatu ungkapan
Daniel


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


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.


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

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.