ผลรวมของจำนวนเต็มในสตริงคั่นด้วยไม่ใช่ตัวเลขเช่น 'a' และ 'Y'


14

สร้างโปรแกรมที่รวมจำนวนเต็มทั้งหมดที่พบในสตริงซึ่งตั้งเป็นตัวแปรในโปรแกรม (ดังนั้นโปรแกรมไม่ต้องจัดการอินพุตใด ๆ ) ตัวเลขจำนวนเต็มถูกคั่นด้วยไม่ใช่ตัวเลข (อะไรก็ได้ยกเว้น 0, 1, 2, 3 ... 9)

ตัวอย่าง:

  • e7rde f ,fe 43 jfj 54f4sD = 7 + 43 + 54 + 4 = 108
  • 5 = 5
  • 64 545,5445-32JIFk0ddk = 64 + 545 + 5445 + 32 + 0 = 6086
  • 0ab0 = 0 + 0 = 0

หมายเหตุเพิ่มเติม:

  • ไม่จำเป็นต้องรองรับ Unicode แต่ได้รับอนุญาต
  • -n(ที่nเป็นจำนวนเต็ม) จะไม่นับเป็นลบแต่เป็นยัติภังค์ตามมาด้วยnn

คำตอบอาจถูกพิมพ์บนหน้าจอ (แต่ไม่จำเป็น)

คำตอบที่สั้นที่สุด (เป็นตัวอักษร) ชนะ


เราควรพิมพ์ผลลัพธ์ด้วยหรือไม่ (คุณไม่ได้กล่าวถึง I / O)
Wile E. Coyote

@Dogbert - ฉันไม่ได้คิดอย่างนั้น ขอโทษค่ะ ฉันจะอัพเดทโพสต์
Anto

เปลี่ยนเป็นบางคนมีคำตอบแล้วและไม่ต้องการ "ทำร้าย" พวกเขา ฉันเดาว่าฉันควรจะนอนตอนนี้ดังนั้นฉันจะคิดว่าชัดเจนขึ้นเล็กน้อย)
Anto

2
Anto: งานที่โซลูชันไม่มีผลข้างเคียงที่สังเกตได้ไม่ดีนัก
Joey

กรณีทดสอบที่น่าสนใจที่ฉันเพิ่งพบจะเป็น5a-3(รหัสของฉันจะข้าม-หากเป็นไปตามหมายเลขทันที แต่ไม่ใช่ถ้าไม่มีตัวเลขก่อนหน้านั้น)
Martin Ender

คำตอบ:



14

Ruby 1.9, 21 ตัวอักษร

eval a.scan(/\d+/)*?+

หากต้องการพิมพ์วิธีแก้ปัญหาไปยัง stdout จำเป็นต้องใช้อักขระเพิ่มเติม 2 ตัว:

p eval a.scan(/\d+/)*?+

และเพื่ออ่านจาก stdin แทนที่จะใช้ตัวแปรที่กำหนดไว้ล่วงหน้าจะต้องใช้อีก 3 ตัวอักษร:

p eval gets.scan(/\d+/)*?+

สำหรับ Ruby 1.8 ให้แทนที่?+ด้วย"+"เพื่อรับโซลูชันการทำงานที่มีอักขระ 22 ตัว


อินพุตควรถูกนำมาจากตัวแปรไม่ใช่ stdin นอกจากนี้ยังจะสั้นกว่าscan splitดังนั้นทางออกของคุณคือeval s.scan(/\d+/)*?+- 21 ตัวอักษร
sepp2k

@ sepp2k: ใช่ไม่ได้อ่านคำอธิบายอย่างถูกต้อง ฉันเพิ่งคุ้นเคยกับงานกอล์ฟอื่น ๆ ที่คุณมักจะต้องอ่านจาก stdin และพิมพ์เป็น stdout จุดดีด้วยscanขอบคุณ!
Ventero

+1, ใช้งานได้ดีevalและ* '+'
Wile E. Coyote


5

Ruby - 36 34 ตัวอักษร

s.scan(/\d+/).map(&:to_i).reduce:+

36 ตัวอักษรหากคุณต้องการพิมพ์ผลลัพธ์

p s.scan(/\d+/).map(&:to_i).reduce:+

สมมติว่าอินพุตมีอยู่เป็นสตริงใน s


4

JavaScript (ES6), 30

c=0,s.replace(/\d+/g,d=>c+=+d)

รุ่นข้อเขียน:

// Store the sum.
c=0,
// Process every number found in the `s`.
s.replace(/\d+/g,
  // Convert the number into an integer.
  // Add it to the sum.
  d => c += +d
)

