|
1 | 1 | /* eslint-env mocha */
|
2 | 2 | const { expect } = require('chai')
|
3 |
| -const { school, ageFish, spawn } = require('./fish') |
| 3 | +const { school, ageFish, spawn, efficientSchool, efficientSpawn } = require('./fish') |
4 | 4 |
|
5 | 5 | describe('--- Day 6: Lanternfish ---', () => {
|
6 | 6 | describe('Part 1', () => {
|
@@ -71,7 +71,70 @@ describe('--- Day 6: Lanternfish ---', () => {
|
71 | 71 | expect(school.state).to.deep.equal([0, 1, 0, 5, 6, 0, 1, 2, 2, 3, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 7, 8])
|
72 | 72 | school.advance()
|
73 | 73 | expect(school.state).to.deep.equal([6, 0, 6, 4, 5, 6, 0, 1, 1, 2, 6, 0, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 8, 8, 8])
|
74 |
| - school.advance() |
| 74 | + }) |
| 75 | + }) |
| 76 | + }) |
| 77 | + describe('Part 2', () => { |
| 78 | + beforeEach(() => { |
| 79 | + // ensure flushed state |
| 80 | + efficientSchool.state = [3, 4, 3, 1, 2] |
| 81 | + expect(efficientSchool.state).to.deep.equal([0, 1, 1, 2, 1, 0, 0, 0, 0]) |
| 82 | + }) |
| 83 | + describe('efficientSpawn()', () => { |
| 84 | + it('efficiently adds new fish to the school', () => { |
| 85 | + efficientSpawn(4) |
| 86 | + expect(efficientSchool.state).to.deep.equal([0, 1, 1, 2, 1, 0, 0, 0, 4]) |
| 87 | + }) |
| 88 | + }) |
| 89 | + describe('efficientAdvance', () => { |
| 90 | + it('advances one day following the same pattern without tracking unique position', () => { |
| 91 | + const sum = (x, y) => x + y |
| 92 | + efficientSchool.state = [3, 4, 3, 1, 2] |
| 93 | + |
| 94 | + efficientSchool.advance() |
| 95 | + expect(efficientSchool.state.reduce(sum)).to.equal([2, 3, 2, 0, 1].length) |
| 96 | + efficientSchool.advance() |
| 97 | + expect(efficientSchool.state.reduce(sum)).to.equal([1, 2, 1, 6, 0, 8].length) |
| 98 | + efficientSchool.advance() |
| 99 | + expect(efficientSchool.state.reduce(sum)).to.equal([0, 1, 0, 5, 6, 7, 8].length) |
| 100 | + efficientSchool.advance() |
| 101 | + expect(efficientSchool.state.reduce(sum)).to.equal([6, 0, 6, 4, 5, 6, 7, 8, 8].length) |
| 102 | + efficientSchool.advance() |
| 103 | + expect(efficientSchool.state.reduce(sum)).to.equal([5, 6, 5, 3, 4, 5, 6, 7, 7, 8].length) |
| 104 | + efficientSchool.advance() |
| 105 | + expect(efficientSchool.state.reduce(sum)).to.equal([4, 5, 4, 2, 3, 4, 5, 6, 6, 7].length) |
| 106 | + efficientSchool.advance() |
| 107 | + expect(efficientSchool.state.reduce(sum)).to.equal([3, 4, 3, 1, 2, 3, 4, 5, 5, 6].length) |
| 108 | + efficientSchool.advance() |
| 109 | + expect(efficientSchool.state.reduce(sum)).to.equal([2, 3, 2, 0, 1, 2, 3, 4, 4, 5].length) |
| 110 | + efficientSchool.advance() |
| 111 | + expect(efficientSchool.state.reduce(sum)).to.equal([1, 2, 1, 6, 0, 1, 2, 3, 3, 4, 8].length) |
| 112 | + efficientSchool.advance() |
| 113 | + expect(efficientSchool.state.reduce(sum)).to.equal([0, 1, 0, 5, 6, 0, 1, 2, 2, 3, 7, 8].length) |
| 114 | + efficientSchool.advance() |
| 115 | + expect(efficientSchool.state.reduce(sum)).to.equal([6, 0, 6, 4, 5, 6, 0, 1, 1, 2, 6, 7, 8, 8, 8].length) |
| 116 | + efficientSchool.advance() |
| 117 | + expect(efficientSchool.state.reduce(sum)).to.equal([5, 6, 5, 3, 4, 5, 6, 0, 0, 1, 5, 6, 7, 7, 7, 8, 8].length) |
| 118 | + efficientSchool.advance() |
| 119 | + expect(efficientSchool.state.reduce(sum)).to.equal([4, 5, 4, 2, 3, 4, 5, 6, 6, 0, 4, 5, 6, 6, 6, 7, 7, 8, 8].length) |
| 120 | + efficientSchool.advance() |
| 121 | + expect(efficientSchool.state.reduce(sum)).to.equal([3, 4, 3, 1, 2, 3, 4, 5, 5, 6, 3, 4, 5, 5, 5, 6, 6, 7, 7, 8].length) |
| 122 | + efficientSchool.advance() |
| 123 | + expect(efficientSchool.state.reduce(sum)).to.equal([2, 3, 2, 0, 1, 2, 3, 4, 4, 5, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7].length) |
| 124 | + efficientSchool.advance() |
| 125 | + expect(efficientSchool.state.reduce(sum)).to.equal([1, 2, 1, 6, 0, 1, 2, 3, 3, 4, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 8].length) |
| 126 | + efficientSchool.advance() |
| 127 | + expect(efficientSchool.state.reduce(sum)).to.equal([0, 1, 0, 5, 6, 0, 1, 2, 2, 3, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 7, 8].length) |
| 128 | + efficientSchool.advance() |
| 129 | + expect(efficientSchool.state.reduce(sum)).to.equal([6, 0, 6, 4, 5, 6, 0, 1, 1, 2, 6, 0, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 8, 8, 8].length) |
| 130 | + }) |
| 131 | + it('advances efficiently for a large number of days', () => { |
| 132 | + efficientSchool.state = [3, 4, 3, 1, 2] |
| 133 | + for (let d = 1; d <= 256; d++) { |
| 134 | + efficientSchool.advance() |
| 135 | + } |
| 136 | + const sum = (x, y) => x + y |
| 137 | + efficientSchool.state.reduce(sum) |
75 | 138 | })
|
76 | 139 | })
|
77 | 140 | })
|
|
0 commit comments