summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Douillet <vincent@vdouillet.fr>2022-12-02 17:52:41 +0100
committerVincent Douillet <vincent@vdouillet.fr>2022-12-02 17:52:41 +0100
commitbe3abab7de115e3093a2d085275d0f8d8b1ba42d (patch)
treed14df0266b2af82f016fc9953d1586f153916b83
parent076d2ca0e0c2f0308373628272a3972241575653 (diff)
day 2
-rw-r--r--02.c165
-rw-r--r--Makefile5
-rw-r--r--input.h2
-rw-r--r--input/02.txt2500
4 files changed, 2671 insertions, 1 deletions
diff --git a/02.c b/02.c
new file mode 100644
index 0000000..8ca0423
--- /dev/null
+++ b/02.c
@@ -0,0 +1,165 @@
+#include "input.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <err.h>
+
+#define INPUT "input/02.txt"
+#define EXPECTED1 13221L
+#define EXPECTED2 13131L
+
+enum draw {
+ rock = 1,
+ paper = 2,
+ scissors = 3,
+};
+
+struct round_p1 {
+ enum draw opponent;
+ enum draw me;
+};
+
+int compute_round_score_p1(struct round_p1* round) {
+ int score = (int) round->me;
+ enum draw opponent = round->opponent;
+ enum draw me = round->me;
+ if((opponent == rock && me == paper) || (opponent == paper && me == scissors) || (opponent == scissors && me == rock))
+ score += 6; // win
+ else if(opponent == me)
+ score += 3; // draw
+ // loss is 0
+ return score;
+}
+
+void parse_round_p1(struct round_p1* round, char* round_str) {
+ switch(round_str[0]) {
+ case 'A':
+ round->opponent = rock;
+ break;
+ case 'B':
+ round->opponent = paper;
+ break;
+ case 'C':
+ round->opponent = scissors;
+ break;
+ default:
+ err(2, "unknown opponent choice %c", round_str[0]);
+ }
+ switch(round_str[2]) {
+ case 'X':
+ round->me = rock;
+ break;
+ case 'Y':
+ round->me = paper;
+ break;
+ case 'Z':
+ round->me = scissors;
+ break;
+ default:
+ err(2, "unknown me choice %c", round_str[2]);
+ }
+}
+
+void part1(struct input_str* input) {
+ // compute max calories
+ long score = 0;
+ struct round_p1 r;
+ for(size_t i = 0; i < input->line_count; i++) {
+ parse_round_p1(&r, input->lines[i]);
+ int round_score = compute_round_score_p1(&r);
+ score += round_score;
+ }
+
+ CHECK(score, EXPECTED1)
+}
+
+enum round_result {
+ loss = 0,
+ draw = 3,
+ win = 6,
+};
+
+struct round_p2 {
+ enum draw opponent;
+ enum round_result result;
+};
+
+int compute_round_score_p2(struct round_p2* round) {
+ enum draw opponent = round->opponent;
+ enum round_result result = round->result;
+ enum draw me;
+ switch(result) {
+ case loss:
+ if(opponent == rock)
+ me = scissors;
+ else
+ me = (enum draw) ((int) opponent - 1);
+ break;
+ case draw:
+ me = opponent;
+ break;
+ case win:
+ if(opponent == scissors)
+ me = rock;
+ else
+ me = (enum draw) ((int) opponent + 1);
+ break;
+ }
+ return (int) me + (int) result;
+}
+
+void parse_round_p2(struct round_p2* round, char* round_str) {
+ switch(round_str[0]) {
+ case 'A':
+ round->opponent = rock;
+ break;
+ case 'B':
+ round->opponent = paper;
+ break;
+ case 'C':
+ round->opponent = scissors;
+ break;
+ default:
+ err(2, "unknown opponent choice %c", round_str[0]);
+ }
+ switch(round_str[2]) {
+ case 'X':
+ round->result = loss;
+ break;
+ case 'Y':
+ round->result = draw;
+ break;
+ case 'Z':
+ round->result = win;
+ break;
+ default:
+ err(2, "unknown expected result %c", round_str[2]);
+ }
+}
+
+void part2(struct input_str* input) {
+ // compute max calories
+ long score = 0;
+ struct round_p2 r;
+ for(size_t i = 0; i < input->line_count; i++) {
+ parse_round_p2(&r, input->lines[i]);
+ int round_score = compute_round_score_p2(&r);
+ score += round_score;
+ }
+
+ CHECK(score, EXPECTED2)
+}
+
+int main() {
+ // read input
+ struct input_str input;
+ input_str_read(&input, INPUT);
+
+ // do stuff
+ part1(&input);
+ part2(&input);
+
+ // cleanup & exit
+ input_str_free(&input);
+ return 0;
+}
diff --git a/Makefile b/Makefile
index e639fbc..b42f264 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CC=cc
CFLAGS=-std=c1x -W -Wall -g -D_GNU_SOURCE
LDFLAGS=
-EXEC=01 01bis
+EXEC=01 01bis 02
all: $(EXEC)
@@ -14,5 +14,8 @@ all: $(EXEC)
01bis: input.o 01bis.o
$(CC) -o $@ $^ $(LDFLAGS)
+02: input.o 02.o
+ $(CC) -o $@ $^ $(LDFLAGS)
+
clean:
rm -rf *.o $(EXEC)
diff --git a/input.h b/input.h
index f7593ce..21f388c 100644
--- a/input.h
+++ b/input.h
@@ -1,6 +1,8 @@
#ifndef DEF_INPUTH
#define DEF_INPUTH
+#include <stddef.h>
+
/* simple macro to check a result against an expected value */
#define CHECK(actual, expected) {\
if(actual == expected)\
diff --git a/input/02.txt b/input/02.txt
new file mode 100644
index 0000000..6db9d93
--- /dev/null
+++ b/input/02.txt
@@ -0,0 +1,2500 @@
+C X
+B Y
+C Z
+C Z
+B X
+C Z
+C Z
+C Z
+B X
+B Y
+B Z
+B Z
+B Z
+C X
+C Y
+B Y
+C Z
+C Y
+C X
+B Y
+C Y
+C Z
+A Y
+B Y
+C X
+C X
+C Y
+B Y
+B X
+C Z
+B Y
+B Z
+C Y
+A X
+B Y
+B X
+B Y
+B X
+C Z
+B Y
+C Y
+A Z
+B Y
+C Z
+A Z
+B Y
+B Y
+B Y
+C Y
+B Y
+A X
+C Z
+C X
+C Z
+A Y
+C X
+C Z
+C Y
+C Y
+A Y
+C Z
+B Y
+B Z
+A X
+C Z
+B Y
+C X
+B X
+C Z
+C Z
+B Y
+C Z
+A Z
+C X
+C Y
+B X
+C X
+C Z
+B Z
+B Z
+B Z
+B Y
+A X
+B Y
+C Y
+B Z
+B Y
+C Y
+C X
+B Z
+C X
+B Y
+A Y
+B X
+C Z
+A Z
+C Y
+C Y
+A Z
+B Z
+B Z
+C Z
+B X
+B X
+C Y
+C Z
+B X
+B X
+A Z
+C X
+C Z
+A Y
+B Z
+B Y
+B Y
+C Z
+C X
+B Z
+A X
+B Y
+B Z
+B Z
+A Z
+A Y
+B X
+B Y
+A X
+C Y
+B Y
+B Y
+B Y
+B Y
+B X
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+A X
+C Z
+C X
+B Z
+C X
+A Z
+A Y
+B Z
+A Y
+A X
+B Y
+A Z
+C Z
+C Z
+B X
+C Z
+A Y
+C Z
+B Y
+C Z
+C X
+A Z
+B Y
+B Y
+C X
+A Z
+C Z
+B X
+B Y
+C X
+B X
+B X
+B Z
+B Y
+A Z
+C Z
+B X
+B Y
+B Z
+B Z
+C Z
+C Z
+C Y
+A Z
+A Z
+C Y
+B Y
+B Y
+B Y
+B Y
+B Z
+C X
+B Y
+A Y
+C X
+A Z
+A Z
+A Z
+C X
+B Y
+B Z
+B Z
+C Z
+B Z
+C X
+A X
+A Z
+B Z
+C X
+C Z
+C Y
+C Z
+B Y
+B X
+C Z
+A Y
+B X
+A X
+B Z
+C Y
+B Y
+B Y
+B Y
+B X
+B Y
+C X
+C Z
+B Y
+C X
+C Z
+C X
+C Z
+B Z
+B Z
+B Z
+A X
+B Y
+C Z
+C Z
+B Y
+C X
+A X
+A Z
+B Z
+B X
+C X
+A X
+B Y
+B Y
+C Y
+B Z
+B X
+A Z
+C Y
+B Y
+C X
+B Y
+C X
+B Z
+A X
+A Y
+C X
+A X
+C Y
+B Y
+B Y
+A Y
+C Z
+B Y
+C X
+B Y
+C X
+C Z
+C X
+C Z
+C Y
+B Z
+B Z
+A Z
+C X
+B X
+C Z
+C Y
+B Y
+B Z
+B Z
+B Y
+C Z
+B Z
+B X
+C Z
+C Z
+C Z
+B Y
+C X
+C Y
+B Z
+B Y
+A Y
+C X
+B Z
+A Z
+B Y
+B Y
+C X
+C Y
+C Z
+C X
+C X
+C X
+C Z
+A Z
+A Z
+C X
+C Z
+C Y
+C Y
+C Z
+C Z
+C Z
+C X
+B X
+B Y
+B X
+C Y
+C Y
+B Y
+C Z
+C X
+B Y
+C X
+B Z
+B Y
+B Z
+B X
+B X
+C X
+C Z
+C X
+C X
+C Z
+C Z
+B Y
+C X
+B Y
+C Y
+C Z
+B Z
+B Y
+C X
+C X
+A X
+C Z
+C Y
+B Z
+B Z
+B Y
+C Z
+C Z
+B Y
+B Z
+A Y
+C X
+A Z
+C Y
+C X
+B Y
+A X
+A Z
+C X
+C Z
+B Y
+B Y
+A Y
+A Z
+A Y
+C Z
+A Z
+A Z
+C Z
+B Y
+C X
+C X
+B Y
+C X
+B Z
+B Y
+C Y
+B Y
+B Y
+B Y
+A Y
+C Z
+B Y
+C X
+C Z
+C X
+B Y
+B Y
+C Z
+B Y
+C Z
+C Z
+B Y
+B Y
+C X
+C Z
+C X
+A Y
+A Y
+B Z
+C Z
+B Y
+C X
+B Y
+C X
+C Y
+C X
+A Y
+C Y
+B Y
+B Z
+C Z
+A Z
+B X
+C Z
+B Z
+B X
+A Y
+C Z
+A Y
+B Y
+A Z
+B Y
+C X
+B X
+C Z
+B Z
+C Z
+B Y
+C X
+B Z
+B Y
+A Z
+B Y
+C Z
+C X
+C Z
+A Y
+A Z
+B X
+A Z
+B Y
+B Y
+B Y
+C Z
+C X
+B Z
+C Z
+A X
+C Z
+C X
+B X
+A Z
+C Y
+A Z
+B Y
+C Y
+A Y
+C X
+A Z
+C Z
+A Z
+B Z
+C Z
+A Y
+C Z
+C Y
+B Y
+B Y
+B Y
+C X
+B Z
+B Y
+C X
+C Y
+C Z
+C Z
+B X
+C X
+B Y
+A Y
+B Y
+C Z
+B X
+A Z
+B Z
+C Z
+C X
+C Z
+B X
+B Y
+C Y
+B Z
+B Y
+C Z
+C Z
+B X
+C Z
+A Y
+B Z
+B Y
+B Y
+B Z
+B Z
+B Y
+B Y
+B X
+B Y
+A Z
+B Y
+C X
+B Z
+A Y
+B Z
+C Z
+C Z
+B Y
+B Z
+B Y
+C X
+C Y
+C Y
+C Y
+C Z
+C X
+C X
+C Z
+A Z
+C Z
+B Y
+B Y
+A Z
+C Z
+B Y
+B Y
+C X
+C Y
+B Y
+A Y
+C Z
+C X
+C Z
+B Y
+C Z
+C X
+B X
+B X
+C X
+C X
+C X
+B Z
+A Z
+B Y
+C Z
+B Y
+B Z
+B Y
+C Y
+A Z
+B Z
+B Y
+C Y
+C X
+B Y
+C Y
+C Z
+C Y
+B Y
+C Z
+C Z
+B Z
+C X
+C Y
+C X
+C X
+C Z
+C X
+C Z
+C Y
+A Y
+A Z
+C Z
+C X
+B Y
+B Y
+C X
+C Z
+A Y
+B Z
+B Y
+C Z
+C X
+B X
+B Y
+B Z
+B Z
+B Y
+A Y
+C X
+C Z
+C X
+A Z
+A Y
+C X
+A X
+C Y
+A X
+B Y
+C Z
+A Y
+C X
+C Z
+B Y
+B Y
+B Z
+B Y
+B X
+B X
+C X
+A Z
+B Z
+A Z
+A Z
+A X
+B Y
+C X
+C Z
+C Z
+B Y
+C X
+C X
+A X
+A Z
+B X
+C Z
+C Z
+B Y
+C X
+B Z
+B Z
+A Y
+B Y
+C X
+B Y
+B Y
+B X
+C Z
+A Y
+C X
+B Y
+C Z
+B X
+A Z
+A Z
+B X
+B Y
+C X
+B Z
+A Y
+C Z
+C Z
+B Y
+B X
+A Z
+B Z
+B Y
+A Y
+A Z
+B Y
+B X
+B Z
+B Z
+A Z
+A X
+A Y
+A Y
+B X
+C X
+C Y
+B X
+A X
+B Z
+B Y
+C Z
+B Y
+C Z
+C Y
+C X
+A Y
+B Z
+A Z
+B X
+B X
+B Y
+C X
+B X
+A Y
+C X
+C Y
+B Y
+B Z
+C Z
+A Y
+A X
+C Z
+C Z
+C X
+A Z
+C X
+A Y
+B Z
+B Y
+C X
+B X
+A Y
+B Z
+C X
+B Y
+C X
+B X
+A Z
+B Y
+C Y
+C X
+C X
+C Z
+A Z
+C Y
+B Y
+C Z
+C Z
+B Y
+C Z
+C Y
+B Y
+C X
+C X
+B Y
+B X
+A Y
+C Z
+B Y
+A Z
+C X
+C Y
+B Y
+B Y
+B Y
+A Z
+A Y
+B X
+B Y
+B Y
+B Z
+B X
+C Z
+B Y
+C X
+C Z
+C X
+C Y
+B Y
+C Y
+A Z
+B Y
+C Y
+B Y
+B Y
+A Y
+C Z
+C Y
+C Y
+A X
+C Z
+C Z
+C Z
+A Y
+B Y
+C Z
+B Z
+A Z
+B Z
+C X
+C Z
+C Z
+A X
+C Y
+C Z
+C Y
+C Y
+C X
+C Y
+C X
+A Z
+C X
+C X
+B X
+C Z
+B Y
+C Z
+B Y
+B X
+C Z
+B Y
+C Y
+C Z
+C X
+A X
+C Z
+A Y
+C Y
+B Y
+B Z
+B Z
+B Z
+B Y
+B X
+B Y
+C Z
+B X
+B X
+B Y
+C Y
+C Z
+A Z
+C Y
+B Y
+B Z
+C X
+C X
+B Z
+B Y
+C X
+C Z
+C Z
+C X
+C Y
+B Y
+C Y
+C Z
+C Z
+B Z
+C Z
+B X
+B Z
+A Z
+A Z
+C Z
+C Y
+C Z
+C X
+B Y
+B Y
+C Z
+B Y
+B Y
+A Z
+A Y
+B Z
+C Z
+C X
+B Y
+C X
+C Z
+B Z
+C X
+C Y
+B X
+C Z
+C Y
+A Z
+C Z
+C Z
+C Z
+C Z
+C Z
+A Z
+B Y
+A Z
+A Z
+A Z
+C X
+B Z
+B Z
+B Y
+A Y
+C Z
+C X
+B Z
+A Y
+B Y
+C X
+C Z
+B Z
+C Y
+A Y
+C Z
+B Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Y
+A Y
+A Z
+A Y
+C X
+C Y
+C Z
+C X
+B Y
+B Z
+C Z
+B Y
+C X
+A X
+C X
+B Y
+B Y
+B Y
+C Z
+C Z
+A X
+B Y
+B Y
+B Z
+B X
+C Z
+B Y
+C X
+B X
+C Z
+C Z
+B Y
+C Z
+C Y
+C Z
+C Y
+C Y
+A Z
+C Z
+B Y
+A Y
+A Y
+B Y
+C Y
+B X
+A Y
+C X
+C Y
+B X
+C X
+C X
+C Z
+C X
+C Z
+B Y
+C X
+B X
+C Y
+C Z
+C Z
+B Z
+C X
+B Y
+A Z
+C Y
+B X
+B Y
+B Y
+B Y
+C Z
+C Y
+A Z
+C X
+B Z
+C Y
+C Y
+C X
+C Z
+A Z
+B X
+A Z
+C Z
+B Z
+B Y
+A Z
+C Z
+B Z
+A X
+B Y
+B Y
+C Z
+C Y
+C Z
+C X
+B Y
+C X
+B Y
+A X
+B X
+C Y
+B Y
+A Y
+B Y
+C Z
+C X
+B Y
+C Z
+C Y
+C X
+C X
+B X
+B Y
+C X
+A X
+B X
+B Z
+A Z
+B Z
+C Y
+B Z
+B Y
+C Z
+C Y
+B Y
+B Y
+C X
+B Y
+C Z
+B Y
+C X
+B X
+C Z
+C Z
+B Y
+C Z
+B Y
+B Y
+A Y
+B Y
+B Y
+C Z
+B Z
+C X
+B X
+C X
+B Y
+B Y
+C Z
+C Z
+C Z
+C X
+C Z
+A Z
+C X
+B Y
+B X
+B Y
+B Z
+C X
+A Y
+A Y
+C Z
+C X
+C Y
+C X
+C X
+C Z
+A Y
+C X
+B Y
+C Z
+C X
+B Y
+A Z
+B X
+C Z
+A Z
+C X
+B X
+A Y
+A Y
+B Y
+B X
+B X
+B X
+C Y
+A X
+A Z
+B Y
+B Z
+B Z
+C Y
+C X
+A Z
+C Z
+B Z
+C X
+C Y
+A Z
+C Z
+C X
+C X
+B Y
+B Y
+C Z
+A Y
+C Z
+B Y
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+B Y
+A Z
+C X
+B Y
+C Z
+B X
+B Z
+C Y
+C Z
+C Z
+A X
+C Z
+A X
+C X
+C Z
+A X
+C Z
+C Z
+A Z
+C X
+C X
+C Y
+C Z
+A X
+C X
+B Y
+A Z
+A Z
+C X
+B Y
+A X
+C Z
+B Y
+A Y
+A Z
+C X
+B Y
+B Z
+C Y
+B Y
+B X
+B X
+B Y
+B X
+A X
+B Y
+C X
+B Y
+C Z
+B X
+C Y
+B Z
+B X
+B Y
+C X
+B Z
+B X
+A X
+C X
+B Y
+B Y
+C Y
+B Y
+C X
+C Z
+C X
+C X
+B Z
+C Z
+C Y
+A Z
+C Z
+C Y
+C X
+A Z
+B Y
+B Y
+B Z
+B X
+A Y
+B Y
+C Z
+B Y
+B Z
+A X
+C X
+C X
+B X
+A Z
+B Z
+B X
+B Y
+C Z
+B Y
+B Z
+B Y
+C Y
+A Y
+C Y
+C Z
+B Z
+A Y
+B Y
+C Z
+B Z
+A Z
+C X
+C Z
+B Y
+C Z
+A Z
+C Z
+C Y
+C Z
+A X
+B Y
+B Y
+B Y
+A Z
+A Y
+B Z
+C Z
+A Z
+B Y
+B Y
+B Y
+C X
+A Z
+A Z
+A Z
+C X
+C Z
+A Z
+C Y
+B Y
+C Z
+C X
+B Y
+A Y
+C Z
+C Z
+C Z
+A Z
+A X
+B Y
+B X
+C Y
+B X
+B Z
+C X
+A Z
+B Z
+B Y
+A X
+A Z
+A Y
+C X
+C Z
+C X
+C Z
+A Z
+B Z
+B Z
+B Z
+C Z
+C Y
+A Z
+A Z
+A Y
+B Y
+C Z
+B Z
+A Z
+C Z
+A X
+B Y
+B Y
+C X
+C Z
+B Z
+B Y
+B X
+C Z
+B Z
+A X
+B Z
+C Z
+B Y
+A X
+C Y
+C X
+C X
+B Y
+C Z
+B X
+A Z
+B Y
+C Z
+B Y
+C Z
+A Y
+B Z
+C X
+C X
+B Y
+C Y
+B X
+C Z
+C Z
+B Y
+B Y
+A Z
+A Y
+C Y
+A Z
+C Z
+A Y
+A Z
+C X
+C Y
+B Z
+C X
+B X
+C X
+C X
+B X
+B X
+B Z
+C X
+C X
+B Y
+A Z
+C X
+B Y
+B Y
+C Y
+B Y
+C Z
+C Y
+A Z
+A X
+C Z
+C X
+B Z
+B X
+B Y
+A X
+C Y
+B Y
+B Z
+B Y
+C Z
+C Z
+A Y
+C Y
+C X
+A X
+C Y
+C Z
+B Z
+B Y
+C Z
+C X
+C Y
+B Z
+B Z
+C X
+C Z
+C X
+B Y
+A Z
+B Y
+B Y
+C Z
+B X
+C X
+C Y
+A Z
+C Z
+B Y
+C Y
+B Y
+C Y
+A X
+C X
+B X
+C X
+C Y
+C Z
+B Y
+B X
+B Y
+C Z
+C Y
+B Z
+C X
+B Y
+B Y
+C Z
+C Z
+C Z
+C X
+B Y
+C X
+C Z
+C X
+C X
+C Y
+B Y
+C Z
+C Z
+B Y
+B Y
+B Y
+B Z
+C Y
+A Z
+C X
+C Z
+A Y
+C X
+C Z
+C Y
+B Y
+A X
+C Z
+B Y
+B X
+B Z
+A Y
+A Z
+C X
+C Z
+C Y
+B X
+C Z
+A Y
+B X
+A Z
+B Y
+A Z
+C Z
+B Y
+C X
+A Z
+B Y
+C Z
+C Z
+C Y
+B Z
+C X
+C X
+B Y
+B Y
+C Z
+C Z
+B X
+C Z
+A Y
+B Y
+C Z
+B X
+A Z
+C Z
+B X
+C X
+B X
+C Y
+C Y
+A Z
+B Y
+C X
+C Z
+A Z
+C Z
+B X
+B Z
+C X
+C Y
+C Z
+A Y
+C Y
+B Z
+C X
+B Z
+C X
+B Z
+B Y
+B Z
+A Y
+B Y
+A Y
+B Y
+A Z
+C Y
+C Z
+C Z
+A X
+C Z
+B X
+A Z
+B Y
+C Z
+A Y
+C Z
+B Y
+B X
+C Z
+C Z
+B Y
+C X
+B X
+A Z
+C Y
+C Z
+B Y
+B Y
+C X
+B Y
+B Y
+B Z
+A Y
+C X
+B X
+B Y
+B Y
+A Z
+C X
+C Y
+A Y
+B Y
+C Z
+B Y
+C Z
+B Y
+C X
+B Z
+B Z
+A X
+A Z
+B Y
+B X
+A X
+B Y
+B Y
+C X
+C Z
+B Y
+C X
+C Y
+C Z
+B Y
+A Z
+B Y
+A Z
+B Z
+C X
+A Z
+B Y
+B Y
+C Z
+A Z
+A Z
+B Y
+B Z
+C Z
+B X
+C Z
+C Z
+B X
+B Z
+C X
+B Z
+C X
+B Y
+B Y
+A Y
+C Z
+B Y
+C Z
+C Z
+C Y
+C X
+A Z
+B Y
+C Z
+C Z
+B X
+C X
+C Z
+B Z
+A Z
+C X
+C Z
+A Z
+B Y
+B Y
+C Z
+A X
+A Z
+C Z
+C Z
+B Y
+C X
+B Y
+B Y
+C Y
+A Y
+C Z
+A Z
+B Z
+A Z
+B Y
+C X
+C Z
+B Y
+C Z
+B Y
+C Z
+C Z
+B Z
+B X
+A Z
+B Z
+B Z
+C X
+C X
+A Z
+B X
+B Z
+B Y
+C Z
+C X
+B Z
+B Z
+C Z
+B Y
+B Y
+C X
+B X
+C X
+C Z
+B Y
+A Z
+B Z
+B Y
+B Z
+B X
+C Z
+C Y
+C Z
+A X
+C Z
+A Y
+C Y
+A Z
+C Z
+B X
+A X
+B Y
+A Z
+A Y
+B Z
+B Y
+B X
+C Y
+C Y
+B Z
+A X
+C X
+B Y
+C Z
+B Y
+B Y
+B X
+A X
+C Z
+B Y
+B Y
+B Z
+C X
+C X
+B Y
+C Z
+C X
+C Z
+C Y
+B Y
+A Z
+C Y
+A Y
+C Z
+C X
+C Z
+C Z
+B Y
+B Y
+B Z
+B X
+A Z
+B X
+A Z
+C Z
+C Y
+B X
+B Y
+C Z
+A Y
+B Y
+B Z
+A Y
+B Z
+B Z
+A Y
+A X
+B Y
+A Z
+B Z
+A Z
+B Z
+C X
+C Y
+B Y
+B X
+B Y
+C Y
+C Y
+B X
+B X
+A Z
+A Y
+A X
+A Z
+B Y
+B Y
+C X
+C Z
+C X
+C X
+B Z
+A Y
+C Z
+C X
+A Y
+A X
+A Z
+C Y
+B X
+A X
+A Z
+C Z
+B Y
+C X
+C Z
+B Z
+B Y
+C X
+C X
+C Z
+A Y
+C X
+B Y
+A X
+A Y
+C X
+C X
+A Z
+C Y
+B Y
+A Y
+C Y
+A Z
+B Y
+B X
+C Z
+C X
+B Y
+A Y
+C X
+B Y
+B X
+C X
+B Y
+A Z
+B Y
+C X
+C Z
+A Y
+C X
+A X
+C Y
+C Z
+C Z
+C Z
+B Z
+B X
+C Z
+B Y
+B Z
+C Z
+A X
+C Z
+B Y
+B Y
+C Y
+A Z
+A X
+C X
+B Z
+C Z
+A Y
+C X
+C Z
+B X
+A Z
+C Y
+A Y
+C Z
+A Z
+B X
+C X
+C Z
+C X
+B Z
+B Y
+C X
+B Y
+C X
+B Y
+C X
+B X
+A Z
+B Z
+C Z
+C X
+C Y
+A Z
+C X
+A Z
+B Z
+B Z
+B X
+B Y
+B Z
+C Z
+C Y
+C Z
+B Z
+B Y
+C X
+C Z
+C Y
+C Z
+A Y
+A Y
+C Y
+A Y
+B Y
+C Z
+A Y
+C X
+B Z
+A Y
+B Y
+C X
+C X
+B Y
+C X
+B Y
+C Z
+C X
+A Y
+C Z
+A Z
+B Y
+B Z
+C Z
+C Z
+C Y
+B Y
+C Y
+C Z
+B Y
+C Z
+B X
+A Z
+A X
+B X
+C Z
+B Y
+B Y
+B Y
+C Y
+C Z
+A Y
+A Z
+B Y
+C Y
+C Z
+C Z
+C X
+C Z
+C X
+C Z
+C Z
+C Y
+C X
+B Z
+C Z
+C Z
+C Z
+C X
+B Y
+C Z
+A Y
+C Z
+C X
+C Y
+C X
+C Y
+B Y
+C Z
+B X
+A Z
+C Y
+C Z
+B X
+C Z
+A X
+B Y
+A Y
+C Z
+B Y
+C Z
+C Z
+B Z
+C X
+B Y
+C Z
+A Y
+B Z
+B X
+C X
+A Z
+C Z
+B Y
+C Z
+C Z
+B X
+B Y
+C Y
+C X
+C Z
+A X
+B Z
+C Y
+C Y
+B Y
+B Y
+B X
+B Y
+B Z
+B Y
+C Z
+B Y
+A Z
+B X
+B Z
+B Y
+B X
+A X
+C Z
+B Z
+A Z
+A Z
+A Z
+A Z
+B Y
+C Y
+C Y
+A Y
+C Z
+B Y
+B Y
+B Y
+C Z
+C Z
+C Y
+C X
+B Z
+C Y
+C X
+C Z
+B X
+A Z
+C X
+A X
+C X
+C X
+A X
+C Z
+B Y
+C X
+C Y
+B X
+B Y
+C Z
+C X
+B Y
+B Z
+B Z
+B Y
+C X
+C X
+B Y
+B X
+C Z
+A Z
+C Z
+B Z
+B Y
+B X
+C Z
+C Z
+B X
+B Y
+C Z
+B Y
+B Y
+A Y
+C X
+C Y
+B Y
+C Z
+B X
+B Y
+C Z
+C Y
+C Y
+B Y
+B Y
+A X
+A Z
+A Z
+B Y
+B Y
+B Y
+C X
+B X
+C Z
+C Z
+B Z
+B Y
+C Y
+C Z
+C X
+C Z
+C Y
+A X
+C Z
+B Y
+B Y
+B Y
+B X
+C Z
+B Y
+B Y
+A Y
+C Z
+A Z
+B Y
+B Y
+A Z
+A Z
+A Y
+C Z
+A X
+B X
+B Z
+C X
+A Y
+A Z
+B Y
+B Y
+A Y
+A Z
+C Z
+B Y
+B Y
+C Z
+A X
+A Z
+A Z
+C X
+B Y
+C X
+B Z
+B Y
+C Y
+B Y
+C Z
+B Y
+C Z
+B Y
+C Y
+C Z
+A Y
+A X
+A X
+C X
+B Y
+A X
+C X
+C Y
+C Z
+C Y
+C Z
+A Z
+B Y
+C X
+C X
+C Y
+C Z
+B Y
+C Z
+C Y
+B Y
+B Y
+A X
+C X
+C X
+B Z
+A Z
+C X
+B Y
+C X
+A X
+C Z
+B Y
+C Y
+C Z
+C X
+A X
+B Z
+A Y
+C Z
+C Y
+B X
+B Y
+C Z
+B Z
+C Z
+C X
+B Y
+C X
+B Z
+B Y
+A Z
+A Y
+C X
+A Y
+C Z
+C Z
+A Z
+C Y
+C X
+A Z
+B Y
+C X
+A Y
+A Z
+B Y
+C Z
+A Y
+C X
+C X
+C Z
+C Z
+C Z
+B Z
+B Y
+A Y
+B Y
+C Z
+C X
+B X
+A Z
+C Z
+C Z
+C Z
+C X
+A Y
+A Z
+A Z
+B Z
+B X
+C X
+B Y
+C X
+C Y
+C Z
+A Z
+C X
+C Y
+B Y
+B X
+C X
+B Y
+C Y
+B Y
+B Y
+C Z
+C Y
+C Y
+B Y
+A Y
+B X
+A Y
+B X
+C Z
+B X
+C Z
+C Y
+B Y
+A Z
+C X
+B Z
+C X
+C X
+C X
+C Z
+A Z
+A Z
+B Y
+A Z
+C Z
+C Y
+B Z
+A X
+A Z
+C X
+B Y
+C X
+C Z
+C Z
+A Z
+C Z
+C Y
+B Z
+B Z
+C Y
+B Y
+C X
+B Y
+B Z
+C Z
+B X
+C Z
+B Z
+B Y
+B Y
+C Y
+C Z
+C X
+B Y
+C X
+C X
+B Z
+B X
+C X
+B X
+C Z
+C Z
+B Y
+A Y
+C X
+B Z
+C X
+C Y
+C Z
+C X
+A Z
+C X
+B Y
+B Y
+A Y
+C Z
+B Z
+B Y
+C Y
+C Y
+A Y
+B Y
+B Y
+B Y
+C Z
+C Z
+A Z
+B Y
+C X
+C Y
+B Y
+B Z
+B Y
+B Y
+C X
+C Z
+C Z
+A X
+B Y
+C Z
+C Z
+C Z
+B Y
+C Y
+B Z
+C Z
+C X
+C X
+C Y
+B X
+C Z
+B Y
+C Y
+B Z
+A Y
+B Y
+B Z
+A Z
+C Z
+C X
+C Z
+B Y
+C Y
+B Y
+B Y
+A Z
+B Y
+B Y
+B Y
+C X
+C X
+B Y
+C Z
+C Z
+B Y
+C X
+C Z
+C X
+A Y
+C Z
+C Z
+B Y
+A X
+C X
+B X
+A Y
+C X
+A X
+B Y
+A Z
+C Y
+C Y
+C Z
+C X
+B Y
+C X
+C Z
+B Y
+C Z
+C X
+C Z
+C Z
+A Z
+A Z
+C Z
+A X
+C Z
+C Z
+B X
+C Z
+B Y
+C X
+A Z
+C Z
+C X
+B Z
+C Z
+B Y
+A Z
+C Y
+B X
+B Z
+A Y
+B Y
+C X
+C Y
+C Z
+C Y
+A X
+C Z
+C Z
+C X
+B Y
+C Z
+B Z
+B Y
+C X
+C Z
+C Y
+B Y
+C Y
+B Y
+A Y
+B X
+C Z
+C Z
+C Z
+C X
+B Z
+C X
+A Z
+C Y
+C Z
+C X
+C Z
+A Z
+A Y
+B X
+C X
+C Z
+B Z
+B X
+C Y
+B Y
+B Z
+C X
+C Z
+C X
+B Y
+B Y
+C X
+B X
+C X
+C X
+B Y
+B Y
+A Y
+B Z
+C Z
+A Z
+B Z
+A Z
+B Y
+C Z
+C Z
+A Z
+B Y
+B Y
+B X
+C X
+A Z
+C Y
+C Z
+A Y
+C Z
+C Z
+B Z
+B Z
+A X
+A X
+C Y
+B X