Lọc ra và thêm


16

Bài tập

Nhiệm vụ rất đơn giản. Cho một chuỗi không trống chứa các số , chữ hoachữ thường , xuất tổng của các số còn lại. Ví dụ:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

Lọc ra tất cả các chữ cái sẽ dẫn đến:

 1   5  45   5  4    33   4

Tổng của những con số này là 1 + 5 + 45 + 5 + 4 + 33 + 4 = 97. Vì vậy, đầu ra sẽ là 97.

Các trường hợp thử nghiệm

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

Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!


Tôi biết rằng tôi đã viết chương trình Labyrinth trước đây ... đây cũng là một thử thách tương tự nhưng cũng có số âm (điều này tạo ra sự khác biệt lớn đáng ngạc nhiên đối với một số ngôn ngữ, vì vậy tôi không nghĩ chúng là bản sao).
Martin Ender

@ MartinBüttner Hình như người ta không bao gồm các số âm: "-n (trong đó n là số nguyên) không được tính là n âm, mà là một dấu gạch nối theo sau n."
Paul

Ồ, tôi hiểu ý của bạn. Bạn đang nói nó có dấu gạch ngang và cái này thì không.
Paul

Câu trả lời:


22

GS2, 2 byte

Wd

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

11
Chà, điều này thật bất ngờ ...
Adnan

@Ad Nam: Đó là Dennis. Cho đủ thời gian anh ta có thể tìm một giải pháp cho bất kỳ golf mã nào trong ít hơn 4 byte.
Deusovi

13

Mê cung , 8 byte

Lấy cái đó đi, Pyth ...

?+
;,;!@

Hãy thử trực tuyến!

Giải trình

Các primer thông thường (bị đánh cắp từ Sp3000):

  • Labyrinth là 2D và dựa trên ngăn xếp. Các ngăn xếp có vô số số 0 ở phía dưới.
  • Khi con trỏ lệnh đạt đến một điểm nối, nó sẽ kiểm tra đỉnh của ngăn xếp để xác định nơi tiếp theo. Tiêu cực là trái, không là tiến và dương là đúng.

Điều thực sự hữu ích ở đây là Labyrinth có hai lệnh đầu vào khác nhau ,?. Cái trước đọc một byte đơn từ STDIN hoặc -1tại EOF. Cái sau đọc một số nguyên từ STDIN. Nó không bỏ qua mọi thứ không phải là số và sau đó đọc số thập phân đầu tiên mà nó tìm thấy. Cái này trả về0 tại EOF, vì vậy chúng tôi không thể sử dụng nó để kiểm tra EOF đáng tin cậy ở đây.

Vòng lặp chính của chương trình là bit nhỏ gọn này:

?+
;,

Với ?chúng tôi đọc một số nguyên (bỏ qua tất cả các chữ cái), với +chúng tôi thêm nó vào tổng số đang chạy (bắt đầu là một trong các số 0 ẩn ở dưới cùng ngăn xếp). Sau đó chúng tôi đọc một ký tự khác ,để kiểm tra EOF. Chừng nào chúng ta không ở EOF, ký tự đọc sẽ là một chữ cái có mã ký tự dương, do đó IP sẽ rẽ phải (theo quan điểm của nó; tức là hướng tây). ;loại bỏ nhân vật bởi vì chúng tôi không cần nó và sau đó chúng tôi lại vào vòng lặp.

Một khi chúng ta đang ở EOF, ,đẩy một -1nên lần lượt IP trái (phía đông) để thay thế. ;một lần nữa loại bỏ điều đó -1, !in tổng số đang chạy dưới dạng một số nguyên và @chấm dứt chương trình.


Martin thứ tuyệt vời!
Một Simmons

6

CJam, 13 byte

Đã sửa lỗi để làm việc với đầu vào không có số nhờ Dennis! Cũng lưu một byte bằng cách thay thế mảng chữ cái bằng một mảng ASCII trên mã điểm 64. Và sau đó một byte khác được lưu bởi Dennis!

q_A,s-Ser~]1b

Chuyển ngữ đơn giản từ chữ cái sang dấu cách, sau đó eval và sum. Hãy thử trực tuyến .


6

MATL , 8 byte

1Y4XXXUs

Hãy thử trực tuyến!

1Y4      % predefined literal: '\d+'
XX       % implicit input. Match regular expression. Returns a cell array of strings
         % representing numbers
XU       % convert each string to a double. Returns a numeric array
s        % sum of numeric array

5

Võng mạc ,22 11

\d+
$0$*1
1

Hãy thử trực tuyến!

11 byte (!) Được lưu nhờ Martin!

Về cơ bản chỉ là số thập phân để unary sau đó đếm 1s.


1
Tôi có lẽ nên làm cho $0ẩn nếu một sự thay thế bắt đầu bằng $*. Đó là một mô hình rất phổ biến và điều đó sẽ cho phép bạn đánh bại Pyth. ;)
Martin Ender

