Skip to content

Instantly share code, notes, and snippets.

@adamgiese
Created July 10, 2018 12:27
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 adamgiese/3203eaec7e12c7ece7e37a92dbc844b6 to your computer and use it in GitHub Desktop.
Save adamgiese/3203eaec7e12c7ece7e37a92dbc844b6 to your computer and use it in GitHub Desktop.
(function() {
const stats = {
wins: 0,
losses: 0,
};
const times = x => f => {
if (x > 0) {
f()
times (x - 1) (f)
}
}
const repeatOften = times(10000)
function simulate() {
const outCard = toRemove => card => {
return toRemove.value !== card.value || toRemove.suit !== card.suit;
}
const toShuffled = () => Math.random() - 0.5;
const suits = [
'Hearts',
'Spades',
'Clubs',
'Diamonds',
];
const values = [
2,
3,
4,
5,
6,
7,
8,
9,
10,
11, // jack
12, // queen
13, // king
14, // ace
];
let deck = values.reduce((acc, value) => {
return [
...acc,
...suits.map(suit => ({
value,
suit,
}))
];
}, []).sort(toShuffled);
const andrewsCard = {
value: 9,
suit: 'Hearts',
};
const trumpCard = {
value: 2,
suit: 'Clubs',
};
deck = deck.filter(outCard(andrewsCard));
deck = deck.filter(outCard(trumpCard));
const numberOfOpponents = 5;
const opponentCards = deck.slice(0, numberOfOpponents);
const toWinningCardWith = ({trump, led}) => (currentWinner, card, index) => {
if (card.suit !== trump && card.suit !== led) { // ineligible to win
return currentWinner;
}
if (card.suit === led) {
if (currentWinner.suit === trump) {
return currentWinner;
}
if (currentWinner.suit === led) {
return currentWinner.value >= card.value ? currentWinner : card;
}
}
if (card.suit === trump) {
if (currentWinner.suit === trump) {
return currentWinner.value >= card.value ? currentWinner : card;
} else {
return card;
}
}
}
const winningCard = [...opponentCards, andrewsCard]
.reduce(toWinningCardWith({
trump: trumpCard.suit,
led: opponentCards[0].suit,
}));
const andrewLost = opponentCards.some(card => winningCard.suit === card.suit && winningCard.value === card.value);
if (andrewLost) {
stats.losses++;
} else {
stats.wins++;
}
}
repeatOften(simulate);
console.log(`Win Percentage: ${stats.wins / (stats.wins + stats.losses) * 100}%`);
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment