Сколько значимых цифр?


10

Учитывая число в качестве входных данных, определите, сколько значащих цифр оно имеет. Это число должно быть взято как строка, потому что вы должны сделать специальное форматирование. Вы поймете, что я имею в виду в ближайшее время (я думаю).

Цифра - это цифра, если применимо хотя бы одно из следующего:

  • Ненулевые цифры всегда значимы.
  • Любые нули между двумя значащими цифрами являются значимыми.
  • конечный ноль или конечные нули только в десятичной части являются значительными.
  • все цифры значимы, если после десятичного разделителя ничего не стоит.
  • когда есть только нули, все, кроме последнего нуля, считаются ведущими нулями

вход

Строка или строковый массив числа. В конце может быть десятичная точка без цифры после нее. Это может не иметь десятичной запятой вообще.

Вывод

Сколько есть сиг-фиг.

Примеры

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

связанный, но а) не имеет ответов и б) о вычислении ответа на выражение
Даниил


Вы можете где-то явно упомянуть, что если есть только нули, то все, кроме последнего нуля, считаются начальными цифрами (в отличие от всех, кроме первого нуля, считающегося конечными цифрами).
Мартин Эндер

Почему 0,00 -> 1? Не являются ли два нуля после десятичной запятой значимыми (в соответствии с «последний ноль или конечные нули только в десятичной части значимы»).
Penguino

@Penguino, как правильно сказал Мартин Эндер, если есть только 0, все, кроме последней цифры, считаются ведущими нулями
Даниил

Ответы:




1

Пакет, 204 202 байта

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

Принимает участие в STDIN. Работает, удаляя конечные нули, если число не содержит a ., затем удаляя начальные .и нули, если только нет нулей, и в этом случае он оставляет один ноль. Наконец, он принимает длину оставшейся строки.


Я никогда не видел столько %s за всю свою жизнь: O
user41805

1
@KritixiLithos Я управлял 16 на одной строке раньше: codegolf.stackexchange.com/a/86608/17602
Нил

0

Скала, 90 байт

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

Объяснение:

& =>               //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 байта

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.