@ MartinBüttner Trong khi bạn ở đó, bạn cũng có thể đặt đúng ký tự thành một thứ gì đó: O
FryAmTheEggman

hm, một ý kiến ​​không tồi Tôi sẽ nghĩ về nó.
Martin Ender

5

Japt, 2 byte

Nx

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

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

Tôi đang gặp lỗi "Japt.stdout" phải được gửi tới HTMLEuity
Downgoat

@Downgoat Điều này thỉnh thoảng xảy ra; Tôi cung không chăc tại sao. Tải lại trang dường như để khắc phục điều này.
Sản xuất ETH

5

JavaScript ES6, 35 byte

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

Làm thế nào nó hoạt động

Đầu tiên, chúng tôi thay thế từng chuỗi không chữ số bằng "+". Về cơ bản có bốn cách khác nhau mà điều này có thể kết thúc:

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

Trường hợp 1 và 2 đã được chăm sóc rồi. Nhưng bằng cách nào đó chúng ta cần sửa lỗi cuối cùng +để nó không gây ra lỗi. Chúng tôi có thể loại bỏ nó .replace(/\+$,""), nhưng nó quá đắt. Chúng ta có thể nối thêm 0vào cuối, nhưng điều đó sẽ ảnh hưởng đến số cuối cùng nếu chuỗi không kết thúc bằng a +. Một sự thỏa hiệp là để bổ sung .0, cả hai đều là một số hợp lệ và không ảnh hưởng đến giá trị của các số nguyên khác.

Đây là một vài giá trị khác cũng sẽ hoạt động:

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

Phiên bản thay thế, cũng 35 byte

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

Một phiên bản thay thế khác, 36 byte

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

4

Bình thường, 12 11 10 byte

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

May mắn thay, s(chuyển đổi thành int) trả về 0khi được áp dụng cho chuỗi trống, vì vậy tôi không phải lo lắng về thực tế split("a1b", "\D+")trả về ["", "1", ""]. Tương tự, split("a", "\D+")trả lại ["", ""].

Điều này thậm chí cho phép tôi phân chia trên từng chữ số riêng lẻ, vì 1 + 0 + 0 + 0 + 0 + 2nó giống như 1 + 2.

Cảm ơn Thomas Kwa cho một byte!


4

Gol> <> , 4 byte

iEh+

Rất ngắn, tôi cần văn bản giả ...


3
Có lẽ bạn nên giải thích mã của mình với không gian thừa của bạn :)
nneonneo

4

Perl 6 , 18 byte

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

Sử dụng:

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

Thạch, 6 byte

&-ṣ-ḌS

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

&-ṣ-Ḍ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 byte

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

Yêu cầu -pcờ:

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

Cái này có hoạt động khi không có số nào không? ví dụ a?
FryAmTheEggman

@FryAmTheEggman Câu hỏi hay, tôi đoán nó sẽ không in gì trong bối cảnh số là 0;-)
andlrc

3

Julia, 35 byte

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

Đây là một hàm ẩn danh chấp nhận một chuỗi và trả về một số nguyên. Để gọi nó, gán nó cho một biến.

Chúng tôi sử dụng matchallđể có được một mảng bao gồm các kết quả khớp của biểu thức chính quy \d+, chỉ là các số nguyên trong chuỗi. Chúng ta phải giải quyết 0 về phía trước chuỗi, nếu không, trong các trường hợp như "a", chúng ta sẽ tổng hợp một mảng trống, gây ra lỗi. Sau đó, chúng tôi áp dụng parsecho từng chuỗi khớp, chuyển đổi thành số nguyên và lấy tổng.


parsecó thể trở thành intnếu bạn không quan tâm đến cảnh báo khấu hao.
Dennis

@Dennis tôi làm mặc dù ._.
Alex A.

2

PHP, 64 byte

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

Chạy nó như

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


Chào mừng bạn đến với Câu đố lập trình và trao đổi ngăn xếp. Đây là một câu trả lời tuyệt vời (+1), tuy nhiên nó có thể được cải thiện bằng cách thêm giải thích và phân tích mã. Ngoài ra, bạn có thể sử dụng <?thay vì <?php?
wizzwizz4

2

Javascript, 32 39 byte

s=>eval((s.match(/\d+/g)||[0]).join`+`)


2

Toán học, 51 byte

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

Bắt kết thúc sai của các nội dung toán học dài dòng. Tắt 1 Byte với sự trợ giúp của @DavidC


DigitCharacter ..sẽ tiết kiệm 1 byte
DavidC

DigitCharacterkhông hoạt động như được viết bởi vì nó xóa tất cả các chữ số trong khi chúng tôi muốn xóa tất cả các chữ cái ...
Một Simmons

1
bạn đúng rồi. Tôi đã nghĩ đếnTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

