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


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>


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

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

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!


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


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


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.



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)



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!


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


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

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.

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


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!


0

QuadR , 9 byte

+/⍎⍵
\D
 

Cobalah online!

+/ jumlah dari

 evaluasi sebagai APL dari

 hasil dari

\D mengganti setiap non-digit dengan

 sebuah ruang



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.


0

APL (NARS), karakter 13, byte 26

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

uji:

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

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.



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

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
   }

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!


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.


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