-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolve.a68
70 lines (61 loc) · 1.94 KB
/
solve.a68
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
PR include "read.a68" PR
PROC traverse = (REF NUMBER num, PROC(INT,REF NUMBER)BOOL visit)VOID:
BEGIN
PROC dive into = (INT depth, REF NUMBER num)VOID:
BEGIN
BOOL found = visit(depth, num);
CASE num IN
(REF PAIR sub): IF NOT found THEN
dive into(depth+1, left OF sub);
dive into(depth+1, right OF sub)
FI
ESAC
END;
dive into(0,num)
END;
PROC snailfish reduce = (REF NUMBER data)VOID:
BEGIN
REF NUMBER last regular;
INT add to next regular;
BOOL exploded;
PROC explode = (INT depth, REF NUMBER cell)BOOL:
CASE cell IN (REF PAIR pair):
IF depth >= 4 AND NOT exploded THEN
IF REF NUMBER prev cell = last regular; prev cell ISNT NIL THEN
prev cell := (prev cell | (INT n): n) + (left OF pair | (INT n): n)
FI;
add to next regular := (right OF pair | (INT n): n);
cell := 0;
exploded := TRUE
ELSE FALSE
FI,
(INT n):
BEGIN
cell := n + add to next regular;
last regular := cell;
IF exploded THEN just start again FI
END
ESAC;
PROC split = (INT depth, REF NUMBER cell)BOOL:
(cell | (INT n): IF n >= 10 THEN cell := make pair (n%2, (n+1)%2); just start again FI | FALSE);
just start again:
CO dump(data); print(new line); CO
exploded := FALSE;
last regular := NIL;
add to next regular := 0;
traverse(data, explode);
traverse(data, split)
END;
OP +:= = (REF NUMBER x, NUMBER y)VOID:
snailfish reduce(x := make pair(x,y));
OP ABS = (NUMBER x)INT:
CASE x IN
(INT n): n,
(REF PAIR pair): 3*ABS left OF pair + 2*ABS right OF pair
ESAC;
NUMBER acc := homework[1];
FOR i FROM 2 TO UPB homework DO
acc +:= homework[i]
OD;
dump(acc);
print((ABS acc, new line))