Tổng các số nguyên trong chuỗi, được phân tách bằng các số không như số 'a' và 'Y'


14

Tạo một chương trình tính tổng tất cả các số nguyên được tìm thấy trong một chuỗi được đặt làm biến trong chương trình (do đó, chương trình không phải xử lý bất kỳ đầu vào nào). Các số nguyên được phân tách bằng các số không (bất cứ thứ gì trừ 0, 1, 2, 3 ... 9).

Ví dụ:

  • 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

Ghi chú thêm:

  • Hỗ trợ Unicode là không cần thiết, nhưng được phép
  • -n(trong đó nlà một số nguyên) không được tính là âm n, mà là một dấu gạch nối theo sau n.

Câu trả lời có thể được in trên màn hình (nhưng không bắt buộc).

Câu trả lời ngắn nhất (tính cách) thắng.


Chúng ta có nên in kết quả quá không? (Bạn đề cập không có I / O).
Dogbert

@Dogbert - Tôi đã không nghĩ về điều đó. Xin lỗi, vâng. Tôi sẽ cập nhật bài viết.
Anto

Thay đổi nó như một số người đã có câu trả lời và không muốn "làm tổn thương" họ. Tôi đoán tôi nên ngủ bây giờ, vì vậy tôi sẽ suy nghĩ rõ ràng hơn một chút;)
Anto

2
Anto: Tuy nhiên, một nhiệm vụ mà một giải pháp không có tác dụng phụ có thể quan sát được thì không hay lắm.
Joey

Một trường hợp thử nghiệm thú vị mà tôi vừa gặp phải là 5a-3(mã của tôi sẽ bỏ qua -nếu nó đi theo một số ngay lập tức, nhưng không phải là nếu không có số trước nó).
Martin Ender

Câu trả lời:


10

Perl, 15

Nhập vào $_, tổng hợp trong $c:

s/\d+/$c+=$&/ge

14

Ruby 1.9, 21 ký tự

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

Để in giải pháp ra thiết bị xuất chuẩn, cần có thêm 2 ký tự:

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

Và để đọc từ stdin thay vì sử dụng biến được xác định trước, phải sử dụng 3 ký tự khác:

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

Đối với Ruby 1.8, thay thế ?+bằng "+"để có được giải pháp hoạt động trong 22 ký tự.


Đầu vào được cho là lấy từ một biến, không phải stdin. Cũng scanngắn hơn split. Vì vậy, giải pháp của bạn trở thành eval s.scan(/\d+/)*?+- 21 ký tự.
sepp2k

@ sepp2k: Vâng, đã không đọc mô tả chính xác. Tôi chỉ quen với các nhiệm vụ golf khác, nơi bạn thường phải đọc từ stdin và in ra thiết bị xuất chuẩn. Điểm tốt với scan, cảm ơn!
Ventero

+1, công dụng tuyệt vời của eval* '+'
Dogbert


5

Ruby - 36 34 ký tự

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

36 ký tự nếu bạn muốn kết quả được in.

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

Giả sử đầu vào là một chuỗi trong s.


4

JavaScript (ES6), 30

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

Phiên bản chú thích:

// 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

Với đầu ra.

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

Trong thực tế, không có đầu ra là hoàn toàn giống nhau, bạn chỉ cần đặt nó ở một nơi khác mà nó cần.


2

J - 40 38 ký tự

Phiên bản lười biếng. Yêu cầu thư viện chuỗi.

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

Hỗ trợ Unicode. Hỗ trợ mã hóa, hãy nghĩ về nó!
MPelletier

2

Java

ra khỏi cuộc thi;)

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

Mê cung , 29 21 byte

(Tuyên bố miễn trừ trách nhiệm: Mê cung mới hơn thử thách này.)

Ngoài ra, Labyrinth không có biến, vì vậy tôi đã sử dụng chương trình nhập / xuất bình thường.

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

Điều này khá đơn giản vì cách hoạt động của các lệnh đầu vào của Labyrinth. ?cố gắng đọc một số nguyên đã ký từ STDIN và dừng ở chữ số đầu tiên. Nếu nó không thể đọc được một số nguyên (vì ký tự tiếp theo -không được theo sau bởi một chữ số hoặc bất kỳ chữ số nào khác hoặc chúng tôi đã đạt EOF), 0thay vào đó , nó sẽ trở lại . ,mặt khác đọc bất kỳ byte tiếp theo và đẩy giá trị byte. Nếu cái này được gọi tại EOF, nó sẽ trả về -1.

Vì vậy, đây là một số mã giả cho giải pháp:

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

Xử lý các số âm chính xác làm phức tạp giải pháp này khá nhiều. Nếu nó không dành cho những người đó, tôi sẽ có giải pháp 8 byte này:

?+
;,;!@

1

PHP - 37

Không in;

<?array_sum(@split("[^0-9]+",`cat`));