3

Windows PowerShell, 23 25 29 31

พร้อมเอาท์พุท

$x-replace'\D','+0'|iex

ในความเป็นจริงหากปราศจากเอาต์พุตจะเหมือนกันทุกประการคุณเพียงแค่วางท่อไว้ที่อื่นที่จำเป็น


2

J - 40 38 ตัวอักษร

รุ่นขี้เกียจ ต้องการไลบรารีสตริง

+/".(,' ',.~a.-.'0123456789')charsub y

รองรับ Unicode รองรับการเข้ารหัสลองคิดดูสิ!
MPelletier

2

ชวา

จากการแข่งขัน;)

public static long sum(String s) {
    long sum = 0;
    String p = "";
    char[] ch = s.toCharArray();
    for (int i = 0; i < ch.length; i++) {
        boolean c = false;
        if (Character.isDigit(ch[i])) {
            if (i + 1 < ch.length) {
                if (Character.isDigit(ch[i + 1])) {
                    p += ch[i];
                    c = true;
                }
            }
            if (!c) {
                p += ch[i];
                sum += Integer.valueOf(p);
                p = "";
                c = false;
            }
        }
    }
    return sum;
}


2

เขาวงกต , 29 21 ไบต์

(ข้อจำกัดความรับผิดชอบ: เขาวงกตนั้นใหม่กว่าความท้าทายนี้)

นอกจากนี้เขาวงกตไม่มีตัวแปรดังนั้นฉันจึงไปกับโปรแกรมอินพุต / เอาต์พุตปกติ

)_"+`
( "?"
";;,;;(!@

สิ่งนี้ค่อนข้างง่ายเนื่องจากวิธีการทำงานของคำสั่งอินพุตของ Labyrinth ?พยายามที่จะอ่านจำนวนเต็มที่ลงนามจาก STDIN และหยุดที่ไม่ใช่หลักแรก หากไม่สามารถอ่านจำนวนเต็ม (เพราะอักขระตัวถัดไปคือตัวเลขที่-ไม่ได้ตามมาหรือที่ไม่ใช่ตัวเลขอื่น ๆ หรือเราได้มาถึง EOF แล้ว) มันจะกลับมา0แทน ,ในทางกลับกันอ่านไบต์ที่ตามมาใด ๆ และผลักดันค่าไบต์ ถ้าอันนี้ถูกเรียกที่ EOF มันจะกลับมา-1แทน

ดังนั้นนี่คือรหัสเทียมบางส่วนสำหรับการแก้ปัญหา:

running total = 0
while(true)
  while(true)
    try reading a non-zero integer N with ?
    if(N < 0)
      running total -= N
    else if(N > 0)
      running total += N
    else
      break
  // We've either read a zero or hit a something that isn't a number
  try reading a character with ,
  if(that returned -1)
    break
print running total

การจัดการกับตัวเลขติดลบทำให้การแก้ปัญหานี้ค่อนข้างซับซ้อน ถ้าไม่ใช่สำหรับผู้ที่มีปัญหาฉันต้องการ 8-byte

?+
;,;!@


1

Perl, 16 ตัวอักษร

s/\d+/$r+=$&/ge;

ใช้เวลาในการป้อนข้อมูลการส่งออกไปใน$_ $rอัฒภาคสุดท้ายไม่จำเป็น แต่อาจจำเป็นเมื่อโปรแกรมทำสิ่งต่าง ๆ เพิ่มเติม เพิ่มsay$rสำหรับการส่งออก


อุ๊ปส์ไม่เห็นคำตอบเดิมของคุณเมื่อฉันโพสต์ แม้ว่าฉันจะนับตัวละครมากขึ้นโดยไม่ใช้เครื่องหมายอัฒภาค
JB

@JB: ฉันไม่สามารถนับได้! : P อันที่จริงผมทำผิดพลาดของ echo'ing ที่ยกมาคู่wc -cสตริง
ninjalj

1

J - 23 ตัวอักษร

ไม่ใช่ผู้ชนะ แต่เราจะได้เห็นการกระทำดั้งเดิมที่หายาก

+/".(,_=_"."0 y)}y,:' '

อธิบาย:

  • _"."0 y- สำหรับอักขระแต่ละตัวในสตริงป้อนข้อมูลyให้ลองอ่านเป็นตัวเลข หากคุณไม่สามารถใช้ค่าเริ่มต้น_(อินฟินิตี้) แทน

  • ,_=- ตรวจสอบผลลัพธ์แต่ละรายการเพื่อความเท่าเทียมกัน_แล้วเรียกใช้อาร์เรย์สุดท้ายของ 0s และ 1s ลงในเวกเตอร์ ( "."0มักเพิ่มมิติข้อมูลมากเกินไปหนึ่งผลลัพธ์ดังนั้นเราจึงแก้ไขให้ถูกต้องที่นี่)

  • y,:' ' - เพิ่มแถวของช่องว่างใต้สตริงอินพุต

  • } - ใช้เหมือนที่นี่ }เรียกว่าItem Amendและใช้รายการ 0s และ 1s ทางซ้ายเป็นดัชนีเพื่อเลือกแถวที่จะดึงออกมาจากอาร์กิวเมนต์ที่ถูกต้อง ดังนั้นสิ่งที่เกิดขึ้นคือสำหรับแต่ละคอลัมน์ทางด้านขวาเราใช้อักขระดั้งเดิมถ้ามันสามารถอ่านเป็นจำนวนและอื่น ๆ เราใช้พื้นที่ด้านล่าง ดังนั้นเราจึงปกปิดอักขระที่ไม่ใช่ตัวเลขด้วยช่องว่าง

  • +/". - ตอนนี้แปลงสตริงทั้งหมดนี้เป็นรายการของตัวเลขและรวมพวกเขา


