덜 믿을만한 친구들을위한 은행


12

소개

당신은 뒷마당에있는 당신의 메이크업 국가에서 재무 장관으로 일했습니다. 당신은 당신과 당신의 덜 신뢰하는 친구를 위해 당신의 나라에서 자신의 은행을 만들기로 결정했습니다. 친구를 믿지 않기 때문에 모든 거래를 확인하여 친구가 화장 통화를 과도하게 사용하고 경제를 망치지 않도록 프로그램을 작성하기로 결정했습니다.

직무

시작 잔액과 모든 거래가 주어지면 누군가가 초과 지출을 시도하는 모든 거래를 걸러 내고 초과 거래를 시도하는 사람 (폐쇄 계좌로 초과 지출을 시도하는 것을 포함)은 향후 거래를 필터링하여 은행을 다시 사용하지 못하게합니다. 은행 계좌.

입출력

두 개의 목록 AB입력과 목록 C은 출력입니다. A형식으로 각 계정의 시작 잔액입니다 [["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

@Laikoni 또는 심지어 양식 목록 ["A", 2, "B", 3, "C", 5]?
Outgolfer Erik

제안 된 테스트 케이스 : A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](무효 한 다음 유효한 거래).
Arnauld

3
누군가가 초과 지출을 시도하고 의도 한 수신자가 이미 초과 지출 한 경우 어떻게됩니까?
니트로 돈

두 번째 및 세 번째 테스트 사례의 [ "B"3]에는 쉼표가 없습니다
Jo King

답변:


5

자바 스크립트 (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))펄 솔루션을 자바 스크립트로 포팅하는 것은 어떻습니까?
Nahuel Fouilleul

@NahuelFouilleul 훨씬 더 좋습니다. 감사!
Arnauld


2

파이썬 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

온라인으로 사용해보십시오!

ovs 덕분에 -12 .

출력 형식 제한으로 인해 더 길어짐 :

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 와우, 그것은 영리하다
Erik the Outgolfer

2

루비 , 57 바이트

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

온라인으로 사용해보십시오!

형식으로 입력 A을 받습니다. 입력 및 출력 은 제안 된 형식입니다.Hash{"A"=>2, "B"=>3}BC

설명

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

1

C ++, 193 바이트

A를 std::map, B를으로 입력하십시오 std::list.

#import<bits/stdc++.h>
using s=std::string;struct p{s a,b;int c;};using t=std::list<p>;t f(std::map<s,int>A,t B){t C;for(p&i:B)(A[i.a]-=i.c)<0|A[i.b]<0?0:(C.push_back(i),A[i.b]+=i.c);return C;}

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.