Filtreleme ve ekleme


16

Görev

Görev çok basit. İçeren bir boş olmayan bir dize Verilen sayılar , büyük ve küçük harf , çıktıyı kalan sayıların toplamı. Örneğin:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

Tüm harfleri filtrelemek şunlara neden olur:

 1   5  45   5  4    33   4

Bu sayıların toplamı 1 + 5 + 45 + 5 + 4 + 33 + 4 = 97. Yani çıktı olurdu 97.

Test Durumları

a > 0
0 > 0
5 > 5
10 > 10
a0A > 0
1a1 > 2
11a1 > 12
4dasQWE65asAs5dAa5dWD > 79
a1wAD5qw45REs5Fw4eRQR33wqe4WE > 97

Bu , yani en az bayt ile gönderme kazanır!


Labirent programını daha önce yazdığımı biliyordum ... burada aynı zorluk var ama negatif sayılar da var (bu bazı diller için şaşırtıcı derecede büyük bir fark yaratıyor, bu yüzden dupes olduklarını düşünmüyorum).
Martin Ender

@ MartinBüttner Görünüşe göre negatif sayılar yok: "-n (burada n bir tamsayıdır) negatif n olarak değil, tire ve ardından n olarak sayılır."
Paul

Ne demek istediğini anlıyorum. Bunun tireleri olduğunu söylüyorsunuz ve bu yok.
Paul

Yanıtlar:


22

GS2, 2 bayt

Wd

Çevrimiçi deneyin!

Nasıl çalışır

W     Read all numbers.
      For input x, this executes map(int, re.findall(r'-?\d+', x)) internally.
 d    Compute their sum.

11
Bu beklenmedik bir şeydi ...
Adnan

@Adnan: Dennis. Yeterli zaman verildiğinde, herhangi bir kod golfüne 4 bayttan daha kısa sürede bir çözüm bulabilir.
Deusovi

13

Labirent , 8 bayt

Al şunu, Pyth ...

?+
;,;!@

Çevrimiçi deneyin!

açıklama

Olağan astar (Sp3000'den çalındı):

  • Labirent 2D ve yığın tabanlıdır. Yığınların altında sonsuz sayıda sıfır vardır.
  • Talimat işaretçisi bir kavşağa ulaştığında, bir sonraki nereye gidileceğini belirlemek için yığının üstünü kontrol eder. Negatif kaldı, sıfır ileri, pozitif doğru.

Burada gerçekten kullanışlı olan, Labirent'in iki farklı giriş komutuna sahip olması ,ve ?. Birincisi STDIN'den veya EOF'dan tek bir bayt okur -1. İkincisi STDIN'den bir tam sayı okur. Böylece sayı olmayan her şeyi atlar ve bulduğu ilk ondalık sayıyı okur. Bu 0EOF'da geri döner , bu yüzden burada EOF'u güvenilir bir şekilde kontrol etmek için kullanamayız.

Programın ana döngüsü bu kompakt bit:

?+
;,

İle ?birlikte biz, bir tam sayı (tüm harfleri görmezden) oku +biz (yığın altındaki kapalı sıfır olarak başlar) çalışan toplam ekleyin. Sonra ,EOF'u kontrol etmek için ile başka bir karakter okuyoruz . EOF'da olmadığımız sürece, okuma karakteri pozitif karakter koduna sahip bir harf olacaktır, bu nedenle IP sağa döner (bakış açısından; yani batı).;karakteri atar çünkü ona ihtiyacımız yoktur ve sonra tekrar döngüye gireriz.

EOF'a girdikten sonra , IP'yi sola (doğu) döndürmek için a'yı ,iter -1. ;Yine atar bu -1, !bir tamsayı olarak çalışan toplam basar ve @bir program sona erer.


Harika şeyler Martin!
Simmons

6

CJam, 13 bayt

Dennis sayesinde sayısız girdi ile çalışmak düzeltildi! Ayrıca, mektup dizisini 64 kod noktasının üzerindeki bir ASCII dizisiyle değiştirerek bir bayt kaydetti. Ve sonra Dennis tarafından kaydedilen başka bir bayt!

q_A,s-Ser~]1b

Harflerden boşluklara basit harf çevirisi, sonra değerlendirme ve toplam. Çevrimiçi deneyin .


6

MATL , 8 bayt

1Y4XXXUs

Çevrimiçi deneyin!

1Y4      % predefined literal: '\d+'
XX       % implicit input. Match regular expression. Returns a cell array of strings
         % representing numbers
