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;
143 struct number
*copy_number(struct number
*n
)
145 struct number
*copy
= malloc(sizeof(struct number
));
146 copy
->number
= n
->number
;
147 copy
->depth
= n
->depth
;
150 struct number
*prev
= copy
;
151 for (struct number
*e
= n
->next
; e
!= NULL
; e
= e
->next
) {
152 struct number
*c
= malloc(sizeof(struct number
));
154 c
->number
= e
->number
;
167 struct number
*numbers
[100] = {0};
168 while ((numbers
[nnumber
] = parse_number()) != NULL
)
171 int maxmagnitude
= 0;
172 for (int i
= 0; i
<nnumber
; i
++) {
173 for (int j
= 0; j
<nnumber
; j
++) {
176 struct number
*e
= copy_number(numbers
[i
]);
177 add_number(e
, copy_number(numbers
[j
]));
179 int magnitude
= magnitude_number(e
);
180 if (magnitude
> maxmagnitude
)
181 maxmagnitude
= magnitude
;
184 printf("%d\n", maxmagnitude
);