diff --git a/2023/day07/example.txt b/2023/day07/example.txt index e552ff3..bf2815e 100644 --- a/2023/day07/example.txt +++ b/2023/day07/example.txt @@ -2,8 +2,4 @@ T55J5 684 KK677 28 KTJJT 220 -QQQJA 483 -33332 100 -2AAAA 100 -77888 100 -77788 100 \ No newline at end of file +QQQJA 483 \ No newline at end of file diff --git a/2023/day07/index.js b/2023/day07/index.js index af0662e..a3a0aab 100644 --- a/2023/day07/index.js +++ b/2023/day07/index.js @@ -14,13 +14,14 @@ import fs from 'node:fs' */ function init() { - const data = fs.readFileSync('example.txt', { encoding: 'utf-8' }, data => data) + const data = fs.readFileSync('input.txt', { encoding: 'utf-8' }, data => data) const games = data.split('\n') const poker = new Poker() for (let game of games) { poker.hand = game.split(' ')[0].split('') poker.bid = parseInt(game.split(' ')[1]) + poker.jokerrule = true poker.play() } poker.score() @@ -32,20 +33,22 @@ class Poker { this.ranking = [] this.bid = 0 this.results = 0 + this.jokerrule = true this.order = [ - { name: 'A', value: 13 }, - { name: 'K', value: 12 }, - { name: 'Q', value: 11 }, - { name: 'J', value: 10 }, - { name: 'T', value: 9 }, - { name: '9', value: 8 }, { name: '8', value: 7 }, { name: '7', value: 6 }, { name: '6', value: 5 }, { name: '5', value: 4 }, { name: '4', value: 3 }, - { name: '3', value: 2 }, { name: '2', value: 1 } + { name: 'A', value: 14 }, + { name: 'K', value: 13 }, + { name: 'Q', value: 12 }, + { name: 'J', value: this.jokerrule ? 1 : 11 }, + { name: 'T', value: 10 }, + { name: '9', value: 9 }, { name: '8', value: 8 }, { name: '7', value: 7 }, { name: '6', value: 6 }, { name: '5', value: 5 }, { name: '4', value: 4 }, + { name: '3', value: 3 }, { name: '2', value: 2 } ] } getOccurences() { + let j = this.jokerrule ? this.hasJokers() : 0 return this.hand.reduce((acc, curr) => { - return acc[`${curr}`] ? ++acc[curr] : acc[`${curr}`] = 1, acc + return acc[`${curr}`] ? ++acc[curr] : acc[`${curr}`] = j + 1, acc }, new Object()) } @@ -67,6 +70,14 @@ class Poker { const result = this.getOccurences() return Object.values(result).indexOf(number) > -1 } + + hasJokers() { + const result = this.hand.reduce((acc, curr) => { + return acc[`${curr}`] ? ++acc[curr] : acc[`${curr}`] = 1, acc + }, new Object()) + return result.hasOwnProperty('J') ? result.J : 0 + } + testResults() { return { 'FiveOfAKind': this.hasMultiple(5), @@ -74,7 +85,8 @@ class Poker { 'FullHouse': this.isFullHouse(), 'ThreeOfAKind': this.hasMultiple(3), 'TwoPair': this.isTwoPair(), - 'OnePair': this.hasMultiple(2) + 'OnePair': this.hasMultiple(2), + 'HasJokers': this.hasJokers() } } rank() { @@ -82,26 +94,26 @@ class Poker { const results = this.testResults() let rank = 0 switch (true) { - case results.FiveOfAKind: - rank = 1_000_000_000_000 - return rank + case results.FiveOfAKind || results.HasJokers === 5: + rank = 7_000_000_000_000 + break case results.FourOfAKind: - rank = 900_000_000_000 - return rank + rank = 6_000_000_000_000 + break case results.FullHouse: - rank = 800_000_000_000 - return rank + rank = 5_000_000_000_000 + break case results.ThreeOfAKind: - rank = 700_000_000_000 - return rank + rank = 4_000_000_000_000 + break case results.TwoPair: - rank = 600_000_000_000 - return rank + rank = 3_000_000_000_000 + break case results.OnePair: - rank = 500_000_000_000 - return rank + rank = 2_000_000_000_000 + break default: - rank = 400_000_000_000 + rank = 1_000_000_000_000 break } return rank @@ -111,11 +123,9 @@ class Poker { const sorted_list = this.ranking.sort((a, b) => a.rank - b.rank) for (let i = 0; i < sorted_list.length; i++) { this.results += (i + 1) * sorted_list[i].bid - console.log(sorted_list[i].cards, `${i + 1} * ${sorted_list[i].bid} = ${(i + 1) * sorted_list[i].bid}`) + console.log(sorted_list[i]) } - console.log(sorted_list.length) console.log(this.results) - } play() { let rank = this.rank() @@ -134,7 +144,7 @@ class Poker { let stringValues = cardValues.map(value => String(value).padStart(2, 0)) rank += parseInt(stringValues.join("")) - this.ranking.push({ rank: rank, bid: this.bid, cards: this.hand.join("") }) + this.ranking.push({ rank: rank, bid: this.bid, cards: this.hand.join(""), jokers: this.hasJokers() }) } rankPosition(position, iterator) {