XU       % convert each string to a double. Returns a numeric array
s        % sum of numeric array

5

Retina ,22 11

\d+
$0$*1
1

Çevrimiçi deneyin!

Martin sayesinde 11 bayt (!) Kurtarıldı!

Temelde sadece ondalık ondalık sonra 1s saymak .


1
$0Bir ikame ile başlarsa muhtemelen örtük yapmalıyım $*. Bu çok yaygın bir örüntüdür ve Pyth'i yenmenize izin verirdi. ;)
Martin Ender

@ MartinBüttner Siz oradayken, doğru karakteri varsayılan bir şeye de
ayarlayabilirsiniz

hm, kötü bir fikir değil. Ben bu konuda düşüneceğim.
Martin Ender

5

Japt, 2 bayt

Nx

Çevrimiçi test edin!

Nasıl çalışır

N    // Implicit: N = (parse input for numbers, "strings", and [arrays])
x    // Sum. Implicit output.

Bir hata alıyorum "Japt.stdout" bir HTMLElement'e gönderilmelidir
Downgoat

@Downgoat Bu bazen olur; Neden olduğundan emin değilim. Sayfayı yeniden yüklemek sorunu çözüyor gibi görünüyor.
ETHproductions

5

JavaScript ES6, 35 bayt

s=>eval(s.replace(/\D+/g,'+')+'.0')

Nasıl çalışır

İlk olarak, basamak olmayan her bir dizeyi yerine koyarız "+". Bunun ortaya çıkmasının dört farklı yolu vardır:

1. 1b23c456   => 1+23+456
2. a1b23c456  => +1+23+456
3. 1b23c456d  => 1+23+456+
4. a1b23c456d => +1+23+456+

Vaka 1 ve 2 zaten halledilir. Ancak bir şekilde sonuncuyu düzeltmemiz gerekiyor, +böylece bir hataya neden olmuyor. Onu kaldırabiliriz .replace(/\+$,""), ama bu çok pahalı. 0Sonuna a ekleyebiliriz , ancak dize a ile bitmezse bu son sayıyı etkiler +. .0Hem kendi başına geçerli bir sayı olan hem de diğer tam sayıların değerini etkilemeyen bir uzlaşma eklenmelidir.

İşte işe yarayacak birkaç değer daha:

.0
-0
 +0
-""
-[]
0/10
0e-1
.1-.1

Alternatif sürüm, ayrıca 35 bayt

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

Başka bir alternatif sürüm, 36 bayt

s=>s.split(/\D/).map(d=>t+=+d,t=0)|t

4

Pyth, 12 11 10 bayt

ssM:z"\D"3
    z        autoinitialized to input()
   : "\D"3   split on non-digits
 sM          convert all elements of resulting array to ints
s            sum

Neyse ki, s(int dönüştürmek) 0boş dize uygulandığında döndürür , bu yüzden split("a1b", "\D+")döner gerçeği hakkında endişelenmenize gerek yok ["", "1", ""]. Benzer şekilde, split("a", "\D+")geri döner ["", ""].

Bu 1 + 0 + 0 + 0 + 0 + 2, aynı basamaktan farklı olduğu için , her bir rakam olmayanı ayrı ayrı bölmeme bile izin veriyor 1 + 2.

Thomas Kwa'ya bayt için teşekkürler !


4

Gol> <> , 4 bayt

iEh+

Çok kısa kukla metne ihtiyacım var ...


3
Belki de kodunuzu fazladan alanınızla açıklamalısınız :)
nneonneo

4

Perl 6 , 18 bayt

{[+] .comb(/\d+/)}
{[+] .split(/\D/)}

Kullanımı:

my &code = {[+] .comb(/\d+/)}

say code 'a'; # 0
say code '0'; # 0
say code '5'; # 5
say code '10'; # 10
say code 'a0A'; # 0
say code '1a1'; # 2
say code '11a1'; # 12
say code '4dasQWE65asAs5dAa5dWD'; # 79
say code 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'; # 97

3

Jöle, 6 bayt

&-ṣ-ḌS

Çevrimiçi deneyin!

Nasıl çalışır

&-ṣ-ḌS  Main link. Input: L (string)

&-      Take the bitwise AND of L's characters and -1.
        This attempts to cast to int, so '0' & -1 -> 0 & -1 -> 0.
        On failure, it returns the integer argument (if any), so 'a' & -1 -> -1.
  ṣ-    Split the resulting list at occurrences of -1.
    Ḍ   Convert each chunk from decimal to integer. In particular, [] -> 0.
     S  Compute the sum of the results.

