文字列の整数を合計する


11

入力

文字列。

出力

行内のすべての整数の合計。

制約

1≤行の長さ≤500

サンプルテストケース

入力

the 5is 108 seCONd4 a

出力

117

説明

合計:5 + 108 + 4 = 117


6
こんにちは、PPCGへようこそ。PPCGでは、通常、単一の言語の課題に眉をひそめます。たぶん、あなたは一般的な挑戦にそれを変更することができます:文字列内のすべての数値の合計出力、文字列与えられ、他のすべてを無視して(すなわち"the 5is 108 seCONd4 a"になります117ので5+108+4=117)。また、ここのすべての「質問」には、勝利条件タグが必要です。この場合、私はそれが[code-golf](最短の解決策)であると仮定しますか?
ケビンCruijssen

4
SOに同様の質問を投稿したようです。これは、PPCGチャレンジとして設計されたものではなく、ゴルフコードではなく「使用可能な」コードを探していることを確認する傾向があります。代わりにSOの元の質問を改善して、サイトのルールによりよく適合することをお勧めします。
アーナルド

4
私たちの基準に合うようにあなたの投稿をオーバーホールしました。結果が自分に合わない場合は自由に編集してください。
アダム

4
@Adámcodegolf.meta.stackexchange.com/ a
mbomb007

2
この場合string x='-12hello3';、負の整数(つまり、-12 + 3 === -9)をカウントしていますか?
ショーンビバーズ

回答:


4

Javascript、34 32バイト

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

すべての数字を一致させ、+5 + 108 + 4に変換して結合し、結果を評価します。
正の整数でのみ機能します。

Arnauldのおかげで2バイト節約

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>


コンソールでstring.lengthを使用して文字をカウントすることは、エスケープ文字が含まれている場合は良いアイデアではないと思います...おっと、修正しました。再びTHX
Bassdrop Cumberwubwubwub

少し良いオプションはになりますがconsole.log(f.toString().length)、100%の信頼性もありません
アーナルド

それとも... TIOを使用して
ジョー・キング


4

05AB1E11 6 バイト

þмS¡þO

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

説明:

þм       # 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
ああ、賢い使い方¡
エリックアウトゴルファー





2

木炭、5バイト

IΣ⁺ψS

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:炭のSum演算子は文字列から数字を自動的に抽出しますが、文字列に数字以外の文字が含まれていない場合は、代わりにデジタル合計を使用するため、これを回避するためにヌルバイトを連結します。結果は、暗黙的な出力のために文字列にキャストバックされます。



2

Zsh、21バイト

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

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

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

残念ながら、bashは01088進数として解釈するため文句を言います。Zshは(しなければsetopt octalzeroes



1

Pythonの363の 59 56バイト

何故なの。必須の正規表現の答え。おそらくPython 2を使用して6をドッキングできますが、何でも。私はマップを使用する代わりにevalアプローチを使用しているため、もう適用されません。

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

説明:

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

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


いいね!TIO z == l[1]では、代わりに使用する必要がz is l[1]あります。現在のコードは、数値が十分に高くなると、偽陰性になる可能性があります。
ヤコブ

1

Java 10、66バイト

これはからStringまでのラムダintです。

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

負の整数はサポートされていません。おそらくそれは大丈夫です。

オンラインで試す

謝辞


1
あなたは切り替えることができます[^0-9]のために\Dも、あなたは切り替えることができ、数バイトのためにlongStringのためにvarあなたが戻り値の型を変更する必要がありますけれども(int
無知の実施の形態


1

Cubix、17バイト

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

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

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

実行を見る

かなりシンプルなもの。 Icubixでは、入力の最初の整数を取得してスタックにプッシュします。これには、すべての文字をスキップする効果があります。残りは追加を処理し、入力の終了を検出します。

  • I! 整数を入力し、0をテストします
  • s+q;;ゼロでない場合、TOS(強制および初期0)を交換して追加します。結果をスタックの下部にプッシュし、上部をきれいにします。最初に戻ります。
  • /i? ゼロの場合、リダイレクトして文字入力を行い、確認します
  • |?;/ポジティブ(文字)がリフレクトに右に曲がる場合、チェッカーを通してそれを押し戻し?、スタックからポップに右に曲がり、TOSに0を残します。その後、IPはメインループにリダイレクトされます。
  • I>p.O@ 負の場合(入力の終わり)、左に曲がり、整数入力を行い、スタックの一番下を一番上にし、出力して停止します。






0

アタッシュ、23バイト

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

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

より興味深いが、間接的な答え(37バイト): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

説明

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

これには次の形式があります。

f##g=>h&x

展開して括弧で囲むと、次のようになります。

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

##2つの関数を一緒に構成し=>、左の関数を右の関数の結果にマッピングする関数を作成し&、引数を関数の側面にバインドします。inputの_場合、これは次と同等です:

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

最初に、次にMatchAll数字(\\d+)を実行します。その後、N関数を使用して各実行を実際の整数に変換します。最後に、を使用してこれらの数値の合計を取得しSumます。


0

APL(NARS)、文字13、バイト26

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

テスト:

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




0

Java 8、53 130バイト

正規表現インポートの場合は105バイト+ 25バイト

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

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

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
私はこれが正しいとは思いません:OPによる(唯一の)例は、連続する数字が単一の整数を形成することを示唆しているため、「123」はコードのように6ではなく123を生成します。
ミハイル

それは残念です、私ができるときに修正します
ベンジャミンアー

@Michailの改訂
ベンジャミンアー



0

ピップ、6バイト

$+a@XI

扱い-123負の整数です。オンラインでお試しください!

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

ハイフンをマイナス記号として扱うのではなく無視する必要がある場合、次は7バイトで機能します

$+a@+XD

XDはのプリセット変数です`\d`+XD正規表現+修飾子を追加して、1桁以上に一致させます。


0

Java(JDK)98 94 93バイト

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

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

-4 bytesLong::new代わりに使用しますLong::valueOf
-1 byte正規表現を短くすることで-後で空の文字列をすでに削除している場合は、分割するときに余分なものを追加しても問題ありません。

説明した

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