กรองและเพิ่ม


16

งาน

งานง่ายมาก กำหนดสตริงไม่ว่างเปล่าที่มีตัวเลข , ตัวพิมพ์ใหญ่และพิมพ์เล็กตัวอักษร , การส่งออกผลรวมของตัวเลขที่ยังเหลืออยู่ ตัวอย่างเช่น:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

การกรองจดหมายทั้งหมดจะส่งผลให้:

 1   5  45   5  4    33   4

1 + 5 + 45 + 5 + 4 + 33 + 4 = 97ผลรวมของตัวเลขเหล่านี้คือ 97ดังนั้นการส่งออกจะเป็น

กรณีทดสอบ

a > 0
0 > 0
5 > 5
10 > 10
a0A > 0
1a1 > 2
11a1 > 12
4dasQWE65asAs5dAa5dWD > 79
a1wAD5qw45REs5Fw4eRQR33wqe4WE > 97

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


ฉันรู้ว่าฉันได้เขียนโปรแกรม Labyrinth มาก่อน ... นี่เป็นความท้าทายเดียวกันแต่มีตัวเลขติดลบเช่นกัน (ซึ่งสร้างความแตกต่างอย่างมากสำหรับบางภาษา
Martin Ender

@ MartinBüttnerดูเหมือนว่าไม่มีตัวเลขลบ: "-n (โดยที่ n เป็นจำนวนเต็ม) ไม่นับเป็นค่าลบ n แต่เป็นเครื่องหมายยัติภังค์ตามด้วย n"
พอล

โอ้ฉันเห็นสิ่งที่คุณหมายถึง คุณกำลังบอกว่ามันมียัติภังค์และอันนี้ไม่มี
พอล

คำตอบ:


22

GS2, 2 ไบต์

Wd

ลองออนไลน์!

มันทำงานอย่างไร

W     Read all numbers.
      For input x, this executes map(int, re.findall(r'-?\d+', x)) internally.
 d    Compute their sum.

11
นี่เป็นสิ่งที่ไม่คาดคิด ...
Adnan

@Adnan: มันคือเดนนิส ให้เวลาพอเขาสามารถหาวิธีแก้ไขรหัสกอล์ฟในเวลาน้อยกว่า 4 ไบต์
Deusovi

13

เขาวงกต 8 ไบต์

รับว่า Pyth ...

?+
;,;!@

ลองออนไลน์!

คำอธิบาย

ไพรเมอร์ปกติ (ถูกขโมยจาก Sp3000):

  • เขาวงกตนั้นเป็นแบบ 2D และเป็นแบบกองซ้อน สแต็คมีจำนวนศูนย์ที่ด้านล่าง
  • เมื่อตัวชี้คำสั่งมาถึงทางแยกมันจะตรวจสอบด้านบนของสแต็กเพื่อกำหนดว่าจะเลี้ยวถัดไป ลบทิ้งเหลือศูนย์จะไปข้างหน้าและบวกเป็นบวก

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

ลูปหลักของโปรแกรมคือคอมแพคบิตนี้:

?+
;,

เมื่อ?เราอ่านจำนวนเต็ม (ไม่ต้องสนใจตัวอักษรทั้งหมด) +เราเพิ่มลงในผลรวมสะสม (ซึ่งเริ่มต้นจากหนึ่งในศูนย์โดยปริยายที่ด้านล่างสแต็ค) จากนั้นเราก็อ่านตัวละครอื่น,เพื่อตรวจสอบ EOF ตราบใดที่เราไม่ได้อยู่ที่ EOF ตัวละครที่อ่านจะเป็นตัวอักษรที่มีรหัสตัวอักษรเป็นบวกดังนั้น IP จะเลี้ยวขวา (จากมุมมองของมัน; คือทิศตะวันตก) ;ละทิ้งตัวละครเพราะเราไม่ต้องการมันแล้วเราเข้าไปวนซ้ำอีกครั้ง

เมื่อเราอยู่ที่ EOF ให้,กด a -1เพื่อให้ IP เลี้ยวซ้าย (ตะวันออก) แทน ;ยกเลิกอีกครั้ง-1โดย!พิมพ์ผลรวมสะสมเป็นจำนวนเต็มและ@ยกเลิกโปรแกรม


สิ่งที่น่ากลัวมาร์ติน!
ซิมมอนส์

6

CJam, 13 ไบต์

จับจ้องที่จะทำงานกับอินพุตโดยไม่ต้องขอบคุณ Dennis! ยังบันทึกไบต์ด้วยการแทนที่อาร์เรย์ตัวอักษรด้วยอาร์เรย์ ASCII ด้านบนรหัสจุด 64 และจากนั้นอีกหนึ่งไบต์บันทึกโดยเดนนิส!

q_A,s-Ser~]1b

