|
| 1 | +fn max_speed(functions []fn (int) int, g fn (int) int, end_time int) int { |
| 2 | + mut s := [0] |
| 3 | + mut gears := []int{len: end_time, init: 0} |
| 4 | + |
| 5 | + for t in 0 .. end_time { |
| 6 | + stay_in_gear_speed := if t - 1 >= 0 { functions[gears[t - 1]](s[t - 1]) } else { 0 } |
| 7 | + shift_gear_speed := if t - 2 >= 0 { functions[gears[t - 2] + 1](g(s[t - 2])) } else { 0 } |
| 8 | + if stay_in_gear_speed > shift_gear_speed { |
| 9 | + gears[t] = if t - 1 >= 0 { gears[t - 1] } else { 0 } |
| 10 | + s << stay_in_gear_speed |
| 11 | + } else { |
| 12 | + gears[t] = if t - 2 >= 0 { gears[t - 2] } else { 0 } + 1 |
| 13 | + s << shift_gear_speed |
| 14 | + } |
| 15 | + } |
| 16 | + return s[end_time] |
| 17 | +} |
| 18 | + |
| 19 | +@[direct_array_access] |
| 20 | +fn max_speed_direct_access(functions []fn (int) int, g fn (int) int, end_time int) int { |
| 21 | + mut s := [0] |
| 22 | + mut gears := []int{len: end_time, init: 0} |
| 23 | + |
| 24 | + for t in 0 .. end_time { |
| 25 | + stay_in_gear_speed := if t - 1 >= 0 { functions[gears[t - 1]](s[t - 1]) } else { 0 } |
| 26 | + shift_gear_speed := if t - 2 >= 0 { functions[gears[t - 2] + 1](g(s[t - 2])) } else { 0 } |
| 27 | + if stay_in_gear_speed > shift_gear_speed { |
| 28 | + gears[t] = if t - 1 >= 0 { gears[t - 1] } else { 0 } |
| 29 | + s << stay_in_gear_speed |
| 30 | + } else { |
| 31 | + gears[t] = if t - 2 >= 0 { gears[t - 2] } else { 0 } + 1 |
| 32 | + s << shift_gear_speed |
| 33 | + } |
| 34 | + } |
| 35 | + return s[end_time] |
| 36 | +} |
| 37 | + |
| 38 | +fn first_gear(speed int) int { |
| 39 | + return speed + 1 |
| 40 | +} |
| 41 | + |
| 42 | +fn second_gear(speed int) int { |
| 43 | + return speed + 1 |
| 44 | +} |
| 45 | + |
| 46 | +fn third_gear(speed int) int { |
| 47 | + return speed + 1 |
| 48 | +} |
| 49 | + |
| 50 | +fn decelerate(speed int) int { |
| 51 | + return speed - 3 |
| 52 | +} |
| 53 | + |
| 54 | +fn test_array_of_fns_index_call_with_embeded_array_call() { |
| 55 | + funcs := [first_gear, second_gear, third_gear] |
| 56 | + |
| 57 | + speed1 := max_speed(funcs, decelerate, 3) |
| 58 | + println(speed1) |
| 59 | + assert speed1 == 1 |
| 60 | + |
| 61 | + speed2 := max_speed_direct_access(funcs, decelerate, 3) |
| 62 | + println(speed2) |
| 63 | + assert speed2 == 1 |
| 64 | +} |
0 commit comments