Với in ấn (38):

<?=array_sum(@split("[^0-9]+",`cat`));

1

Perl, 16 ký tự

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

Đưa đầu vào vào $_, đầu ra tiếp tục $r. Dấu chấm phẩy cuối cùng là không cần thiết, nhưng có lẽ nó sẽ cần thiết khi chương trình làm nhiều việc hơn. Thêm say$rcho đầu ra.


Rất tiếc, tôi không thấy câu trả lời chính xác của bạn khi tôi đăng. Mặc dù tôi đã đếm thêm một ký tự ngay cả khi không có dấu chấm phẩy.
JB

@JB: Tôi không thể đếm! : P. Trên thực tế, tôi đã phạm sai lầm khi lặp lại một chuỗi trích dẫn képwc -c .
ninjalj

1

J - 23

Không phải là một người chiến thắng, nhưng chúng ta có thể thấy một hành động nguyên thủy khá hiếm gặp.

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

Giải thích:

  • _"."0 y- Đối với mỗi ký tự trong chuỗi đầu vào y, hãy thử đọc nó dưới dạng số. Nếu bạn không thể, hãy sử dụng giá trị mặc định _(vô cực) thay thế.

  • ,_=- Kiểm tra từng kết quả để tìm đẳng thức _, và sau đó chạy mảng 0 và 1 cuối cùng thành một vectơ. ( "."0luôn thêm một quá nhiều thứ nguyên vào kết quả, vì vậy chúng tôi sửa cho điều đó ở đây.)

  • y,:' ' - Thêm một hàng khoảng trắng bên dưới chuỗi đầu vào.

  • }- Được sử dụng như ở đây, }được gọi là Sửa đổi Mục và nó sử dụng danh sách 0 và 1 ở bên trái làm chỉ mục để chọn hàng để rút ra trong đối số bên phải. Vì vậy, những gì xảy ra là, đối với mỗi cột ở phía bên phải, chúng ta lấy ký tự gốc nếu nó có thể được đọc dưới dạng số và nếu không, chúng ta sẽ lấy khoảng trắng bên dưới nó. Do đó, chúng tôi che đậy mọi ký tự không phải là số có dấu cách.

  • +/". - Bây giờ chuyển đổi toàn bộ chuỗi này thành một danh sách các số và tính tổng chúng.


1

gs2, 4 byte

W#Θd

Được mã hóa trong CP437 ; byte thứ ba là E9.

Wđọc tất cả các số /-?\d+/từ một chuỗi, ánh xạ giá trị tuyệt đối, dtổng.

(gs2 cũng vậy, mới hơn thử thách này, nhưng read-numslệnh của nó hoàn toàn trùng khớp.)


0

Smalltalk (Smalltalk / X) (51 ký tự)

sử dụng pakage regex:

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

wex regex:

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

đầu vào trong s


0

R, 30

sum(scan(t=gsub("\\D"," ",x)))

Đây xlà tên của biến.

Thí dụ:

> x  <- "e7rde f ,fe 43 jfj 54f4sD"
> sum(scan(t=gsub("\\D"," ",x)))
Read 4 items
[1] 108

0

Javascript - 43 ký tự

Tôi biết nó dài, nhưng không có giải pháp JS nên :)

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

alà chuỗi. cchứa câu trả lời.


0

Tcl, 30

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

Nó giả định rằng đầu vào nằm trong biến $a(chính thức, trong a) và lưu câu trả lời trong kết quả phiên dịch. I / O được để lại như một bài tập.


0

C99 (có cảnh báo) 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);}

Để thực sự sử dụng chương trình, bạn cần gán biến như vậy:

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);}

Nếu bạn đang sử dụng gcc, bạn cần biên dịch nó thành C99 như vậy:

gcc -std=c99 x.c

0

APL, 16 byte

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

⎕dlà một tích hợp có chứa các chữ số (0-9). bđược gán cho vectơ 0/1 trong đó 1 được gán cho các ký tự là chữ số. bđược sử dụng để nén mảng ký tự đã cho và sau đó được sử dụng lại để mở rộng nó, trong đó chèn các khoảng trống. eval của APL chuyển đổi một chuỗi thành một vectơ một số nguyên, trong trường hợp này. +/tính tổng.


Độ dài bằng nhau, nhưng thú vị:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám

0

Swift 3, 78

s.characters.split{!("0"..."9"~=$0)}.flatMap{Int(String($0))}.reduce(0){$0+$1}

nơi slà chuỗi


0

Perl - 24 ký tự

warn eval join'+',/\d+/g

Đầu vào là $ _


0

Trên thực tế, 14 byte (không cạnh tranh)

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

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

Bài dự thi này không cạnh tranh vì Trên thực tế là một chút công bằng mới hơn thử thách này.

Chương trình này hỗ trợ trang mã CP437 cho đầu vào.

Giải trình:

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
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.