Банк для менш надійних друзів


12

Вступ

Ви влаштувались на посаду міністра фінансів у вашій складеній країні на задньому подвір’ї. Ви вирішили створити власний банк у своїй країні для вас та ваших менш надійних друзів. Оскільки ви не довіряєте своїм друзям, ви вирішили написати програму для підтвердження всіх транзакцій, щоб уникнути перевитрати вашими друзями витраченої валюти та зруйнування економіки.

Завдання

Враховуючи стартовий баланс та всі транзакції, відфільтруйте всі транзакції, коли хтось намагається перевитратити та заблокувати тих, хто намагається перевитратити гроші (це включає спроби перевитрати коштів на закритий рахунок), щоб ніколи не користувався вашим банком знову, фільтруючи майбутні транзакції на його або з його / її банківський рахунок.

Введення-виведення

Два списки Aі Bяк вхід, і список Cяк вихід. A- початковий баланс кожного рахунку з форматом [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Bце перелік транзакцій у форматі, [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]де ["Bob", "Alice", 3]означає, що Боб хоче сплатити Алісі 3 валютні одиниці. Cповинен мати той самий формат, що і B. A, Bі Cможе бути в будь-якому розумному форматі.

Випробування

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]](дійсна угода після неприпустимою один).
Арнольд

3
Що станеться, якщо хтось намагається завищити витрати, а призначений одержувач вже завищив?
Nitrodon

У другому та третьому тестових комах немає жодної коми [“B” 3]
Jo King

Відповіді:


5

JavaScript (ES6), 91 88 79 байт

Збережено 8 байт завдяки @NahuelFouilleul

Здійснює введення в синтаксис 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))

Тестові справи

Прикрасили і прокоментували

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?
Nahuel Fouilleul

@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 завдяки ов .

Більше через обмеження у форматі виводу:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.