¿Cuántas cifras significativas?

10

Dado un número como entrada, determine cuántas cifras significativas tiene. Este número debe tomarse como una cadena porque debe hacer un formato especial. Verás lo que quiero decir pronto (creo).

Un dígito es un sig-fig si se aplica al menos uno de los siguientes:

  • Los dígitos distintos de cero son siempre significativos.
  • Cualquier ceros entre dos dígitos significativos son significativos.
  • el cero final o los ceros finales en la porción decimal solo son significativos.
  • todos los dígitos son significativos si nada sigue al lugar decimal.
  • cuando solo hay ceros, todos menos el último cero se consideran ceros iniciales

Entrada

Una cadena o conjunto de cadenas del número. Puede tener un punto decimal al final sin un dígito después. Puede que no tenga un punto decimal en absoluto.

Salida

¿Cuántos higos hay?

Ejemplos

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
fuente
relacionado pero a) no tiene respuestas yb) se trata de calcular la respuesta a una expresión
Daniel
Relacionado
Adnan
Es posible que desee mencionar explícitamente en alguna parte que si solo hay ceros, todos menos el último cero se consideran dígitos iniciales (a diferencia de todos, excepto el primer cero, que se consideran dígitos finales).
Martin Ender
¿Por qué 0.00 -> 1? ¿No son significativos los dos ceros que siguen al punto decimal (según "el cero final o los ceros finales en la porción decimal solo son significativos")?
Penguino
@Penguino, como dijo Martin Ender correctamente, si solo hay 0s, todos menos el último dígito se consideran ceros a la izquierda
Daniel

Respuestas:

1

Lote, 204 202 bytes

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

Toma entrada en STDIN. Funciona eliminando los ceros finales si el número no contiene a ., luego elimina los .ceros y los ceros iniciales, a menos que solo haya ceros, en cuyo caso deja un cero. Finalmente toma la longitud de la cadena restante.

Neil
fuente
Nunca he visto tantos %
correos electrónicos
1
@KritixiLithos He logrado 16 en una línea antes: codegolf.stackexchange.com/a/86608/17602
Neil
0

Scala, 90 bytes

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

Explicación:

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

C # 6, 163 bytes

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

Sin 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"
Enlace Ng
fuente