1

gs2, 4 ไบต์

W#Θd

เข้ารหัสในCP437 ; ไบต์ที่สามคือE9ไบต์ที่สามคือ

Wอ่านตัวเลขทั้งหมด/-?\d+/จากสตริงแม็พค่าสัมบูรณ์dผลรวม

(gs2 เช่นกันใหม่กว่าความท้าทายนี้ แต่read-numsคำสั่งของมันคือความบังเอิญโดยรวม)


0

Smalltalk (Smalltalk / X) (51 ตัวอักษร)

ใช้ pakage regex:

(s regex:'\d+' matchesCollect:[:n|n asNumber])sum

wo regex:

((s asCollectionOfSubCollectionsSeparatedByAnyForWhich:[:c|c isDigit not]) map:#asNumber)sum

ใส่ใน s



0

Javascript - 43 ตัวอักษร

ฉันรู้ว่ามันยาว แต่ไม่มีวิธีแก้ปัญหา JS ดังนั้น :)

c=0
a=a.split(/[^\d]/g)
for(i in a)c+=+a[i]

aเป็นสตริง cมีคำตอบ


0

Tcl, 30

expr [regsub -all \\D+ $a.0 +]

มันอนุมานว่าอินพุตอยู่ในตัวแปร$a(เป็นทางการในa) และเก็บคำตอบในผลลัพธ์ของล่าม I / O ที่เหลือเป็นแบบฝึกหัด


0

APL, 16 ไบต์

{+/⍎b\⍵/⍨b←⍵∊⎕d}

⎕dเป็นตัวเลขภายในตัว (0-9) bถูกกำหนดให้กับเวกเตอร์ 0/1 โดยที่ 1 กำหนดให้กับอักขระที่เป็นตัวเลข bจะใช้ในการบีบอัดอาร์เรย์ตัวอักษรที่กำหนดแล้วนำมาใช้ซ้ำเพื่อขยายมันซึ่งแทรกช่องว่าง เป็นevalของ APL ซึ่งแปลงสตริงเป็นเวกเตอร์จำนวนเต็มในกรณีนี้ +/คำนวณผลรวม


ความยาวเท่ากัน แต่ที่น่าสนใจ:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
อดัม



0

ที่จริงแล้ว 14 ไบต์ (ไม่ใช่การแข่งขัน)

9u▀8╙r♂┌-@s♂≈Σ

ลองออนไลน์!

การส่งข้อมูลนี้ไม่สามารถแข่งขันได้เพราะจริงๆแล้วค่อนข้างใหม่กว่าความท้าทายนี้

โปรแกรมนี้รองรับหน้ารหัส CP437 สำหรับการป้อนข้อมูล

คำอธิบาย:

9u▀8╙r♂┌-@s♂≈Σ
9u▀             base 10 digits (0-9)
   8╙r♂┌        all characters in CP437 (map(ord_cp437, range(2**8)))
        -       set difference
         @s     split input on any value in the resulting list
           ♂≈Σ  convert to ints and sum

0

C 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

ลองออนไลน์!

85 ไบต์รุ่นก่อนหน้านี้ที่โกงบิตโดยการเข้ารหัสสตริงภายในโปรแกรม:

t=0;main(i){for(char*q,*s;i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

ในการใช้งานโปรแกรม 85 ไบต์คุณจำเป็นต้องกำหนดตัวแปรดังนี้:

t=0;main(i){for(char*q,*s="text";i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.