22const expect = require ( 'chai' ) . expect
33const {
44 calculateXAfterY,
5+ findPattern,
56 loopRecipesForElves,
67 Recipes,
78 totalDigitsInArray
89} = require ( './recipes' )
910
1011describe ( '--- Day 14: Chocolate Charts ---' , ( ) => {
12+ let recipes
1113 describe ( 'Part 1:' , ( ) => {
14+ beforeEach ( ( ) => {
15+ recipes = new Recipes ( [ 3 , 7 ] )
16+ } )
1217 describe ( 'new Recipes()' , ( ) => {
1318 it ( 'builds a linked list' , ( ) => {
14- const recipes = new Recipes ( 0 )
19+ expect ( recipes . head . value ) . to . equal ( 7 )
1520 for ( let x = 1 ; x <= 5 ; x ++ ) {
1621 recipes . addRecipe ( x )
1722 }
18- expect ( recipes . length ) . to . equal ( 6 )
23+ expect ( recipes . length ) . to . equal ( 7 )
1924 expect ( recipes . head . value ) . to . equal ( 5 )
20- expect ( recipes . tail . value ) . to . equal ( 0 )
25+ expect ( recipes . tail . value ) . to . equal ( 3 )
2126 expect ( recipes . tail . prev ) . to . equal ( recipes . head ) // circular linked list for prev
2227 expect ( recipes . head . next ) . to . equal ( recipes . tail ) // circular linked list for next
2328 } )
2429 describe ( 'scoreRecipes()' , ( ) => {
2530 it ( 'adds new recipes based on the provided score' , ( ) => {
26- const recipes = new Recipes ( 0 )
2731 for ( let x = 1 ; x <= 5 ; x ++ ) {
2832 recipes . addRecipe ( x )
2933 }
@@ -46,95 +50,80 @@ describe('--- Day 14: Chocolate Charts ---', () => {
4650 describe ( 'loopRecipeForEleves()' , ( ) => {
4751 it ( 'loops through the recipe object for the specified elves the specified number of times' , ( ) => {
4852 const expected = '37101012451589167792' // list of recipe values in the last iteration of the example
49- const elves = [ 3 , 7 ]
50- const recipes = new Recipes ( elves [ 0 ] )
51- let actual = ''
5253
53- elves . forEach ( ( elf , idx ) => {
54- if ( idx === 0 ) {
55- elves [ 0 ] = recipes . head
56- } else {
57- elves [ idx ] = recipes . addRecipe ( elf )
58- }
59- } )
54+ loopRecipesForElves ( recipes , 15 )
55+ let actual = recipes . tail . value . toString ( )
56+ let iterator = recipes . tail . next
57+ while ( iterator !== recipes . tail ) {
58+ actual += iterator . value . toString ( )
59+ iterator = iterator . next
60+ }
6061
61- loopRecipesForElves ( elves , recipes , 15 )
62+ expect ( expected ) . to . equal ( actual )
63+ } )
64+ it ( 'handles when the score is multidigit' , ( ) => {
65+ const expected = '3710101245158916'
6266
67+ loopRecipesForElves ( recipes , 10 )
68+ // next should be multidigit
69+ loopRecipesForElves ( recipes , 1 )
70+ let actual = recipes . tail . value . toString ( )
6371 let iterator = recipes . tail . next
64- actual += recipes . tail . value . toString ( )
6572 while ( iterator !== recipes . tail ) {
6673 actual += iterator . value . toString ( )
6774 iterator = iterator . next
6875 }
69-
76+ expect ( recipes . length ) . to . equal ( expected . length )
7077 expect ( expected ) . to . equal ( actual )
7178 } )
7279 } )
73- describe ( 'calculateXAfterY(x, y, recipe, elves )' , ( ) => {
80+ describe ( 'calculateXAfterY(x, y, recipe)' , ( ) => {
7481 it ( 'predicts the next X results after the elves have executed Y' , ( ) => {
75- const elves = [ 3 , 7 ]
76- const recipes = new Recipes ( elves [ 0 ] )
77- let actual = ''
78-
79- elves . forEach ( ( elf , idx ) => {
80- if ( idx === 0 ) {
81- elves [ 0 ] = recipes . head
82- } else {
83- elves [ idx ] = recipes . addRecipe ( elf )
84- }
85- } )
86-
87- actual = calculateXAfterY ( 10 , 9 , recipes , elves )
82+ let actual = calculateXAfterY ( 10 , 9 , recipes )
8883 expect ( actual ) . to . equal ( '5158916779' )
8984 } )
9085 it ( 'predicts the next X results after the elves have executed Y' , ( ) => {
91- const elves = [ 3 , 7 ]
92- const recipes = new Recipes ( elves [ 0 ] )
93- let actual = ''
94-
95- elves . forEach ( ( elf , idx ) => {
96- if ( idx === 0 ) {
97- elves [ 0 ] = recipes . head
98- } else {
99- elves [ idx ] = recipes . addRecipe ( elf )
100- }
101- } )
102-
103- actual = calculateXAfterY ( 10 , 5 , recipes , elves )
86+ const actual = calculateXAfterY ( 10 , 5 , recipes )
10487 expect ( actual ) . to . equal ( '0124515891' )
10588 } )
10689 it ( 'predicts the next X results after the elves have executed Y' , ( ) => {
107- const elves = [ 3 , 7 ]
108- const recipes = new Recipes ( elves [ 0 ] )
109- let actual = ''
110-
111- elves . forEach ( ( elf , idx ) => {
112- if ( idx === 0 ) {
113- elves [ 0 ] = recipes . head
114- } else {
115- elves [ idx ] = recipes . addRecipe ( elf )
116- }
117- } )
118-
119- actual = calculateXAfterY ( 10 , 18 , recipes , elves )
90+ const actual = calculateXAfterY ( 10 , 18 , recipes )
12091 expect ( actual ) . to . equal ( '9251071085' )
12192 } )
12293 it ( 'predicts the next X results after the elves have executed Y' , ( ) => {
123- const elves = [ 3 , 7 ]
124- const recipes = new Recipes ( elves [ 0 ] )
125- let actual = ''
126-
127- elves . forEach ( ( elf , idx ) => {
128- if ( idx === 0 ) {
129- elves [ 0 ] = recipes . head
130- } else {
131- elves [ idx ] = recipes . addRecipe ( elf )
132- }
133- } )
134-
135- actual = calculateXAfterY ( 10 , 2018 , recipes , elves )
94+ const actual = calculateXAfterY ( 10 , 2018 , recipes )
13695 expect ( actual ) . to . equal ( '5941429882' )
13796 } )
97+ it ( 'positions results correctly if X triggers 2 recipes being added' , ( ) => {
98+ let actual = calculateXAfterY ( 3 , 15 , recipes )
99+ expect ( actual ) . to . equal ( '677' )
100+ } )
101+ } )
102+ describe ( 'findPattern()' , ( ) => {
103+ it ( 'counts the number of recipes to the left of the specified pattern' , ( ) => {
104+ const actual = findPattern ( '51589' , recipes )
105+ expect ( actual ) . to . equal ( 9 )
106+ } )
107+ it ( 'counts the number of recipes to the left of the specified pattern' , ( ) => {
108+ const actual = findPattern ( '01245' , recipes )
109+ expect ( actual ) . to . equal ( 5 )
110+ } )
111+ it ( 'counts the number of recipes to the left of the specified pattern' , ( ) => {
112+ const actual = findPattern ( '92510' , recipes )
113+ expect ( actual ) . to . equal ( 18 )
114+ } )
115+ it ( 'counts the number of recipes to the left of the specified pattern' , ( ) => {
116+ const actual = findPattern ( '59414' , recipes )
117+ expect ( actual ) . to . equal ( 2018 )
118+ } )
119+ it ( 'accepts small search buffer sizes' , ( ) => {
120+ const actual = findPattern ( '59414' , recipes , 20 )
121+ expect ( actual ) . to . equal ( 2018 )
122+ } )
123+ it ( 'accepts large search buffer sizes' , ( ) => {
124+ const actual = findPattern ( '59414' , recipes , 50000 )
125+ expect ( actual ) . to . equal ( 2018 )
126+ } )
138127 } )
139128 } )
140129} )
0 commit comments