Bir dizedeki toplam tamsayılar


11

Giriş

Dizi.

Çıktı

Satırdaki tüm tam sayıların toplamı.

Kısıtlamalar

1≤ Çizgi uzunluğu≤500

Örnek test örneği

Giriş

the 5is 108 seCONd4 a

Çıktı

117

açıklama

Toplam: 5 + 108 + 4 = 117


6
Merhaba, PPCG'ye hoş geldiniz. Tek bir dil için zorluklar genellikle PPCG'de kaşlarını çattı. Belki genel mücadeleye bunu değiştirebilir: dizede tüm sayıların toplamı çıkışı, bir dize verilen, başka herşeyi görmezden (yani "the 5is 108 seCONd4 a"neden olacaktır 117çünkü 5+108+4=117). Ayrıca, buradaki her 'soru' kazanan bir koşul etiketine sahip olmalıdır . Bu durumda bunun [code-golf] olduğunu varsayalım (mümkün olan en kısa çözüm)?
Kevin Cruijssen

4
Görünüşe göre SO'ya benzer bir soru yayınladınız, bu da bir PPCG meydan okuması olarak tasarlanmadığını onaylama eğilimindedir ve golf kodundan ziyade 'kullanılabilir' kod arıyorsunuz. Bunun yerine SO ile ilgili orijinal sorunuzu geliştirmenizi tavsiye ederim, böylece sitenin kurallarına daha iyi uyar.
Arnauld

4
Yayınınızı standartlarımıza uygun olarak elden geçirdim. Sonuç size uygun değilse düzenlemekten çekinmeyin.
Adam


2
Bu durumda string x='-12hello3';negatif tamsayıları sayıyorsunuz (yani, -12 + 3 === -9)?
Shaun Bebbers

Yanıtlar:


4

Javascript, 34 32 bayt

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

Tüm rakamları eşleştirin ve +5 + 108 + 4'e çevirerek onlara katılın , sonucu değerlendirin.
Yalnızca pozitif tamsayılarda çalışır.

Arnauld sayesinde 2 bayt tasarruf edildi

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>


Karakterleri saymak için konsolda string.length kullanmak sanırım kaçış karakterleri içerdiğinde iyi bir fikir değil ... Hata! Düzeltti. Thx tekrar
Bassdrop Cumberwubwubwub

Biraz daha iyi bir seçenek olacaktır console.log(f.toString().length), ama bu değil ya% 100 güvenilir.
Arnauld

Ya da sadece TIO'yu kullanarak ...
Jo King


4

05AB1E , 11 6 bayt

þмS¡þO

Çevrimiçi deneyin.

Açıklama:

þм       # 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
Ah, akıllı kullanımı ¡!
Outgolfer Erik

4

R , 64 48 45 bayt

PowerShell girişini gördükten sonra bu daha golf başardı.

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

Çevrimiçi deneyin!


t=burada yetertext
Giuseppe

Teşekkürler, her zaman kısmi eşlemeyi unuturum (ve istediğiniz seçeneğe ulaşana kadar `` dizesini).
CT Salonu

3

APL (Dyalog Unicode) , 11 bayt

Anonim zımni prefic fonksiyonu

+/#⍎¨∊∘⎕D⊆⊢

Çevrimiçi deneyin!

 argüman

 bölümlenmiş (True'nun parçaları parça haline gelir, False'nin çalışması ayırıcılardır) tarafından

 üyelik
 ait
⎕D basamak kümesi

#⍎¨ kök ad alanındaki her birini değerlendirin

+/ toplam


3

Retina 0.8.2 , 8 bayt

\d+
$*
1

Çevrimiçi deneyin!

  • İlk satır tüm rakamlarla eşleşir
  • İkinci satır bunları 1s ile değiştirir, adı geçen kez tekrarlanır
  • Son satır bir eşleşmedir ve dizedeki toplam 1 sayısını sayar


2

Kömür , 5 bayt

IΣ⁺ψS

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama: Kömür Sumoperatörü otomatik olarak bir dizeden sayıları ayıklar, ancak dize sayısal olmayan karakterler içermiyorsa bunun yerine dijital toplamı alır, bu nedenle bunu önlemek için boş bir bayt birleştiririm. Sonuç daha sonra örtük çıktı için dizeye geri döndürülür.



2

Zsh , 21 bayt

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

Çevrimiçi deneyin!

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

Ne yazık ki, bash şikayet ediyor çünkü 0108sekizli olarak yorumluyor . Zsh yapmaz (sürece setopt octalzeroes)



1

Python 3 , 63 59 56 bayt

