Скільки значущих цифр?


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 ., потім видаляє .і ведучі нулі, якщо тільки немає нулів, і в цьому випадку воно залишає один нуль. Нарешті, вона займає довжину рядка, що залишився.


Я ніколи не бачив стільки %с у своєму житті: O
user41805

1
@KritixiLithos Мені вдалося 16 на одному рядку раніше: codegolf.stackexchange.com/a/86608/17602
Neil

0

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

Безумовно

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.