Số nguyên tổng trong một chuỗi


11

Đầu vào

Một chuỗi.

Đầu ra

Tổng của tất cả các số nguyên trong dòng.

Những ràng buộc

1≤Chiều dài của dòng≤500

Mẫu thử

Đầu vào

the 5is 108 seCONd4 a

Đầu ra

117

Giải trình

Tổng là: 5 + 108 + 4 = 117


6
Xin chào, chào mừng đến với PPCG. Những thách thức đối với một ngôn ngữ duy nhất thường được tán thành ở đây tại PPCG. Có lẽ bạn có thể thay đổi nó thành một thách thức chung: đưa ra một chuỗi, xuất tổng của tất cả các số trong chuỗi, bỏ qua mọi thứ khác (nghĩa là "the 5is 108 seCONd4 a"sẽ dẫn đến 1175+108+4=117). Ngoài ra, mỗi 'câu hỏi' ở đây nên có thẻ điều kiện chiến thắng . Trong trường hợp này, tôi cho rằng đó là [code-golf] (là giải pháp ngắn nhất có thể)?
Kevin Cruijssen

4
Có vẻ như bạn đã đăng một câu hỏi tương tự trên SO, có xu hướng xác nhận rằng nó không được thiết kế để trở thành một thách thức PPCG và bạn đang tìm kiếm mã 'có thể sử dụng' thay vì mã đánh gôn. Thay vào đó, tôi khuyên bạn nên cải thiện câu hỏi ban đầu của mình về SO, để nó phù hợp hơn với các quy tắc của trang web.
Arnauld

4
Tôi đã đại tu bài viết của bạn để phù hợp với tiêu chuẩn của chúng tôi. Hãy chỉnh sửa nếu kết quả không phù hợp với bạn.
Adám


2
Còn trường hợp này string x='-12hello3';thì bạn đang đếm số nguyên âm (nghĩa là -12 + 3 === -9)?
Shaun Bebbers

Câu trả lời:


4

Javascript, 34 32 byte

s=>eval(s.match(/\d+/g).join`+`)

Ghép tất cả các chữ số và nối chúng với nhau bằng cách +biến nó thành 5 + 108 + 4, đánh giá kết quả.
Chỉ hoạt động trên số nguyên dương.

Đã lưu 2 byte nhờ Arnauld

f=
    s=>eval(s.match(/\d+/g).join`+`)

g=()=>b.innerHTML = f(a.value)
g()
<input id=a value="the 5is 108 seCONd4 a" onkeyup="g()">
<pre id=b>


Tôi đoán sử dụng string.length trong bảng điều khiển để đếm các ký tự không phải là ý hay khi nó chứa các ký tự thoát ... Rất tiếc, đã sửa nó. Thx một lần nữa
Bassdrop Cumberwubwubwub

Một lựa chọn tốt hơn một chút sẽ là console.log(f.toString().length), nhưng nó cũng không đáng tin cậy 100%.
Arnauld

Hoặc chỉ sử dụng TIO ...
Jo King


4

05AB1E , 11 6 byte

þмS¡þO

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

Giải trình:

þм       # Only leave the non-digits of the (implicit) input-string
         #  i.e. "the 5is 108 seCONd4 a" → "the is  seCONd a"
  S      # Split it into a list of characters
         #  → ["t","h","e"," ","i","s"," "," ","s","e","C","O","N","d"," ","a"]
   ¡     # Split the (implicit) input-string by each of these characters
         #  → ["","","","","5","","","108","","","","","","","4","",""]
    þ    # Remove the empty strings by only leaving the digits
         #  → ["5","108","4"]
     O   # And sum these numbers (which is output implicitly)
         #  → 117

1
Oh hey, sử dụng thông minh của ¡!
Erik the Outgolfer


3

APL (Dyalog Unicode) , 11 byte

Chức năng ẩn danh ẩn danh

+/#⍎¨∊∘⎕D⊆⊢

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

 tranh luận

 được phân vùng (chạy True trở thành mảnh, chạy sai là dấu phân cách) bởi

 thành viên
 của
⎕D bộ chữ số

#⍎¨ đánh giá từng cái trong không gian tên gốc

+/ Tổng


3

Võng mạc 0.8.2 , 8 byte

