除外して追加


16

仕事

タスクは非常に簡単です。数字大文字小文字を含む空でない文字列が与えられた場合、残りの数字の合計を出力します。例えば:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

すべての文字を除外すると、次のようになります。

 1   5  45   5  4    33   4

これらの数値の合計は1 + 5 + 45 + 5 + 4 + 33 + 4 = 97です。したがって、出力はになります97

テストケース

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

これはであるため、バイト数が最小の提出が勝ちです!


以前にそのラビリンスプログラムを書いたことは知っていました... ここでも同じ課題ですが、負の数もあります(これはいくつかの言語で驚くほど大きな違いをもたらすので、彼らはだまされているとは思いません)。
マーティンエンダー

@MartinBüttnerは、負の数を含まないように見えます。「-n(nは整数)は、負のnとしてカウントされませんが、ハイフンにnが続くものとしてカウントされます。」
ポール

ああ、私はあなたが何を意味するかわかります。あなたはそれがハイフンを持っていると言っていますが、これはそうではありません。
ポール

回答:


22

GS2、2バイト

Wd

オンラインでお試しください!

使い方

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

11
まあ、これは...予想外だった
アドナン・

@アドナン:デニスです。十分な時間があれば、彼は4バイト未満であらゆるコードゴルフの解決策を見つけることができます。
デウソビ

13

ラビリンス、8バイト

どうぞ、Pyth ...

?+
;,;!@

オンラインでお試しください!

説明

通常のプライマー(Sp3000から盗まれた):

  • Labyrinthは2Dおよびスタックベースです。スタックの下部には無限の数のゼロがあります。
  • 命令ポインタがジャンクションに到達すると、スタックの最上部をチェックして、次にどこを向くかを決定します。負は左、ゼロは順方向、正は右です。

何ここでは本当に便利になることはラビリンスは、2つの異なる入力コマンドを持っていることである、,?。前者は、STDINまたは-1EOF から1バイトを読み取ります。後者は、STDINから整数を読み取ります。数値ではないものすべてスキップし、見つかった最初の10進数を読み取ります。これ0はEOFで返されるため、ここでEOFを確実にチェックするために使用することはできません。

プログラムのメインループはこのコンパクトビットです。

?+
;,

では?、私たちはと、整数(すべての文字を無視して)を読んで+、我々は(スタック下部の暗黙のゼロの一つとして開始)現在合計に追加します。次に,、EOFをチェックするために別の文字を読み取ります。EOFにいない限り、読み取られた文字は正の文字コードを持つ文字になるため、IPは(その視点から、つまり西から)右に曲がります。;私たちはそれを必要としないので、文字を破棄し、再びループに入ります。

EOFになったら、,aを押すと、-1代わりにIPが左(東)になります。;再びそれを破棄し-1!実行中の合計を整数として出力し@、プログラムを終了します。


素晴らしいものマーティン!
シモンズ

6

CJam、13バイト

デニスのおかげで数字なしの入力で動作するように修正されました!また、文字配列をコードポイント64の上にあるASCII配列に置き換えることにより、バイトを保存しました。次に、デニスによって別のバイトが保存されました。

q_A,s-Ser~]1b

文字からスペースへの単純な音訳、次に評価と合計。オンラインでお試しください



5

網膜22 11

\d+
$0$*1
1

オンラインでお試しください!

Martinのおかげで11バイト(!)節約されました!

基本的には、10進数から単項へ、そして1sをカウントします。


1
$0置換がで始まる場合、おそらく暗黙的にする必要があり$*ます。これは非常に一般的なパターンであり、それによってPythを倒すことができます。;)
マーティン・エンダー

@MartinBüttnerあなたがそれにいる間、あなたは右のキャラクターをデフォルトにすることもできます:O
FryAmTheEggman

ええと、悪い考えではありません。考えておく。
マーティンエンダー


5

JavaScript ES6、35バイト

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

使い方

最初に、数字以外の各文字列をに置き換えます"+"。これには、基本的に4つの異なる方法があります。

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

ケース1と2はすでに処理されています。ただし+、エラーが発生しないように、最後の部分を何らかの方法で修正する必要があります。で削除できますが.replace(/\+$,"")、高すぎます。0末尾にa を追加することもできますが、文字列の末尾がでない場合、最後の数字に影響し+ます。妥協点はappendで.0、これはそれ自体有効な数であり、他の整数の値には影響しません。

以下に、同様に機能する他の値をいくつか示します。

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

代替バージョン、35バイト

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

別の代替バージョン、36バイト

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

4

Pyth、12 11 10バイト

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

幸いなことに、空の文字列に適用されるとs(intに変換)が返さ0れるため、がsplit("a1b", "\D+")返されるという事実を心配する必要はありません["", "1", ""]。同様に、をsplit("a", "\D+")返します["", ""]

これ1 + 0 + 0 + 0 + 0 + 2は、と同じことなので、数字以外のすべてで個別に分割することもできます1 + 2

Thomas Kwaにバイトをありがとう!


4

Gol> <>、4バイト

iEh+

短いので、ダミーテキストが必要です...


3
おそらく、余分なスペースを使用してコードを説明する必要があります:)
nneonneo

