Saring dan tambahkan


16

Tugas

Tugasnya sangat sederhana. Diberikan string yang tidak kosong yang berisi angka , huruf besar dan huruf kecil , menampilkan jumlah angka yang tersisa. Sebagai contoh:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

Memfilter semua surat akan menghasilkan:

 1   5  45   5  4    33   4

Jumlah dari angka-angka ini adalah 1 + 5 + 45 + 5 + 4 + 33 + 4 = 97. Jadi hasilnya akan97 .

Uji Kasus

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

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!


Saya tahu saya telah menulis program Labyrinth sebelumnya ... di sini adalah tantangan yang sama tetapi dengan angka negatif juga (yang membuat perbedaan besar yang mengejutkan untuk beberapa bahasa, jadi saya tidak berpikir mereka menipu).
Martin Ender

@ MartinBüttner Sepertinya itu tidak termasuk angka negatif: "-n (di mana n adalah bilangan bulat) tidak dihitung sebagai n negatif, tetapi sebagai tanda hubung diikuti oleh n."
Paul

Oh, aku mengerti maksudmu. Anda mengatakan itu memiliki tanda hubung dan yang ini tidak.
Paul

Jawaban:


22

GS2, 2 byte

Wd

Cobalah online!

Bagaimana itu bekerja

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

11
Nah, ini tidak terduga ...
Adnan

@ Adnan: Ini Dennis. Dengan waktu yang cukup ia dapat menemukan solusi untuk kode golf apa pun dalam waktu kurang dari 4 byte.
Deusovi

13

Labirin , 8 byte

Ambil itu, Pyth ...

?+
;,;!@

Cobalah online!

Penjelasan

Primer biasa (dicuri dari Sp3000):

  • Labyrinth adalah 2D dan berbasis stack. Tumpukan memiliki angka nol tanpa batas di bagian bawah.
  • Ketika penunjuk instruksi mencapai persimpangan, itu memeriksa bagian atas tumpukan untuk menentukan ke mana harus belok berikutnya. Negatif dibiarkan, nol di depan dan positif di kanan.

Apa yang sangat berguna di sini adalah bahwa Labyrinth memiliki dua perintah input yang berbeda, ,dan ?. Yang pertama membaca byte tunggal dari STDIN, atau -1di EOF. Yang terakhir membaca bilangan bulat dari STDIN. Ia melewatkan semua yang bukan angka dan kemudian membaca angka desimal pertama yang ditemukannya. Yang ini kembali 0di EOF, jadi kami tidak bisa menggunakannya untuk memeriksa EOF dengan andal di sini.

Loop utama program adalah bit yang ringkas ini:

?+
;,

Dengan ?kami membaca integer (mengabaikan semua huruf), dengan +kami menambahkannya ke total berjalan (yang dimulai sebagai salah satu nol tersirat di tumpukan bawah). Kemudian kita membaca karakter lain dengan ,untuk memeriksa EOF. Selama kita tidak berada di EOF, karakter yang dibaca akan menjadi huruf yang memiliki kode karakter positif, sehingga IP berbelok ke kanan (dari sudut pandangnya; yaitu barat). ;membuang karakter karena kita tidak membutuhkannya dan kemudian kita masukkan loop lagi.

Setelah kita berada di EOF, ,tekan a -1sehingga IP berbelok ke kiri (timur). ;sekali lagi membuangnya -1, !mencetak total yang berjalan sebagai bilangan bulat dan @mengakhiri program.


Martin, hal-hal yang luar biasa!
A Simmons

6

CJam, 13 byte

Tetap bekerja dengan input tanpa angka berkat Dennis! Juga menyimpan byte dengan mengganti array surat dengan array ASCII di atas titik kode 64. Dan kemudian byte lain disimpan oleh Dennis!

q_A,s-Ser~]1b

Transliterasi sederhana dari huruf ke spasi, lalu eval dan jumlah. Cobalah online .


6

MATL , 8 byte

1Y4XXXUs

Cobalah online!

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

Retina ,22 11

\d+
$0$*1
1

Cobalah online!

11 byte (!) Disimpan berkat Martin!

Pada dasarnya hanya desimal ke unary lalu hitung 1s.