การทับศัพท์อย่างง่ายจากตัวอักษรไปยังช่องว่างจากนั้น eval และ sum ลองมันออนไลน์



5

จอประสาทตา22 11

\d+
$0$*1
1

ลองออนไลน์!

บันทึก 11 ไบต์ (!) ต้องขอบคุณ Martin!

โดยทั่วไปเพียงทศนิยมให้เป็นเอกแล้วนับ1s


1
ฉันอาจจะทำให้นัยถ้าเปลี่ยนตัวเริ่มต้นด้วย$0 $*มันเป็นรูปแบบที่ธรรมดามากและนั่นจะทำให้คุณเอาชนะ Pyth ได้ ;)
Martin Ender

@ MartinBüttnerในขณะที่คุณอยู่ที่นั่นคุณสามารถทำให้ตัวละครที่เหมาะสมเริ่มต้นกับบางสิ่งบางอย่างเกินไป: O
FryAmTheEggman

อืมไม่ใช่ความคิดที่เลว ฉันจะคิดเกี่ยวกับมัน
Martin Ender

5

Japtap, 2 ไบต์

Nx

ทดสอบออนไลน์!

มันทำงานอย่างไร

N    // Implicit: N = (parse input for numbers, "strings", and [arrays])
x    // Sum. Implicit output.

ฉันได้รับข้อผิดพลาด "Japt.stdout" ต้องถูกส่งไปยัง HTMLElement
Downgoat

@Downgoat เหตุการณ์นี้เกิดขึ้นเป็นครั้งคราว ฉันไม่แน่ใจว่าทำไม การโหลดหน้าซ้ำดูเหมือนว่าจะแก้ไขปัญหานี้
ETHproductions

5

JavaScript ES6, 35 ไบต์

s=>eval(s.replace(/\D+/g,'+')+'.0')

มันทำงานอย่างไร

"+"ครั้งแรกที่เราเข้ามาแทนที่สตริงของตัวเลขที่ไม่ใช่กับแต่ละ โดยทั่วไปมีสี่วิธีที่แตกต่างกันซึ่งอาจจบลงด้วย:

1. 1b23c456   => 1+23+456
2. a1b23c456  => +1+23+456
3. 1b23c456d  => 1+23+456+
4. a1b23c456d => +1+23+456+

กรณีที่ 1 และ 2 ได้รับการดูแลอยู่แล้ว แต่เราก็จำเป็นต้องแก้ไขครั้งล่าสุด+เพื่อที่จะไม่ก่อให้เกิดข้อผิดพลาด เราสามารถลบมันด้วย.replace(/\+$,"")แต่มันแพงเกินไป เราสามารถผนวก0ไปที่สิ้นสุด +แต่ที่จะส่งผลกระทบต่อหมายเลขสุดท้ายถ้าสตริงไม่จบด้วย การประนีประนอมคือการผนวก.0ซึ่งเป็นทั้งตัวเลขที่ถูกต้องด้วยตัวเองและไม่ส่งผลกระทบต่อมูลค่าของจำนวนเต็มอื่น ๆ

