Skip to content

Instantly share code, notes, and snippets.

@tphummel
Last active August 14, 2021 20:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tphummel/28766e34730d603ca67d7c90f8bd6fc1 to your computer and use it in GitHub Desktop.
Save tphummel/28766e34730d603ca67d7c90f8bd6fc1 to your computer and use it in GitHub Desktop.
Compile head to head scoring for group solitaire (aka nertz, pounce)
[
{
"Hand": 1,
"Player": "Neela",
"Score": 24,
"Winner": ""
},
{
"Hand": 2,
"Player": "Neela",
"Score": 24,
"Winner": "TRUE"
},
{
"Hand": 3,
"Player": "Neela",
"Score": 20,
"Winner": ""
},
{
"Hand": 4,
"Player": "Neela",
"Score": -2,
"Winner": ""
},
{
"Hand": 5,
"Player": "Neela",
"Score": -10,
"Winner": ""
},
{
"Hand": 6,
"Player": "Neela",
"Score": 28,
"Winner": "TRUE"
},
{
"Hand": 7,
"Player": "Neela",
"Score": 20,
"Winner": ""
},
{
"Hand": 8,
"Player": "Neela",
"Score": 22,
"Winner": "TRUE"
},
{
"Hand": 9,
"Player": "Neela",
"Score": -9,
"Winner": ""
},
{
"Hand": 10,
"Player": "Neela",
"Score": 12,
"Winner": ""
},
{
"Hand": 11,
"Player": "Neela",
"Score": 23,
"Winner": "TRUE"
},
{
"Hand": 12,
"Player": "Neela",
"Score": 32,
"Winner": "TRUE"
},
{
"Hand": 13,
"Player": "Neela",
"Score": 1,
"Winner": ""
},
{
"Hand": 19,
"Player": "Neela",
"Score": 15,
"Winner": ""
},
{
"Hand": 20,
"Player": "Neela",
"Score": 17,
"Winner": ""
},
{
"Hand": 1,
"Player": "Tom",
"Score": 14,
"Winner": ""
},
{
"Hand": 2,
"Player": "Tom",
"Score": -12,
"Winner": ""
},
{
"Hand": 3,
"Player": "Tom",
"Score": 36,
"Winner": "TRUE"
},
{
"Hand": 4,
"Player": "Tom",
"Score": -1,
"Winner": ""
},
{
"Hand": 5,
"Player": "Tom",
"Score": 3,
"Winner": ""
},
{
"Hand": 6,
"Player": "Tom",
"Score": 6,
"Winner": ""
},
{
"Hand": 7,
"Player": "Tom",
"Score": 5,
"Winner": ""
},
{
"Hand": 8,
"Player": "Tom",
"Score": 7,
"Winner": ""
},
{
"Hand": 9,
"Player": "Tom",
"Score": -13,
"Winner": ""
},
{
"Hand": 10,
"Player": "Tom",
"Score": 4,
"Winner": ""
},
{
"Hand": 11,
"Player": "Tom",
"Score": 10,
"Winner": ""
},
{
"Hand": 12,
"Player": "Tom",
"Score": 1,
"Winner": ""
},
{
"Hand": 13,
"Player": "Tom",
"Score": -17,
"Winner": ""
},
{
"Hand": 14,
"Player": "Tom",
"Score": 4,
"Winner": ""
},
{
"Hand": 15,
"Player": "Tom",
"Score": -11,
"Winner": ""
},
{
"Hand": 16,
"Player": "Tom",
"Score": -5,
"Winner": ""
},
{
"Hand": 17,
"Player": "Tom",
"Score": -14,
"Winner": ""
},
{
"Hand": 18,
"Player": "Tom",
"Score": 4,
"Winner": ""
},
{
"Hand": 19,
"Player": "Tom",
"Score": -19,
"Winner": ""
},
{
"Hand": 20,
"Player": "Tom",
"Score": -1,
"Winner": ""
},
{
"Hand": 1,
"Player": "Dylan",
"Score": 30,
"Winner": "TRUE"
},
{
"Hand": 2,
"Player": "Dylan",
"Score": 3,
"Winner": ""
},
{
"Hand": 4,
"Player": "Dylan",
"Score": -7,
"Winner": ""
},
{
"Hand": 5,
"Player": "Dylan",
"Score": -9,
"Winner": ""
},
{
"Hand": 6,
"Player": "Dylan",
"Score": 8,
"Winner": ""
},
{
"Hand": 7,
"Player": "Dylan",
"Score": 1,
"Winner": ""
},
{
"Hand": 8,
"Player": "Dylan",
"Score": 2,
"Winner": ""
},
{
"Hand": 14,
"Player": "Nancy",
"Score": -5,
"Winner": ""
},
{
"Hand": 15,
"Player": "Nancy",
"Score": 2,
"Winner": ""
},
{
"Hand": 16,
"Player": "Nancy",
"Score": 18,
"Winner": "TRUE"
},
{
"Hand": 17,
"Player": "Nancy",
"Score": 8,
"Winner": ""
},
{
"Hand": 18,
"Player": "Nancy",
"Score": -2,
"Winner": ""
},
{
"Hand": 19,
"Player": "Nancy",
"Score": 18,
"Winner": ""
},
{
"Hand": 20,
"Player": "Nancy",
"Score": 5,
"Winner": ""
},
{
"Hand": 1,
"Player": "Tyler",
"Score": -10,
"Winner": ""
},
{
"Hand": 2,
"Player": "Tyler",
"Score": 5,
"Winner": ""
},
{
"Hand": 4,
"Player": "Tyler",
"Score": -5,
"Winner": ""
},
{
"Hand": 5,
"Player": "Tyler",
"Score": -4,
"Winner": ""
},
{
"Hand": 7,
"Player": "Tyler",
"Score": 12,
"Winner": ""
},
{
"Hand": 8,
"Player": "Tyler",
"Score": 3,
"Winner": ""
},
{
"Hand": 9,
"Player": "Tyler",
"Score": 2,
"Winner": ""
},
{
"Hand": 10,
"Player": "Tyler",
"Score": 28,
"Winner": "TRUE"
},
{
"Hand": 12,
"Player": "Tyler",
"Score": -7,
"Winner": ""
},
{
"Hand": 13,
"Player": "Tyler",
"Score": -10,
"Winner": ""
},
{
"Hand": 15,
"Player": "Tyler",
"Score": 6,
"Winner": ""
},
{
"Hand": 16,
"Player": "Tyler",
"Score": -6,
"Winner": ""
},
{
"Hand": 17,
"Player": "Tyler",
"Score": 24,
"Winner": "TRUE"
},
{
"Hand": 18,
"Player": "Tyler",
"Score": 23,
"Winner": "TRUE"
},
{
"Hand": 1,
"Player": "Molly",
"Score": 14,
"Winner": ""
},
{
"Hand": 2,
"Player": "Molly",
"Score": -1,
"Winner": ""
},
{
"Hand": 3,
"Player": "Molly",
"Score": 21,
"Winner": ""
},
{
"Hand": 4,
"Player": "Molly",
"Score": -19,
"Winner": ""
},
{
"Hand": 6,
"Player": "Molly",
"Score": 7,
"Winner": ""
},
{
"Hand": 7,
"Player": "Molly",
"Score": -5,
"Winner": ""
},
{
"Hand": 8,
"Player": "Molly",
"Score": -12,
"Winner": ""
},
{
"Hand": 13,
"Player": "Molly",
"Score": -10,
"Winner": ""
},
{
"Hand": 16,
"Player": "Dylan",
"Score": -8,
"Winner": ""
},
{
"Hand": 17,
"Player": "Dylan",
"Score": 1,
"Winner": ""
},
{
"Hand": 18,
"Player": "Dylan",
"Score": 5,
"Winner": ""
},
{
"Hand": 19,
"Player": "Dylan",
"Score": 11,
"Winner": ""
},
{
"Hand": 20,
"Player": "Dylan",
"Score": 3,
"Winner": ""
},
{
"Hand": 1,
"Player": "Britta",
"Score": 19,
"Winner": ""
},
{
"Hand": 2,
"Player": "Britta",
"Score": 18,
"Winner": ""
},
{
"Hand": 3,
"Player": "Britta",
"Score": 27,
"Winner": ""
},
{
"Hand": 4,
"Player": "Britta",
"Score": 18,
"Winner": "TRUE"
},
{
"Hand": 5,
"Player": "Britta",
"Score": 17,
"Winner": "TRUE"
},
{
"Hand": 6,
"Player": "Brenty",
"Score": 9,
"Winner": ""
},
{
"Hand": 7,
"Player": "Brenty",
"Score": 10,
"Winner": ""
},
{
"Hand": 8,
"Player": "Brenty",
"Score": 1,
"Winner": ""
},
{
"Hand": 9,
"Player": "Brenty",
"Score": -18,
"Winner": ""
},
{
"Hand": 10,
"Player": "Brenty",
"Score": 13,
"Winner": ""
},
{
"Hand": 11,
"Player": "Brenty",
"Score": -1,
"Winner": ""
},
{
"Hand": 12,
"Player": "Brenty",
"Score": 5,
"Winner": ""
},
{
"Hand": 13,
"Player": "Brenty",
"Score": -5,
"Winner": ""
},
{
"Hand": 14,
"Player": "Britta",
"Score": -4,
"Winner": ""
},
{
"Hand": 15,
"Player": "Britta",
"Score": -2,
"Winner": ""
},
{
"Hand": 16,
"Player": "Britta",
"Score": 5,
"Winner": ""
},
{
"Hand": 17,
"Player": "Britta",
"Score": 3,
"Winner": ""
},
{
"Hand": 18,
"Player": "Britta",
"Score": 1,
"Winner": ""
},
{
"Hand": 19,
"Player": "Britta",
"Score": -2,
"Winner": ""
},
{
"Hand": 20,
"Player": "Britta",
"Score": 3,
"Winner": ""
},
{
"Hand": 1,
"Player": "Courtney",
"Score": -20,
"Winner": ""
},
{
"Hand": 2,
"Player": "Courtney",
"Score": -21,
"Winner": ""
},
{
"Hand": 4,
"Player": "Gavin",
"Score": -12,
"Winner": ""
},
{
"Hand": 5,
"Player": "Gavin",
"Score": 13,
"Winner": ""
},
{
"Hand": 6,
"Player": "Gavin",
"Score": -7,
"Winner": ""
},
{
"Hand": 7,
"Player": "Gavin",
"Score": 17,
"Winner": "TRUE"
},
{
"Hand": 8,
"Player": "Gavin",
"Score": 4,
"Winner": ""
},
{
"Hand": 9,
"Player": "Gavin",
"Score": 16,
"Winner": "TRUE"
},
{
"Hand": 10,
"Player": "Gavin",
"Score": 20,
"Winner": ""
},
{
"Hand": 12,
"Player": "Gavin",
"Score": 3,
"Winner": ""
},
{
"Hand": 13,
"Player": "Gavin",
"Score": 21,
"Winner": "TRUE"
},
{
"Hand": 14,
"Player": "Gavin",
"Score": 22,
"Winner": "TRUE"
},
{
"Hand": 15,
"Player": "Gavin",
"Score": 19,
"Winner": "TRUE"
},
{
"Hand": 16,
"Player": "Gavin",
"Score": 5,
"Winner": ""
},
{
"Hand": 17,
"Player": "Gavin",
"Score": 5,
"Winner": ""
},
{
"Hand": 18,
"Player": "Gavin",
"Score": 13,
"Winner": ""
},
{
"Hand": 19,
"Player": "Gavin",
"Score": 20,
"Winner": "TRUE"
},
{
"Hand": 20,
"Player": "Gavin",
"Score": 22,
"Winner": "TRUE"
},
{
"Hand": 1,
"Player": "Rumiah",
"Score": -6,
"Winner": ""
},
{
"Hand": 2,
"Player": "Rumiah",
"Score": -2,
"Winner": ""
},
{
"Hand": 6,
"Player": "Brent B",
"Score": 4,
"Winner": ""
},
{
"Hand": 7,
"Player": "Brent B",
"Score": -9,
"Winner": ""
},
{
"Hand": 8,
"Player": "Brent B",
"Score": -5,
"Winner": ""
},
{
"Hand": 14,
"Player": "Brenty",
"Score": -19,
"Winner": ""
},
{
"Hand": 15,
"Player": "Brenty",
"Score": -2,
"Winner": ""
},
{
"Hand": 16,
"Player": "Brenty",
"Score": -3,
"Winner": ""
},
{
"Hand": 17,
"Player": "Brenty",
"Score": -6,
"Winner": ""
},
{
"Hand": 18,
"Player": "Brenty",
"Score": 2,
"Winner": ""
},
{
"Hand": 19,
"Player": "Brenty",
"Score": 5,
"Winner": ""
},
{
"Hand": 20,
"Player": "Brenty",
"Score": -7,
"Winner": ""
},
{
"Hand": 14,
"Player": "Alissa",
"Score": -5,
"Winner": ""
},
{
"Hand": 15,
"Player": "Alissa",
"Score": -6,
"Winner": ""
},
{
"Hand": 16,
"Player": "Alissa",
"Score": -6,
"Winner": ""
},
{
"Hand": 17,
"Player": "Alissa",
"Score": 3,
"Winner": ""
},
{
"Hand": 18,
"Player": "Alissa",
"Score": 9,
"Winner": ""
},
{
"Hand": 19,
"Player": "Alissa",
"Score": 9,
"Winner": ""
},
{
"Hand": 20,
"Player": "Genny",
"Score": -2,
"Winner": ""
}
]
'use strict'
let playerHands = require('./2014-12-31.json')
// build lookup indices
let handsByPlayer = playerHands.reduce((memo, ph) => {
if(!memo[ph.Player]) memo[ph.Player] = []
memo[ph.Player][ph.Hand] = ph
return memo
}, {})
let playersByHand = playerHands.reduce((memo, ph) => {
if(!memo[ph.Hand]) memo[ph.Hand] = {}
memo[ph.Hand][ph.Player] = ph
return memo
}, [])
// enrich handsByPlayer with opponents
for (const [player, hands] of Object.entries(handsByPlayer)) {
const enrichedHands = hands.map((hand) => {
const filtered = Object.entries(playersByHand[hand.Hand]).filter(([k, v]) => {
return v.Player !== player
})
hand.opponents = Object.fromEntries(filtered)
return hand
})
handsByPlayer[player] = enrichedHands
}
console.log(handsByPlayer)
// enrich handsByPlayer+opponents with pairwise scoring
// summarize pairwise scoring
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment