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

relacionado , mas a) não tem respostas e b) é sobre como calcular a resposta a uma expressão
Daniel


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

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.


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

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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.