นี่คือค่าอื่น ๆ ที่จะใช้ได้เช่นกัน:

.0
-0
 +0
-""
-[]
0/10
0e-1
.1-.1

รุ่นทางเลือก 35 ไบต์เช่นกัน

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

อีกรุ่นหนึ่งขนาด 36 ไบต์

s=>s.split(/\D/).map(d=>t+=+d,t=0)|t

4

Pyth, 12 11 10 ไบต์

ssM:z"\D"3
    z        autoinitialized to input()
   : "\D"3   split on non-digits
 sM          convert all elements of resulting array to ints
s            sum

โชคดีs(แปลง int) ผลตอบแทน0เมื่อนำไปใช้กับสตริงว่างดังนั้นผมจึงไม่ต้องกังวลเกี่ยวกับความจริงที่ว่าผลตอบแทนsplit("a1b", "\D+") ["", "1", ""]ในทำนองเดียวกันผลตอบแทนsplit("a", "\D+")["", ""]

นี้ยังช่วยให้ฉันเพื่อแยกในทุกบาทที่ไม่ใช่รายบุคคลเนื่องจากเป็นสิ่งเดียวกับ1 + 0 + 0 + 0 + 0 + 21 + 2

ขอบคุณThomas Kwaสำหรับไบต์!


4

Gol> <> , 4 ไบต์

iEh+

สั้นมากฉันต้องการข้อความจำลอง ...


3
บางทีคุณควรอธิบายโค้ดของคุณด้วยพื้นที่พิเศษของคุณ :)
nneonneo

4

Perl 6 , 18 ไบต์

{[+] .comb(/\d+/)}
{[+] .split(/\D/)}

การใช้งาน:

my &code = {[+] .comb(/\d+/)}

say code 'a'; # 0
say code '0'; # 0
say code '5'; # 5
say code '10'; # 10
say code 'a0A'; # 0
say code '1a1'; # 2
say code '11a1'; # 12
say code '4dasQWE65asAs5dAa5dWD'; # 79
say code 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'; # 97

3

เยลลี่ขนาด 6 ไบต์

&-ṣ-ḌS

ลองออนไลน์!

มันทำงานอย่างไร

&-ṣ-ḌS  Main link. Input: L (string)

&-      Take the bitwise AND of L's characters and -1.
        This attempts to cast to int, so '0' & -1 -> 0 & -1 -> 0.
        On failure, it returns the integer argument (if any), so 'a' & -1 -> -1.
  ṣ-    Split the resulting list at occurrences of -1.
    Ḍ   Convert each chunk from decimal to integer. In particular, [] -> 0.
     S  Compute the sum of the results.

3

Perl, 21 + 1 = 22 ไบต์

$_=eval join"+",/\d+/g

ต้องการ-pธง:

$ perl -pe'$_=eval join"+",/\d+/g' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

ใช้งานได้เมื่อไม่มีตัวเลขหรือไม่? เช่นa?
FryAmTheEggman

@FryAmTheEggman เป็นคำถามที่ดีฉันเดาว่ามันจะไม่พิมพ์อะไรในบริบทที่เป็นตัวเลข0;-)
andlrc

3

Julia, 35 ไบต์

s->sum(parse,matchall(r"\d+","0"s))

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งกลับจำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

เราใช้matchallในการรับอาร์เรย์ประกอบด้วยการจับคู่ของการแสดงออกปกติ\d+ซึ่งเป็นเพียงจำนวนเต็มในสตริง เราต้องตรึง 0 ไว้ที่ด้านหน้าของสตริงมิฉะนั้นสำหรับกรณีอย่างเช่น"a"เราจะรวมกันเป็นอาร์เรย์ว่างเปล่าซึ่งทำให้เกิดข้อผิดพลาด จากนั้นเราจะนำparseไปใช้กับการจับคู่แต่ละสตริงซึ่งแปลงเป็นจำนวนเต็มและนำผลรวม


