Work out who pays whom #64

Closed
jheaps wants to merge 1 commits from fix/casino-holdem-settle-up into fix/casino-holdem-allin-and-bar
Owner

I went looking for what home-game dealers actually struggle with rather than reading the code again, and the answer that kept coming up was the end of the night: hosts reach for a separate app to finish a game "knowing exactly who owes whom in seconds rather than minutes". Stacked on #63.

This tool already had every number that answer needs. The standings panel knows what each player is up or down — chips in front of them less the cash they handed over — and then stops. Which leaves the dealer with six signed numbers at 2am and the actual job still to do. That last step is the part people get wrong, not the poker.

Standings Settle up
Ann +$75 Fay → Dee $70
Ben −$10 Cal → Dee $40
Cal −$65 Cal → Ann $25
Dee +$110 Eve → Ann $40
Eve −$40 Ben → Ann $10
Fay −$70 5 payments and the night is square.

Largest debt against largest win, repeatedly. Greedy rather than optimal, which is the right trade here: the true minimum number of transfers is NP-hard, while this needs at most one payment fewer than there are people and each one it emits clears somebody out of the list entirely. A dealer wants a short list to read down, not a proof. Payers are the outer loop so everything one person owes prints together — the list gets read out one player at a time.

All of it in integer cents. A settlement that has to come out exactly right is the last place to let a float land on 41.99999999.

When the chips on the table don't match the cash taken

Then the payments can't all be made, and that is reported rather than quietly spread across them. It is never rounding — the arithmetic is integer cents — so it is always what the bank check sitting directly above it is already warning about: a rebuy nobody wrote down, or a miscount. Inventing a transfer to make the columns agree is how a real person ends up short.

$100 of winnings has nothing to pay it — there are more chips on the table than cash was taken for. Fix that above before anyone cashes out.

The payment list goes into the CSV export too, under the standings it came from, with the caveat if there is one. Whoever opens that file wants the answer, not to redo the arithmetic in a spreadsheet.

Validation

13 tests (185 total): everyone ends up square, at most n−1 payments, a payer's lines stay together, cents survive, nobody pays themselves, no payment is ever for zero, both directions of an unbalanced bank, and one that settles a real table's standings rather than hand-made numbers.

Driven through the UI at six viewports, balanced and not: clean layout audit and contrast everywhere except the landscape phone already documented in #63. Verified the panel follows a stack edit live, and checked with 26-character names and seven-figure stacks on a 360px screen — names wrap, amounts stay whole and right-aligned, nothing overflows.

Sources: Poker Chip Forum — dealing at home games, Chips of Fury — house rules to keep the game moving, PokerTally

