Daha az Güvenilir Arkadaşlar için bir banka


12

Giriş

Arka bahçenizdeki makyaj yaptığınız ülkede maliye bakanı olarak işe başladınız. Siz ve daha az güvenilir arkadaşlarınız için ülkenizde kendi bankanızı oluşturmaya karar verdiniz. Arkadaşlarınıza güvenmediğiniz için, arkadaşlarınızın para biriminizi geçmesini ve ekonominizi mahvetmesini önlemek için tüm işlemleri doğrulamak üzere bir program yazmaya karar verdiniz.

Görev

Başlangıç ​​bakiyesi ve tüm işlemler göz önüne alındığında, bir kişinin abartmaya çalıştığı ve abartmaya çalışan herkesi (bu kapalı bir hesaba abartmayı denemek dahil) gelecekteki işlemleri bankanıza veya hesabından gelecekteki işlemlerini filtreleyerek tekrar kullanmasını engelleyen tüm işlemleri filtreleyin / banka hesabı.

Giriş çıkış

İki liste Ave Bgirdi olarak ve liste Cçıktı olarak. Aher hesabın biçimiyle başlangıç ​​bakiyesidir [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Bformatı ile işlemlerin listesidir vasıta Bob Alice 3 kur birimlerini ödemek istediğini söyledi. ile aynı biçime sahip olmalıdır . , Ve makul biçimde olabilir.[["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]["Bob", "Alice", 3]CBABC

Test Durumları

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

puanlama

Bu , her dilde bayt olarak en kısa kod kazanır.


ES formatı ne kadar katı? Could Ada bir sözlük ya da tüp listeleriniz olmak?
Laikoni

@Laikoni Yoksa sadece formun bir listesi ["A", 2, "B", 3, "C", 5]mi?
Outgolfer Erik

Önerilen test durumu: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](geçersiz biri aşağıdaki geçerli bir işlem).
Arnauld

3
Birisi gereğinden fazla abartmaya çalışırsa ve hedeflenen alıcı zaten abartılmışsa ne olur?
Nitrodon

İkinci ve üçüncü test vakalarında ["B" 3) virgül yok
Jo King

Yanıtlar:


5

JavaScript (ES6), 91 88 79 bayt

@NahuelFouilleul sayesinde 8 bayt kaydedildi

Körili sözdiziminde girdi alır (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))

Test senaryoları

Güzel ve yorumlu

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 çözümünün javascript'e taşınmasına ne dersiniz ?
Nahuel Fouilleul

@NahuelFouilleul Gerçekten çok daha iyi. Teşekkürler!
Arnauld


2

Python 2 , 103 bayt

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

Çevrimiçi deneyin!

-12 sayesinde OVS .

Çıktı biçimi kısıtlamaları nedeniyle daha uzun:

Cile aynı biçime sahip olmalıdır B.

Aksi takdirde bunu 92 bayt için yapabilirdim:

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 wow, bu zekice
Outgolfer Erik

2

Ruby , 57 bayt

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

Çevrimiçi deneyin!

Girişi alır Abir şekilde Hashformatında {"A"=>2, "B"=>3}. Giriş Bve çıkış Cönerilen formattadır.

açıklama

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

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.