Neden olmasın. Zorunlu normal ifade cevabı. Muhtemelen Python 2 kullanarak 6 rıhtım olabilir, ama ne olursa olsun. Harita kullanmak yerine bir değerlendirme yaklaşımı kullandığım için artık geçerli değil.

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

Açıklama:

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

Çevrimiçi deneyin!


Güzel! TIO'nuzda z == l[1]bunun yerine kullanmalısınız z is l[1]. Sayılar yeterince yükselirse, geçerli kod yanlış negatifler verebilir.
Jakob

1

Java 10, 66 bayt

Bu bir lambda Stringiçin int.

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

Negatif tamsayılar desteklenmez. Muhtemelen sorun değil.

Çevrimiçi Deneyin

Teşekkür


1
Sen geçiş yapabilirsiniz [^0-9]için \Dayrıca geçiş yapabilir birkaç bayt için longve Stringiçin varsize dönüş türünü değiştirmek zorunda kalacak olsa (int
Cehalet Edilen


1

Cubix , 17 bayt

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

Çevrimiçi deneyin!

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

Koşmasını izle

Oldukça basit bir tane. Icubix içinde girişteki ilk tamsayıyı alır ve yığına iter. Bunun tüm karakterleri atlama etkisi vardır. Geri kalanı ek ile ilgileniyor ve girişin sonunu tespit ediyor.

  • I! Bir tam sayı girin ve 0 için test edin
  • s+q;;Sıfır değilse, TOS'u (kuvvetler ve ilk 0) değiştirin ve ekleyin. Sonucu yığının altına doğru itin ve üstünü temizleyin. Başlangıca dön.
  • /i? Sıfırsa, yönlendirmek ve kontrol etmek için bir karakter girişi yapın
  • |?;/Pozitif (karakter) sağa bir yansımaya dönüşürse, bu daha sonra denetleyiciden geriye doğru iter ?ve TOS'ta 0 bırakarak yığıntan sağa doğru döner. IP daha sonra ana döngüye yeniden yönlendirilir.
  • I>p.O@ negatif (giriş sonu) sola dönerse, tamsayı girişi yapın, yığının altını üste, çıktıya ve durdurmaya getirin.

1

PHP ,40 39 bayt

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

Çevrimiçi deneyin!

php -nFGirdi ile çalıştır STDIN'den. Misal:

$ echo the 5is 108 seCONd4 a | php -nF sumint.php    
117





0

Ataşe , 23 bayt

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

Çevrimiçi deneyin!

Daha ilginç ama dolaylı bir cevap (37 bayt): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

açıklama

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

Bu şu şekildedir:

f##g=>h&x

genişletildiğinde ve parantez içine alındığında:

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

##iki işlevi birlikte =>oluşturur, sol işlevi sağ işlevin sonucu üzerinden eşleyen bir işlev oluşturur ve bir işlevi bir işlevin &bir kenarına bağlar. Girdi için _bu şuna eşdeğerdir:

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

İlk olarak, MatchAllrakam karakterleri ( \\d+) çalıştırıyoruz. Daha sonra, Nfonksiyonu kullanarak her bir çalışmayı gerçek bir tam sayıya dönüştürürüz . Son olarak, bu sayıların toplamını kullanarak Sum.


0

APL (NARS), karakter 13, bayt 26

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

Ölçek:

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



0

Japt v2.0a0 -x, 3 bayt

(Çok WIP) tercümanım için başka bir test sürüşü.

q\D

Dene

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 bayt

Normal ifade için 105 bayt + 25 bayt

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

Çevrimiçi deneyin!
açıklama

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
Ben bunun doğru olduğunu düşünmüyorum: OP tarafından (sadece) örnek ardışık basamak tek bir tamsayı oluşturması gerektiğini gösterir, böylece "123" 123 kodunu değil 6 üretmelidir.
Michail

Bu talihsiz, ne zaman yapabileceğimi gözden geçireceğim
Benjamin Urquhart

@Michail revize
Benjamin Urquhart



0

Pip , 6 bayt

$+a@XI

-123Negatif bir tamsayı olarak davranır . Çevrimiçi deneyin!

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

Eksi işaretleri olarak muamele görmek yerine kısa çizgiler göz ardı edilirse, 7 bayt için aşağıdakiler çalışır :

$+a@+XD

XDaşağıdakiler için önceden ayarlanmış bir değişkendir `\d`; +XDregex +değiştiricisini ekleyerek 1 veya daha fazla basamakla eşleşmesini sağlar.


0

Java (JDK) , 98 94 93 bayt

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

Çevrimiçi deneyin!

-4 bytesLong::newyerine kullanarak Long::valueOf.
-1 byteregex'i kısaltarak - daha sonra boş dizeleri kaldırıyorsak, bölme iyi olduğunda bazı ekstralar yaparız.

Açıklaması

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