文字列内の数値の加減算


14

文字列を入力として受け取り、文字列内のすべての数字の加算/減算を実行し、それらの演算の合計を結果として出力します。

ルール

  • 文字列の数字は左から右に読み取られます
  • 数字(n)が奇数の場合、次の数字(n + n1)で加算を実行します
  • 数字(n)が偶数の場合、次の数字(n-n1)で減算を実行します
  • 文字列の最後の数字に達した場合は、文字列の最初の数字で操作を実行します
  • 出力は、結果のすべての値の合計になります
  • 文字列に1桁しかない場合は、それ自体で操作を実行します(n + nまたはnn)
  • 文字列に数字がない場合、出力は0

Input: r5e6o9mm!/3708dvc    
Process: (5+6) + (6-9) + (9+3) + (3+7) + (7+0) + (0-8) + (8-5)
Output: 32

ノート

  • 機能または完全なプログラムのいずれかが受け入れられます
  • 最大入力長は、文字列入力の言語の制限に依存します
  • 文字入力に制限はありませんが、半角数字のみが出力にカウントされます
  • 最少バイト数が勝つ

4
さらにいくつかの例も良いでしょう
ディルナン

2
奇数で終わるテストケースを追加することをお勧めします。
アーナウルド

3
推奨テストケース:"""0""1"
TSH

1
入力を文字列ではなく文字の配列として受け取ることはできますか?(ジュリアは、これら二つの間の区別を行う。)
サンダー-回復モニカ

4
@sundar 現在のコンセンサスでは、文字列は一連の文字として定義されています。したがって、言語にネイティブの文字列型がある場合でも、文字の配列はデフォルトで許可されます。
アーナウルド

回答:


6

ゼリー17 15 12バイト

fØDV€ḂT‘ịƲSḤ

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

テストケースを試してください。

プログラムは、奇数の数字に続く数字のみを保持し、合計の2倍を計算します。

fØDV€ḂT‘ịƲSḤ   
f                   Remove anything that isn't...
 ØD                 a digit.
   V€               Cast each digit to an integer
         Ʋ          Monad:
     Ḃ              Parity of each digit.
      T             Indices of truthy elements (odd digits).
       ‘            Increment.
        ị           Index into list of digits.
                    Wraps to beginning and if there are no digits this returns 0.
          S         Sum.
           Ḥ        Double.

3

K(oK)47 43 40 31バイト

解決:

{+/(1_x,*x)*2*2!x^:(x-:48)^!10}

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

説明:

数値ではない文字列からすべてを削除し(変換中も)、2を法として、2を乗算し、xを1回転させて乗算し、合計します。

{+/(1_x,*x)*2*2!x^:(x-:48)^!10} / solution
{                             } / lambda taking implicit x
                           !10  / range 0..10
                          ^     / except
                   (     )      / do this together
                    x-:48       / subtract 48 from x (type fudging char ascii value -> ints), save back into x
                x^:             / x except right, and save back to x
              2!                / modulo 2
            2*                  / multiply by 2
           *                    / multiply by
   (      )                     / do this together
        *x                      / first element of x
       ,                        / append to
      x                         / x
    1_                          / drop first (ie rotate everything by 1)
 +/                             / sum, add (+) over (/)

素朴な解決策:

数値ではない文字列からすべてを削除し(変換も行います)、2アイテムのスライディングウィンドウを使用して、それらが奇数か偶数かを判断し、必要に応じて加算/減算を適用し、合計します。

{+/((-;+)2!x).'2':(1+#x)#x^:(x-:48)^!10}

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

ノート:

  • 入力をよりスマートにフィルタリングする方法により、@ ngnのおかげで-4バイト
  • 形状変更ではなくスライディングウィンドウを使用して-3バイト
  • -9バイトの ngnのソリューションの移植(非単純なアプローチ)

1
x:48!x@&x in,/$!10->x^:(x-:48)^!10
ngn

私はq / kdb +でソリューションを書いてからoKに移植しました...これからさらに数バイトを圧縮できるかもしれません!
ストリートスター

1
私はngn / kに別の回答を投稿しました。そこからアイデアを持ち込んでください。私のパーサーは現在ごみです-変更された割り当てを適切に解析しないので、私はokが最短になると思います。ところで、私は':「スライディングウィンドウ」とは知りませんでした-おもしろいです。
-ngn

kに精通しているようです。同じような人とベクトルプログラミングのことを話したり、他の人を見てみたいと思うなら、このチャットルームがあります。冗談のほとんどはAPLについてですが、kとJも話題になっています。
-ngn



2

Powershell、80 78 76バイト

($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s

-2バイト、Reilソリューション付きNeilに感謝

-2バイト、AdmBorkBorkに感謝

テストスクリプト:

$f = {
($d="$args"-split'\D*'-ne'')+$d[0]|?{$p-match'[13579]';$p=$_}|%{$s+=2*$_};$s
}

&$f 'r5e6o9mm!/3708dvc'

説明

まず、前の数字が奇数の場合は2 * nを追加し、前の数字が偶数の場合は0を追加する必要があります。

($d="$args"-split'\D*'-ne'')+ # let $d is array contains digits only, each element is a digit
$d[0]|                        # apend first digit to the end of the array
?{                            # where for each digit
    $p-match'[13579]'         # predicate is 'previous digit is odd' (it is false on the first iteration because $p is null)
    $p=$_                     # let previous digit is current
}|
%{                            # for each digit matched to the predicate
    $s+=2*$_                  # add current digit multiply 2 to $s. 
}
$s                            # return sum

追加、99バイト

@Neilに触発されました。「前の数字が奇数」のみの正規表現一致数字。Matches自動変数です

param($d)$d+($d-match'\d')+$Matches[0]|sls '(?<=[13579]\D*)\d'-a|%{$_.Matches.Value|%{$s+=2*$_}};$s

1
などの括弧に移動することで、バイトスワップ|?{$_}を保存します。-ne''$d="$args"-split'\D*'-ne''($d="$args"-split'\D*'-ne'')+$d[0]
AdmBorkBork

2

MATL18 17バイト

t4Y2m)!Ut1YSof)sE

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

(Luis Mendo / Giuseppe / bothのおかげで1バイト!)

説明:

     % Implicit input
 t   % duplicate input
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc']
 4Y2 % push inbuilt literal, characters '0':'9'
     % stack: ['r5e6o9mm!/3708dvc' 'r5e6o9mm!/3708dvc' '0123456789']
 m)  % extract only characters from input that belong to '0':'9'
     % stack: ['5693708']
 !U  % transpose and convert each value from string to number
     % stack: [5 6 9 3 7 0 8]
 t   % duplicate that
 1YS % circular shift by 1
     % stack: [[5 6 9 3 7 0 8] [8 5 6 9 3 7 0]]
 o   % parity check - 1 for odd, 0 for even
     % stack: [[5 6 9 3 7 0 8] [0 1 0 1 1 1 0]]
 f   % find non-zero value indices in last array
     % stack: [[5 6 9 3 7 0 8] [2 4 5 6]]
 )   % index at those places in the first array
 s   % sum
 E   % multiply by 2
     % (implicit) convert to string and display

基本的な考え方は、偶数に続く数字は無視でき、奇数に続く数字は2倍になり、最終結果はそれらの2倍にされた値の合計になるということです。

fパリティチェックoが必要になるとは思いませんでしたが、何らかの理由でMATLは0から1のo配列を論理配列として認識せず、代わりにそれらを数値インデックスおよびインデックスとして位置1およびに取り込みますend


!U代わりに使用できると思います48-。ここで転置は害を与えないようです。o以下のためのdouble入力だけでmod(...,2)、その出力がありますdouble。素敵なNaN入力トリック!それがSTDOUTの無関係な出力を解決することを意図している場合、デニスはアイデア持っていて、おそらくすぐにそれを修正するでしょう
ルイスメンドー

!U代わりに48-
ジュゼッペ

@LuisMendo welp、あなたは私を打ち負かしました!
ジュゼッペ

@ジュゼッペ:-D :-D
ルイスメンドー

編集していただきありがとうございます。@LuisMendo o論理配列を出力するのはいつですか-そうではありませんか?(MATLABの数値型システムを実際に調べたことがないことを告白する必要があります。)そして、NaN実際にどこでも実際に入力される可能性は低いため、良いセンチネルになると思いました。 !
スンダ

2

K(ngn / k)、33バイト

{+/(1_x,*x)*2*2!x:-48+x^x^,/$!10}

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

{ } 引数付きの関数です x

!10 リストです 0 1 ... 9

$ 文字列に変換する

,/ 連結する

x^x右側にないものを意味します

x^x^x右側のものと交差することを意味します。つまり、数字のみを保持しますx

-48+減算48、これはASCIIコードです"0"

x: に割り当てます x

2! mod 2

2* 2倍

1_x,*xの1つのドロップ:xの最初のx; すなわちx、1ステップ左に回転します

+/


2

Japt(v2.0a0)、25 19バイト

Shaggyのおかげで-6バイト。

kè\D
íÈ°*2*Y°u}Ué)x

ここで試してみてください

今回は数字なしで動作します!入力は文字のリストです。


Japt v2への切り替えを含む19バイトxただし、関数の配列には満足していません。質問がある場合は、チャットで Pingしてください。
シャギー

入力に数字が含まれていない場合、これはまったく機能しないことに注意してください。
シャギー

また、v2.0a0、@ Shaggyのソースはどこにありますか?リポジトリで見つけることができません。
LegionMammal978

これはv1で、これはv2です。
シャギー

チャットで見逃した場合に備えて、これを12バイトに減らしました。
シャギー

2

05AB1E12 9バイト

Dylnanのパリティトリックを利用して、単純な方法で1バイト
節約します。Xcoder氏のおかげで3バイト節約できました。

þDÁ€ÉÏSO·

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

説明

þ              # push only digits of input
 D             # duplicate
  Á            # rotate right
   ۃ          # get the parity of each
     Ï         # keep only true items
      SO       # calculate digit-sum
        ·      # double

HMM、あろうþÀIþ€ÉÏSO·þÀDÁ€ÉÏSO·þÀ¹þ€ÉÏSO·またはþÀsþ€ÉÏSO·-2バイトのすべてのテストケースを渡しますか?
Mr Xcoder

@ Mr.Xcoder:ああ、はい。いいね!þDÁ€ÉÏSO·-3 でもできます:)
エミグナ

1

網膜、37バイト

(\d).*
$&$1
L$`(?<=[13579]\D*).
2**
_

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

(\d).*
$&$1

最初の数字の複製を追加します。

L$`(?<=[13579]\D*).

最初の前の数字が奇数であるものに一致します。

2**

すべての一致を単項に変換し、それらを2倍にします。(非数字はゼロとして扱われます。)

_

合計を取ります。一致がなかった場合、必要に応じてゼロが生成されます。

Retina 0.8.2でできることは44バイトでした。

[^\d]

(.).*
$&$1
(?<![13579]).

.
$*
.
..
.

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

[^\d]

数字以外を削除します。

(.).*
$&$1

最初の数字のコピーを追加します。

(?<![13579]).

奇数の数字に続かない数字を削除します。

.
$*

単項に変換します。

.
..

それらを倍増します。

.

合計を取ります。


私は最後の数字が奇数でない場合、結果が不正確になる恐れている
mazzy

1
@mazzy最後の数字を言うとき、最初の数字を最後までコピーする前またはコピーした後ですか?
ニール

'最後まで'。ステップ「最初の数字の複製を追加する」は最後までコピーしていますか?OK。涼しい。おかげで
mazzy


1

JavaScript(ES6)、56バイト

入力を文字の配列として受け取ります。

s=>s.map(c=>1/c?r+=p*(p=c*2&2,n=n||c,c):0,n=p=r=0)|r+p*n

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

コメント済み

s =>                     // given the input array s[]
  s.map(c =>             // for each character c in s[]:
    1 / c ?              //   if c is a digit:
      r +=               //     update r:
        p * (            //       p = either 0 or 2 (always 0 on the 1st iteration)
          p = c * 2 & 2, //       p = 0 if c is even, 2 if c is odd
          n = n || c,    //       if n is still equal to 0 (as an integer), set it to c
          c              //       compute p * c
        )                //     add the result to r
    :                    //   else:
      0,                 //     do nothing
    n = p = r = 0        //   n = first digit, p = previous digit, r = result
  )                      // end of map()
  | r + p * n            // compute the last operation with the 1st digit and add it to r

1

JavaScript(Node.js)85 84 83 82バイト

ovsにより-1バイト

s=>(s.match(/\d/g)||[]).reduce((r,n,i,a)=>r+(+n)+a[a[++i]!=null?i:0]*-(1-n%2*2),0)

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

文字列の入力を取得し、数字を文字の配列として検索するか、見つからない場合は空の配列を返し、型強制を使用して値が正しく加算/減算されるようにします。前方参照はインデックスを事前にインクリメントし、簡潔さのためにnullチェックを使用し、最後の部分は数値が奇数か偶数かをチェックしてから、加算または減算を強制します(+および-は-など)


n-0ことができます+n
-ovs

PPCGへようこそ!
コナーオブライエン

1

R、58バイト

function(x,y=strtoi(x[x%in%0:9]))sum(c(y[-1],y[1])*y%%2*2)

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


array出力を気にしない場合は67バイト
ジュゼッペ

1
うーん、実際には空の配列のためにドット積を使用することはできません。そのため、生成するxxxインデックスの変更を使用すると68バイトになります。ay
ジュゼッペ

@ジュゼッペ:変更、ありがとう:)
digEmAll

@ジュゼッペ:あなたは賢いコードゴルファーだからあなたの意見を聞いてください...コメントから、文字のベクトルを使用できるようです、この場合は61バイトが可能です:オンラインで試してみてください!どう思いますか ?
digEmAll

strtoi代わりに使用しますがas.double、ええ、それは問題ないはずです。
ジュゼッペ



0

C Sharp 180バイト

これはあまり良いゴルフではありません、笑。

s=>{var q=new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));q.Enqueue(q.First());int t,o=0;o=q.Dequeue();try{while(true){t+=o+(o%2==0?-1:1)*(o=q.Dequeue());}}catch{return t;}}

アンゴルフド:

var q = new Queue<int>(s.Where(Char.IsNumber).Select(n=>n-48));
int t,o=0;

q.Enqueue(q.First());    
o=q.Dequeue();

try{
    while(true){
        t += o + (o%2==0?-1:1) * (o=q.Dequeue());
    }
}
catch {
    return t;
}


0

JavaScript(ES6)、52バイト

s=>s.filter(t=>1/t&&~(a+=u*t,u=t%2),a=u=0)[0]*u+a<<1

入力を文字の配列として期待します。警告:ビットシフトの使用により、出力の上限は2^31-1

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

説明

奇数の値に続く数字の合計を本質的に2倍にします。

s => s.filter(             // filter to preserve the first digit
    t =>
        1/t &&             // short-circuits if NaN
        ~(                 // coerce to truthy value
            a += u * t,    // adds value only if previous digit is odd
            u = t%2        // store parity of current digit
        ),
    a = u = 0
)[0]                       // first digit
* u + a
<< 1                       // bit-shift to multiply by 2 (also coerces a NaN resulting from a string devoid of digits to 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.