@@ -9,6 +9,7 @@ test('solves jump list', t => {
99
1010test ( 'solves jump list - with zero as value' , t => {
1111 t . is ( solve ( [ 2 , 3 , 1 , 0 , 4 ] ) , 2 )
12+ t . is ( solve ( [ 1 , 2 , 0 , 1 ] ) , 2 ) // 60th test case
1213} )
1314
1415test ( 'solves jump list - empty list' , t => {
@@ -25,27 +26,81 @@ test('solves jump list - two items', t => {
2526 t . is ( solve ( [ 2 , 1 ] ) , 1 )
2627} )
2728
29+ test ( 'multiple ones' , t => {
30+ t . is ( solve ( [ 1 , 2 , 1 , 1 , 1 ] ) , 3 ) // 65th test case
31+ } )
32+
2833test ( 'solves jump list - large list' , t => {
2934 const size = 50000
3035 t . is ( solve ( new Array ( size ) . fill ( 1 ) ) , size - 1 )
3136} )
3237
33- test . skip ( 'solves jump list - large descending list' , t => {
38+ test ( 'solves jump list - large descending list' , t => {
3439 const size = 25000
3540 const input = new Array ( size ) . fill ( 1 ) . map ( ( _ , idx ) => size - idx )
3641 t . is ( solve ( input ) , 1 )
3742} )
3843
39- test . skip ( 'solves jump list - large descending list twice' , t => {
44+ test ( 'solves jump list - large descending list twice' , t => {
4045 const size = 25000
4146 const list = new Array ( size ) . fill ( 1 ) . map ( ( _ , idx ) => size - idx )
4247 t . is ( solve ( list . concat ( list ) ) , 2 )
4348} )
4449
50+ test ( 'solves jump list - value greater than prev' , t => {
51+ t . is ( solve ( [ 4 , 3 , 1 ] ) , 1 )
52+ t . is ( solve ( [ 4 , 1 , 3 , 1 ] ) , 1 )
53+ } )
54+
55+ test ( 'solves jump list - value less than prev' , t => {
56+ t . is ( solve ( [ 2 , 4 , 2 ] ) , 1 )
57+ t . is ( solve ( [ 4 , 5 , 2 , 4 , 2 ] ) , 1 )
58+ } )
59+
4560const solve = ( jumps ) =>
46- solveI ( jumps )
61+ solveI2 ( jumps )
62+ // solveI(jumps)
4763 // solveR(jumps)[0]
4864
65+ const solveI2 = ( jumps ) => {
66+ const len = jumps . length
67+ if ( len <= 1 ) {
68+ return 0
69+ }
70+
71+ const map = new Array ( jumps . length ) . fill ( 0 ) . map ( ( _ , idx ) => ( [ Infinity , idx ] ) )
72+ map [ len - 1 ] = [ 0 , 0 ]
73+
74+ for ( let idx = len - 2 ; idx >= 0 ; idx -- ) {
75+ const curJumps = jumps [ idx ]
76+
77+ // deadend - leave as infinity
78+ if ( curJumps === 0 ) {
79+ map [ idx ] = [ Infinity , 0 ]
80+ continue
81+ }
82+
83+ const [ prevC , prevUsed ] = map [ idx + 1 ]
84+ let [ bestC , bestUsed ] = [ prevC + 1 , 1 ] // zero case to be handled later
85+ const diff = curJumps - prevUsed
86+ const prevEnd = idx + prevUsed + 1
87+
88+ if ( diff > 0 ) {
89+ for ( let pos = prevEnd ; pos < Math . min ( prevEnd + diff , len ) ; pos ++ ) {
90+ const [ candidateC ] = map [ pos ]
91+ if ( candidateC + 1 < bestC ) {
92+ bestC = candidateC + 1
93+ bestUsed = pos - idx
94+ }
95+ }
96+ }
97+
98+ map [ idx ] = [ bestC , bestUsed ]
99+ }
100+
101+ return map [ 0 ] [ 0 ]
102+ }
103+
49104const solveI = ( jumps ) => {
50105 const len = jumps . length
51106 if ( len <= 1 ) {
0 commit comments