Ile znaczących liczb?

10

Biorąc pod uwagę liczbę jako dane wejściowe, określ, ile ma znaczących liczb. Liczba ta powinna być traktowana jako ciąg znaków, ponieważ musisz wykonać specjalne formatowanie. Wkrótce zobaczysz, co mam na myśli (tak myślę).

Cyfra to sig-fig, jeśli ma zastosowanie co najmniej jedna z następujących czynności:

  • Cyfry niezerowe są zawsze znaczące.
  • Wszelkie zera między dwiema cyframi znaczącymi są znaczące.
  • końcowe zero lub końcowe zera tylko w części dziesiętnej są znaczące.
  • wszystkie cyfry są znaczące, jeśli nic nie następuje po przecinku.
  • gdy są tylko zera, wszystkie oprócz ostatniego zera są uważane za zera wiodące

Wejście

Ciąg lub tablica ciągów liczby. Może mieć na końcu kropkę dziesiętną bez cyfry po nim. Może w ogóle nie mieć przecinka dziesiętnego.

Wynik

Ile jest sig-fig.

Przykłady

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
źródło
powiązane, ale a) nie ma odpowiedzi, a b) dotyczy obliczenia odpowiedzi na wyrażenie
Daniel,
Powiązane
Adnan
Możesz wyraźnie wspomnieć gdzieś, że jeśli są tylko zera, to wszystkie oprócz ostatniego zera są uważane za cyfry wiodące (w przeciwieństwie do wszystkich oprócz pierwszego zera, za cyfry końcowe).
Martin Ender
Dlaczego 0,00 -> 1? Czy dwa zera następujące po przecinku nie są znaczące (zgodnie z „końcowe zero lub końcowe zera w części dziesiętnej są znaczące”).
Penguino,
@Penguino, jak słusznie powiedział Martin Ender, jeśli są tylko zera, wszystkie z wyjątkiem ostatniej cyfry są uważane za zera wiodące
Daniel

Odpowiedzi:

1

05AB1E , 11 10 bajtów

D.ïi0Ü}þïg

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

D            # duplicate
 .ïi  }      # if it is an integer
    0Ü       # remove trailing zeroes
       þ     # remove the "." if present
        ï    # convert to int
         g   # length
Emigna
źródło
1

Partia, 204 202 bajtów

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

Pobiera dane wejściowe na STDIN. Działa poprzez usuwanie końcowych zer, jeśli liczba nie zawiera a ., a następnie usuwanie .zer wiodących, chyba że są tylko zera, w którym to przypadku pozostawia jedno zero. Wreszcie zajmuje długość pozostałego ciągu.

Neil
źródło
Nigdy w życiu nie widziałem tylu %s: O
user41805
1
@KritixiLithos Zarządzałem wcześniej 16 w jednej linii: codegolf.stackexchange.com/a/86608/17602
Neil
0

Scala, 90 bajtów

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

Wyjaśnienie:

& =>               //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
źródło
0

C # 6, 163 bajty

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

Nie golfił

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"
Link nr
źródło