Quantos números significativos?

10

Dado um número como entrada, determine quantos números significativos ele possui. Esse número deve ser tomado como uma sequência, porque você precisa fazer alguma formatação especial. Você verá o que quero dizer em breve (eu acho).

Um dígito é um símbolo se pelo menos um dos seguintes itens se aplicar:

  • Dígitos diferentes de zero são sempre significativos.
  • Quaisquer zeros entre dois dígitos significativos são significativos.
  • zero final ou zeros à direita na parte decimal são significativos.
  • todos os dígitos são significativos se nada seguir a casa decimal.
  • quando houver apenas zeros, todos, exceto o último zero, são considerados zeros iniciais

Entrada

Uma string ou matriz de strings do número. Pode ter um ponto decimal no final sem um dígito depois dele. Pode não ter um ponto decimal.

Resultado

Quantos sig-figs existem.

Exemplos

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
fonte
relacionado , mas a) não tem respostas e b) é sobre como calcular a resposta a uma expressão
Daniel
Relacionado
Adnan
Você pode mencionar explicitamente em algum lugar que, se houver apenas zeros, todos, exceto o último zero, serão considerados dígitos iniciais (em oposição a todos, exceto o primeiro zero, sendo considerados dígitos finais).
Martin Ender
Por que 0.00 -> 1? Os dois zeros após o ponto decimal não são significativos (de acordo com "zero final ou zeros à direita na parte decimal são significativos apenas").
Penguino
@Penguino, como Martin Ender disse corretamente, se houver apenas 0s, todos, exceto o último dígito, serão considerados zeros à esquerda
Daniel

Respostas:

1

05AB1E , 11 10 bytes

D.ïi0Ü}þïg

Experimente online! ou como um conjunto de testes

Explicação

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

Retina, 29 27 bytes

Guardado 2 bytes graças a @MartinEnder

^0\.0*.|^\d(\d*?)0+$
1$1
\d

Experimente online! | Suíte de teste

ETHproductions
fonte
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%

Recebe entrada em STDIN. Funciona removendo zeros à direita se o número não contiver a ., removendo os .zeros à esquerda e à esquerda, a menos que haja apenas zeros, nesse caso, ele deixa um zero. Finalmente, leva o comprimento da string restante.

Neil
fonte
Eu nunca vi tantos %s em toda a minha vida: O
user41805
11
@KritixiLithos eu consegui 16 em uma linha 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

Explicação:

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

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"
Ng do link
fonte