I went looking for what home-game dealers actually struggle with rather than reading the code again, and the answer that kept coming up was the end of the night: hosts reach for a separate app to finish a game *"knowing exactly who owes whom in seconds rather than minutes"*. Stacked on #63. This tool already had every number that answer needs. The standings panel knows what each player is up or down — chips in front of them less the cash they handed over — **and then stops**. Which leaves the dealer with six signed numbers at 2am and the actual job still to do. That last step is the part people get wrong, not the poker. | Standings | | Settle up | | | --- | --- | --- | --- | | Ann | +$75 | Fay → Dee | $70 | | Ben | −$10 | Cal → Dee | $40 | | Cal | −$65 | Cal → Ann | $25 | | Dee | +$110 | Eve → Ann | $40 | | Eve | −$40 | Ben → Ann | $10 | | Fay | −$70 | | *5 payments and the night is square.* | Largest debt against largest win, repeatedly. **Greedy rather than optimal**, which is the right trade here: the true minimum number of transfers is NP-hard, while this needs at most one payment fewer than there are people and each one it emits clears somebody out of the list entirely. A dealer wants a short list to read down, not a proof. Payers are the outer loop so everything one person owes prints together — the list gets read out one player at a time. All of it in **integer cents**. A settlement that has to come out exactly right is the last place to let a float land on 41.99999999. ## When the chips on the table don't match the cash taken Then the payments can't all be made, and that is **reported rather than quietly spread across them**. It is never rounding — the arithmetic is integer cents — so it is always what the bank check sitting directly above it is already warning about: a rebuy nobody wrote down, or a miscount. Inventing a transfer to make the columns agree is how a real person ends up short. > $100 of winnings has nothing to pay it — there are more chips on the table than cash was taken for. Fix that above before anyone cashes out. The payment list goes into the **CSV export** too, under the standings it came from, with the caveat if there is one. Whoever opens that file wants the answer, not to redo the arithmetic in a spreadsheet. ## Validation **13 tests (185 total)**: everyone ends up square, at most n−1 payments, a payer's lines stay together, cents survive, nobody pays themselves, no payment is ever for zero, both directions of an unbalanced bank, and one that settles a real table's standings rather than hand-made numbers. Driven through the UI at six viewports, balanced and not: **clean layout audit and contrast everywhere** except the landscape phone already documented in #63. Verified the panel follows a stack edit live, and checked with 26-character names and seven-figure stacks on a 360px screen — names wrap, amounts stay whole and right-aligned, nothing overflows. Sources: [Poker Chip Forum — dealing at home games](https://www.pokerchipforum.com/threads/dealing-home-game-questions.100179/), [Chips of Fury — house rules to keep the game moving](https://chipsoffury.com/learn/poker-house-rules-to-keep-the-game-moving/), [PokerTally](https://apps.apple.com/app/id6756515972)
jheaps added 1 commit 2026-09-01 12:53:22 -06:00
I went looking for what home-game dealers actually struggle with rather than reading
the code again, and the answer that kept coming up was the end of the night: hosts
reach for a separate app to finish a game "knowing exactly who owes whom in seconds
rather than minutes".

This tool already had every number that answer needs. The standings panel knows what
each player is up or down -- chips in front of them less the cash they handed over --
and then stops. Which leaves the dealer with six signed numbers at 2am and the actual
job still to do. That last step is the part people get wrong, not the poker.

  Ann  +$75    Dee  +$110      Fay -> Dee   $70
  Ben  -$10    Eve   -$40      Cal -> Dee   $40
  Cal  -$65    Fay   -$70      Cal -> Ann   $25
                               Eve -> Ann   $40
                               Ben -> Ann   $10

Largest debt against largest win, repeatedly. Greedy rather than optimal, which is
the right trade here: the true minimum number of transfers is NP-hard, while this
needs at most one payment fewer than there are people and each one it emits clears
somebody out of the list entirely. A dealer wants a short list to read down, not a
proof. Payers are the outer loop so everything one person owes prints together --
the list gets read out one player at a time.

All of it in integer cents. A settlement that has to come out exactly right is the
last place to let a float land on 41.99999999.

When the chips on the table don't match the cash taken

Then the payments can't all be made, and that is reported rather than quietly spread
across them. It is never rounding -- the arithmetic is integer cents -- so it is
always what the bank check sitting right above it is already warning about: a rebuy
nobody wrote down, or a miscount. Inventing a transfer to make the columns agree is
how a real person ends up short.

  $100 of winnings has nothing to pay it -- there are more chips on the table than
  cash was taken for. Fix that above before anyone cashes out.

The payment list goes into the CSV export too, under the standings it came from,
with the caveat if there is one. Whoever opens that file wants the answer, not to
redo the arithmetic in a spreadsheet.

13 tests (185 total): everyone ends up square, at most n-1 payments, a payer's lines
stay together, cents survive, nobody pays themselves, no payment is ever for zero,
both directions of an unbalanced bank, and one that settles a real table's standings
rather than hand-made numbers.

Driven through the UI at six viewports, balanced and not: clean layout audit and
contrast everywhere but the landscape phone already known from #63. Checked with
26-character names and seven-figure stacks on a 360px screen -- names wrap, amounts
stay whole and right-aligned, nothing overflows.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
jheaps closed this pull request 2026-09-02 09:58:33 -06:00

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jheaps/JoshHeaps.Net#64