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!

Adnan
sumber
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.
Dennis
sumber
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 Ender
sumber
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 .

GamrCorps
sumber
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
Luis Mendo
sumber
5

Retina ,22 11

\d+
$0$*1
1

Cobalah online!

11 byte (!) Disimpan berkat Martin!

Pada dasarnya hanya desimal ke unary lalu hitung 1s.

FryAmTheEggman
sumber
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.
Produksi ETH
sumber
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
Produksi ETH
sumber
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!

Gagang pintu
sumber
4

Gol> <> , 4 byte

iEh+

Begitu pendeknya aku butuh teks tiruan ...

randomra
sumber
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
Brad Gilbert b2gills
sumber
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.
Dennis
sumber
3

Perl, 21 + 1 = 22 byte

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

Membutuhkan -pbendera:

$ perl -pe'$_=eval join"+",/\d+/g' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97
andlrc
sumber
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.

Alex A.
sumber
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

ʰᵈˑ
sumber
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`+`)

dihapus
sumber
2

Mathematica, 51 byte

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

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

A Simmons
sumber
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.

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

AdmBorkBork
sumber
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'
manatwork
sumber
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)
Mego
sumber
@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;}
HyperNeutrino
sumber
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
Timtech
sumber
1

Clojure / ClojureScript, 35 byte

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

R, 50 byte

Perlu gsubfndiinstal

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

Menggunakan strtoiuntuk memaksa ke numerik

mnel
sumber
1

Ruby 45 byte

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

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

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

Toby Speight
sumber
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
Katenkyo
sumber
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
digital Trauma
sumber
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!

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

Jeto
sumber