Kaç önemli figür?


10

Girdi olarak bir sayı verildiğinde, kaç önemli rakamı olduğunu belirleyin. Bazı özel biçimlendirme yapmanız gerektiğinden, bu sayı dize olarak alınmalıdır. Yakında ne demek istediğimi göreceksin (sanırım).

Aşağıdakilerden en az biri geçerliyse, rakam bir sig-incirdir:

  • Sıfır olmayan rakamlar her zaman önemlidir.
  • İki anlamlı basamak arasındaki sıfırlar önemlidir.
  • yalnızca ondalık kısımdaki son sıfır veya sondaki sıfırlar önemlidir.
  • ondalık basamaktan sonra hiçbir şey gelmezse tüm basamaklar önemlidir.
  • sadece sıfır olduğunda, son sıfır hariç tümü sıfır olarak kabul edilir

Giriş

Sayının dize veya dize dizisi. Sonunda ondalık işareti olabilir ve sonrasında rakam olmadan olabilir. Hiç ondalık noktası olmayabilir.

Çıktı

Kaç tane sig-incir var.

Örnekler

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

ilgili ama a) cevapları yok ve b) bir ifadeye verilen cevabı hesaplamakla ilgilidir
Daniel


Açıkça bir yerde, sadece sıfır varsa, o zaman son sıfır hariç tümünün önde gelen basamak olarak kabul edildiğini (ilk sıfır hariç tümünün tersi olarak sayılan basamak olarak kabul edildiğini) belirtmek isteyebilirsiniz.
Martin Ender

Neden 0.00 -> 1? Ondalık noktasını izleyen iki sıfır önemli değil mi ("yalnızca ondalık kısımdaki son sıfır veya sondaki sıfırlar önemlidir).
Penguino

@Penguino, Martin Ender'in doğru olarak söylediği gibi, sadece 0'lar varsa, son rakam hariç tümü önde gelen sıfırlar olarak kabul edilir
Daniel

Yanıtlar:




1

Toplu, 204202 bayt

@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 üzerine girdi alır. Sayı bir içermiyorsa sondaki sıfırları kaldırarak çalışır ., daha sonra .yalnızca sıfır olmadığı sürece ve baştaki sıfırları kaldırarak çalışır , bu durumda bir sıfır bırakır. Son olarak, kalan dizenin uzunluğunu alır.


Hayatım boyunca hiç bu kadar çok %s görmedim : O
user41805

1
@KritixiLithos Daha önce bir satırda 16'yı yönettim
Neil

0

Scala, 90 bayt

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

Açıklama:

& =>               //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 bayt

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.