1
Saya mungkin harus membuat $0implisit jika substitusi dimulai $*. Ini adalah pola yang sangat umum dan akan membiarkan Anda mengalahkan Pyth. ;)
Martin Ender

@ MartinBüttner Sementara Anda melakukannya, Anda dapat membuat karakter yang tepat menjadi default juga untuk sesuatu: O
FryAmTheEggman

hm, bukan ide yang buruk. Saya akan berpikir tentang hal ini.
Martin Ender

5

Japt, 2 byte

Nx

Uji secara online!

Bagaimana itu bekerja

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

Saya mendapat pesan kesalahan "Japt.stdout" harus dikirim ke HTMLElement
Downgoat

@Downgoat Ini terjadi sesekali; Saya tidak yakin mengapa. Reload halaman tampaknya memperbaiki ini.
ETHproduksi

5

JavaScript ES6, 35 byte

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

Bagaimana itu bekerja

Pertama, kami mengganti setiap string yang bukan digit "+". Pada dasarnya ada empat cara berbeda yang bisa berakhir:

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

Kasus 1 dan 2 sudah diurus. Tetapi kita harus memperbaiki yang terakhir +agar tidak menyebabkan kesalahan. Kita bisa menghapusnya dengan .replace(/\+$,""), tapi itu terlalu mahal. Kita dapat menambahkan a 0hingga akhir, tetapi itu akan memengaruhi angka terakhir jika string tidak diakhiri dengan a +. Kompromi adalah menambahkan .0, yang merupakan angka yang valid sendiri dan tidak mempengaruhi nilai bilangan bulat lainnya.

Berikut beberapa nilai lain yang juga berfungsi:

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

Versi alternatif, juga 35 byte

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

Versi alternatif lain, 36 byte

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

4

Pyth, 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

Untungnya, s(convert to int) kembali 0ketika diterapkan ke string kosong, jadi saya tidak perlu khawatir tentang fakta yang split("a1b", "\D+")kembali ["", "1", ""]. Demikian pula, split("a", "\D+")pengembalian ["", ""].

Ini bahkan memungkinkan saya untuk membagi setiap non-digit satu per satu, karena 1 + 0 + 0 + 0 + 0 + 2hal yang sama 1 + 2.

Terima kasih kepada Thomas Kwa untuk satu byte!


4

Gol> <> , 4 byte

iEh+

Begitu pendeknya aku butuh teks tiruan ...


3
Mungkin Anda harus menjelaskan kode Anda dengan ruang ekstra Anda :)
nneonneo

4

Perl 6 , 18 byte

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

Pemakaian:

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

Jelly, 6 byte

&-ṣ-ḌS

Cobalah online!

Bagaimana itu bekerja

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

Membutuhkan -pbendera:

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

Apakah ini berfungsi ketika tidak ada angka? misalnya a?
FryAmTheEggman

@FryAmTheEggman Pertanyaan yang bagus, saya kira itu tidak akan mencetak apa pun yang dalam konteks numerik 0;-)
andlrc

3

Julia, 35 byte

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

Ini adalah fungsi anonim yang menerima string dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.

Kami menggunakan matchalluntuk mendapatkan array yang terdiri dari kecocokan dari ekspresi reguler \d+, yang hanya bilangan bulat dalam string. Kita harus menempelkan 0 ke depan string, jika tidak untuk kasus seperti "a", kita akan menjumlahkan array kosong, yang menyebabkan kesalahan. Kami kemudian menerapkan parseke setiap kecocokan string, yang mengonversi menjadi bilangan bulat, dan mengambil jumlahnya.


parsebisa menjadi intjika Anda tidak keberatan dengan peringatan penghinaan.
Dennis

@ Dennis saya lakukan ._.
Alex A.

2

PHP, 64 byte

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

Jalankan sebagai

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


Selamat Datang di Programming Puzzles dan Stack Exchange. Ini adalah jawaban yang bagus (+1), namun dapat ditingkatkan dengan menambahkan penjelasan dan rincian kode. Juga, bisakah Anda menggunakan <?bukan <?php?
wizzwizz4

2

Javascript, 32 39 byte

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


2

Mathematica, 51 byte

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

