「a」や「Y」などの非数値で区切られた、文字列内の整数の合計


14

プログラム内の変数として設定されている文字列で見つかったすべての整数を合計するプログラムを作成します(したがって、プログラムは入力を処理する必要はありません)。整数は、非数値(0、1、2、3 ... 9以外)で区切られます。

例:

  • 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

追加のメモ:

  • Unicodeのサポートはありません必要はなく、許可します
  • -nnは整数)は負としてカウントされませんnが、ハイフンの後にn

答えが画面に印刷される場合があります(必須ではありません)。

最短回答(文字数)が勝ちます。


結果も印刷する必要がありますか?(I / Oはありません)。
ドグバート

@Dogbert-私はそれについて考えませんでした。ごめん、はい。投稿を更新します。
アント

一部の人々はすでに答えを持ち、それらを「傷つけたくない」ので、それを変更しました。私は今眠るべきだと思うので、私は少し明確になると思います;)
アント

2
アント:ソリューションに目に見える副作用がないタスクは、あまり良くありません。
ジョーイ

私がちょうど遭遇した興味深いテストケースは次のとおりです5a-3-数字の直後にコードがある場合、コードはスキップされますが、数字の前に数字がない場合はスキップされません)。
マーティンエンダー

回答:


10

Perl、15

入力$_、合計$c

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

14

Ruby 1.9、21文字

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

ソリューションを標準出力に印刷するには、2つの追加文字が必要です。

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

また、定義済みの変数を使用する代わりに標準入力から読み取るには、さらに3文字を使用する必要があります。

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

Ruby 1.8の場合、に置き換え?+"+"22文字の有効なソリューションを取得します。


入力は、stdinではなく変数から取得されることになっています。またscan、よりも短いですsplit。したがって、ソリューションはeval s.scan(/\d+/)*?+-21文字になります。
sepp2k

@ sepp2k:ええ、説明を正しく読みませんでした。私は他のゴルフの仕事に慣れていますが、通常は標準入力から読み、標準出力に印刷する必要があります。との良い点scan、ありがとう!
ヴェンテロ

+1、evalおよび* '+'
ドッグバート


5

ルビー-36 34文字

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

結果を印刷する場合は36文字。

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

入力がsの文字列として存在すると仮定します。


4

JavaScript(ES6)、30

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

注釈付きバージョン:

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

出力あり。

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

実際、出力がない場合でもまったく同じです。必要な場所にパイプするだけです。


2

J- 40 38文字

遅延バージョン。文字列ライブラリが必要です。

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

Unicodeをサポートします。エンコードをサポートしています。考えてみてください!
MPelletier

2

Java

コンテストから;)

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

ラビリンス29 21バイト

(免責事項:ラビリンスはこのチャレンジよりも新しいものです。)

また、Labyrinthには変数がないため、通常の入出力プログラムを使用しました。

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

Labyrinthの入力コマンドが機能するため、これはかなり簡単でした。?STDINから符号付き整数を読み取ろうとし、最初の非数字で停止します。整数を読み取ることができない場合(次の文字の-後に数字やその他の数字が続かないため、またはEOFに達したため)、0代わりに戻ります。,一方、後続のバイトを読み取り、バイト値をプッシュします。これがEOFで呼び出された場合、-1代わりに戻ります。

したがって、ソリューションの擬似コードは次のとおりです。

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

負の数を正しく処理すると、このソリューションがかなり複雑になります。それらがなければ、この8バイトのソリューションがあります。

?+
;,;!@


1

Perl、16文字

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

入力を受け取り$_、出力が続き$rます。最後のセミコロンは不要ですが、プログラムがさらに処理を行う場合におそらく必要になります。say$r出力用に追加します。


おっと、投稿したときにまったく同じ答えが表示されませんでした。セミコロンがなくても1文字を数えましたが。
JB

@JB:数えられない!:P。実際、二重引用符で囲まれた文字列をにエコーするという間違いを犯しましたwc -c
ninjalj

1

J-23文字

勝者ではありませんが、非常にまれなプリミティブの動作を確認できます。

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

説明:

  • _"."0 y-入力文字列の各文字についてy、数字として読み込もうとします。できない場合は、_代わりにデフォルト値(無限大)を使用してください。

  • ,_=-各結果がに等しいかどうかを確認し_、0と1の最終配列をベクトルに実行します。("."0常に結果に多すぎるディメンションを1つ追加するため、ここで修正します。)

  • y,:' ' -入力文字列の下にスペースの行を追加します。

  • }-ここでそのまま使用され、Item Amend}と呼ばれ、左側の0と1のリストをインデックスとして使用して、右側の引数で描画する行を選択します。そのため、右側の各列について、元の文字が数字として読み取れる場合はそれを取得し、そうでない場合はその下のスペースを取得します。したがって、数字以外の文字はスペースで隠します。

  • +/". -次に、この文字列全体を数字のリストに変換し、それらを合計します。


1

gs2、4バイト

W#Θd

CP437でエンコード。3番目のバイトはE9です。

W/-?\d+/文字列からすべての数値を読み取り、絶対値、d合計をマッピングします。

(gs2もこのチャレンジよりも新しいですが、そのread-numsコマンドは完全に偶然です。)


0

Smalltalk(Smalltalk / X)(51文字)

正規表現パッケージを使用する:

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

正規表現を:

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

sの入力



0

Javascript-43文字

私はそれが長いことを知っていますが、JSソリューションがなかったので:)

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

a文字列です。c答えが含まれています。


0

Tcl、30

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

入力が変数$a(正式にはin a)にあると想定し、インタープリターの結果に回答を保存します。I / Oは演習として残されています。


0

C99(警告あり)85

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

プログラムを実際に使用するには、次のように変数を割り当てる必要があります。

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

gccを使用している場合は、次のようにC99としてコンパイルする必要があります。

gcc -std=c99 x.c

0

APL、16バイト

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

⎕dは、数字(0〜9)を含む組み込みです。b0/1のベクトルに割り当てられ、数字である文字に1が与えられます。bは、指定された文字配列を圧縮するために使用され、それを展開するために再利用され、空白が挿入されます。この場合、文字列を整数に変換するAPLのevalです。+/合計を計算します。


長さが等しいが、興味深い:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
アダム

0

スイフト3、78

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

s文字列はどこですか



0

実際には、14バイト(非競合)

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

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

実際にこの課題よりもかなり新しいため、この提出は競合しません。

このプログラムは、入力用のCP437コードページをサポートしています。

説明:

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