3

Perl, 21 + 1 = 22 bayt

$_=eval join"+",/\d+/g

-pBayrağı gerektirir :

$ perl -pe'$_=eval join"+",/\d+/g' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

Herhangi bir sayı olmadığında bu işe yarar mı? örneğin a?
FryAmTheEggman

@FryAmTheEggman İyi bir soru, sanırım sayısal bir bağlamda 0;-)
andlrc

3

Julia, 35 bayt

s->sum(parse,matchall(r"\d+","0"s))

Bu, bir dizeyi kabul eden ve bir tamsayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Biz sadece dizedeki tamsayılar olan matchallnormal ifadenin eşleşmelerinden oluşan bir dizi elde etmek için kullanırız \d+. Dizenin önüne 0 ile başlamalıyız, aksi takdirde "a"hataya neden olan boş bir dizi üzerinden toplanırdık. Daha sonra parse, tamsayılara dönüştürülen ve toplamı alan her dize eşleşmesine uygulanır .


parseolabilir intEğer kullanımdan kaldırılması uyarı sakıncası yoksa.
Dennis

@Dennis olsa yaparım ._.
Alex

2

PHP, 64 bayt

<?php preg_match_all("/\d+/",$argv[1],$a);echo array_sum($a[0]);

Farklı çalıştır

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


Programlama Bulmacaları ve Stack Exchange'e hoş geldiniz. Bu harika bir cevaptır (+1), ancak bir kod açıklaması ve dökümü eklenerek geliştirilebilir. Ayrıca, <?yerine kullanabilir misiniz <?php?
wizzwizz4

2

Javascript, 32 39 bayt

s=>eval((s.match(/\d+/g)||[0]).join`+`)


2

Mathematica, 51 bayt

Total@ToExpression@StringCases[#,DigitCharacter..]&

Mathematica yerleşiklerinin yanlış ucunu yakalamak. @DavidC yardımıyla 1 byte off


DigitCharacter ..1 bayt kurtaracak
DavidC

DigitCharacteryazılı olarak çalışmaz, çünkü tüm rakamları kaldırır, oysa tüm harfleri kaldırmak istiyoruz ...
A Simmons

1
Haklısın. DüşünüyordumTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

Anlıyorum! Evet bu değişiklik bayt tasarrufu sağlıyor.
Simmons

2

R, 46 43 bayt

sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))

açıklama

                    scan(,'')                  # Take the input string
           strsplit(         ,'\\D')           # Returns list of all numeric parts of the string
                                    [[1]]      # Unlists to character vector
    strtoi(                              )     # Converts to numeric vector
sum(                                      )    # Sums the numbers

Örnek çalışma

> sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))
1: a1wAD5qw45REs5Fw4eRQR33wqe4WE
2: 
Read 1 item
[1] 97

Düzenleme: Değiştirilen [^0-9]ile \\D.


Programlama Bulmacaları ve Kod Golf hoş geldiniz. Bu harika bir ilk cevap; ancak bir kod açıklaması ve dökümü ekleyerek geliştirilebilir, bu yüzden nasıl çalıştığını biliyoruz.
wizzwizz4

1

PowerShell, 28 26 bayt

$args-replace"\D",'+0'|iex

Girdi alır $argssonra -replaceharfleri takas etmek için bir regex yapar +0, sonra bunu iex(kısa Invoke-Expressionve benzer eval) boru .

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

alternatif olarak

Bazı yabancı çıkışı ile konum Tamam, adresinden de aşağıdakileri yapabilirsiniz 28 26 bayt:

$args-split"\D"|measure -s

Bu, giriş dizesini $argsve dizeyi -splitsayı olmayan sayılarda dizeler dizisine götürür (işlemde kaldırarak). Örneğin, 1a2b33dönüşür ['1','2','33']. Bunu parametre Measure-Objectile -Sumbağlarız. Çıktı aşağıdaki gibi olacaktır:

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

Count    : 21
Average  : 
Sum      : 97
Maximum  : 
Minimum  : 
Property : 

Düzenle - durr, [ ]artık olası eşleşmeler listesini belirtmediğim için normal ifadeye gerek yok ...


1

Gema, 39 karakter

<D>=@set{s;@add{${s;};$0}}
?=
\Z=${s;0}

Örnek çalışma:

bash-4.3$ gema '<D>=@set{s;@add{${s;};$0}};?=;\Z=${s;0}' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

1

Ciddi, 13 bayt

,ú;û+@s`≈`MΣl

Çevrimiçi deneyin!