4

Perl 6、18バイト

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

使用法:

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

ゼリー、6バイト

&-ṣ-ḌS

オンラインでお試しください!

使い方

&-ṣ-Ḍ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バイト

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

-pフラグが必要です:

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

これは、数字がないときに機能しますか?例えばa
FryAmTheEggman

@FryAmTheEggman良いの質問、私はそれが数値コンテキストである何も印刷されません推測0;-)
andlrc

3

ジュリア、35バイト

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

これは、文字列を受け入れて整数を返す匿名関数です。呼び出すには、変数に割り当てます。

matchall正規表現の一致で構成される配列を取得するために使用し\d+ます。これは、文字列の整数です。文字列の先頭に0を追加する必要があります。そうしないと、などの場合"a"、空の配列を合計することになり、エラーが発生します。次にparse、各文字列の一致に適用し、整数に変換して合計を取得します。


parseなることができintますが、非推奨の警告を気にしない場合。
デニス

@Dennisでも._。
アレックスA.

2

PHP、64バイト

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

として実行

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


プログラミングパズルとStack Exchangeへようこそ。これは素晴らしい回答(+1)ですが、コードの説明と内訳を追加することで改善できます。また、<?代わりに使用できます<?phpか?
wizzwizz4

2

Javascript、32 39バイト

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


2

Mathematica、51バイト

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

詳細なMathematicaビルトインの間違った終わりをつかむ。@DavidCの助けを借りて1バイトオフ


DigitCharacter ..1バイトの節約になります
DavidC

DigitCharacter我々はすべての文字を削除したいのに対し、それはすべての数字を削除しますので、書かれて動作しません...
Aシモンズ

1
あなたが正しいです。考えていたTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
-DavidC

そうですか!ええ、その変更はバイトを節約します。
シモンズ

2

R、46 43バイト

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

説明

                    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

サンプル実行

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

編集:に置き換えられまし[^0-9]\\D


プログラミングパズルとコードゴルフへようこそ。これは素晴らしい最初の答えです。ただし、コードの説明と内訳を追加することで改善されるため、どのように機能するかがわかります。
wizzwizz4

1

PowerShell、28 26バイト

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

入力$argsを取得し、正規表現-replaceを実行して文字をに交換し+0、それをパイプしますiex(略してInvoke-Expressionに似ていますeval)。

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

代わりに

いくつかの余分な出力を備えているOK、あなたがいる場合は、にも、次のことを行うことができます28 26バイト:

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

これは、入力文字列になります$args-split、アレイ・オブ・文字列非数値(プロセスでそれらを削除する)上にそれを。たとえば、に1a2b33なります['1','2','33']。それまで私たちは、パイプMeasure-Objectを持つ-Sumパラメータ。出力は次のようになります。

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

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

編集-durr、[ ]可能性のある一致のリストを指定しなくなったため、正規表現で必要ありません...


1

Gema、39文字

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

サンプル実行:

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

1

真剣に、13バイト

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

オンラインでお試しください!

説明:

,ú;û+@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良いキャッチ-で空のリストを出力しaます。1バイトの修正である必要があります。
メゴ


1

TI-Basic、106バイト

TI-83 / 84計算機で動作します!

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

R、50バイト

gsubfnインストールが必要です

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

を使用strtoiして数値に強制する


1

Ruby 45バイト

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

(職場での最初の試み、これを再訪します)


1

POSIX sh + tr + dc、27 25バイト

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

数字以外の実行(終端の改行を含む)を+演算子に変換し、2つのゼロをスタックにプッシュし(入力が数字以外で始まる場合)、それらすべてを追加して結果を出力します。スタックの一番下に余分なゼロが残っているかもしれませんが、それについては気にしません。


1

Lua、51バイト

かなり短い!Javaよりもさらに短い!入力が機能するには、コマンドライン引数である必要があります。

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

非ゴルフ

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ユーティリティ、29

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

数字なしの入力をサポートする必要がある場合(例 a、これを行うことができます。

Bash + GNUユーティリティ、38

@TobySpeightのおかげで1バイト節約されました。

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

これは、入力に対して何も出力しませんa現在、それが有効かどうかについて議論しています。
デニス

@デニス。OK。両方の不測の事態をカバーする別のバージョンを追加しました。
デジタル外傷

;代わりに||を使用して、常にゼロを追加しても問題はありません。
トビースパイト

@TobySpeightはい、それはいいです-ありがとう!
デジタル外傷

1

Python 2、70バイト

楽しみのためだけにPythonの回答を掲載しています。

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

非常にシンプルで、正規表現を使用して入力内のすべての数値を検索します。オンラインでお試しください!


1
このコンテキストでは、使用するraw_inputか、python3に切り替える必要があります。小型版(PY3、56バイト) import re;print(sum(map(int,re.findall('\d+',input()))))
ディカ

1

Oracle SQL 11.2、105バイト

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

正規表現は、アルファ文字を「、」に変換します

XMLTABLEは、区切り文字として「、」を使用して、文字列内のアイテムごとに1行を作成します。

行を合計して結果を取得します。

NVLは、数字のない文字列を説明するために必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.