parseสามารถกลายเป็นintถ้าคุณไม่สนใจคำเตือนการคัดค้าน
เดนนิส

@Dennis ฉันทำแม้ว่า. _
Alex A.

2

PHP, 64 ไบต์

<?php preg_match_all("/\d+/",$argv[1],$a);echo array_sum($a[0]);

เรียกใช้เป็น

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนสแต็ค นี่เป็นคำตอบที่ดี (+1) อย่างไรก็ตามมันอาจปรับปรุงได้โดยการเพิ่มคำอธิบายรหัสและรายละเอียด นอกจากนี้คุณสามารถใช้<?แทนได้<?phpหรือไม่
wizzwizz4


2

Mathematica, 51 ไบต์

Total@ToExpression@StringCases[#,DigitCharacter..]&

จับปลายผิดของตัวสร้างทางคณิตศาสตร์ verbose 1 ไบต์ด้วยความช่วยเหลือของ @DavidC


DigitCharacter ..จะประหยัด 1 ไบต์
DavidC

DigitCharacterไม่ได้ทำงานตามที่เขียนไว้เพราะมันเอาตัวเลขทั้งหมดในขณะที่เราต้องการที่จะลบตัวอักษรทั้งหมด ...
ซิมมอนส์

1
คุณพูดถูก ฉันกำลังคิดถึงTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

ฉันเห็น! ใช่ว่าการเปลี่ยนแปลงจะบันทึกไบต์
Simmons

2

R, 46 43 ไบต์

sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))

คำอธิบาย

                    scan(,'')                  # Take the input string
           strsplit(         ,'\\D')           # Returns list of all numeric parts of the string
                                    [[1]]      # Unlists to character vector
    strtoi(                              )     # Converts to numeric vector
sum(                                      )    # Sums the numbers

วิ่งตัวอย่าง

> sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))
1: a1wAD5qw45REs5Fw4eRQR33wqe4WE
2: 
Read 1 item
[1] 97

แก้ไข: แทนที่ด้วย[^0-9]\\D


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ นี่เป็นคำตอบแรกที่ดีมาก อย่างไรก็ตามมันจะได้รับการปรับปรุงโดยการเพิ่มคำอธิบายรหัสและรายละเอียดดังนั้นเราจึงรู้ว่ามันทำงานอย่างไร
wizzwizz4

1

PowerShell, 28 26 ไบต์

$args-replace"\D",'+0'|iex

ใช้อินพุต$argsจากนั้นทำการ regex -replaceเพื่อสลับตัวอักษรด้วย+0จากนั้นไปป์ที่iex(สั้นInvoke-Expressionและคล้ายeval)

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

อีกทางเลือกหนึ่ง

หากคุณตกลงกับเอาต์พุตภายนอกบางอย่างคุณสามารถทำสิ่งต่อไปนี้ได้เช่นกันที่28 26 ไบต์:

$args-split"\D"|measure -s

สิ่งนี้จะนำสตริงอินพุต$argsและ-splitใส่ลงในอาร์เรย์ของสตริงที่ไม่ใช่ตัวเลข (ลบออกในกระบวนการ) ยกตัวอย่างเช่นจะกลายเป็น1a2b33 ['1','2','33']เราไปป์นั้นMeasure-Objectกับ-Sumพารามิเตอร์ ผลลัพธ์จะเป็นดังนี้:

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

Count    : 21
Average  : 
Sum      : 97
Maximum  : 
Minimum  : 
Property : 

แก้ไข - ไม่ต้องใช้[ ]ใน regex เนื่องจากฉันไม่ได้ระบุรายการที่ตรงกันที่เป็นไปได้อีกต่อไป ...



1

อย่างจริงจัง 13 ไบต์

,ú;û+@s`≈`MΣl

ลองออนไลน์!

คำอธิบาย:

,ú;û+@s`≈`MΣl
,              push input
 ú;û+          push "abc...zABC...Z" (uppercase and lowercase English letters)
     @s        split on letters
       `≈`M    convert to ints
           Σ   sum
            l  length (does nothing to an integer, pushes 0 if an empty list is left, in the case where the string is all letters)