Açıklama:

,ú;û+@s`≈`MΣl
,              push input
 ú;û+          push "abc...zABC...Z" (uppercase and lowercase English letters)
     @s        split on letters
       `≈`M    convert to ints
           Σ   sum
            l  length (does nothing to an integer, pushes 0 if an empty list is left, in the case where the string is all letters)

@Adnan Good catch - boş listeyi çıktılar a. Tek baytlık bir düzeltme olmalıdır.
Mego

1

Java, 70 bayt

s->{int n=0;for(String i:s.split("\\D+"))n+=Long.valueOf(i);return n;}

1

TI-Basic, 106 bayt

TI-83/84 hesap makineleri üzerinde çalışıyor!

Input Str1
"{0,→Str2
Str1+"N0→Str1
For(I,1,length(Ans
sub(Str1,I,1
If inString("0123456789",Ans
Then
Str2+Ans→Str2
Else
If ","≠sub(Str2,length(Str2),1
Str2+","→Str2
End
End
sum(expr(Ans

1

Clojure / ClojureScript, 35 bayt

#(apply +(map int(re-seq #"\d+"%)))

1

R, 50 bayt

gsubfnYüklü olmasını gerektirir

sum(gsubfn::strapply(scan(,''),'\\d+',strtoi)[[1]])

strtoiSayıya zorlamak için kullanır


1

Yakut 45 bayt

$*[0].split(/[a-z]/i).map(&:to_i).inject 0,:+

(İlk iş denemesi bunu tekrar ziyaret edecektir)


1

POSIX sh + tr + dc, 27 25 bayt

dc -e "0d`tr -sc 0-9 +`p"

Basamak olmayan herhangi bir işlemi (son satırsonu dahil) +operatöre dönüştürür, iki sıfırı yığının üzerine iter (girişin basamaksız olarak başlaması durumunda), hepsini ekler ve sonucu yazdırır. Yığının altında fazladan bir sıfır kalmış olabilir, ancak bunu umursamıyoruz.


1

Lua, 51 Bayt

Bir kez oldukça kısa! Java'dan bile daha kısa! Girdinin çalışması için bir komut satırı bağımsız değişkeni olması gerekir.

a=0 arg[1]:gsub("%d+",function(c)a=a+c end)print(a)

Ungolfed

a=0                 -- Initialize the sum at 0
arg[1]:gsub("%d+",  -- capture each group of digits in the string
  function(c)       -- and apply an anonymous function to each of them
  a=a+c             -- sums a with the latest group captured
end)               
print(a)            -- output a

1

Bash + GNU yardımcı programları, 29

grep -Eo [0-9]+|paste -sd+|bc

Numarasız girişi desteklemek gerekirse (ör. a ) , bunu yapabiliriz:

Bash + GNU yardımcı programları, 38

@TobySpeight sayesinde 1 bayt kaydedildi.

(grep -Eo [0-9]+;echo 0)|paste -sd+|bc

Bu giriş için hiçbir şey yazdırmaz a. Şu anda bunun geçerli olup olmadığını tartışıyoruz .
Dennis

@Dennis. Tamam. Her iki olasılığı da kapsayacak başka bir sürüm ekledim.
Dijital Travma

Her zaman sıfır eklemek ;yerine, ||zarar vermeden kullanabilirsiniz.
Toby Speight

@TobySpeight Evet, bu iyi - teşekkürler!
Dijital Travma

1

Python 2,70 bayt

Sadece eğlence için bir Python cevabı koyuyorum.

import re
j=0
for i in map(int,re.findall('\d+',input())):j+=i
print j

Çok basit ve girişteki tüm sayıları bulmak için regex kullanır. Çevrimiçi deneyin!


1
Bu bağlamda raw_inputpython3'ü kullanmanız veya bu python3'e geçmeniz gerekir. Daha küçük bir versiyonu (PY3, 56 bayt): import re;print(sum(map(int,re.findall('\d+',input())))).
Dica

1

Oracle SQL 11.2, 105 bayt

SELECT NVL(SUM(TO_NUMBER(COLUMN_VALUE)),0)FROM XMLTABLE(('"'||regexp_replace(:1,'[a-zA-Z]','","')||'"'));

Normal ifade, alfa karakterlerini ',' biçimine dönüştürür

XMLTABLE, ayırıcı olarak ',' kullanarak dizede öğe başına bir satır oluşturur.

Sonucu almak için satırları TOPLA.

Rakamı olmayan bir dizeyi hesaba katmak için NVL gereklidir.

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.