Jumlah bilangan bulat dalam string, dipisahkan oleh non-numerik seperti 'a' dan 'Y'


14

Buat program yang menjumlahkan semua bilangan bulat yang ditemukan dalam string yang ditetapkan sebagai variabel dalam program (dengan demikian, program tidak harus menangani input apa pun). Angka integer dipisahkan oleh non-numerik (selain 0, 1, 2, 3 ... 9).

Contoh:

  • 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

Catatan tambahan:

  • Dukungan Unicode tidak diperlukan, tetapi diizinkan
  • -n(Dimana nbilangan bulat) tidak dihitung sebagai negatif n, tetapi sebagai tanda hubung diikuti oleh n.

Jawabannya dapat dicetak di layar (tetapi tidak diperlukan).

Jawaban terpendek (dalam karakter) menang.


Haruskah kita mencetak hasilnya juga? (Anda menyebutkan tidak I / O).
Dogbert

@Dogbert - Saya tidak memikirkan hal itu. Maaf ya Saya akan memperbarui pos.
Anto

Mengubahnya karena beberapa orang sudah memiliki jawaban dan tidak ingin "melukai" mereka. Saya kira saya harus tidur sekarang, jadi saya akan berpikir sedikit lebih jelas;)
Anto

2
Anto: Tugas di mana solusi tidak memiliki efek samping yang dapat diamati tidak terlalu bagus.
Joey

Kasus uji yang menarik yang baru saja saya temui adalah 5a-3(kode saya akan melompati -jika mengikuti nomor segera, tetapi tidak jika ada non-angka sebelumnya).
Martin Ender

Jawaban:


10

Perl, 15

Masukkan $_, jumlahkan $c:

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

14

Ruby 1.9, 21 karakter

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

Untuk mencetak solusi ke stdout, diperlukan 2 karakter tambahan:

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

Dan untuk membaca dari stdin daripada menggunakan variabel yang telah ditentukan, 3 karakter lain harus digunakan:

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

Untuk Ruby 1.8, ganti ?+dengan "+"untuk mendapatkan solusi yang berfungsi dalam 22 karakter.


Input seharusnya diambil dari variabel, bukan stdin. Juga scanlebih pendek dari split. Jadi solusi Anda menjadi eval s.scan(/\d+/)*?+- 21 karakter.
sepp2k

@ sepp2k: Ya, tidak membaca deskripsi dengan benar. Saya hanya terbiasa dengan tugas golf lainnya, di mana Anda biasanya harus membaca dari stdin dan mencetak ke stdout. Poin bagus dengan scan, terima kasih!
Ventero

+1, penggunaan hebat evaldan* '+'
Dogbert


5

Ruby - 36 34 karakter

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

36 karakter jika Anda ingin hasilnya dicetak.

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

Mengasumsikan input hadir sebagai string dalam s.


4

JavaScript (ES6), 30

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

Versi beranotasi:

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

Dengan output.

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

Faktanya, tanpa output persis sama, Anda hanya perlu menyalurkannya di tempat lain di mana ia dibutuhkan.


2

J - 40 38 karakter

Versi malas. Membutuhkan perpustakaan string.

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

Mendukung Unicode. Mendukung pengkodean, kalau dipikir-pikir itu!
MPelletier

2

Jawa

keluar dari kontes;)

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

Labyrinth , 29 21 byte

(Penafian: Labirin lebih baru dari tantangan ini.)

Juga, Labyrinth tidak memiliki variabel, jadi saya pergi dengan program input / output normal.

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

Ini cukup sederhana karena cara input perintah Labyrinth bekerja. ?mencoba membaca bilangan bulat yang ditandatangani dari STDIN dan berhenti di non-digit pertama. Jika tidak dapat membaca bilangan bulat (karena karakter berikutnya adalah -tidak diikuti oleh digit, atau non-digit lainnya, atau kami telah mencapai EOF), ia akan kembali 0sebagai gantinya. ,di sisi lain membaca byte berikutnya dan mendorong nilai byte. Jika yang ini disebut di EOF itu akan kembali -1sebagai gantinya.

Jadi, inilah beberapa kodesemu untuk solusinya:

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

Berurusan dengan angka negatif cukup merumitkan solusi ini. Jika bukan karena itu, saya akan memiliki solusi 8 byte ini:

