diff options
author | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
---|---|---|
committer | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
commit | 8777ff071f7bb37631baa7b6717ad29961e50911 (patch) | |
tree | 6d59c4ed58e454b960339c3d1151f0a879e8d7cb /racket/aoc2022/day-02 | |
parent | 6156a9ef7be4012063a042aafb4e9b0d7eadde8e (diff) | |
download | gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.tar.gz gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.zip |
sorting by language
Diffstat (limited to 'racket/aoc2022/day-02')
-rw-r--r-- | racket/aoc2022/day-02/day-02.ipynb | 193 | ||||
-rw-r--r-- | racket/aoc2022/day-02/day-02.pl | 72 | ||||
-rw-r--r-- | racket/aoc2022/day-02/prolog-input.txt | 2500 |
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 |