信頼できない友人のための銀行


12

前書き

あなたはあなたの裏庭で、あなたのメイクアップされた国で財務大臣としての仕事を得ました。あなたとあなたの信頼性の低い友人のために、あなたの国であなた自身の銀行を作ることにしました。友人を信用していないため、すべての取引を検証するプログラムを作成して、友​​人が構成通貨を使い果たして経済を台無しにするのを防ぐことにしました。

仕事

開始残高とすべてのトランザクションを考えると、誰かが使いすぎたすべてのトランザクションを除外し、使い過ぎた人(これは閉鎖された口座への使いすぎを含む)がブロックするようになります。 /彼女の銀行口座。

入出力

入力としての2つのリストAと出力としてBのリストCAは、形式の各アカウントの開始残高です[["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]Bフォーマットとの取引のリストである手段ボブがアリスの3通貨単位を支払うことを望んでいます。と同じ形式にする必要があります。、および任意の合理的な形式にすることができます。[["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]["Bob", "Alice", 3]CBABC

テストケース

A: [["Alice", 5], ["Bob", 2]]
B: [["Alice", "Bob", 5], ["Bob", "Alice" 7]]
C: [["Alice", "Bob", 5], ["Bob", "Alice" 7]]

A: [["A", 2], ["B", 3], ["C", 5]]
B: [["C", "A", 2], ["B", "C", 4], ["A", "B", 2]]
C: [["C", "A", 2]]

A: [["A", 2], ["B", 3]]
B: [["A", "B", 2], ["A", "B", 2]]
C: [["A", "B", 2]]

A: [["A", 4], ["B", 0]]
B: [["A", "B", 1], ["A", "B", 5], ["A", "B", 2]]
C: [["A", "B", 1]]

A: [["A", 2], ["B", 3], ["C", 4]]
B: [["A", "B", 3], ["C", "B", 4]]
C: [["C", "B", 4]]

A: [["A", 2], ["B", 3], ["C", 4]]
B: [["A", "B", 3], ["B", "A", 4], ["C", "B" 2]]
C: []

得点

これはで、各言語のバイト単位の最短コードが勝ちます。


IO形式はどのくらい厳格ですか?でしたAまた、辞書、またはタプルのリストで?
ライコニ

@Laikoniまたはフォームの単なるリスト["A", 2, "B", 3, "C", 5]ですか?
エリックアウトゴルファー

推奨テストケース:A: [["A", 2], ["B", 3], ["C", 4]]B: [["A", "B", 3], ["C", "B", 4]]C: [["C", "B", 4]](無効1次有効なトランザクション)。
アーナルド

3
誰かが使いすぎて、目的の受信者がすでに使いすぎている場合はどうなりますか?
ニトロドン

2番目と3番目のテストケースの["B" 3]にコンマはありません
ジョーキング

回答:


5

JavaScript(ES6)、91 88 79バイト

@NahuelFouilleulのおかげで8バイト節約

カリー化構文の入力を受け取ります(a)(b)

a=>b=>b.filter(([x,y,z])=>(a[x]+=z)<0&a[y]<0?a[y]-=z:0,a.map(([x,y])=>a[x]=~y))

テストケース

美化とコメント

a => b =>                 // given the two lists a and b
  b.filter(([x, y, z]) => // for each (x = payer, y = payee, z = amount) in b:
    (a[x] += z) < 0 &     //   update the payer's account; if it's still valid
    a[y] < 0 ?            //   and the payee's account is also valid:
      a[y] -= z           //     update the payee's account
    :                     //   else:
      0,                  //     do nothing
    a.map(([x, y]) =>     //   initialization: for each (x = owner, y = amount) in a:
      a[x] = ~y           //     set up this account (>= 0: closed, -1: $0, -2: $1, etc.)
    )                     //   end of map()
  )                       // end of filter()

a=>b=>b.filter(([x,y,z])=>(a[x]-=z)>0&a[y]>0?a[y]+=z:0,a.map(([x,y])=>a[x]=y+1))Perlソリューションをjavascriptに移植するのはどうですか?
ナウエルフイユル

@NahuelFouilleul本当に良くなりました。ありがとう!
アーナウド


2

Python 2、103バイト

A,B=input()
C=[]
for i in B:
 N,P,M=i
 if M>A[N]:A[N]=-1
 if A[N]>-1<A[P]:A[N]-=M;A[P]+=M;C+=i,
print C

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

-12 ovsに感謝ます。

出力形式の制限により長くなります:

Cと同じ形式にする必要がありますB

そうでなければ、92バイトでこれを行うことができました:

A,B=input()
for(N,P,M)in B:
 if M>A[N]:A[N]=-1
 if A[N]>-1<A[P]:A[N]-=M;A[P]+=M;print(N,P,M)


@ovsうわー、それは賢いです
エリックアウトゴルファー

2

ルビー、57バイト

->a,b{b.select{|(s,r,x)|a[r]+=x if[a[s]-=x,a[r]].min>-1}}

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

入力Aをa Hashの形式で受け取ります{"A"=>2, "B"=>3}。入力Bと出力Cは推奨される形式です。

説明

->a,b{                      # lambda function taking arguments A and B
b.select{|(s,r,x)|              # select items in B that return truthy (s = sender, r = receiver, x = amount)
            a[s]-=x,                # subtract amount from sender
        if [         a[r]].min>-1   # check if the smaller of the balances is non-negative
                                    # (true if both values are non-negative)
a[r]+=x                             # if so, add to the receiver's balance
}                               # the select function returns truthy when the above if statement passes
}

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