Jumlah bilangan bulat dalam sebuah string

11

Memasukkan

Sebuah benang.

Keluaran

Jumlah semua bilangan bulat di baris.

Kendala

1≤Panjang garis≤500

Contoh uji kasus

Memasukkan

the 5is 108 seCONd4 a

Keluaran

117

Penjelasan

Jumlahnya adalah: 5 + 108 + 4 = 117

Karandeep Singh
sumber
6
Halo, selamat datang di PPCG. Tantangan untuk satu bahasa biasanya disukai di sini di PPCG. Mungkin Anda bisa mengubahnya menjadi tantangan umum: diberi string, menampilkan jumlah semua angka dalam string, mengabaikan semua yang lain (yaitu "the 5is 108 seCONd4 a"akan menghasilkan 117karena 5+108+4=117). Juga, setiap 'pertanyaan' di sini harus memiliki tag kondisi kemenangan . Dalam hal ini saya menganggap itu [kode-golf] (menjadi solusi sesingkat mungkin)?
Kevin Cruijssen
4
Tampaknya Anda telah memposting pertanyaan serupa di SO, yang cenderung mengkonfirmasi bahwa itu tidak dirancang untuk menjadi tantangan PPCG dan Anda mencari kode yang 'dapat digunakan' daripada kode golf. Saya akan merekomendasikan untuk meningkatkan pertanyaan awal Anda pada SO, sehingga lebih sesuai dengan aturan situs.
Arnauld
4
Saya telah memeriksa pos Anda agar sesuai dengan standar kami. Anda bebas mengedit jika hasilnya tidak cocok untuk Anda.
Adám
2
Bagaimana dengan kasus string x='-12hello3';ini Anda menghitung bilangan bulat negatif (yaitu, -12 + 3 === -9)?
Shaun Bebbers

Jawaban:

4

Javascript, 34 32 byte

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

Cocokkan semua digit dan bergabung dengan mereka dengan +mengubahnya menjadi 5 + 108 + 4, hasilkan eval.
Hanya bekerja pada bilangan bulat positif.

Disimpan 2 byte berkat 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>

Bassdrop Cumberwubwubwub
sumber
Saya kira menggunakan string.length di konsol untuk menghitung karakter bukan ide yang baik ketika berisi karakter escape ... Ups, perbaiki. Thx lagi
Bassdrop Cumberwubwubwub
Pilihan yang sedikit lebih baik console.log(f.toString().length), tetapi tidak 100% andal.
Arnauld
Atau hanya menggunakan TIO ...
Jo King
4

Perl 6 , 14 byte

{sum m:g/\d+/}

Cobalah online!

Blok kode anonim yang mengembalikan jumlah semua seri digit

Jo King
sumber
4

05AB1E , 11 6 byte

þмS¡þO

Cobalah online.

Penjelasan:

þм       # 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
Kevin Cruijssen
sumber
1
Oh, hei, penggunaan pintar ¡!
Erik the Outgolfer
4

R , 64 48 45 byte

Setelah melihat entri PowerShell saya bisa bermain golf ini lebih jauh.

function(s)eval(parse(,,gsub('\\D+','+0',s)))

Cobalah online!

CT Hall
sumber
t=lebih memadai di sini daripadatext
Giuseppe
Terima kasih, saya selalu lupa tentang pencocokan sebagian, (dan string ,,, sampai Anda mendapatkan opsi yang Anda inginkan).
CT Hall
3

APL (Dyalog Unicode) , 11 byte

Fungsi preferensi diam-diam anonim

+/#⍎¨∊∘⎕D⊆⊢

Cobalah online!

 argumen

 dipartisi (jalankan True menjadi bagian, jalankan False adalah pemisah) oleh

 keanggotaan
 dari
⎕D set digit

#⍎¨ mengevaluasi masing-masing di root namespace

+/ jumlah

Adm
sumber
3

Retina 0.8.2 , 8 byte