Tôi hiểu rồi! Vâng, sự thay đổi đó tiết kiệm một byte.
Một Simmons

2

R, 46 43 byte

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

Giải trình

                    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

Chạy mẫu

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

Chỉnh sửa: Thay thế [^0-9]bằng \\D.


Chào mừng bạn đến với Câu đố lập trình và Code Golf. Đây là một câu trả lời đầu tiên tuyệt vời; tuy nhiên nó sẽ được cải thiện bằng cách thêm giải thích và phân tích mã, vì vậy chúng tôi biết cách hoạt động của nó.
wizzwizz4

1

PowerShell, 28 26 byte

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

Lấy đầu vào $argssau đó thực hiện một biểu thức chính -replaceđể hoán đổi các chữ cái +0, sau đó chuyển sang iex(viết tắt Invoke-Expressionvà tương tự eval).

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

Hoặc

Nếu bạn ổn với một số đầu ra không liên quan, bạn có thể thực hiện các thao tác sau, cũng ở mức 28 26 byte:

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

Điều này sẽ đưa chuỗi đầu vào $args-splitnó thành một chuỗi các chuỗi trên các số không (loại bỏ chúng trong quy trình). Ví dụ, 1a2b33sẽ biến thành ['1','2','33']. Chúng tôi đường ống mà Measure-Objectvới -Sumtham số. Đầu ra sẽ như dưới đây:

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

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

Chỉnh sửa - durr, không cần [ ]trong regex vì tôi không còn chỉ định danh sách các trận đấu có thể ...


1

Gema, 39 ký tự

<D>=@set{s;@add{${s;};$0}}
?=
\Z=${s;0}

Chạy mẫu:

bash-4.3$ gema '<D>=@set{s;@add{${s;};$0}};?=;\Z=${s;0}' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

1

Nghiêm túc, 13 byte

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

Hãy thử trực tuyến!

Giải trình:

,ú;û+@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 Bắt tốt - nó xuất ra danh sách trống với a. Nên là một sửa chữa một byte.
Mego

1

Java, 70 byte

s->{int n=0;for(String i:s.split("\\D+"))n+=Long.valueOf(i);return n;}

1

TI-Basic, 106 byte

Hoạt động trên máy tính 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

Clojure / ClojureScript, 35 byte

#(apply +(map int(re-seq #"\d+"%)))

1

R, 50 byte

Yêu cầu phải gsubfncài đặt

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

Sử dụng strtoiđể ép buộc thành số


1

Ruby 45 byte

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

(Nỗ lực đầu tiên trong công việc, sẽ xem xét lại điều này)


1

POSIX sh + tr + dc, 27 25 byte

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

Chuyển đổi bất kỳ lần chạy không chữ số nào (bao gồm cả dòng mới kết thúc) thành +toán tử, đẩy hai số không lên ngăn xếp (trong trường hợp đầu vào bắt đầu bằng chữ số không), thêm tất cả và in kết quả. Có thể có thêm một số 0 còn lại ở dưới cùng của ngăn xếp, nhưng chúng tôi không quan tâm đến điều đó.


1

Lua, 51 byte

Khá ngắn cho một lần! Thậm chí còn ngắn hơn Java! Đầu vào phải là một đối số dòng lệnh để nó hoạt động.

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

Bị đánh cắp

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

Tiện ích Bash + GNU, 29

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

Nếu được yêu cầu hỗ trợ đầu vào không có số (ví dụ: a ), thì chúng ta có thể làm điều này:

Tiện ích Bash + GNU, 38

Lưu 1 byte nhờ @TobySpeight.

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

Điều này in không có gì cho đầu vào a. Chúng tôi hiện đang thảo luận về việc đó có hợp lệ hay không.
Dennis

@Dennis. Đồng ý. Tôi đã thêm một phiên bản khác để bao gồm cả hai sự kiện.
Chấn thương kỹ thuật số

Bạn có thể sử dụng ;thay vì ||luôn luôn thêm số không, không có hại.
Toby Speight

@TobySpeight Vâng, thật tốt - cảm ơn!
Chấn thương kỹ thuật số

1

Python 2, 70 byte

Tôi đang đặt một câu trả lời Python chỉ cho vui.

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

Rất đơn giản và sử dụng regex để tìm tất cả các số trong đầu vào. Hãy thử trực tuyến!


1
Trong bối cảnh này, bạn phải sử dụng raw_inputhoặc chuyển sang python3. Một phiên bản nhỏ hơn (py3, 56 byte) : import re;print(sum(map(int,re.findall('\d+',input())))).
Dica

1

Oracle SQL 11.2, 105 byte

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

Regex chuyển đổi các ký tự alpha thành ','

XMLTABLE tạo một hàng cho mỗi mục trong chuỗi bằng cách sử dụng ',' làm dấu phân cách.

SUM các hàng để có kết quả.

NVL là cần thiết để chiếm một chuỗi không có chữ số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.