'A' ve 'Y' gibi sayısal olmayanlarla ayrılmış, dizedeki tamsayıların toplamı


14

Programda değişken olarak ayarlanan bir dizede bulunan tüm tamsayıları toplayan bir program oluşturun (böylece programın herhangi bir girişi işlemesi gerekmez). Tamsayı sayıları sayısal olmayanlarla ayrılır (0, 1, 2, 3 ... 9 dışında herhangi bir şey).

Örnekler:

  • 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

Ekstra notlar:

  • Unicode desteği gerekli değildir , ancak izin verilir
  • -n(burada nbir tam sayı olduğu) değil , bir negatif olarak sayılır n, fakat bir tire ardından olarak n.

Cevap ekrana yazdırılabilir (ancak zorunlu değildir).

En kısa cevap (karakterlerle) kazanır.


Sonucu da yazdırmalı mıyız? (G / Ç'den bahsetmiyorsunuz).
Wile E. Coyote

@Dogbert - Bunu düşünmedim. Üzgünüm, evet. Gönderiyi güncelleyeceğim.
Anto

Bazı insanların zaten cevapları olduğu ve "incitmek" istemediği için değiştirildi. Sanırım şimdi uyumalıyım, bu yüzden biraz daha net düşüneceğim;)
Anto

2
Anto: Bir çözümün gözlemlenebilir yan etkisi olmayan bir görev çok hoş değil.
Joey

Ben sadece içine koştu ilginç bir test durumda olurdu 5a-3(kodum -hemen bir sayı takip eğer atlar , ama ondan önce bir sayı olmasaydı atlar ).
Martin Ender

Yanıtlar:


10

Perl, 15

Girin $_, toplamı girin $c:

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

14

Ruby 1.9, 21 karakter

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

Çözümü stdout'a yazdırmak için 2 ek karakter gereklidir:

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

Ve önceden tanımlanmış bir değişken kullanmak yerine stdin'den okumak için 3 karakter daha kullanılmalıdır:

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

Ruby 1.8 için 22 karakterle çalışan bir çözüm elde etmek için ?+ile değiştirin "+".


Girdinin stdin değil, bir değişkenten alınması gerekiyordu. Ayrıca scandaha kısadır split. Böylece çözümünüz eval s.scan(/\d+/)*?+- 21 karakter olur .
sepp2k

@ sepp2k: Evet, açıklamayı doğru okumadım. Ben sadece stdin'den okumak ve stdout'a yazdırmak zorunda olduğunuz diğer golf görevlerine alışkınım. İyi bir noktaya scan, teşekkürler!
Ventero

+1, büyük kullanımı evalve* '+'
Wile E. Coyote


5

Yakut - 36 34 karakter

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

Sonucu yazdırmak istiyorsanız 36 karakter.

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

Girdinin s olarak dize olarak var olduğunu varsayar.


4

JavaScript (ES6), 30

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

Açıklamalı sürüm:

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

Çıktı ile.

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

Aslında, çıktı olmadan tamamen aynıdır, sadece ihtiyaç duyulduğu başka bir yere bağlarsınız.


2

J - 40 38 karakter

Tembel versiyonu. Dize kitaplığı gerektirir.

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

Unicode'u destekler. Kodlamayı destekler, düşünmeye gel!
MPelletier

2

Java

yarışma dışı;)

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

JavaScript [30 bayt]

eval(s.match(/\d+/g).join('+'))

2

Labirent , 29 21 bayt

(Feragatname: Labirent bu görevden daha yenidir.)

Ayrıca, labirent değişken yok, bu yüzden normal bir giriş / çıkış programı ile gittim.

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

