|
| 1 | +/* eslint-env mocha */ |
| 2 | +const { expect } = require('chai') |
| 3 | +const { descrambleSignal, decodeSignal, parseEntry } = require('./display') |
| 4 | + |
| 5 | +const testSingle = 'acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf' |
| 6 | + |
| 7 | +const testMultiple = `be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe |
| 8 | +edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc |
| 9 | +fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg |
| 10 | +fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb |
| 11 | +aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea |
| 12 | +fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb |
| 13 | +dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe |
| 14 | +bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef |
| 15 | +egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb |
| 16 | +gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce`.split('\n') |
| 17 | + |
| 18 | +describe('--- Day 8: Seven Segment Search ---', () => { |
| 19 | + describe('Part 1', () => { |
| 20 | + describe('descrambleSignal()', () => { |
| 21 | + const testData = testSingle.split('|')[0].trim() |
| 22 | + const { segmentCodes, charCodes } = descrambleSignal(testData) |
| 23 | + |
| 24 | + it('takes scambled string of 10 codes and identifies the letters matching each seven-digit-display segment', () => { |
| 25 | + expect(segmentCodes.length).to.equal(7) |
| 26 | + expect(segmentCodes.filter((code) => !['a', 'b', 'c', 'd', 'e', 'f', 'g'].includes(code)).length).to.equal(0) |
| 27 | + }) |
| 28 | + |
| 29 | + it('produces a list of character codes for each number that can be displayed', () => { |
| 30 | + // There should be exactly 10 numbers |
| 31 | + expect(charCodes.length).to.equal(10) |
| 32 | + // lengths of each code is predictable as each number has a specific count of segments |
| 33 | + const expectedLengths = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6] |
| 34 | + expect(charCodes.map(code => code.length)).to.deep.equal(expectedLengths) |
| 35 | + }) |
| 36 | + }) |
| 37 | + describe('decodeSignal()', () => { |
| 38 | + const testData = testMultiple[0].split('|').map((a) => a.trim()) |
| 39 | + const { charCodes } = descrambleSignal(testData[0]) |
| 40 | + |
| 41 | + it('decodes a display pattern using the provided map of display codes', () => { |
| 42 | + const result = decodeSignal(charCodes, testData[1]) |
| 43 | + expect(result[0]).to.equal(8) |
| 44 | + expect(result[3]).to.equal(4) |
| 45 | + }) |
| 46 | + it('throws an error if a digit doesn`t have a matching code', () => { |
| 47 | + expect( |
| 48 | + () => decodeSignal( |
| 49 | + [['a']], |
| 50 | + 'dcb' |
| 51 | + ) |
| 52 | + ).to.throw( |
| 53 | + 'No match found for dcb when cleaned up to b,c,d' |
| 54 | + ) |
| 55 | + }) |
| 56 | + it('throws an error if a digit has multiple matches (meaning a bad codes map)', () => { |
| 57 | + expect( |
| 58 | + () => decodeSignal( |
| 59 | + [['a'], ['d', 'c', 'b'], ['b', 'c', 'd']], |
| 60 | + 'dcb' |
| 61 | + ) |
| 62 | + ).to.throw( |
| 63 | + 'Too many matches for dcb when cleaned up to b,c,d. This most likely indicates a bad list of character codes.' |
| 64 | + ) |
| 65 | + }) |
| 66 | + }) |
| 67 | + }) |
| 68 | + describe('Part 2', () => { |
| 69 | + describe('parseEntry()', () => { |
| 70 | + it('parses a set of scrambled codes and signal to produce a number for display', () => { |
| 71 | + expect( |
| 72 | + parseEntry( |
| 73 | + testSingle.split('|').map((x) => x.trim()) |
| 74 | + ) |
| 75 | + ).to.equal(5353) |
| 76 | + |
| 77 | + const testData = testMultiple.map( |
| 78 | + (entry) => entry.split('|') |
| 79 | + .map((x) => x.trim()) |
| 80 | + ).map(parseEntry) |
| 81 | + |
| 82 | + expect(testData.reduce((a, b) => a + b)).to.equal(61229) |
| 83 | + }) |
| 84 | + }) |
| 85 | + }) |
| 86 | +}) |
0 commit comments