Quante cifre significative?


10

Dato un numero come input, determinare quante cifre significative ha. Questo numero dovrebbe essere preso come una stringa perché devi fare una formattazione speciale. Vedrai cosa intendo presto (penso).

Una cifra è un segno se si applica almeno una delle seguenti condizioni:

  • Le cifre diverse da zero sono sempre significative.
  • Tutti gli zeri tra due cifre significative sono significativi.
  • lo zero finale o gli zeri finali nella sola parte decimale sono significativi.
  • tutte le cifre sono significative se nulla segue il decimale.
  • quando ci sono solo zeri, tutti tranne l'ultimo sono considerati zero iniziali

Ingresso

Una stringa o una matrice di stringhe del numero. Potrebbe avere un punto decimale alla fine senza una cifra dopo di esso. Potrebbe non avere affatto un punto decimale.

Produzione

Quanti sig-fichi ci sono.

Esempi

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

correlati ma a) non ha risposte eb) riguarda il calcolo della risposta a un'espressione
Daniel


Potresti voler menzionare esplicitamente da qualche parte che se ci sono solo zeri allora tutti tranne l'ultimo zero sono considerati cifre iniziali (al contrario di tutti tranne il primo zero considerato cifre finali).
Martin Ender,

Perché 0,00 -> 1? I due zeri che seguono il punto decimale non sono significativi (secondo lo "zero finale o gli zeri finali nella parte decimale sono significativi").
Penguino,

@Penguino, come ha giustamente affermato Martin Ender, se ci sono solo 0, tutti tranne l'ultima cifra sono considerati zero iniziali
Daniel

Risposte:


1

05AB1E , 11 10 byte

D.ïi0Ü}þïg

Provalo online! o come una suite di test

Spiegazione

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


1

Lotto, 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%

Accetta input su STDIN. Funziona rimuovendo gli zeri finali se il numero non contiene a ., quindi rimuovendo gli .zeri iniziali e iniziali, a meno che non vi siano solo zeri, nel qual caso lascia uno zero. Alla fine prende la lunghezza della stringa rimanente.


Non ho mai visto così tanti %s in tutta la mia vita: O
user41805

1
@KritixiLithos Ho gestito 16 su una riga prima: codegolf.stackexchange.com/a/86608/17602
Neil

0

Scala, 90 byte

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

Spiegazione:

& =>               //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);

Ungolfed

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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.