Combien de chiffres significatifs?

10

Étant donné un nombre en entrée, déterminez le nombre de chiffres significatifs dont il dispose. Ce nombre doit être considéré comme une chaîne car vous devez effectuer un formatage spécial. Vous verrez ce que je veux dire bientôt (je pense).

Un chiffre est un sig-fig si au moins l'une des conditions suivantes s'applique:

  • Les chiffres non nuls sont toujours significatifs.
  • Tous les zéros entre deux chiffres significatifs sont significatifs.
  • le zéro final ou les zéros de fin dans la partie décimale uniquement sont significatifs.
  • tous les chiffres sont significatifs si rien ne suit la décimale.
  • lorsqu'il n'y a que des zéros, tous sauf le dernier zéro sont considérés comme des zéros de tête

Contribution

Une chaîne ou un tableau de chaînes du nombre. Il peut y avoir un point décimal à la fin sans chiffre après. Il pourrait ne pas avoir de point décimal du tout.

Production

Combien de sig-figs il y a.

Exemples

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
la source
liés mais a) n'a pas de réponses et b) concerne le calcul de la réponse à une expression
Daniel
En relation
Adnan
Vous voudrez peut-être mentionner explicitement quelque part que s'il n'y a que des zéros, tous, sauf le dernier zéro, sont considérés comme des chiffres de début (par opposition à tous, sauf le premier zéro étant considérés comme des chiffres de fin).
Martin Ender
Pourquoi 0,00 -> 1? Les deux zéros suivant le point décimal ne sont-ils pas significatifs (selon "le zéro final ou les zéros de fin dans la partie décimale seulement sont significatifs").
Penguino
@Penguino, comme Martin Ender l'a correctement dit, s'il n'y a que des 0, tous, sauf le dernier chiffre, sont considérés comme des zéros de tête
Daniel

Réponses:

1

Lot, 204 202 octets

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

Prend entrée sur STDIN. Fonctionne en supprimant les zéros de fin si le nombre ne contient pas de a ., puis en supprimant les .zéros de début et de fin, à moins qu'il n'y ait que des zéros, auquel cas il laisse un zéro. Enfin, il prend la longueur de la chaîne restante.

Neil
la source
Je n'ai jamais vu autant de %s de toute ma vie: O
user41805
1
@KritixiLithos J'ai réussi 16 sur une seule ligne avant: codegolf.stackexchange.com/a/86608/17602
Neil
0

Scala, 90 octets

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

Explication:

& =>               //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
la source
0

C # 6, 163 octets

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

Non golfé

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 Ng
la source