\d+
$*
1

Cobalah online!

  • Baris pertama cocok dengan semua angka
  • Baris kedua menggantikan ini dengan 1s, diulangi beberapa kali
  • Baris terakhir adalah pertandingan, dan menghitung jumlah total 1 dalam string
Yang Mulia
sumber
2

Arang , 5 byte

IΣ⁺ψS

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Operator Charcoal Sumsecara otomatis mengekstraksi angka dari sebuah string, namun jika string tersebut tidak mengandung karakter non-digit maka ia mengambil jumlah digital, jadi saya menggabungkan byte nol untuk menghindari hal ini. Hasilnya kemudian dilemparkan kembali ke string untuk output implisit.

Neil
sumber
2

Haskell , 50 byte

sum.map read.words.map f
f x|'/'<x,x<':'=x
f _=' '

Cobalah online!

Mungkin ada cara yang lebih baik, tetapi ini adalah yang paling jelas.

dfeuer
sumber
2

Zsh , 21 byte

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

Cobalah online!

  ${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

Sayangnya, bash mengeluh karena diartikan 0108sebagai oktal. Zsh tidak (kecuali setopt octalzeroes)

Fungsi Gamma
sumber
2

Bash, 43 byte

for n in ${1//[!0-9]/ };{((s+=n));};echo $s

Ganti setiap non-angka dengan spasi, lalu jumlahkan semuanya.

-5 byte berkat GammaFunction

vityavv
sumber
1
Terima kasih! Saya telah mengedit posting saya
vityavv
1

Python 3 , 63 59 56 byte

Kenapa tidak. Jawaban regex wajib. Mungkin bisa berlabuh 6 dengan menggunakan Python 2, tapi apa pun. Tidak berlaku lagi karena saya menggunakan pendekatan eval alih-alih menggunakan peta.

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

Penjelasan:

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

Cobalah online!

Epicness
sumber
Bagus! Di TIO Anda, Anda harus menggunakan z == l[1]bukan z is l[1]. Kode saat ini dapat memberikan negatif palsu jika angkanya cukup tinggi.
Jakob
1

Java 10, 66 byte

Ini adalah lambda dari Stringke int.

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

Bilangan bulat negatif tidak didukung. Agaknya tidak apa-apa.

Cobalah secara Online

Ucapan Terima Kasih

Jakob
sumber
1
Anda dapat beralih [^0-9]untuk \Dbeberapa byte, Anda juga dapat beralih longdan Stringuntuk var(meskipun Anda harus mengubah jenis kembali keint
Perwujudan Ketidaktahuan
1

Ruby, 32 27 karakter

->s{eval s.scan(/\d+/)*?+}

Ucapan Terima Kasih

GBrandt
sumber
Selamat datang di PPCG! Anda bisa menggunakan *?+bukan .join ?+untuk -7 byte. Lihat ary * str
Conor O'Brien
1

Cubix , 17 byte

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

Cobalah online!

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

Lihat saja

Yang cukup sederhana. Idi cubix akan mengambil integer pertama di input dan mendorongnya ke stack. Ini memiliki efek melewatkan semua karakter. Selebihnya berurusan dengan tambahan dan mendeteksi akhir input.

  • I! Masukkan bilangan bulat dan uji untuk 0
  • s+q;;Jika tidak nol, tukar TOS (gaya dan awal 0) dan tambahkan. Dorong hasil ke bagian bawah tumpukan dan bersihkan bagian atas. Kembali ke awal.
  • /i? Jika nol, arahkan ulang dan lakukan input karakter untuk memeriksa
  • |?;/Jika positif (karakter) berbelok ke kanan menjadi pantulan, ini kemudian mendorongnya kembali melalui checker ?dan berbelok ke kanan ke pop dari tumpukan, meninggalkan 0 pada TOS. IP kemudian dialihkan kembali ke loop utama.
  • I>p.O@ jika negatif (akhir input) belok kiri, lakukan input integer, bawa bagian bawah tumpukan ke atas, keluaran dan hentikan.
MickyT
sumber
1

PHP ,40 39 byte

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

Cobalah online!

Jalankan dengan php -nFinput dari STDIN. Contoh:

$ echo the 5is 108 seCONd4 a | php -nF sumint.php    
117
640KB
sumber
1

Depan , 13 byte

Ini berfungsi karena Icukup memindai aliran input untuk token berikutnya yang terlihat seperti angka, mengabaikan hal lain.

~Ilj~#
 >K+O@

Cobalah online!

siput_
sumber
0

QuadR , 9 byte

+/⍎⍵
\D
 

Cobalah online!

+/ jumlah dari

 evaluasi sebagai APL dari

 hasil dari

\D mengganti setiap non-digit dengan

 sebuah ruang

Adm
sumber
0

Attache , 23 byte

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

Cobalah online!

Jawaban yang lebih menarik, tetapi tidak langsung, (37 byte): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Penjelasan

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

Ini memiliki bentuk:

f##g=>h&x

yang, ketika diperluas dan dipatenkan, menjadi:

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

##menyusun dua fungsi bersama-sama, =>membuat fungsi memetakan fungsi kiri atas hasil fungsi yang tepat, dan &mengikat argumen ke sisi fungsi. Untuk input _, ini setara dengan:

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

Pertama, kemudian, kita MatchAllmenjalankan karakter digit ( \\d+). Setelah itu, kami mengonversi setiap proses ke integer aktual menggunakan Nfungsi. Akhirnya, kami mengambil jumlah dari angka-angka ini menggunakan Sum.

Conor O'Brien
sumber
0

APL (NARS), karakter 13, byte 26

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

uji:

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

C # (Visual C # Interactive Compiler), 117 111 byte

a=>System.Text.RegularExpressions.Regex.Replace(a,@"\D+"," ").Split(' ').Select(x=>x==""?0:int.Parse(x)).Sum();

Cobalah online.

Data Kedaluwarsa
sumber
0

Japt v2.0a0 -x, 3 byte

Test drive lain untuk penerjemah (sangat-WIP) saya.

q\D

Cobalah

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

Java 8, 53 130 byte

105 byte + 25 byte untuk impor regex

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

Cobalah online!
Penjelasan

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
   }
Benjamin Urquhart
sumber
2
Saya tidak berpikir ini benar: contoh (hanya) oleh OP menunjukkan bahwa digit berturut-turut harus membentuk bilangan bulat tunggal, jadi "123" harus menghasilkan 123, bukan 6 seperti kode Anda.
Michail
Sangat disayangkan, saya akan merevisinya ketika saya bisa
Benjamin Urquhart
@Michail direvisi
Benjamin Urquhart
0

Swift, 109 byte

func s(a:String){var d=0,t=0;a.forEach{(c) in if let e=Int(String(c)){d=d*10+e}else{t+=d;d=0}};t+=d;print(t)}

Cobalah online!

onnoweb
sumber
0

Pip , 6 byte

$+a@XI

Memperlakukan -123sebagai bilangan bulat negatif. Cobalah online!

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

Jika tanda hubung harus diabaikan daripada diperlakukan sebagai tanda minus, maka berikut ini berfungsi untuk 7 byte :

$+a@+XD

XDadalah variabel preset untuk `\d`; +XDmenambahkan +pengubah regex ke dalamnya, membuatnya cocok dengan 1 atau lebih digit.

DLosc
sumber
0

Java (JDK) , 98 94 93 byte

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

Cobalah online!

-4 bytesdengan menggunakan Long::newbukan Long::valueOf.
-1 bytedengan memperpendek regex - jika kita sudah menghapus string kosong nanti, membuat beberapa tambahan saat pemisahan baik-baik saja.

Dijelaskan

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.
Sara J
sumber