13 void print_number(struct number
*head
)
15 for (struct number
*e
= head
; e
!= NULL
; e
= e
->next
)
16 printf("(%d,%d) ", e
->number
, e
->depth
);
20 struct number
*parse_comp(struct number
*prev
, int *depth
)
24 struct number
*r
= malloc(sizeof(struct number
));
32 } else if (c
== ',') {
33 return parse_comp(prev
, depth
);
34 } else if (c
== '[') {
36 return parse_comp(prev
, depth
);
37 } else if (c
== ']') {
39 return parse_comp(prev
, depth
);
40 } else if (c
!= '\n' && c
!= EOF
) {
41 printf("unknown character: '%c': %d\n", c
, c
);
46 struct number
*parse_number()
49 struct number
*head
= parse_comp(NULL
, &depth
);
52 struct number
*e
= head
;
53 while ((e
= parse_comp(e
, &depth
)) != NULL
)
58 void add_number(struct number
*sum
, struct number
*oper
)
60 //increase depth of sum
61 struct number
*e
= sum
;
62 for (; e
->next
!= NULL
; e
= e
->next
)
67 //increase depth of oper
68 for (; e
!= NULL
; e
= e
->next
)
72 bool explode_number(struct number
*e
)
77 struct number
*r
= e
->next
;
79 l
->prev
->number
+= l
->number
;
81 r
->next
->number
+= r
->number
;
93 bool split_number(struct number
*e
)
97 struct number
*i
= malloc(sizeof(struct number
));
98 i
->number
= e
->number
/2 + (e
->number
%2);
99 i
->depth
= e
->depth
+1;
103 e
->number
= e
->number
/2;
104 e
->depth
= e
->depth
+1;
108 void reduce_number(struct number
*n
)
112 appliedaction
= false;
113 for (struct number
*e
= n
; e
!= NULL
&& !appliedaction
; e
= e
->next
)
114 appliedaction
|= explode_number(e
);
115 for (struct number
*e
= n
; e
!= NULL
&& !appliedaction
; e
= e
->next
)
116 appliedaction
|= split_number(e
);
117 } while (appliedaction
);
120 int magnitude_number(struct number
*n
)
123 while (n
->next
!= NULL
) {
124 for (struct number
*e
= n
; e
!= NULL
; e
= e
->next
) {
125 if (e
->depth
== maxdepth
) {
126 struct number
*l
= e
;
127 struct number
*r
= e
->next
;
129 l
->number
= l
->number
*3 + r
->number
*2;
145 struct number
*sum
= parse_number();
147 while ((oper
= parse_number()) != NULL
) {
148 add_number(sum
, oper
);
151 printf("%d\n", magnitude_number(sum
));