Bu, Labirent'in giriş komutlarının çalışma şekli nedeniyle oldukça basitti. ?STDIN'den işaretli bir tam sayı okumaya çalışır ve ilk rakam olmayanda durur. Bir tamsayıyı okuyamazsa (bir sonraki karakter -bir rakam ya da başka bir rakam olmayan bir rakam olduğu için veya EOF'a ulaştığımız için) 0bunun yerine geri döner . ,diğer yandan sonraki baytları okur ve bayt değerini iter. EOF'da çağrılırsa -1bunun yerine geri döner .

İşte çözüm için bazı sahte kod:

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

Negatif sayılarla uğraşmak bu çözümü oldukça karmaşık hale getirir. Bunlar olmasaydı, bu 8 baytlık bir çözüme sahip olurdum:

?+
;,;!@

1

PHP - 37

Baskı olmadan;

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

Baskı ile (38):

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

1

Perl, 16 karakter

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

Girdi alır $_, çıktı devam eder $r. Son noktalı virgül gereksizdir, ancak program daha fazla şey yaptığında muhtemelen gerekli olacaktır. say$rÇıktı için ekleyin .


Hata! Yayınladığımda aynı cevabı görmedim. Noktalı virgül olmadan bile bir karakter daha saymış olmama rağmen.
JB

@JB: Sayamıyorum! : P. Aslında, çift ​​tırnaklı bir dize yankılama hatası yaptım wc -c.
ninjalj

1

J - 23 karakter

Kazanan değil, ama eylemde oldukça nadir bir ilkel görüyoruz.

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

Açıklaması:

  • _"."0 y- Giriş dizesindeki her karakter yiçin sayı olarak okumayı deneyin. _Yapamıyorsanız, bunun yerine varsayılan değeri (sonsuz) kullanın.

  • ,_=- Her bir sonuç için eşitlik olup olmadığını kontrol edin _ve ardından 0 ve 1'lerin son dizisini bir vektörde çalıştırın. ( "."0sonuca her zaman çok fazla boyut ekler, bu yüzden burada düzeltiyoruz.)

  • y,:' ' - Giriş dizesinin altına bir satır boşluk ekleyin.

  • }- Burada olduğu gibi kullanılır, Öğe Değişikliği} olarak adlandırılır ve sağdaki argümanda çizilecek satırı seçmek için soldaki 0'lar ve 1'ler listesini endeks olarak kullanır. Öyleyse, sağ taraftaki her sütun için, sayı olarak okunabiliyorsa orijinal karakteri alırız, aksi takdirde altındaki alanı alırız. Bu nedenle, sayısal olmayan karakterleri boşluklarla kapatıyoruz.

  • +/". - Şimdi bu dizenin tamamını bir sayı listesine dönüştürün ve toplayın.


1

gs2, 4 bayt

W#Θd

CP437 ile kodlanmıştır ; üçüncü bayt E9.

W/-?\d+/bir dizeden tüm sayıları okur , mutlak değeri eşler, dtoplamlar.

(gs2 de bu meydan okumadan daha yenidir, ancak read-numsemri tam bir tesadüfdür .)


0

Smalltalk (Smalltalk / X) (51 karakter)

regex pakage kullanarak:

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

normal ifade:

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

s cinsinden girdi


0

R, 30

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

İşte, xdeğişkenin adı.

Misal:

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

0

Javascript - 43 karakter

Uzun olduğunu biliyorum, ama JS çözümü yoktu :)

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

adizedir. ccevap içeriyor.


0

Tcl, 30

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

Girdinin değişken içinde olduğunu $a(resmi olarak, içinde a) varsayar ve yanıtı yorumlayıcı sonucuna kaydeder. I / O bir egzersiz olarak bırakılmıştır.


0

APL, 16 bayt

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

⎕dbasamakları (0-9) içeren yerleşiktir. b0/1 vektörüne atanır; burada basamak olan karakterlere 1 verilir. bverilen karakter dizisini sıkıştırmak için kullanılır ve ardından boşluklar ekleyen genişletmek için yeniden kullanılır. APL olan eval bu durumda, bir vektör içine tamsayılar bir dize dönüştürür. +/toplamı hesaplar.


Eşit uzunluk, ama ilginç:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám

0

Hızlı 3, 78

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

sdize nerede


0

Perl - 24 karakter

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

Girdi $ _


0

Aslında 14 bayt (rakip olmayan)

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

Çevrimiçi deneyin!

Aslında bu meydan okumadan biraz daha yeni olduğu için bu başvuru rekabet etmiyor.

Bu program giriş için CP437 kod sayfasını destekler.

Açıklama:

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

0

C 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

Çevrimiçi deneyin!

Programın içindeki dizeyi kodlayarak biraz hile yapan 85 baytlık bir önceki sürüm:

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

Aslında 85 bayt programını kullanmak için değişkeni şu şekilde atamanız gerekir:

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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.