-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path24.coffee
74 lines (66 loc) · 1.26 KB
/
24.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{_log,test,expect,testAndRun} = require './util'
ansi = require('ansicolor').nice
class Solver
constructor: ( @input )->
@pairs = @input.split('\n').map (v)->
[a,b] = v.split '/'
[a,b,+a + +b]
#_log @pairs
return
permute: (rem, longest, prev='0')->
max = 0
max_len = 0
#max_p = []
for p,i in rem when prev is p[0] or prev is p[1]
next = rem[..]
next.splice i,1
sum = p[2]
sum_len = 1
#sum_p = [p[0..1]]
if next.length
last = if prev is p[0] then p[1] else p[0]
v = @permute next, longest, last
if v[0]
sum += v[0]
sum_len += v[1]
#sum_p = sum_p.concat v[2]
if max<sum and (not longest or max_len<=sum_len)
max=sum
max_len=sum_len
#max_p=sum_p
[max,max_len] #,max_p]
solve1: ->
@permute @pairs
solve2: ->
@permute @pairs, yes
test.solve1 = ->
s = new Solver '''
0/2
2/2
2/3
3/4
3/5
0/1
10/1
9/10
'''
expect.nth(0) 31, s.solve1()
return
test.solve2 = ->
s = new Solver '''
0/2
2/2
2/3
3/4
3/5
0/1
10/1
9/10
'''
expect.nth(0) 19, s.solve2()
return
testAndRun ->
s = new Solver require './input/24.txt'
_log.yellow '1: [sum,length] =', s.solve1()
_log.yellow '2: [sum,length] =', s.solve2()
return