パラレルアカウント(2日目)


10

私の大学コードチャレンジコンテストの許可を得てチャレンジ


数か月前に勉強を終えた後、マリーは銀行で口座を開き、町での最初の仕事の支払いを受け取り始めました。それ以来、彼女はいくつかのトランザクションを実行しています。彼女の最初の支払いは1000ドルでした。彼女が両親を招待した夕食に支払ったそのお金で(夕食は$ 150ドルかかりました)、それから彼女は有名なスーパーマーケット($ 80ドル)での購入と休暇($ 200)のホテル予約を行いました。その月の終わりに、彼女は再び支払いを受け取り(1040ドル、前の月より少し多い)、その翌日にスーパーマーケットでさらに70ドルを費やしました。

今日、彼女はスーパーマーケットで最初の80ドルを支払った後に2番目のアカウントが作成され、最初のアカウントが凍結された場合、両方のアカウントの残高はまったく同じになることに気付きました。

1000−150−80⏟Total=770−2001040−70⏟Total=770

このイベントは彼女にとって非常に珍しかったので、彼女は自分のアカウントの動きと彼女の友達の動きにもこの機能があるかどうかを確認し続けたいと思っています。

チャレンジ

トランザクションのリストを指定して、銀行口座の所有者が2番目の口座を作成して、両方が同じ最終残高になるような瞬間の数を出力します。

例: [1000, -150, -80, -200, 1040, -70]

1)⏟Total=01000−150−80−2001040−70⏟Total=1540
2)1000⏟Total=1000−150−80−2001040−70⏟Total=540
3)1000−150⏟Total=850−80−2001040−70⏟Total=690
4)1000−150−80⏟Total=770−2001040−70⏟Total=770
5)1000−150−80−200⏟Total=5701040−70⏟Total=970
6)1000−150−80−2001040⏟Total=1610−70⏟Total=−70
7)1000−150−80−2001040−70⏟Total=1540⏟Total=0

テストケース

  • 入力:1000 -150 -80 -200 1040 -70出力:1
  • 入力:100 -100出力:2
  • 入力:1 2 3出力:1
  • 入力:10 -20 15出力:0
  • 入力:15 -15 15 -15出力:3
  • 入力:1出力:0

ノート

  • $ 0ドルの取引はないと想定できます。
  • 適切な方法で入力を受け取ることができます

11
6か月に渡って新しく作成されたアカウントが凍結された後、マリーの銀行員は現在、療養所に収容されていると報告されています。「私たちはあなたの友達です。あなたは少し休む必要があります」と彼らは言った。
— Arnauld

2
単一トランザクションの推奨テストケース
— Veskah

回答:



4

Perl 6、25バイト

{+grep .sum/2,[\+] 0,|$_}

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

説明

与えられたリスト(0,|$_)にゼロを追加し、一連の部分和[\+](つまり、最初の要素、最初の2つの合計、最初の3つの合計などによって形成されるシーケンス)を作成し、(grep)を探します最終的なアカウント状態の半分(指定されたリストの合計)と完全に等しい要素。最後に、それらを+。


3

05AB1E、11 バイト

0.ø.œ2ùO€ËO

オンラインそれを試してみたり、すべてのテストケースを確認してください。

説明:

0.ø          # Surround the (implicit) input list with a leading and trailing 0
             #  i.e. [100,-100] → [0,100,-100,0]
   .œ        # Get all possible partitions to divide the list
             #  → [[[0],[100],[-100],[0]],[[0],[100],[-100,0]],[[0],[100,-100],[0]],[[0],[100,-100,0]],[[0,100],[-100],[0]],[[0,100],[-100,0]],[[0,100,-100],[0]],[[0,100,-100,0]]]
     2ù      # Only leave partitions consisting of 2 items
             #  → [[[0],[100,-100,0]],[[0,100],[-100,0]],[[0,100,-100],[0]]]
       O     # Take the sum of each
             #  → [[0,0],[100,-100],[0,0]]
        €Ë   # Check of each inner list if both sums are equal (1 if truthy; 0 if falsey)
             #  → [1,0,1]
          O  # Take the sum of that (and output as result)
             #  → 2


3

JavaScript(Node.js)、45バイト

a=>!a.map(v=>o[s+=v]=-~o[s],s=0,o=[1])|o[s/2]

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

を使用して4バイトを節約します-~o[s]。シャギーに感謝します。




@ LuisfelipeDejesusMunoz、Arnauldは(常に)無敵ではありません!;)
— シャギー

@Shaggyのリーディング+がに変更されたため!、入力で機能する可能性があります[100]。
— TSH

ああ、シングルトンアレイを処理する必要があることを理解していませんでした。うまく修正されました。
— シャギー


2

JavaScript(ES6)、52バイト

a=>a.map(x=>n+=(s+=x)==eval(a.join`+`)-s,n=s=0)|n+!s

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

コメントしました