@Adnan Good catch - เป็นเอาท์พุตเปล่าaๆ ควรแก้ไขหนึ่งไบต์
Mego


1

TI-Basic, 106 ไบต์

ทำงานบนเครื่องคิดเลข TI-83/84!

Input Str1
"{0,→Str2
Str1+"N0→Str1
For(I,1,length(Ans
sub(Str1,I,1
If inString("0123456789",Ans
Then
Str2+Ans→Str2
Else
If ","≠sub(Str2,length(Str2),1
Str2+","→Str2
End
End
sum(expr(Ans


1

R, 50 ไบต์

ต้องมีการgsubfnติดตั้ง

sum(gsubfn::strapply(scan(,''),'\\d+',strtoi)[[1]])

ใช้strtoiเพื่อบังคับให้เป็นตัวเลข


1

Ruby 45 ไบต์

$*[0].split(/[a-z]/i).map(&:to_i).inject 0,:+

(ความพยายามครั้งแรกในที่ทำงานจะกลับมาอีกครั้ง)


1

POSIX sh + tr + dc, 27 25 ไบต์

dc -e "0d`tr -sc 0-9 +`p"

แปลงการรันที่ไม่ใช่ตัวเลขใด ๆ (รวมถึงการขึ้นบรรทัดใหม่) ไปยัง+โอเปอเรเตอร์กดสองศูนย์ลงบนสแต็ก (ในกรณีที่อินพุตเริ่มต้นด้วยไม่ใช่ตัวเลข) เพิ่มพวกมันทั้งหมดและพิมพ์ผลลัพธ์ อาจมีศูนย์เหลืออยู่ที่ด้านล่างของสแต็ก แต่เราไม่สนใจ


1

Lua, 51 ไบต์

ค่อนข้างสั้นสักครั้ง! แม้จะสั้นกว่า Java! อินพุตต้องเป็นอาร์กิวเมนต์บรรทัดคำสั่งเพื่อให้ทำงานได้

a=0 arg[1]:gsub("%d+",function(c)a=a+c end)print(a)

Ungolfed

a=0                 -- Initialize the sum at 0
arg[1]:gsub("%d+",  -- capture each group of digits in the string
  function(c)       -- and apply an anonymous function to each of them
  a=a+c             -- sums a with the latest group captured
end)               
print(a)            -- output a

1

ยูทิลิตี Bash + GNU, 29

grep -Eo [0-9]+|paste -sd+|bc

If it is required to support input with no numbers (e.g. a), then we can do this:

Bash + GNU utilities, 38

1 byte saved thanks to @TobySpeight.

(grep -Eo [0-9]+;echo 0)|paste -sd+|bc

This prints nothing for input a. We are currently discussing whether that's valid or not.
Dennis

@Dennis. Ok. I added another version to cover both eventualities.
Digital Trauma

You could use ; instead of || to always add zero, for no harm.
Toby Speight

@TobySpeight Yes, thats good - thanks!
Digital Trauma

1

Python 2, 70 bytes

I am putting a Python answer just for fun.

import re
j=0
for i in map(int,re.findall('\d+',input())):j+=i
print j

Very simple and uses regex to find all the numbers in the input. Try it online!


1
In this context you have to use raw_input or switch to python3. A smaller version (py3, 56 bytes) : import re;print(sum(map(int,re.findall('\d+',input())))).
Dica

1

Oracle SQL 11.2, 105 bytes

SELECT NVL(SUM(TO_NUMBER(COLUMN_VALUE)),0)FROM XMLTABLE(('"'||regexp_replace(:1,'[a-zA-Z]','","')||'"'));

The regex convert alpha characters to ','

XMLTABLE create one row per item in the string using ',' as the separator.

SUM the rows to get the result.

NVL is needed to account for a string with no digit.

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