Der Partyfinanzausgleich

Eine Feier und jede(r) bringt etwas mit. Später sollen die Kosten geteilt werden und schon geht die Rechnerei los: Betrag x von a an b, Betrag y von b an c, Betrag z von c nach a. Allerdings sind a zwei Personen, haben für ebenso viele Personen gegessen und es wäre sinnlos, zweimal Geld zu überweisen.

Klar, kann man das einfach und klassisch mit Bleistift und Papier machen, aber warum nicht einfach den großen Taschenrechner arbeiten lassen? Also kurz ein Javascript zusammengetippt, das die Aufgabe übernimmt:

var teilnehmer = [
    {"name" : "Mila/Adam", "ausgaben" : 30, "esser" : 2},
    {"name" : "Emilia/Noah", "ausgaben" : 20, "esser" : 2},
    {"name" : "Leni/Felix", "ausgaben" : 35, "esser" : 2},
    {"name" : "Mira/Leon/Sophia", "ausgaben" : 10, "esser" : 3},
    {"name" : "Emil", "ausgaben" : 5, "esser" : 1 },
]

var transfer = [];
teilnehmer = teilnehmer.sort((a, b) => a.ausgaben - b.ausgaben);
var ausgaben = teilnehmer.reduce((prev, curr) => prev += curr.ausgaben, 0);
var ausgabenpp = ausgaben / teilnehmer.reduce((prev, curr) => prev += curr.esser, 0);

console.log("Ausgaben Insgesamt:", ausgaben, "Euro, pro Esser:", ausgabenpp)
teilnehmer.forEach(p => p.ausgaben -= ausgabenpp * p.esser)
teilnehmer.forEach(p1 => {
    if(p1.ausgaben < 0)
    {
        var p2 = teilnehmer.find(a => a.ausgaben > 0);
        if(p2 != undefined)
        {
            transfer.push(Math.round(-p1.ausgaben * 100) / 100 + " Euro von " + p1.name + " an " + p2.name);
            p2.ausgaben += p1.ausgaben;
            p1.ausgaben = 0;
        }
    }
});

console.log("Überweisungen:", transfer);
console.log("Betrag nicht ausgeglichen für:", teilnehmer.filter(p => p.ausgaben != 0));

Oben kommen die Teilnehmer, Ausgaben und die „esser“ rein, es purzeln die Beträge, die Transaktionen und was übrig geblieben ist (was bis bis auf Rundungsfehler leer bleiben sollte) heraus:

Ausgaben Insgesamt: 100 Euro, pro Esser: 10
Überweisungen: [
  '5 Euro von Emil an Mila/Adam',
  '20 Euro von Mira/Leon/Sophia an Mila/Adam',
  '15 Euro von Mila/Adam an Leni/Felix'
]
Betrag nicht ausgeglichen für: []

Kann man sicher eleganter lösen, aber: 🤷‍♂️

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.