a =>                        // a[] = input array
  a.map(x =>                // for each element x in a[]:
    n +=                    //   increment n if the following test is truthy:
      (s += x)              //     update the left sum
      ==                    //     and test whether it's equal to
      eval(a.join`+`) - s,  //     the right sum
    n = s =0                //   start with n = s = 0
  )                         // end of map()
  | n                       // yield n; if the final sum is 0, it means that we could have
  +                         // created a balanced account at the beginning of the process;
  !s                        // so, we increment n if it is

再帰バージョン、 54  53バイト

f=(a,s=0)=>a+a?(s==eval(a.join`+`))+f(a,s+a.pop()):!s

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


52バイトバージョンを提案しようとしていたところです。
— シャギー

@Shaggyええ、再帰バージョンの方が短いのではないかと思ったので、非再帰バージョンをすぐに破棄しました。
— Arnauld

2

APL(Dyalog Unicode)、21 バイトSBCS

匿名の暗黙のプレフィックス関数

+/⊂((+/↑)=1⊥↓)¨⍨0,⍳∘≢

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

⍳ ɩ ndices
 ∘ の
≢ 取引の集計

0, 先頭にゼロを付ける

⊂(… )¨⍨ 次の暗黙関数を、それぞれを左引数として、トランザクションのリスト全体を右引数として(⍨スワップ引数として)適用します。

⊂ トランザクションのリスト全体
 (… ) 以下の関数の左の引数として、引数 が交換
  ¨ された各インデックスに適用され
   ⍨ます(つまり、右のリスト、左のインデックス:

  ↓ 左からたくさん落とす

  1⊥ 合計(lit. base-1で評価)

  (… )= (0/1)は… と等しい

   ↑ 左からその数のトランザクションを取ります

   +/ それらを合計します

+/ 真偽数を取得するためにそのブールリストを合計する


2

バッチ、84バイト

@set s=%*
@set/as=%s: =+%,c=0
@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s
@echo %c%

入力をコマンドライン引数として受け取ります。説明:

@set s=%*

引数をスペースで結合します。

@set/as=%s: =+%,c=0

スペースを+sに置き換え、結果を評価します。カウントもクリアします。

@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s

それぞれの金額について、合計からその2倍を引きます。結果がゼロの場合、これは有効な一致なので、カウントを増やします。最初にゼロを追加することで、金額の前に一致させることができます。

@echo %c%

結果を印刷します。


2

チャコール、15バイト

⊞θ⁰IΣEθ⁼Σθ⊗Σ✂θκ

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

 θ              Input list
  ⁰             Literal 0
⊞               Push to list
      θ         Augmented list
     E          Mapped to
             θ  Augmented list
            ✂   Sliced from
              κ Current index
           Σ    Summed
          ⊗     Doubled
       ⁼        Equals
         θ      (Augmented) list
        Σ       Summed
    Σ           Sum of booleans
   I            Cast to string
                Implicitly print

残念ながら、チャコールSum([])では0そうではないので、合計する要素が常に少なくとも1つあることを確認する必要があります。




2

MATL、9バイト

s0GhYsE=s

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

他のいくつかの回答と同じアプローチ:ゼロを付加し、累積合計の半分が合計合計と等しい頻度を確認します。

s   % Total sum of (implicit) input
0Gh % Prepend 0 to another copy of the input
Ys  % Cumulative sum
E=  % Check element-wise equality of 2*cumulative sum with total sum
s   % Sum number of `true` values

2

Japt -x、14 11バイト

iT å+ ®¥nUx

それを試してみてください

iT å+ ®¥nUx     :Implicit input of array U
i               :Prepend
 T              :  Zero
   å+           :Cumulatively reduce by addition
      ®         :Map each Z
       ¥        :  Test for equality with
        n       :  Z subtracted from
         Ux     :  U reduced by addition
                :Implicitly reduce by addition and output

2

PowerShell、88 82バイト

mazzyによる-6バイト

param($n)0..($x=$n.length)|%{$i+=+$z-eq($n[$_..$x]|measure -Su).sum;$z+=$n[$_]};$i

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

これは非常に不器用な方法のように見えますが、それで仕事が完了しました。将来的にはそれを改良するつもりです。


1
あなたは$i+=<predicate>代わりに書くことができますif(<predicate>){$i++}
— マジー



1

bash、52バイト

IFS=+;for i in 0 $@;{((c+=2*(x+=i)=="$*"));};echo $c

TIO

秘訣:を設定しIFS=+、"$*"引数がで区切られた文字列に展開し、+算術式evalで合計にします



0

J、19バイト

1#.[:(={:-])0+/\@,]

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

説明

1 #. [: (= ({: - ])) 0 +/\@, ]

                     0     , ]  NB. prepend 0 to input...
                       +/\@     NB. and take the prefix sums...
     [:    ({: - ])             NB. then subtract that list
                                NB. from its final elm 
                                NB. (`{:`), giving the list
                                NB. of suffix sums...
     [: (= (      ))            NB. create a 1-0 list showing
                                NB. where the prefix sums 
                                NB. equal the suffix sums
1 #.                            NB. and take the sum.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.