?+
;,;!@

1

PHP - 37

Tanpa cetak;

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

Dengan pencetakan (38):

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

1

Perl, 16 karakter

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

Membawa input masuk $_, output terus berjalan $r. Titik koma terakhir tidak berguna, tetapi mungkin akan diperlukan ketika program melakukan lebih banyak hal. Tambahkan say$runtuk keluaran.


Ups, tidak melihat jawaban Anda yang sama persis ketika saya memposting. Meskipun saya menghitung satu karakter lebih banyak bahkan tanpa titik koma.
JB

@ JK: Saya tidak bisa menghitung! : P. Sebenarnya, saya membuat kesalahan dengan menggandakan string yang dikutip gandawc -c .
ninjalj

1

J - 23 char

Bukan pemenang, tetapi kita bisa melihat primitif yang cukup langka dalam aksi.

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

Dijelaskan:

  • _"."0 y- Untuk setiap karakter dalam string input y, cobalah membacanya sebagai angka. Jika Anda tidak bisa, gunakan nilai default _(tak terhingga) sebagai gantinya.

  • ,_=- Periksa setiap hasil untuk kesetaraan _, dan kemudian jalankan array akhir 0s dan 1s menjadi vektor. ( "."0selalu menambahkan satu dimensi terlalu banyak ke hasilnya, jadi kami memperbaikinya di sini.)

  • y,:' ' - Tambahkan baris spasi di bawah string input.

  • }- Digunakan sebagaimana adanya di sini, }disebut Item Amend , dan ia menggunakan daftar 0s dan 1s di sebelah kiri sebagai indeks untuk memilih baris yang akan diambil dari argumen yang benar. Jadi yang terjadi adalah, untuk setiap kolom di sisi kanan, kami mengambil karakter asli jika dapat dibaca sebagai angka, dan jika tidak, kami mengambil ruang di bawahnya. Karenanya, kami menutupi setiap karakter non-numerik dengan spasi.

  • +/". - Sekarang konversi seluruh string ini menjadi daftar angka, dan jumlahkan.


1

gs2, 4 byte

W#Θd

Dikodekan dalam CP437 ; byte ketiga adalah E9.

Wmembaca semua angka /-?\d+/dari string, memetakan nilai absolut, djumlah

(GS2 juga lebih baru dari tantangan ini, tetapi read-numsperintahnya adalah suatu kebetulan total.)


0

Smalltalk (Smalltalk / X) (51 karakter)

menggunakan regex pakage:

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

dengan regex:

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

masukan dalam s


0

R, 30

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

Di sini, xadalah nama variabel.

Contoh:

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

0

Javascript - 43 karakter

Saya tahu ini panjang, tapi tidak ada solusi JS jadi :)

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

aadalah string. cberisi jawaban.


0

Tcl, 30

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

Diasumsikan bahwa input ada dalam variabel $a(secara formal, dalam a) dan menyimpan jawaban dalam hasil penerjemah. I / O dibiarkan sebagai latihan.


0

C99 (dengan peringatan) 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);}

Untuk benar-benar menggunakan program ini, Anda perlu menetapkan variabel seperti:

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

Jika Anda menggunakan gcc, Anda harus mengompilasinya sebagai C99 seperti:

gcc -std=c99 x.c

0

APL, 16 byte

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

⎕dadalah built-in yang berisi digit (0-9). bditugaskan ke vektor 0/1 di mana 1 diberikan ke karakter yang merupakan digit. bdigunakan untuk mengompresi array karakter yang diberikan dan kemudian digunakan kembali untuk memperluasnya, yang memasukkan kosong. adalah APL eval yang mengubah string ke vektor bilangan bulat, dalam hal ini. +/menghitung jumlahnya.


Panjang yang sama, tetapi menarik:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám

0

Swift 3, 78

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

dimana ssenarnya


0

Perl - 24 karakter

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

Input dalam $ _


0

Sebenarnya, 14 byte (tidak bersaing)

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

Cobalah online!

Kiriman ini tidak bersaing karena Sebenarnya sedikit lebih baru dari tantangan ini.

Program ini mendukung halaman kode CP437 untuk input.

Penjelasan:

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