มีความหมายมากน้อยแค่ไหน?


10

กำหนดตัวเลขเป็นอินพุตพิจารณาจำนวนที่มีนัยสำคัญ หมายเลขนี้จะถูกนำมาเป็นสตริงเนื่องจากคุณต้องทำการจัดรูปแบบพิเศษบางอย่าง คุณจะเห็นสิ่งที่ฉันหมายถึงเร็ว ๆ นี้ (ฉันคิดว่า)

ตัวเลขเป็นรูป sig-fig หากมีอย่างน้อยหนึ่งอย่างต่อไปนี้:

  • ตัวเลขที่ไม่ใช่ศูนย์มีความสำคัญเสมอ
  • เลขศูนย์ใด ๆ ระหว่างเลขนัยสำคัญสองหลักนั้นมีนัยสำคัญ
  • ศูนย์สุดท้ายหรือศูนย์ต่อท้ายในส่วนทศนิยมเท่านั้นที่มีความสำคัญ
  • ตัวเลขทั้งหมดมีความสำคัญหากไม่มีสิ่งใดตามทศนิยม
  • เมื่อมีศูนย์เป็นศูนย์ทั้งหมด แต่ศูนย์สุดท้ายจะถือเป็นศูนย์นำหน้า

อินพุต

สตริงหรืออาร์เรย์สตริงของตัวเลข มันอาจมีจุดทศนิยมในตอนท้ายโดยไม่มีตัวเลขหลังจากนั้น มันอาจจะไม่มีจุดทศนิยมเลย

เอาท์พุต

มีกี่รูปซิกซิก

ตัวอย่าง

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

เกี่ยวข้องแต่ก) ไม่มีคำตอบและ b) เป็นเรื่องเกี่ยวกับการคำนวณคำตอบสำหรับนิพจน์
Daniel


คุณอาจต้องการพูดถึงอย่างชัดเจนว่าหากมีเพียงศูนย์แล้วทั้งหมด แต่ศูนย์สุดท้ายจะถือว่าเป็นตัวเลขนำหน้า (ตรงข้ามกับทั้งหมด แต่เป็นศูนย์แรกที่ถือว่าเป็นตัวเลขต่อท้าย)
Martin Ender

ทำไม 0.00 -> 1 ไม่ใช่สองศูนย์ต่อจากจุดทศนิยมอย่างมีนัยสำคัญ (ตาม "ศูนย์สุดท้ายหรือศูนย์ต่อท้ายในส่วนทศนิยมเท่านั้นที่สำคัญ")
Penguino

@Penguino อย่างที่ Martin Ender พูดอย่างถูกต้องหากมีเพียง 0 วินาทีทั้งหมดยกเว้นเลขหลักสุดท้ายจะถือว่าเป็นเลขศูนย์นำ
Daniel

คำตอบ:




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 ทำงานโดยการลบเลขศูนย์ต่อท้ายหากจำนวนไม่มี., จากนั้นลบ.และศูนย์นำหน้าเว้นแต่จะมีเพียงศูนย์เดียวซึ่งในกรณีนี้จะเหลือศูนย์หนึ่ง ในที่สุดมันก็ใช้ความยาวของสตริงที่เหลือ


ฉันไม่เคยเห็นเรื่องราวมากมาย%ในชีวิตของฉัน: O
user41805

1
@KritixiLithos ฉันได้จัดการ 16 หนึ่งบรรทัดก่อน: codegolf.stackexchange.com/a/86608/17602
Neil

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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.