Kalkulator podziału kosztów grupowych
Aplikacja do dzielenia kosztów grupowych (np. wyjście, wycieczka): wpisz osoby, ile każda zapłaciła, a system obliczy kto komu ile jest winien, żeby wyrównać rachunki.
Kalkulator podziału kosztów grupowych
Aplikacja do dzielenia kosztów grupowych (np. wyjście, wycieczka): wpisz osoby, ile każda zapłaciła, a system obliczy kto komu ile jest winien, żeby wyrównać rachunki.
Algorytmy podziału kosztów są w aplikacjach takich jak Splitwise, Tricount czy Revolut. Nauka balansowania sald to klasyczny problem algorytmiczny z praktycznym zastosowaniem.
{ "group": { "people": ["Jan", "Anna", "Piotr"], "expenses": [ {"payer": "Jan", "description": "Pizza", "amount": 60.00}, {"payer": "Anna", "description": "Napoje", "amount": 30.00}, {"payer": "Piotr", "description": "Parking", "amount": 15.00} ] }}<?php// Obliczenie sald i transferówfunction calculateSettlement(array $people, array $expenses): array { $count = count($people); $total = array_sum(array_column($expenses, 'amount')); $share = $total / $count;
// Oblicz ile każdy zapłacił $paid = array_fill_keys($people, 0.0); foreach ($expenses as $expense) { $paid[$expense['payer']] += $expense['amount']; }
// Saldo = zapłacone - należne $balances = []; foreach ($people as $person) { $balances[$person] = round($paid[$person] - $share, 2); }
// Generuj transfery: od tych z saldem ujemnym do tych z dodatnim $debtors = array_filter($balances, fn($b) => $b < 0); $creditors = array_filter($balances, fn($b) => $b > 0); arsort($creditors); asort($debtors);
$transfers = []; // Uproszczona wersja: każdy dłużnik oddaje największemu wierzycielowi foreach ($debtors as $debtor => $debt) { foreach ($creditors as $creditor => $credit) { if ($debt >= 0) break; $amount = min(abs($debt), $credit); if ($amount > 0.01) { $transfers[] = [ 'from' => $debtor, 'to' => $creditor, 'amount' => round($amount, 2), ]; $debtors[$debtor] += $amount; $creditors[$creditor] -= $amount; } } } return $transfers;}Splitwise po polsku!
Zacznij od obliczenia sumy i udziału. Potem salda. Na końcu algorytm transferów. Każdy krok jest osobną funkcją.