aboutsummaryrefslogtreecommitdiff
path: root/racket/aoc2022/day-02
diff options
context:
space:
mode:
Diffstat (limited to 'racket/aoc2022/day-02')
-rw-r--r--racket/aoc2022/day-02/day-02.ipynb193
-rw-r--r--racket/aoc2022/day-02/day-02.pl72
-rw-r--r--racket/aoc2022/day-02/prolog-input.txt2500
3 files changed, 2765 insertions, 0 deletions
diff --git a/racket/aoc2022/day-02/day-02.ipynb b/racket/aoc2022/day-02/day-02.ipynb
new file mode 100644
index 0000000..13b9986
--- /dev/null
+++ b/racket/aoc2022/day-02/day-02.ipynb
@@ -0,0 +1,193 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Advent of Code 2022\n",
+ "#### Day 2: Rock Paper Scissors\n",
+ "\n",
+ "You've given a strategy guide for how to win at a Rock Paper Scissors tournament. The first column is what your opponent will throw. Your score is determined by the result (win, lose, draw) of each round and what you played (rock, paper, scissors).\n",
+ "\n",
+ "**Part 1.** What's your tournament score if the second column represents what you should play in each round?\n",
+ "\n",
+ "**Part 2.** What's your tournament score if the second column represents the result of each round?\n",
+ "\n",
+ "For this solution, I'm using `rackjure` since I'm planning on using a bunch of dictionaries, and `rackjure`'s shorthand makes them easier to work with."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "vscode": {
+ "languageId": "racket"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "#lang iracket/lang #:require rackjure\n",
+ "(require advent-of-code)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The input for this problem is a list with two columns; the first column is one of the characters `A`, `B` or `C` (corresponding to the opponent's throw of rock, paper or scissors) and the second column is `X`, `Y` or `Z`, whose meaning is currently unknown."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "vscode": {
+ "languageId": "racket"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "(define strategy-guide (~> (fetch-aoc-input (find-session) 2022 2) (string-split \"\\n\")))\n",
+ "(define opponent-throw {\"A\" 'rock \"B\" 'paper \"C\" 'scissors})"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We're also given the score for a round result and the bonus for the selected throw, and we write a function that determines the result for a given round."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "vscode": {
+ "languageId": "racket"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "(define score-bonus {'rock 1 'paper 2 'scissors 3 'win 6 'draw 3 'lose 0})\n",
+ "\n",
+ "(define winning-rounds {'rock 'paper 'paper 'scissors 'scissors 'rock})\n",
+ "(define losing-rounds {'rock 'scissors 'paper 'rock 'scissors 'paper})\n",
+ "\n",
+ "(define (outcome them me)\n",
+ " (match* (them me)\n",
+ " [(x x) 'draw]\n",
+ " [(x y) #:when (eq? y (winning-rounds x)) 'win]\n",
+ " [(_ _) 'lose]))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### Part 1\n",
+ "\n",
+ "In part 1, we assume that the second column refers to the throw we should select in each round. We add that to our existing dictionary and write a `for` comprehension to calculate each round result."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "vscode": {
+ "languageId": "racket"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<code>13809</code>"
+ ],
+ "text/plain": [
+ "13809"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(define assume-throw (dict-merge opponent-throw {\"X\" 'rock \"Y\" 'paper \"Z\" 'scissors}))\n",
+ "\n",
+ "(for/sum ([play (in-list strategy-guide)])\n",
+ " (match-define (list them me) (string-split play))\n",
+ " (+ (score-bonus (outcome (assume-throw them) (assume-throw me)))\n",
+ " (score-bonus (assume-throw me))))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### Part 2\n",
+ "Now we're told that the second column actually represents the round result: `X` is lose, `Y` is draw, `Z` is win. We can look up what we should throw in response for each round, and then calculate the score from that."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "vscode": {
+ "languageId": "racket"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<code>12316</code>"
+ ],
+ "text/plain": [
+ "12316"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(define assume-result (dict-merge opponent-throw {\"X\" 'lose \"Y\" 'draw \"Z\" 'win}))\n",
+ "(define (pick-throw them result)\n",
+ " (match* (them result)\n",
+ " [(x 'draw) x]\n",
+ " [(x 'win) (winning-rounds x)]\n",
+ " [(x 'lose) (losing-rounds x)]))\n",
+ "\n",
+ "(for/sum ([play (in-list strategy-guide)])\n",
+ " (match-define (list them result) (string-split play))\n",
+ " (+ (score-bonus (assume-result result))\n",
+ " (score-bonus (pick-throw (assume-result them) (assume-result result)))))"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Racket (trusted)",
+ "language": "racket",
+ "name": "racket-trusted"
+ },
+ "language_info": {
+ "codemirror_mode": "scheme",
+ "file_extension": ".rkt",
+ "mimetype": "text/x-racket",
+ "name": "Racket",
+ "pygments_lexer": "racket",
+ "version": "8.7"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/racket/aoc2022/day-02/day-02.pl b/racket/aoc2022/day-02/day-02.pl
new file mode 100644
index 0000000..707da41
--- /dev/null
+++ b/racket/aoc2022/day-02/day-02.pl
@@ -0,0 +1,72 @@
+:- use_module(library(yall)).
+:- use_module(library(apply)).
+
+output_solutions :-
+ get_data(Games),
+ part1_total(Games, Part1),
+ write(Part1), nl, !,
+ part2_total(Games, Part2),
+ write(Part2), nl.
+
+% Facts
+
+game(X, X, draw).
+game(rock, scissors, win).
+game(scissors, paper, win).
+game(paper, rock, win).
+game(rock, paper, lose).
+game(scissors, rock, lose).
+game(paper, scissors, lose).
+
+opponent_move("A", rock).
+opponent_move("B", paper).
+opponent_move("C", scissors).
+
+assume_move("X", rock).
+assume_move("Y", paper).
+assume_move("Z", scissors).
+
+assume_outcome("X", lose).
+assume_outcome("Y", draw).
+assume_outcome("Z", win).
+
+bonus(rock, 1).
+bonus(paper, 2).
+bonus(scissors, 3).
+bonus(lose, 0).
+bonus(draw, 3).
+bonus(win, 6).
+
+% Rules
+
+get_data(Result) :-
+ setup_call_cleanup(open("2022/day-02/prolog-input.txt", read, In),
+ (read_string(In, _, Str),
+ split_string(Str, "\n", "\s\t\n", Lines),
+ maplist([In, Out] >> split_string(In, "\s", "", Out), Lines, Result)),
+ close(In)).
+
+score_game(MyMove, Result, Score) :-
+ bonus(Result, X),
+ bonus(MyMove, Y),
+ Score is X + Y.
+
+part1_score([Them, Me], Score) :-
+ opponent_move(Them, TheirMove),
+ assume_move(Me, MyMove),
+ game(MyMove, TheirMove, Result),
+ score_game(MyMove, Result, Score).
+
+part1_total(Games, Total) :-
+ maplist(part1_score, Games, Scores),
+ sum_list(Scores, Total).
+
+part2_score([Them, Outcome], Score) :-
+ opponent_move(Them, TheirMove),
+ assume_outcome(Outcome, Result),
+ game(MyMove, TheirMove, Result),
+ score_game(MyMove, Result, Score).
+
+part2_total(Games, Total) :-
+ maplist(part2_score, Games, Scores),
+ sum_list(Scores, Total). \ No newline at end of file
diff --git a/racket/aoc2022/day-02/prolog-input.txt b/racket/aoc2022/day-02/prolog-input.txt
new file mode 100644
index 0000000..95a2b2a
--- /dev/null
+++ b/racket/aoc2022/day-02/prolog-input.txt
@@ -0,0 +1,2500 @@
+C X
+C X
+A Y
+C X
+B Y
+A X
+A Z
+B Y
+C Z
+C Z
+B X
+C Z
+B Y
+C Z
+B Y
+A Z
+B Y
+C X
+C X
+C X
+B X
+C Z
+C X
+C Z
+C X
+A Y
+B Y
+B Z
+A X
+C X
+C Z
+C Z
+A Z
+B Y
+C Z
+C X
+C X
+C Z
+B Y
+C Z
+C Z
+C X
+B X
+B X
+A Y
+C Z
+C Z
+B Y
+B Y
+C Z
+C X
+A Z
+C X
+C Z
+C Z
+B X
+C Z
+C Z
+B Y
+A Y
+B X
+C X
+C X
+C Z
+C X
+A Y
+C X
+C Z
+A Z
+B Y
+C Z
+C X
+C X
+C Z
+C Z
+C Z
+A Z
+C Z
+A Z
+A Z
+C X
+B Y
+C X
+C X
+A Z
+C X
+A Y
+C Z
+C Z
+A Y
+A Z
+C Z
+C Z
+A Y
+C Z
+C Y
+B Y
+B Y
+A Z
+A Y
+C Z
+C Z
+A Z
+C Z
+A Y
+B Z
+C X
+C Z
+C X
+B Y
+C Z
+C X
+B Y
+B X
+A Y
+C Z
+C Z
+C Z
+B Z
+A Y
+C Z
+C Z
+C X
+C Z
+C X
+A Y
+C Z
+C Z
+C X
+B Y
+B X
+B Y
+C Z
+C X
+B X
+C Z
+C Z
+A Y
+C Z
+A Z
+A Y
+C Z
+A Y
+C X
+A Y
+C Y
+A Z
+C X
+C X
+B Y
+B Y
+A Y
+A Z
+C Z
+C X
+C Z
+A Y
+B Y
+A Y
+B X
+C Z
+C Z
+A Z
+A Y
+C X
+C X
+C X
+A Z
+B Y
+C Z
+C Z
+C Z
+C X
+B Z
+C Z
+C Z
+B Z
+C Z
+A Z
+B Y
+A Y
+C Z
+B Y
+B X
+B X
+C X
+C Z
+A X
+C Z
+C X
+C X
+C X
+C X
+C X
+B Y
+C X
+C X
+A Y
+A Y
+C Z
+C Z
+B X
+C Z
+C Z
+C Z
+C Z
+A Z
+C Z
+A Z
+B Y
+B Y
+C Z
+B Y
+C Z
+C Z
+C Z
+C X
+B Y
+B Y
+C Z
+A Z
+C Z
+C X
+B Y
+C Z
+A Z
+C Z
+C X
+C Z
+C Z
+C X
+C X
+B Z
+A Y
+B X
+C Z
+B Y
+C X
+C X
+C Z
+C Z
+B X
+B X
+B Y
+A X
+C X
+A Z
+A Z
+C Z
+B Y
+C Z
+A Z
+B X
+C X
+B Y
+A Z
+C X
+A X
+A Z
+B Y
+B X
+B Y
+A Y
+C Z
+C Z
+B X
+C Z
+C X
+B Y
+C Z
+C Z
+A Y
+B Y
+A Z
+A Y
+C X
+C X
+C Z
+A Z
+C Z
+B Z
+A Z
+A Y
+C X
+C Z
+C X
+B Z
+C Z
+B Y
+A Y
+B X
+A Y
+C Z
+A Y
+C Z
+C X
+B Y
+C X
+A Y
+A Z
+C Z
+B Y
+C X
+A Y
+C X
+C Z
+C X
+B Y
+C X
+C Z
+C Z
+A Z
+B Y
+C X
+B X
+A Z
+C X
+C X
+A Y
+B X
+C X
+A Z
+C Z
+C Z
+C Z
+B Y
+A Y
+C X
+C Z
+C Z
+A Z
+C Z
+A Y
+C X
+C X
+C X
+A Z
+B Y
+C Z
+A Y
+C Z
+C Z
+C X
+C Z
+A Z
+C Z
+B Y
+C X
+C X
+C Z
+B Z
+B Y
+C X
+C X
+A Y
+A Z
+A Z
+A X
+C X
+A Y
+B Y
+A Y
+A Z
+B Y
+B Y
+A Y
+B Y
+C X
+A Z
+B X
+C Z
+A Z
+B X
+A Y
+B X
+B Y
+A Y
+A X
+C Z
+B Z
+B X
+B Z
+C Z
+C X
+B X
+B Y
+A Y
+B Y
+B Y
+B Y
+A Z
+A Y
+B X
+A Y
+C X
+B Y
+B X
+B Y
+C X
+A Y
+C X
+A Y
+C Z
+C Z
+A Z
+C Z
+C X
+C X
+A Z
+C X
+C X
+C X
+A Y
+A Z
+A Z
+C Z
+B X
+C X
+C X
+C Z
+A Y
+C X
+C X
+B X
+C Z
+C Z
+C X
+B Z
+C X
+C X
+C Z
+A Y
+C X
+A Z
+C Z
+C X
+B X
+B Y
+C X
+C Z
+C X
+C Z
+A Z
+C Z
+C X
+C Z
+C Z
+A Z
+B X
+C X
+C Z
+C X
+C X
+C Z
+C X
+C Z
+A Z
+A Z
+A Z
+C Z
+C X
+A Z
+C Z
+C Z
+C Z
+A Z
+B Y
+C X
+B Y
+C X
+C Z
+B Y
+C X
+C X
+A Z
+A Z
+C X
+C Z
+C X
+C Z
+A Z
+A Y
+C Z
+C Z
+A Y
+B Y
+B Y
+C Z
+B Y
+B X
+B Z
+A Y
+A Z
+C X
+B Y
+B Z
+B Y
+B Z
+C Z
+B Y
+C Z
+C Z
+B Y
+B X
+B Z
+C X
+A Z
+C X
+C X
+C X
+A Z
+C Z
+A Z
+C Z
+A Y
+C Y
+B Y
+A Z
+B Y
+C Z
+A Z
+A Y
+B X
+C X
+C X
+C X
+C Z
+C X
+B X
+C Z
+A Y
+C Z
+A X
+B Y
+B Z
+C Z
+B Y
+C Z
+B X
+B Y
+C Z
+B X
+A Z
+B X
+B Y
+A Y
+B Z
+C X
+C Z
+A Z
+A Y
+A Z
+C X
+C Z
+B Z
+A Z
+A Z
+C X
+C Z
+C X
+C X
+A Z
+C X
+C X
+C X
+B X
+A Y
+B Y
+B X
+B Y
+C Z
+B Y
+B Z
+C Z
+C X
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+A Z
+A Z
+A Z
+C X
+C Z
+B Y
+C Z
+C Z
+C Z
+C Z
+C X
+C X
+A Z
+B Y
+A Z
+B Z
+C X
+C X
+C Z
+C Z
+C X
+A Y
+C X
+A Y
+C Z
+A Z
+C Z
+B X
+C Z
+C Z
+C X
+C X
+C Z
+B Z
+A Y
+B X
+A Y
+B Y
+A Y
+A Z
+A Z
+C Z
+B X
+C Z
+C X
+C Z
+C Z
+A Z
+C X
+A Y
+C X
+A Z
+C Z
+C X
+C Z
+A Z
+C X
+C X
+C X
+C X
+B X
+B Y
+C X
+C Z
+C Z
+C Z
+C Z
+A Z
+A Z
+A Y
+C Z
+C X
+C Z
+C Z
+C Z
+A Y
+C X
+A Z
+C Y
+A Z
+C Z
+C X
+A Y
+C Z
+C X
+C X
+A Z
+B Y
+C Z
+A Z
+C Z
+C Z
+C Z
+B Y
+C X
+C X
+A X
+A Y
+C Z
+A Z
+C Z
+B Y
+C X
+B X
+C X
+C X
+A Y
+C Z
+C Z
+C Z
+C X
+A Z
+B Y
+A Y
+B Z
+B Z
+B X
+A Z
+B X
+B X
+A Z
+A Z
+C Y
+B Y
+C Z
+A X
+C Z
+B X
+C Z
+A Y
+A Y
+C Z
+C Z
+A Z
+B Y
+C Z
+C Z
+C Z
+C X
+A Y
+C X
+B Y
+B Y
+C X
+C Z
+C X
+B X
+A Y
+A Y
+C Z
+C Z
+C Z
+C Z
+C Z
+B X
+C Z
+A Y
+B X
+A Y
+A Z
+C Z
+C X
+B Y
+B Y
+C Z
+C Z
+C Z
+B Y
+C X
+B Y
+A Y
+B X
+C Z
+C Z
+A Y
+C X
+C Z
+A Y
+C X
+C X
+A Z
+C Z
+B X
+A Z
+B Y
+C Z
+A Z
+B X
+C Z
+B Y
+C Z
+B Y
+C X
+C Z
+B X
+C X
+B Y
+C X
+A Y
+C Z
+C Z
+C X
+B Y
+C X
+C Z
+C X
+C Z
+A Z
+A Y
+C X
+C Z
+C Z
+A Z
+C X
+B Z
+A Z
+B Y
+C X
+A Z
+C Z
+B Y
+C X
+C X
+C Z
+C Z
+B Y
+A Z
+C Z
+C X
+C Z
+A Z
+C X
+A Z
+C Z
+C X
+C X
+C Z
+B X
+C Z
+C Z
+C Z
+B Y
+A X
+B Y
+C X
+A Z
+B X
+A Z
+C Z
+C X
+C Z
+C Z
+B Y
+B X
+C Z
+B Z
+B Y
+B X
+C X
+C X
+C X
+C Z
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C X
+C Z
+A Y
+C X
+B X
+A Y
+C X
+C X
+C Z
+C Z
+C X
+B X
+B Y
+B Y
+C Z
+B X
+C X
+C X
+C Z
+C Z
+A Y
+C Z
+A Y
+C Z
+C Z
+B Y
+A Z
+B X
+B X
+C Z
+C Z
+A Y
+A Y
+C Z
+C Z
+C X
+A Y
+A Y
+C Z
+A Z
+C X
+B Z
+A Y
+C X
+B Z
+A Y
+C X
+B Y
+C X
+C X
+C Z
+A X
+C Y
+A Y
+B Z
+B Y
+A X
+B Y
+A Z
+C Z
+C X
+C X
+C X
+C Y
+B Y
+C Z
+A Z
+C X
+C X
+C Z
+C Z
+C X
+C Z
+B Y
+C Z
+C X
+B Y
+A Z
+C X
+B Y
+C Z
+C X
+B Y
+A Z
+B X
+C Z
+B X
+B X
+C Z
+C Z
+C X
+B Y
+A Y
+B X
+B X
+A Y
+B Y
+B Y
+B X
+A Z
+A Y
+C Z
+B Y
+C Z
+A Z
+C Z
+C X
+A Z
+C X
+C Z
+C X
+B Y
+C X
+A Z
+B X
+C Z
+C X
+C X
+B Y
+A Y
+C Z
+C X
+A Y
+A X
+C Z
+B Y
+B X
+C X
+C X
+C X
+C Z
+A Z
+B Y
+A Y
+B Y
+B X
+B Y
+B Y
+A Z
+B Y
+B Y
+B Y
+C Z
+C X
+A Z
+A X
+B Z
+C X
+C X
+C X
+C X
+C Z
+A Z
+B Y
+A Z
+B Y
+C X
+A Z
+A Y
+C Z
+C X
+B X
+A Z
+B Y
+C Z
+A Z
+C X
+A Z
+A Y
+B Y
+C Z
+B Y
+C X
+A Z
+A Z
+A X
+C Z
+C X
+A Y
+B Y
+B X
+C Z
+A Z
+C X
+B X
+B Y
+A Z
+C X
+B Y
+C X
+C Z
+C Z
+B Y
+A Z
+A Y
+C X
+B Y
+C X
+C X
+C Z
+C Z
+C X
+A X
+C X
+A Z
+C Z
+B X
+B X
+C X
+B X
+B Y
+C X
+C X
+A Y
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+A Z
+B X
+C X
+B Y
+B Y
+C X
+C Z
+A Z
+C X
+C Z
+C Z
+C X
+A Z
+C Z
+A Z
+C Z
+A Y
+C X
+C X
+B Y
+C X
+C Z
+B X
+A Y
+C Z
+C X
+B Y
+B X
+A Y
+C X
+A Z
+C Z
+C X
+C X
+A Y
+B Y
+C Z
+B Z
+C Z
+C X
+B Y
+C Z
+C X
+A Y
+C X
+C Z
+C X
+C X
+B X
+C X
+B Y
+C X
+C Z
+C X
+B X
+B X
+C Z
+A Y
+C Z
+C Y
+B X
+A Z
+C X
+A Z
+B Z
+A Y
+C Z
+C Z
+A Z
+B Z
+A Z
+C X
+C Z
+C Z
+A Z
+A Y
+C Z
+C X
+A Y
+B Y
+B X
+A Z
+A Y
+C X
+B X
+A Y
+C Z
+B Y
+C X
+C X
+C X
+B X
+A Z
+B Y
+B Y
+A Z
+C X
+B X
+B X
+A Y
+C Z
+C X
+C X
+A Y
+C X
+C X
+C Z
+C X
+A Y
+B Y
+C Z
+A Z
+C Z
+A Z
+A Z
+A Y
+C X
+C X
+C X
+A Y
+A Y
+B Y
+B Z
+A Z
+C X
+C Z
+C X
+C Z
+B X
+C X
+C X
+B X
+C Z
+C X
+B Y
+B X
+C Z
+A Z
+C Z
+B Y
+C Z
+C Z
+B X
+A Y
+B Y
+A Z
+B Y
+C X
+C X
+A Z
+C Z
+C X
+C Z
+C X
+A Z
+C X
+A Z
+C X
+A Y
+A Z
+C X
+C Z
+B Y
+C Z
+A Z
+C Y
+B Z
+B Y
+A Z
+C Z
+A X
+A Z
+C Z
+C X
+C X
+A Y
+C Z
+C X
+C Z
+C Z
+C Z
+B Y
+C Z
+C X
+C Z
+B Y
+C Z
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+B Y
+C Z
+B Y
+A Y
+C X
+B Y
+A Y
+C X
+A Z
+A Y
+C Z
+B Y
+C Z
+C X
+A Y
+B Y
+C X
+C X
+C X
+A Y
+A Z
+B X
+B X
+B X
+B Y
+C Z
+B Y
+C Z
+C Z
+B Y
+A X
+C X
+A Y
+C Z
+B Y
+B Y
+C Z
+C Z
+C X
+C Z
+C Z
+B Y
+C Z
+C X
+A Y
+A Z
+C X
+B Z
+C X
+B Y
+C Z
+C X
+A Y
+A Z
+C Z
+C X
+C Z
+C X
+C X
+C X
+C X
+C Z
+C X
+B Y
+A Y
+C X
+C Z
+A Z
+B Y
+C Z
+C X
+C Z
+B Y
+A Z
+A Y
+A Y
+B Y
+B Y
+A Z
+B X
+A Y
+C X
+C X
+A Y
+C X
+A Y
+B Y
+C Z
+A X
+B X
+A Y
+A Z
+C Z
+B X
+C Z
+B Y
+C X
+B Y
+C Z
+A Z
+A Y
+C X
+C Z
+B X
+B Y
+C Z
+C Z
+A Z
+C Z
+B Z
+C X
+C X
+C Z
+C Z
+C Z
+C X
+C X
+C Z
+B Y
+C Z
+B Z
+C X
+A Y
+C Z
+B Y
+C X
+A Y
+C Z
+B X
+C Z
+A Z
+C Z
+C X
+A Y
+A Y
+A Y
+C Z
+C Z
+A Y
+A X
+C Z
+C Z
+C X
+C Z
+A Z
+A Z
+C Z
+C X
+C Z
+B Y
+A Y
+B Z
+B Y
+C X
+C Z
+C X
+B X
+B Y
+C X
+C X
+C X
+A Z
+A Y
+C X
+C Z
+C X
+B Y
+C Z
+B X
+C Z
+B Y
+A Z
+C X
+B Y
+C X
+B X
+A Z
+C X
+B Y
+A Y
+C Z
+C X
+A Y
+C X
+B Y
+B X
+C Z
+C X
+C X
+C Z
+C X
+C X
+A Y
+A X
+C Z
+C Z
+C Z
+B Y
+C Z
+A Z
+B X
+C Z
+C X
+C X
+A Y
+A Z
+B Y
+B Y
+C Z
+C Z
+A Y
+A Z
+A Z
+C Z
+B Y
+B Y
+C Z
+B Y
+C X
+C X
+C Z
+A Z
+C X
+C X
+B Y
+B Y
+C Z
+B Y
+C Z
+C Z
+C Z
+C Z
+C X
+C Z
+B Y
+C Z
+C Z
+B X
+C Z
+C Z
+C X
+B Y
+C Z
+A Z
+A Z
+A Z
+C X
+B Y
+C Z
+A Y
+B X
+C X
+C X
+A X
+A Y
+B X
+C Z
+C X
+C Z
+C Z
+B Y
+C Z
+C Z
+B Z
+C Z
+C Z
+B X
+A Y
+C X
+A Z
+B Y
+A Z
+C X
+B X
+B X
+C Z
+A X
+B Z
+A Z
+B Y
+C X
+C Z
+B Z
+C X
+B X
+C Z
+A Z
+B X
+C Z
+C Z
+A Z
+A Y
+C Z
+C Z
+B X
+A Z
+C Z
+B Y
+B Y
+C Z
+B Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C X
+A Y
+C Z
+C Z
+C X
+C Z
+B Y
+B X
+B Y
+A Z
+C Z
+B Y
+B X
+C Z
+B X
+C Y
+C X
+B Y
+C Z
+B Y
+A Z
+B Y
+C X
+C Z
+B X
+C Z
+A Y
+C Z
+B X
+A Z
+A Y
+B Y
+C Z
+A Y
+B Y
+C X
+A Z
+A Y
+C Z
+C Z
+A Y
+B X
+C X
+B Y
+A Y
+C X
+B X
+C X
+C Z
+C Z
+B Y
+A Z
+B Y
+A Z
+A Y
+A Z
+B X
+A Y
+C X
+B Y
+C Z
+C Z
+A Z
+C Z
+C Z
+C X
+C Z
+C Z
+B Y
+A Z
+C X
+A Y
+C Z
+A X
+A Z
+C Z
+B Y
+C X
+C Y
+A Y
+B X
+B Y
+C Z
+C Z
+B X
+B X
+C Y
+B Y
+B X
+C X
+C Z
+A Z
+C Z
+A Z
+C Z
+C Z
+A Z
+B X
+C Z
+C X
+C Z
+B Y
+B X
+A Z
+C Z
+B X
+C Z
+B Z
+C Z
+B Y
+B Y
+C Z
+B Y
+A Y
+A Z
+A Z
+C X
+A X
+C X
+C Z
+C Z
+A Y
+C Z
+C Z
+C Z
+A Y
+B X
+C Z
+C X
+B X
+C X
+C X
+B Y
+C Z
+B X
+C X
+B Y
+A Y
+C Z
+C X
+C X
+A Z
+B Y
+C Z
+B Y
+C Z
+B Z
+B Y
+B Y
+A Y
+B Y
+B Y
+A X
+A Y
+C Z
+C X
+B X
+C Z
+C X
+C X
+B Y
+C Z
+C Z
+B Y
+A Y
+B Y
+C Z
+C X
+C Z
+C Z
+C X
+A Y
+A Y
+C Z
+A Y
+C X
+C Z
+A Z
+A Z
+C Z
+B Y
+A X
+A X
+B X
+A Z
+C X
+C X
+C X
+C X
+A Z
+A Z
+C X
+B X
+B Y
+C X
+B Y
+B Z
+A Z
+A Y
+C X
+B Y
+B Y
+C Z
+B X
+B X
+C Z
+B Y
+C Z
+C Z
+B Y
+C Z
+C X
+C Z
+B Y
+C X
+C Z
+C Z
+C X
+B X
+C Z
+C X
+C X
+C Y
+C Z
+B Y
+C X
+C X
+A Y
+C X
+C X
+C Z
+C X
+C Z
+C Z
+C Z
+A X
+C Z
+C Y
+C Z
+C Z
+C Z
+C Z
+A X
+C Z
+B X
+C Z
+C X
+B Y
+C X
+A Z
+C Z
+C X
+B Y
+B Y
+A Z
+A Y
+C X
+A Z
+C Z
+C Z
+A Y
+A Z
+A X
+C Z
+A Z
+C Z
+C Z
+C Z
+A Z
+A Y
+A Z
+A Z
+A Y
+A Y
+C X
+A Y
+A Y
+C Z
+C Z
+C Z
+B X
+C X
+C Z
+B X
+C Z
+C Z
+C Z
+C Z
+C Z
+B Y
+C Z
+B Y
+C Z
+C X
+A Z
+C Z
+B X
+B Y
+C X
+B Y
+C X
+C X
+A Y
+C Z
+C X
+C X
+C Z
+C X
+C X
+C Z
+B Y
+B X
+C X
+B X
+B Y
+C X
+A Z
+B Y
+A Z
+B Y
+A Z
+A Y
+C Z
+C Z
+C X
+B Y
+A Y
+A Y
+C X
+B Y
+C X
+A Z
+A Z
+C X
+A X
+C X
+A Z
+C X
+C Z
+C X
+A Y
+C X
+B Y
+B Y
+C X
+A Z
+C Z
+C Z
+B X
+C Z
+C Z
+A Y
+C Z
+B Y
+A Z
+A X
+C Z
+C X
+B Y
+A Z
+C X
+B X
+A Z
+A Z
+C Z
+A Z
+C Z
+C Z
+A X
+C X
+A Z
+C X
+A Y
+B Y
+C Z
+B Y
+B X
+C Z
+A X
+B Z
+A Z
+A Z
+C Z
+A Z
+C Z
+A Z
+C X
+C X
+C X
+C X
+A Z
+C Z
+C X
+B Y
+A Z
+B Y
+A Y
+C Z
+A Z
+C X
+C Z
+B Y
+C X
+A Y
+B X
+A Y
+B X
+B Y
+C Z
+A Y
+B Y
+A Y
+B Y
+C Z
+C X
+C X
+C X
+C Z
+B Y
+C Z
+B X
+C X
+A Y
+A X
+B Y
+A Z
+C Z
+A Y
+A Z
+C X
+B Y
+A Z
+C Z
+C X
+C Y
+C X
+A Z
+A Y
+C X
+A Y
+C X
+C X
+A Z
+B Y
+C Z
+C X
+B X
+B Y
+A Z
+A Z
+B X
+B Y
+C X
+B Y
+C Z
+B Y
+C Y
+B Y
+B X
+B Y
+A Y
+B Y
+C Z
+B X
+B Y
+C Z
+A Z
+C Z
+B X
+A Y
+B X
+C Z
+B Y
+A Y
+C Z
+C Z
+C Y
+C Z
+A Y
+C X
+A Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C X
+C Z
+C Z
+B Y
+C X
+C Z
+B X
+C X
+C Z
+C X
+A Z
+C X
+C X
+C Z
+C X
+C X
+C Z
+A Z
+B X
+B Y
+C Z
+A Z
+C X
+B X
+B Y
+C Z
+C Z
+A Y
+C X
+C Z
+C X
+C Z
+B Y
+C X
+C Z
+C X
+C X
+C Z
+C X
+B X
+C X
+C Z
+A Y
+A Y
+A Y
+C Z
+C Z
+B X
+C X
+A Z
+C Z
+C X
+C Z
+B X
+C Z
+B Z
+C X
+A Y
+C Z
+A Y
+C X
+B Y
+B Y
+A Z
+C Z
+C Z
+C Z
+A Z
+C X
+A Y
+C Z
+A Y
+C Z
+A Z
+A Z
+B Y
+C Z
+A Z
+C X
+A Y
+C Z
+C Z
+C X
+C X
+C X
+A X
+B Z
+C Z
+C X
+A Y
+A Z
+C Z
+B X
+B Y
+C X
+C Z
+B X
+B Y
+C X
+B X
+C Z
+C X
+C X
+C X
+C X
+A Y
+A Z
+A Y
+B Y
+C Z
+B Y
+B Y
+C Z
+A X
+C Z
+B X
+C Z
+C Z
+A Z
+B Y
+C Z
+C Z
+A Y
+A Z
+A Z
+A Z
+B X
+C X
+C X
+B Y
+C Z
+C X
+B Y
+A Y
+C X
+C Z
+C Z
+C X
+C Y
+A Y
+A Z
+C X
+C X
+A Z
+B X
+C Z
+A X
+C Z
+C X
+C Z
+A X
+A Z
+C X
+B Y
+C Z
+C Z
+B X
+A Y
+B Y
+C Z
+C Z
+A Z
+A Y
+C Z
+C Z
+A X
+B Y
+C Z
+C Z
+B Y
+C X
+C Z
+B X
+B Y
+A Z
+C Z
+C X
+C X
+C Z
+B Z
+B Y
+C Z
+C X
+A Y
+C X
+A Y
+A Z
+B Y
+B X
+C Z
+A Z
+C Z
+C Z
+C Z
+A Y
+B Y
+A Z
+B Y
+C Z
+C X
+B Y
+C Z
+A Y
+C Z
+A Z
+C Z
+C Z
+C Z
+A Z
+C X
+B Y
+C Z
+A Z
+C Z
+C Z
+A Z
+C Z
+C X
+B Z
+C Z
+C Z
+A Z
+C Z
+C Z
+B Y
+B X
+C Z
+C Z
+B Y
+A Y
+C Z
+A Z
+A Z
+C Z
+C X
+C X
+B X
+C X
+A Y
+B X
+A Y
+C Z
+C X
+B Y
+C Z
+C X
+C X
+C X
+B X
+B Z
+C Z
+B Y
+C X
+A Z
+C Z
+C Z
+A Z
+A Z
+C Z
+C Z
+A Z
+A Z
+A Z
+C Z
+A Z
+C Y
+A Z
+C Z
+C Z
+C X
+C X
+C Z
+C Z
+A Z
+C Z
+A Z
+C X
+C X
+C X
+A Y
+A Z
+A Z
+A Y
+B X
+C Z
+C Z
+B X
+C Z
+C X
+B Y
+C Z
+C X
+C X
+B Y
+B Y
+A Y
+A Z
+B X
+C X
+B Y
+B Y
+B Y
+C Z
+C X
+C X
+A Y
+B Z
+A Z
+A Z
+B X
+C X
+A Y
+C X
+C Z
+C X
+A Y
+A Z
+C Z
+A Z
+C Z
+C X
+C X
+A Z
+B X
+B X
+B Y
+C Z
+C Z
+C X
+C X
+C X
+B Y
+C Z
+C X
+B X
+C Z
+C X
+B X
+A Y
+B Y
+C Z
+A Z
+A Y
+C Z
+A Y
+A Y
+C Z
+B Y
+C Z
+B Z
+C Z
+A Z
+C X
+C X
+C Z
+B X
+C X
+B Y
+C Z
+B X
+C Z
+C X
+B X
+B Y
+B Z
+B X
+A Y
+C X
+C Z
+C Z
+A Y
+B X
+A Y
+C X
+C Z
+B Y
+C Z
+C Z
+C Z
+A Z
+A Z
+A Y
+C Z
+B Y
+C Z
+C X
+B Y
+C Z
+C Z
+A X
+C X
+B Y
+A Z
+C Z
+C X
+A Z
+A Y
+C Z
+C Z
+B X
+C Z
+A Z
+A Y
+C X
+A Y
+C Z
+C X
+C X
+C X
+B Y
+C X
+A Y
+C X
+B Y
+B X
+A Y
+B X
+A Y
+B Z
+C Z
+A Z
+B Y
+B X
+C Z
+C Z
+C X
+B Y
+A Z
+A Z
+A Y
+A Y
+C Z
+A Z
+A Z
+B Y
+C X
+C Z
+C Z
+C Z
+A Y
+A Z