Menangkap ujung yang salah dari builtin verbose Mathematica. 1 Byte off dengan bantuan @DavidC


DigitCharacter ..akan menghemat 1 byte
DavidC

DigitCharactertidak berfungsi seperti yang tertulis karena menghapus semua digit sedangkan kami ingin menghapus semua huruf ...
A Simmons

1
kamu benar. Saya sedang memikirkanTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

Saya melihat! Ya perubahan itu menghemat satu byte.
A Simmons

2

R, 46 43 byte

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

Penjelasan

                    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

Contoh dijalankan

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

Sunting: Diganti [^0-9]dengan \\D.


Selamat datang di Programming Puzzles and Code Golf. Ini adalah jawaban pertama yang bagus; namun itu akan ditingkatkan dengan menambahkan penjelasan dan pemecahan kode, jadi kami tahu cara kerjanya.
wizzwizz4

1

PowerShell, 28 26 byte

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

Mengambil input $argskemudian melakukan regex -replaceuntuk menukar huruf dengan +0, lalu pipa itu ke iex(kependekan Invoke-Expressiondan mirip dengan eval).

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

kalau tidak

Jika Anda OK dengan beberapa output asing, Anda dapat melakukan hal berikut, juga pada 28 26 byte:

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

Ini akan mengambil string input $argsdan -splititu menjadi array-of-string pada non-angka (menghapusnya dalam proses). Misalnya 1a2b33akan berubah menjadi ['1','2','33']. Kami menyalurkannya ke Measure-Objectdengan -Sumparameter. Output akan seperti di bawah ini:

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

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

Sunting - durr, tidak perlu [ ]di regex karena saya tidak lagi menentukan daftar kemungkinan yang cocok ...


1

Gema, 39 karakter

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

Contoh dijalankan:

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

1

Serius, 13 byte

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

Cobalah online!

Penjelasan:

,ú;û+@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 - ini menampilkan daftar kosong a. Seharusnya berupa perbaikan satu 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

Bekerja pada kalkulator 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

Perlu gsubfndiinstal

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

Menggunakan strtoiuntuk memaksa ke numerik


1

Ruby 45 byte

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

(Upaya pertama di tempat kerja, akan mengunjungi kembali ini)


1

POSIX sh + tr + dc, 27 25 byte

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

Mengubah konversi non-digit (termasuk baris baru yang berhenti) ke +operator, mendorong dua nol ke tumpukan (jika input dimulai dengan non-digit), tambahkan semuanya dan cetak hasilnya. Mungkin ada tambahan nol tersisa di bagian bawah tumpukan, tetapi kami tidak peduli tentang itu.


1

Lua, 51 Bytes

Cukup singkat untuk sekali! Bahkan lebih pendek dari Jawa! Input harus berupa argumen baris perintah agar dapat berfungsi.

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

Tidak disatukan

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

Utilitas Bash + GNU, 29

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

Jika diperlukan untuk mendukung input tanpa nomor (mis a ), maka kita dapat melakukan ini:

Utilitas Bash + GNU, 38

1 byte disimpan berkat @TobySpeight.

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

Ini tidak mencetak apa pun untuk input a. Kami sedang mendiskusikan apakah itu valid atau tidak.
Dennis

@Dennis. Baik. Saya menambahkan versi lain untuk mencakup kedua kemungkinan.
Digital Trauma

Anda bisa menggunakan ;daripada ||selalu menambahkan nol, tanpa membahayakan.
Toby Speight

@TobySpeight Ya, itu bagus - terima kasih!
Trauma Digital

1

Python 2, 70 byte

Saya memberikan jawaban Python hanya untuk bersenang-senang.

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

Sangat sederhana dan menggunakan regex untuk menemukan semua angka dalam input. Cobalah online!


1
Dalam konteks ini Anda harus menggunakan raw_inputatau beralih ke python3. Sebuah versi yang lebih kecil (py3, 56 bytes): 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 mengonversi karakter alfa ke ','

XMLTABLE membuat satu baris per item dalam string menggunakan ',' sebagai pemisah.

SUM baris untuk mendapatkan hasilnya.

NVL diperlukan untuk menjelaskan string tanpa digit.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.