Um banco para menos amigos confiáveis

12

Introdução

Você conseguiu um emprego como ministro das Finanças no seu país inventado no seu quintal. Você decidiu criar seu próprio banco em seu país para você e seus amigos menos confiáveis. Como você não confia em seus amigos, decidiu escrever um programa para validar todas as transações para impedir que seus amigos gastem demais sua moeda inventada e arruinem sua economia.

Tarefa

Dado o saldo inicial e todas as transações, filtre todas as transações em que alguém tenta gastar mais e bloqueie qualquer pessoa que tente gastar mais (isso inclui tentar gastar mais em uma conta fechada) de nunca mais usar o seu banco, filtrando transações futuras de ou para as dele. / sua conta bancária.

Entrada / Saída

Duas listas Ae Bcomo entrada e uma lista Ccomo saída. Aé o saldo inicial de cada conta com o formato [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Bé uma lista de transações com o formato [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]em ["Bob", "Alice", 3]que significa que Bob deseja pagar a Alice 3 unidades monetárias. Cdeve ter o mesmo formato que B. A, BE Cpodem estar em qualquer formato razoável.

Casos de teste

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: []

Pontuação

Este é o , o código mais curto em bytes em cada idioma vence.

Herman L
fonte
Quão rigoroso é o formato IO? ATambém pode ser um dicionário ou uma lista de tuplas?
Laikoni
@Laikoni Ou mesmo apenas uma lista do formulário ["A", 2, "B", 3, "C", 5]?
Erik o Outgolfer
Caso de teste sugerido: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](uma transação válida após um um inválido).
Arnauld
3
O que acontece se alguém tentar gastar mais e o destinatário pretendido já gastou demais?
Nitrodon
Não há vírgula em ["B" 3] no segundo e terceiro casos de teste #
Jo King

Respostas:

5

JavaScript (ES6), 91 88 79 bytes

Guardado 8 bytes graças a @NahuelFouilleul

Recebe entrada na sintaxe de currying (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))

Casos de teste

Embelezado e comentado

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()
Arnauld
fonte
que tal 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))portar solução perl para javascript?
Nahuel Fouilleul 25/11
@NahuelFouilleul Muito melhor mesmo. Obrigado!
Arnauld
4

Perl 5, 72 + 2 (-ap) = 74 bytes

%h=@F;$_=<>;s/(\S+) (\S+) (\S+)/($h{$1}-=$3)<0||($h{$2}+=$3)<$3?"":$&/ge

experimente online

Nahuel Fouilleul
fonte
2

Python 2 , 103 bytes

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

Experimente online!

-12 graças a ovs .

Mais devido a restrições de formato de saída:

Cdeve ter o mesmo formato que B.

Caso contrário, eu poderia ter feito isso por 92 bytes:

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)
Erik, o Outgolfer
fonte
103 bytes
ovs
@ovs uau, isso é inteligente
Erik o Outgolfer
2

Ruby , 57 bytes

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

Experimente online!

Recebe a entrada Acomo a Hashno formato {"A"=>2, "B"=>3}. Entrada Be saída Cestão no formato sugerido.

Explicação

->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
}
Justin Mariner
fonte
1

C ++, 193 bytes

Entrada A as std::map, B as 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;}

Experimente online!

Colera Su
fonte