\d+
$*
1

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

  • Dòng đầu tiên phù hợp với tất cả các số
  • Dòng thứ hai thay thế những dòng này bằng 1 giây, lặp lại số lần nói
  • Dòng cuối cùng là một trận đấu và đếm tổng số 1 giây trong chuỗi


2

Than , 5 byte

IΣ⁺ψS

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải thích: SumToán tử của Char than tự động trích xuất các số từ một chuỗi, tuy nhiên nếu chuỗi không chứa các ký tự không có chữ số thì thay vào đó, nó lấy tổng số, vì vậy tôi ghép một byte rỗng để tránh điều này. Kết quả sau đó được đưa trở lại chuỗi cho đầu ra ẩn.



2

Zsh , 21 byte

<<<$[${1//[^0-9]/+0}]

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

  ${1           }  # the 5is 108 seCONd4 a
  ${1//[^0-9]/+0}  # +0+0+0+05+0+0+0108+0+0+0+0+0+0+04+0+0
$[${1//[^0-9]/+0}] # 117

Thật không may, bash phàn nàn vì nó diễn giải 0108như bát phân. Zsh không (trừ khi setopt octalzeroes)



1

Python 3 , 63 59 56 byte

Tại sao không. Bắt buộc regex trả lời. Có lẽ có thể cập bến 6 bằng cách sử dụng Python 2, nhưng bất cứ điều gì. Không áp dụng nữa vì tôi đang sử dụng phương pháp tiếp cận thay vì sử dụng bản đồ.

import re;x=lambda y:eval('+'.join(re.findall('\d+',y)))

Giải trình:

import re; # Import regex module
x=lambda y: eval(                                 ) # Run as Python code
                  '+'.join(                     ) # Joined by '+'
                            re.findall('\d+',y) # A list of all matches of regex \d+ in string y

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


Đẹp! Trong TIO của bạn, bạn nên sử dụng z == l[1]thay vì z is l[1]mặc dù. Mã hiện tại có thể đưa ra âm tính giả nếu các số đủ cao.
Jakob

1

Java 10, 66 byte

Đây là một lambda từ Stringđến int.

s->{var r=0;for(var n:s.split("\\D"))r+=new Long("0"+n);return r;}

Số nguyên âm không được hỗ trợ. Có lẽ như vậy là ổn.

Dùng thử trực tuyến

Sự nhìn nhận


1
Bạn có thể chuyển đổi [^0-9]cho \Dmột vài byte, bạn cũng có thể chuyển đổi longStringcho var(mặc dù bạn sẽ phải thay đổi loại trả về thànhint
Hiện thân của sự thiếu hiểu biết vào


1

Khối , 17 byte

?|i.I!/s+q;;>p.O@

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

    ? |
    i .
I ! / s + q ; ;
> p . O @ . . .
    . .
    . .

Xem nó chạy

Một điều khá đơn giản. Itrong cubix sẽ lấy số nguyên đầu tiên trong đầu vào và đẩy nó vào ngăn xếp. Điều này có tác dụng bỏ qua tất cả các nhân vật. Phần còn lại của nó là xử lý bổ sung và phát hiện kết thúc của đầu vào.

  • I! Nhập một số nguyên và kiểm tra nó cho 0
  • s+q;;Nếu không bằng 0, hoán đổi TOS (lực và 0 ban đầu) và thêm. Đẩy kết quả xuống dưới cùng của ngăn xếp và làm sạch trên cùng. Quay trở lại bắt đầu.
  • /i? Nếu không, chuyển hướng và thực hiện nhập ký tự để kiểm tra
  • |?;/Nếu dương (ký tự) biến phải thành phản xạ, thì điều này sau đó đẩy nó trở lại qua trình kiểm tra ?và rẽ phải vào cửa sổ bật lên từ ngăn xếp, để lại 0 trên ĐKDV. IP sau đó được chuyển hướng trở lại vào vòng lặp chính.
  • I>p.O@ nếu âm (kết thúc đầu vào) rẽ trái, làm đầu vào số nguyên, đưa đáy ngăn xếp lên trên cùng, đầu ra và tạm dừng.

1

PHP ,40 39 byte

<?=array_sum(preg_split('(\D)',$argn));

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

Chạy với php -nFđầu vào là từ STDIN. Thí dụ:

$ echo the 5is 108 seCONd4 a | php -nF sumint.php    
117





0

Tùy viên , 23 byte

Sum##N=>MatchAll&"\\d+"

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

Một câu trả lời thú vị hơn, nhưng gián tiếp (37 byte): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Giải trình

Sum##N=>MatchAll&"\\d+"

Điều này có dạng:

f##g=>h&x

mà, khi được mở rộng và ngoặc đơn, trở thành:

f ## (g => (h&x))

##kết hợp hai hàm với nhau, =>tạo ra một hàm ánh xạ hàm trái qua kết quả của hàm phải và &liên kết một đối số với một mặt của hàm. Đối với đầu vào _, điều này tương đương với:

{ f[Map[g, h[_, x]]] }

Đầu tiên, sau đó, chúng tôi MatchAllchạy các ký tự chữ số ( \\d+). Sau đó, chúng tôi chuyển đổi mỗi lần chạy thành một số nguyên thực tế bằng cách sử dụng Nhàm. Cuối cùng, chúng tôi lấy tổng của những con số này bằng cách sử dụng Sum.


0

APL (NARS), ký tự 13, byte 26

{+/⍎¨⍵⊂⍨⍵∊⎕D}

kiểm tra:

  f←{+/⍎¨⍵⊂⍨⍵∊⎕D}
  f 'the 5is 108 seCONd4 a'
117



0

Japt v2.0a0 -x, 3 byte

Một ổ đĩa thử nghiệm khác cho trình thông dịch (rất WIP) của tôi.

q\D

Thử nó

q\D     :Implicit input of string
q       :Split on
 \D     :  Non-digit characters (/[^0-9]/)
        :Implicitly reduce by addition and output

0

Java 8, 53 130 byte

105 byte + 25 byte để nhập regex

s->{long c=0;for(Matcher m=Pattern.compile("\\d+").matcher(s);m.find();c+=new Long(m.group()));return c;}

Hãy thử trực tuyến!
Giải trình

s->{                                                    // Lambda function
    long c=0;                                           // Sum is zero
    for(Matcher m=Pattern.compile("\\d+").matcher(s);   // Prepare regex matcher
        m.find();                                       // While the string contains unused matches...
        c+=new Long(m.group()));                        // Add those matches to the output
    return c;                                           // Return the output
   }

2
Tôi không nghĩ điều này là đúng: ví dụ (chỉ) của OP cho thấy các chữ số liên tiếp sẽ tạo thành một số nguyên duy nhất, vì vậy "123" sẽ tạo ra 123, chứ không phải 6 như mã của bạn.
Michail

Điều đó thật đáng tiếc, tôi sẽ sửa lại khi tôi có thể
Benjamin Urquhart

@Michail sửa đổi
Benjamin Urquhart



0

Pip , 6 byte

$+a@XI

Xử lý -123như một số nguyên âm. Hãy thử trực tuyến!

  a     Command-line input
   @XI  Regex find all integers (XI is a variable predefined as the regex `-?\d+`)
$+      Fold on +

Nếu các dấu gạch nối nên được bỏ qua thay vì được coi là dấu trừ, thì sau đây hoạt động cho 7 byte :

$+a@+XD

XDlà một biến đặt trước cho `\d`; +XDthêm công cụ +sửa đổi regex cho nó, làm cho nó khớp với 1 hoặc nhiều chữ số.


0

Java (JDK) , 98 94 93 byte

s->java.util.Arrays.stream(s.split("\\D")).filter(t->!t.isEmpty()).mapToLong(Long::new).sum()

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

-4 bytesbằng cách sử dụng Long::newthay vì Long::valueOf.
-1 bytebằng cách rút ngắn regex - nếu sau đó chúng tôi đã xóa các chuỗi trống, thực hiện một số bổ sung khi chia tách là tốt.

Giải thích

s->                            // Lambda (target type is ToLongFunction<String>)
    java.util.Arrays.stream(   // Stream the result of
        s.split("\\D")        // splitting on non-digits
    )
    .filter(t->!t.isEmpty())   // Discard any empty strings
    .mapToLong(Long::new)      // Convert to long
    .sum()                     // Add up the stream's values.
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.