diff --git a/aoc-utils.sh b/awk/aoc-utils.sh similarity index 100% rename from aoc-utils.sh rename to awk/aoc-utils.sh diff --git a/day-1/awk/part-1.awk b/awk/day-1/part-1.awk similarity index 100% rename from day-1/awk/part-1.awk rename to awk/day-1/part-1.awk diff --git a/day-1/awk/part-2.awk b/awk/day-1/part-2.awk similarity index 100% rename from day-1/awk/part-2.awk rename to awk/day-1/part-2.awk diff --git a/day-1/awk/test.sh b/awk/day-1/test.sh similarity index 74% rename from day-1/awk/test.sh rename to awk/day-1/test.sh index d2d9c27..96ef6f8 100755 --- a/day-1/awk/test.sh +++ b/awk/day-1/test.sh @@ -19,10 +19,10 @@ set -e PATH="$(pwd):${PATH}" -source ../../aoc-utils.sh +source ../aoc-utils.sh -aoc_expect part-1.awk ../test-input.txt 24000 -aoc_expect part-2.awk ../test-input.txt 45000 +aoc_expect part-1.awk ../../input/day-1-example.txt 24000 +aoc_expect part-2.awk ../../input/day-1-example.txt 45000 -aoc_expect part-1.awk ../input.txt 68292 -aoc_expect part-2.awk ../input.txt 203203 +aoc_expect part-1.awk ../../input/day-1.txt 68292 +aoc_expect part-2.awk ../../input/day-1.txt 203203 diff --git a/aoc.el b/elisp/advent-of-code.el similarity index 82% rename from aoc.el rename to elisp/advent-of-code.el index e04637e..f874ab5 100644 --- a/aoc.el +++ b/elisp/advent-of-code.el @@ -25,7 +25,13 @@ (defmacro aoc-debug (expr) `(let ((e ,expr)) - (debug e) + (princ (format "%s\n\n" e) 'external-debugging-output) + (unless noninteractive + (debug e)) e)) -(provide 'aoc) +(provide 'advent-of-code) + +;; Local Variables: +;; read-symbol-shorthands: (("aoc-" . "advent-of-code-")) +;; End: diff --git a/day-1/elisp/solution.el b/elisp/day-1/solution.el similarity index 94% rename from day-1/elisp/solution.el rename to elisp/day-1/solution.el index 2b416c5..11ef9c4 100755 --- a/day-1/elisp/solution.el +++ b/elisp/day-1/solution.el @@ -17,15 +17,15 @@ ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . -(add-to-list 'load-path "../../") +(add-to-list 'load-path "../") (require 'ert) (require 'cl-lib) (require 'aoc) -(defvar input-file "../input.txt") +(defvar input-file "../../input/day-1.txt") -(defvar test-input-file "../test-input.txt") +(defvar test-input-file "../../input/day-1-example.txt") (defun eat (data) (let ((lines (string-lines data))) diff --git a/elisp/day-2/solution.el b/elisp/day-2/solution.el new file mode 100755 index 0000000..763736c --- /dev/null +++ b/elisp/day-2/solution.el @@ -0,0 +1,141 @@ +#!/usr/bin/env -S emacs --script + +;; -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 notroot + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(add-to-list 'load-path "../") + +(require 'ert) +(require 'advent-of-code) + +(defvar solution-example-input + "../../input/day-2-example.txt") + +(defvar solution-input + "../../input/day-2.txt") + +(defvar solution-shapes + '(rock paper scissors)) + +(defvar solution-outcomes + '(win lose draw)) + +(defvar solution-opponent-letter-to-shape-alist + '(("A" . rock) + ("B" . paper) + ("C" . scissors))) + +(defvar solution-player-letter-to-shape-alist + '(("X" . rock) + ("Y". paper) + ("Z" . scissors))) + +(defvar solution-player-letter-to-outcome-alist + '(("X" . lose) + ("Y" . draw) + ("Z" . win))) + +(defvar solution-shape-score-alist + '((rock . 1) + (paper . 2) + (scissors . 3))) + +(defvar solution-outcome-score-alist + '((win . 6) + (draw . 3) + (lose . 0))) + +;; Each shape points to another shape creating a cyclical list. +;; Each shape points to the shape that it beats, so deciding a game +;; outcome is a simple list search! + +(defvar solution-shape-outcome-alist + '((rock . scissors) + (scissors . paper) + (paper . rock))) + +(defun solution-decide-game (a b) + (cond ((equal a b) + 'draw) + ((equal (cdr (assoc a solution-shape-outcome-alist)) b) + 'win) + (t + 'lose))) + +(defun solution-shape-for-outcome (a outcome) + (pcase outcome + ('lose + (cdr (assoc a solution-shape-outcome-alist))) + ('draw + a) + ('win + (car (seq-find (lambda (c) + (equal (cdr c) a)) + solution-shape-outcome-alist))))) + +(defun solution-part-1 (input) + (let ((rows (seq-map (lambda (s) + (string-split s " " t)) + input))) + (seq-reduce (lambda (acc row) + (let* ((their-shape (cdr (assoc (nth 0 row) solution-opponent-letter-to-shape-alist))) + (our-shape (cdr (assoc (nth 1 row) solution-player-letter-to-shape-alist))) + (outcome (solution-decide-game our-shape their-shape))) + (+ acc + (cdr (assoc our-shape solution-shape-score-alist)) + (cdr (assoc outcome solution-outcome-score-alist))))) + rows + 0))) + +(defun solution-part-2 (input) + (let ((rows (seq-map (lambda (s) + (string-split s " " t)) + input))) + (seq-reduce (lambda (acc row) + (let* ((their-shape (cdr (assoc (nth 0 row) solution-opponent-letter-to-shape-alist))) + (desired-outcome (cdr (assoc (nth 1 row) solution-player-letter-to-outcome-alist))) + (our-shape (solution-shape-for-outcome their-shape desired-outcome))) + (+ acc + (cdr (assoc our-shape solution-shape-score-alist)) + (cdr (assoc desired-outcome solution-outcome-score-alist))))) + rows + 0))) + + +(ert-deftest solution-test-decide-game () + (should (equal (solution-decide-game 'rock 'paper) 'lose)) + (should (equal (solution-decide-game 'paper 'rock) 'win)) + (should (equal (solution-decide-game 'rock 'rock) 'draw))) + +(ert-deftest solution-test-part-1-example () + (should (equal (solution-part-1 (aoc-read-file-lines solution-example-input)) 15))) + +(ert-deftest solution-test-part-1-input () + (should (equal (solution-part-1 (aoc-read-file-lines solution-input)) 12740))) + +(ert-deftest solution-test-part-2-example () + (should (equal (solution-part-2 (aoc-read-file-lines solution-example-input)) 12))) + +(ert-deftest solution-test-part-2 () + (should (equal (solution-part-2 (aoc-read-file-lines solution-input)) 11980))) + +(when noninteractive + (ert-run-tests-batch-and-exit)) + +;; Local Variables: +;; read-symbol-shorthands: (("solution-" . "advent-of-code-day-2-") ("aoc-" . "advent-of-code-")) +;; End: diff --git a/day-1/test-input.txt b/input/day-1-example.txt similarity index 100% rename from day-1/test-input.txt rename to input/day-1-example.txt diff --git a/day-1/input.txt b/input/day-1.txt similarity index 100% rename from day-1/input.txt rename to input/day-1.txt diff --git a/input/day-2-example.txt b/input/day-2-example.txt new file mode 100644 index 0000000..25097e8 --- /dev/null +++ b/input/day-2-example.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z \ No newline at end of file diff --git a/input/day-2.txt b/input/day-2.txt new file mode 100644 index 0000000..41022db --- /dev/null +++ b/input/day-2.txt @@ -0,0 +1,2500 @@ +B Y +A X +B Y +A Y +A Z +B Y +B Z +C Y +A X +C X +A X +B Y +C Y +B Y +B Z +C X +C Z +A X +B Y +C Z +C Y +B X +B Y +A X +B Z +B Z +B Y +C Z +B X +B Z +C X +B Y +B Y +B Y +B Y +C X +C X +B Z +C X +B Z +C X +B Y +C X +B X +B Z +B Y +C Y +B Y +A X +B Y +B Y +C Y +B Z +B Y +B Z +C Y +B Y +A X +C X +C Y +B Y +A Z +A Z +A X +B Z +A X +A X +B Z +C Y +C Z +B Z +B X +C Y +B Y +C Y +C X +C Z +A X +B X +B Y +B Z +B Y +A X +B Z +B Y +B Z +B Z +B Y +A X +B Y +C X +A X +B Y +C X +A X +C Y +B Y +C Z +A X +B X +C X +B Z +A X +B X +B Y +B Y +B X +B Z +B Y +C Y +B Y +B Y +A X +C Y +C X +B Y +B Y +C Y +B Y +B X +B Z +B Y +B Y +C Y +B Z +B Y +B X +A X +B Z +A X +A X +B X +B Z +B X +B Y +B Y +B Y +B Y +C Y +C X +C Y +B Y +B Z +B X +B Z +C Z +C X +B Z +C X +B Y +C X +C Y +B Z +C X +C X +B Z +B Y +B Y +B Y +B Y +B Y +B Y +A X +A X +B Y +C X +B Y +B Z +B X +B Z +A Z +A X +C X +B X +A X +A X +C Z +A Z +B Y +A X +C X +C Y +C Y +A X +B Y +A X +B Z +C X +B Z +B Y +B Y +A X +C X +C X +B Y +A X +A X +C X +B Z +B Y +A X +A X +B Y +B Y +B Y +B Y +C X +B Z +B Y +B Y +A Y +B Y +B Z +A Y +B Y +C Y +B Z +B Y +B Y +C Z +A X +B Z +C X +C X +B Y +B Z +B X +A X +B X +B Y +B Z +B Z +B Z +B X +B Y +B Y +C Z +A X +C X +B Y +B X +C Y +B Y +B Y +A X +B Z +B Z +B Y +B Y +B Z +B Y +C Y +C Y +B Y +B Y +B Y +A X +A X +C Y +C Z +C Z +A Y +C Y +B Z +B Y +B Y +C Y +A X +B X +A Z +A Y +B Y +C X +B X +B X +A X +B Y +B X +C Y +B Y +B Y +B Y +B Y +B X +B Y +C X +C X +A X +B X +B X +B Y +C Y +B Z +C Y +B X +C X +C Y +B Z +C Z +A Y +B Y +A Z +B Z +C Y +A Z +B Y +C X +B Y +B Z +B Y +A X +B Y +B Y +C Y +C Y +A X +B Y +A X +C Y +B Y +C X +A X +C X +B Z +B X +B Y +B Y +B Y +B Y +B Y +C Y +A Z +C X +B X +B Z +B Y +B Y +B X +B Y +B Z +B Y +C Y +B Y +B Y +B Y +B X +B Y +B X +A Z +B Z +C Y +B Y +B Z +B X +B Z +A X +B Y +A X +B Z +B Z +C Z +B Y +B Y +B X +B Y +B Y +C X +B Z +B Z +B Y +B Z +B Y +B Z +A X +C X +C X +B Y +C Z +B X +B X +B Y +C X +C Y +B Y +C X +C Y +B X +B Z +A X +B Z +B Z +C Y +B Z +C X +B Y +C X +A X +A X +C Z +C X +B Y +C Y +B Z +C X +A X +C Y +B Z +B Y +C X +C Z +B X +A X +B Y +A X +B Y +C X +B Z +C Y +C X +B Z +B Z +B X +C Z +B Y +B Z +C X +B Y +B Y +B Y +C Z +B Y +B X +B X +C Z +B Z +A X +B Y +B Z +B Z +C Y +C Z +A Y +B Y +B Y +A X +B Y +C Z +A X +C X +B Z +C X +B Y +B X +B Y +B Y +C Y +A Z +B Y +C Z +B Z +C Z +B Z +A Y +A X +B Z +B Y +B X +B Y +B X +C X +C X +C X +B Y +C Y +B X +B Y +B X +C Y +A Z +B Z +B Y +B Y +B Y +B Y +C X +C X +A X +B Y +B Z +B Z +C Y +B Y +A X +C Y +C Y +B X +B X +A X +C X +C Y +B Z +A X +B Z +C X +B Y +B Y +C Y +B Y +C Y +A Y +B Y +B Y +B Z +A X +B Y +B Z +C X +B Z +B Z +B Y +B Y +B X +B Y +C Z +B Z +B Y +B Y +A X +B Y +B Y +B Y +B Y +B Y +B Y +C Y +B Z +B Y +C Y +A Z +C Y +B Y +C X +C Y +C Y +B Z +B Z +C Y +C X +B Z +B Y +B X +A X +A X +C X +B Z +C X +B Z +A X +B Y +B Y +C Y +A X +B Y +B Y +A X +A X +A Z +C Z +C X +A X +B Z +B Y +C Y +C Y +C Z +B Y +A X +B X +B Y +C X +C Y +B Z +C Y +B Y +B Y +B Y +B Z +B Z +B Y +B Y +C X +A X +B X +B Y +A X +B Y +B Z +B X +C X +B Y +B Y +B X +B Y +C Y +C Y +B Y +B Y +B Y +A X +C Y +B Y +B X +C Y +A X +B Y +A Y +A Z +B Z +B X +A X +C Y +C Y +B Z +A Y +B X +B Y +A X +C X +B Y +C X +B Z +B Z +C X +B Y +B Z +B Y +B Y +B Z +B Y +B X +B Z +C X +A X +C Y +C Y +B Y +B Z +A X +B X +C Y +A X +A X +A X +C X +B Z +B Y +C Z +B Y +B Y +C X +B Y +A X +A X +B Y +B Z +C X +C X +C X +A X +B X +C Z +C Y +B Y +C X +C X +B Y +B Y +C Z +A Z +A X +B Y +B X +A X +A X +B Y +B X +B Y +C Y +A Y +C X +B Y +B Z +B Y +B Z +C Z +B X +B Y +A X +B Y +B Y +C Z +A X +B Y +B Y +B Y +A X +C Y +A X +B Y +C X +C Y +C X +B Y +B Z +B Y +B Y +C X +C Y +B Y +C X +C Y +B Y +B Z +A X +A Z +B Y +C X +B X +B Y +C X +A X +A X +C Y +C Z +C X +C Y +A Y +C Y +C Z +C X +B Y +C X +A Z +B X +C X +B Y +B Z +B Z +B Y +C Y +B Z +B Y +B Z +A X +C X +B Z +C X +B Z +C X +C Y +C Y +C Y +B X +C Z +B Y +B Z +B Y +C Y +B Y +A X +B Y +C X +A Y +A Z +A X +B Y +C X +B Z +B Z +C X +A X +B Y +A Z +B Y +C X +B Z +B Y +C X +A X +B X +C Y +C Z +C Y +C Y +A X +B X +B Y +C Y +B Y +A X +B Y +B X +B Y +A X +B Y +B X +C Z +B Y +C X +B Y +A X +B X +B Z +B Y +A X +C X +B X +C X +B Y +A X +C X +B Y +A X +B Y +B Y +A X +B Y +B Z +A X +B Y +B X +C Y +B X +B Z +C X +B Y +C Z +B Y +C X +C X +A X +B Y +C Z +B Z +B Y +B Y +B Z +B Y +B X +B X +B Z +C Y +C Z +B Y +A X +B Y +B Y +C X +C X +B Z +A X +B Y +B Y +B Y +C X +B Y +B Y +C Y +B Z +C X +B Z +B X +B Y +C X +C X +A X +C X +B Y +C Y +B Y +C Z +A X +B Z +B Y +B Y +B Y +C X +C Y +B Y +B X +C X +B Y +A X +B Y +C X +A X +A X +C Y +B X +B X +B Z +B Z +B X +C Y +B Y +B Y +B Y +C X +C Y +B Z +B Z +C Z +B Y +B Y +A Z +C Y +C X +B Z +A X +A X +C X +A X +B X +B Y +B Z +B Y +A X +B Z +B Z +B Y +B Y +C Z +A X +C Y +B Y +B Y +B Z +B Y +C X +B Z +A X +B X +A X +B Y +C X +A X +C X +B Y +A X +C X +B Y +A X +B X +A Y +B Y +B Z +C Z +B Y +B Z +C X +B Z +B Y +C X +B Y +B Y +B X +A X +A Y +A X +B Y +B X +C X +B Y +B Y +B Z +C Y +A X +B Z +A X +A X +A X +A X +C Y +B X +C X +C X +A X +B Y +C Y +A X +A X +C Y +C X +C Y +B Y +B Z +A X +B Y +B Y +B Z +B Y +B X +C Y +C X +C Y +C X +B Y +A X +B Y +A X +C Y +C X +C Y +C X +C Y +B Y +B Y +A Z +A X +A X +B Z +A X +B Y +B Y +A X +A X +C Y +C Y +C Y +A X +B X +C X +B Y +A X +B X +B Y +C Y +A X +B X +B Y +B Y +B Y +C X +C X +B Y +B Y +A Z +B Y +A X +B Y +B Y +B Y +B Y +A X +B Z +C X +B Z +B Z +C Y +B Z +A X +A X +B Y +A Y +A X +A Z +C Y +C X +C X +C Z +C X +C Y +B X +B Y +A X +B Y +A X +C X +B Y +A Y +B Y +B X +B Y +A X +B Y +B Z +B Z +B X +B Z +C X +A X +B Y +B Y +B Y +A X +C X +C X +C X +B Y +C Y +A X +B Y +C Y +B X +B Z +A X +B Y +A X +C X +C Y +C Y +B Y +C Y +C X +B Z +B Y +B Y +A X +A X +B Y +B Y +B Z +C X +C X +C Y +C X +C Z +A Z +C X +B Y +A Z +B Y +A X +B Y +C X +B Y +B Y +B Z +C Y +B Y +A Z +A X +A X +C X +A Y +B Y +B Y +A X +A X +B Z +B Z +B Y +C X +C Y +C Z +A Z +B Z +A X +A Z +A X +C Y +C X +A X +A X +C Z +C X +A X +C Y +C X +A X +B Z +B Z +B Y +B Y +B Y +B Y +B Y +C Y +C X +B X +C X +B Y +B Y +A X +B Y +A X +A Y +B Z +B Y +A X +A Y +B X +B Y +C Y +B Y +C X +C Z +B X +B Z +B Y +C Z +B Y +C Y +A X +B Y +B Y +B Y +B Z +C Y +A Z +C X +B Y +B Z +C X +B Y +A X +C Y +B X +C X +A X +B Y +B Y +C X +B X +B Y +B Z +B Y +A X +B Y +B X +A X +A X +A X +B Y +C Y +C X +B Y +A X +A Z +B Z +A X +C X +B Y +B Y +C Y +B Z +B Y +C X +C Y +B Y +C Y +B Y +B Y +C X +A X +A X +A X +B Y +B Y +B Y +C X +A Z +B Y +B Z +B X +B Z +B Y +B Y +C X +A X +B Y +B Y +B X +B X +C X +C X +A X +C Y +B Y +C X +B Y +C Y +C X +B Y +C X +B Y +A X +B Z +C Z +C Y +A X +B Z +A X +C Y +C Y +B Z +B Z +A X +C X +B Y +C Z +B X +B Z +B Y +B Y +B Y +C Y +B Y +C X +A X +B Y +C Y +B Y +A X +B Y +B Y +C X +A X +B X +B X +B Z +C Z +B Y +C Y +C Y +B X +C X +C X +B Z +B Z +C X +C X +B Y +C X +B Y +B Y +B Z +B Y +B X +B Y +C X +C Y +C Y +B Y +A X +B Y +A X +C Y +C Z +C X +C Y +B Y +B Y +B Z +B Z +A Y +C X +B Y +B Z +A Z +B X +C X +B Y +B Z +B Y +C X +A X +B Z +C X +B Z +B Z +B Z +B Y +C X +B Y +B Y +B Y +A Z +B Y +B X +C X +B Y +C Y +A Z +B Z +A X +A X +B Z +A X +B Z +A X +A X +C X +C X +A Z +C X +B Z +B Z +B Y +B X +B Y +B Y +B Z +B Y +C Y +A X +C Y +B X +B Y +B Z +C X +A Z +A X +B Y +A X +A X +C X +A X +B Y +A Z +B Y +C Y +A X +B Y +A X +B Z +A Z +C X +B Z +B Y +B Z +B X +A X +B Z +C X +B X +B Z +B Z +C X +C X +C X +B Y +B Z +C X +B X +B Y +C Y +B Z +A Z +C X +B Z +B Z +B X +C Y +B Z +B Y +A X +B Y +B X +B Y +B Y +B Y +B Y +B Z +A X +B Y +B Y +B Y +B Y +C Y +A Z +C X +B X +A Y +B Y +A X +A X +B Y +A X +C Z +B Z +C Z +B Y +C Y +A X +C Y +C Y +C Y +B Y +C Y +B X +B X +C Y +A X +C Y +C X +C X +B Y +B Z +B X +B Z +B Z +B Y +C Y +B Y +C Y +B Y +B Z +B Y +A X +B Y +C Z +B X +B Y +C Z +C X +B Y +C Y +C X +A X +B Y +A X +B X +B Z +B Y +B Z +C X +B Y +A X +B Z +B Y +B Z +B X +B Z +B Z +A X +A Z +B Y +C Y +A X +B Z +B X +A X +A X +C X +B Y +C X +C Z +B Z +B Z +B Y +C Y +C X +B Y +B Y +A X +B Y +C Z +B Y +B Y +C Y +B X +B Y +B Y +B Z +B X +B Y +B X +B Y +B Z +B Z +B Z +B Z +B Z +C Y +B Y +C Y +A Y +C Y +C Z +A X +B Y +C Y +B Y +A X +C Y +B Z +A X +A X +B Z +C Y +B Y +C X +B Z +B Y +A X +B Y +C X +B Y +B Z +A X +C X +B X +B Y +A Y +C Y +C X +B Z +C Z +B X +B X +C Y +A X +A X +B Y +C Y +C X +C Y +B Z +C X +B Y +B X +B Y +C X +B Z +B Z +B Y +C X +C Z +B Y +B Z +B Z +B Z +A Y +B Y +A X +B Z +C X +C Z +A X +B Y +C X +A X +C Y +C Y +B Y +B Y +B Y +B X +B Y +B Y +C X +A X +B X +B Z +C X +B Y +C X +C Y +B Y +A X +B Y +B Y +A X +B Y +A X +C X +A X +B Y +A Y +A X +B Y +C X +C Y +B Z +A X +B Y +C X +A X +B Z +C Y +A X +C X +B Y +C X +C Z +B Y +B Z +C Z +C Y +B Y +B Y +B Y +B Y +B Y +B Y +A X +A X +B X +A X +C Y +B Z +B Y +B Y +B Y +B Y +C X +B Z +A X +A X +B X +B Y +B Z +B Z +B Y +C X +A X +B Y +B Y +B Y +B Y +A X +B Z +C Z +B Z +B Y +A X +A X +B Z +B Y +B Y +B Y +C X +B Z +B Y +B Y +B Y +B Z +C X +A X +B Z +C X +B Z +A X +A X +A X +C X +C X +B Z +C X +C X +C X +B Y +B Y +C X +A X +C X +C Y +B Z +B Y +B Z +A X +B Y +B Z +B Y +A X +B Z +B Y +B Z +A X +B Y +B X +C Y +C Y +B Y +C Y +C X +B Z +B Z +C Y +A X +B Y +B Y +C Y +C Y +A Z +B Y +B X +C X +B Y +C X +C Z +C X +C X +C Y +A X +C Z +C Z +B Z +B Y +A X +B Y +B Z +B Z +C Y +C Y +B Y +B X +B Z +A X +C X +C X +A X +B Y +C Y +C X +B Y +B Z +A Y +B Y +B Y +B Y +B Y +C Y +B Y +C Y +B Z +C Y +B Y +B Z +B Y +B Y +C X +C X +B Z +B Z +B Z +B Y +B Z +A X +A Y +C X +B Z +A X +A X +A X +C Y +A X +B Y +A Y +B Y +B Y +C X +B Y +B Y +A X +B X +A X +B Y +B Y +B X +A X +B X +B Z +C X +A X +B Y +B Z +C Y +C Z +B Y +C Y +C Z +B X +B Y +C Y +A X +B Y +C Y +C X +B X +C X +A X +C Y +C Z +B Y +A X +C Z +C X +B Y +B Y +C Y +C Z +C Y +A X +A X +C Y +A Y +A Z +A Y +C X +C Y +B Z +B Y +B Y +B Z +A X +C X +C X +B Y +A Z +B Y +B X +B Y +B Y +C Y +C Z +A Y +B Y +B Y +B Y +B Z +B Y +C Y +B X +B Y +C X +A X +B X +B Y +B Y +A X +B Z +C Z +C X +B Y +A X +A X +C Y +B Y +A X +B Y +B Y +C Z +A X +A X +B Z +C Y +B Y +B Y +A X +B Z +A X +C Z +B Y +A Z +B Y +A Z +C Z +B Z +B Y +C Z +B Y +C Y +A X +B Y +B Z +C Y +A X +C Y +C Z +B Z +A Z +B X +A Z +C Z +A X +C X +B Y +B Y +B Y +B Y +B Y +B Y +C X +B X +B Y +C X +B Y +C Y +A X +B Y +C X +A X +B Z +B Y +A X +B Y +C X +C X +B Y +A X +B Y +C X +C X +B Y +B Y +B X +C Y +B X +C X +A X +B Y +A Z +B X +B Z +A Z +A X +B Y +C Y +B Y +B Y +B Y +C Z +A X +B Z +C Y +C Y +C X +A Z +B X +C X +C Z +B Y +B Y +C Y +C X +B Y +C Y +B Y +C Y +B Z +C X +B X +B X +C Y +B Z +B Y +B Y +B Z +B Y +A X +C Y +B Y +B Y +B Z +B Y +C X +B Y +C X +B X +A X +A X +C X +B X +B Y +B X +A X +C X +B X +B Z +B Y +A X +A Y +B Y +C Y +B Y +A Z +B Y +B Y +C Y +A X +C Y +B Z +C X +C X +A X +C Y +C Y +A Y +B Y +B Z +B Y +C X +B X +C Y +C Y +A Y +C Y +B Y +B X +B Y +C Y +B Z +C X +B Y +C Y +B Y +B Y +B Y +A X +C Y +A X +B X +B X +C X +C Y +B Y +A Z +B Y +A X +B Z +B Y +C Z +B Y +C X +C X +C X +C X +B X +C X +B Z +A X +C Z +B Y +A X +C Y +A Z +B Y +C Y +B Y +B Z +A X +B Y +B Y +B Y +A X +B Z +C Y +B Y +B Y +B X +B Y +B Y +A Z +C Y +B X +C X +B Y +B Z +B Y +B Y +C X +B Z +B Y +C Y +B Y +B Y +A X +C X +A X +B Z +A X +C X +B Z +A X +B Z +C Z +A X +B Z +C X +B Y +B Y +B Y +C X +B X +A X +B Y +B Z +C X +B X +B Z +C Y +B X +B Y +C Y +B Y +C X +B Z +A Z +B Y +B Z +C X +B Z +B Y +C Y +C Y +A X +C Y +B Y +A Z +C X +C X +C X +B Y +C X +B X +B Y +B Y +A X +A X +B Z +A X +C Y +C X +B Y +C Z +B Y +B Y +C X +B Z +C Y +A X +B Y +A X +A X +B Y +B Y +B Y +B Z +A Z +B Z +B Y +A X +C X +A X +A Z +C Y +A X +C X +C X +A X +C Z +B Y +B Y +B X +B Y +C X +A X +A X +B Y +A Z +C Z +B Z +B Y +B Y +B Y +C Y +C Y +B Y +A X +B Y +B Y +C Z +B Y +A X +C Z +B Y +C X +B X +B Y +B Z +C X +C Y +B Y +B Z +B Z +A X +A X +B Y +B Y +C Y +C X +C X +A Z +C Z +B Y +B Y +A X +B Y +B Y +A X +C Y +C X +C X +C Y +C Y +B X +B Z +C X +B Y +C Y +B X +B Y +A X +C Z +C Y +C Y +A X +C Z +C X +B Y +B Y +C Y +C X +C X +C X +C Z +C Y +A X +B Y +C X +B Y +B X +C X +B Z +C X +C Z +B Z +B Y +A X +B Z +B X +C Y +B X +B Y +B Z +B Y +A Y +B Y +A X +A X +B Y +A X +C X +C Z +B Z +B Y +B Y +B Y +A X +C Z +B Y +C Z +C X +A X +B Y +A X +B Y +C Y +B Y +A X +B Y +C Z +B Z +A Y +C X +A X +A Z +C X +B X +B Y +B X +C Y +B Y +B Y +C Y +C Y +B Y +A X +B Y +B Y +B Y +C X +C Y +B X +B X +B X +A X +B Z +B Y +C Y +B Y +C X +B X +C X +C X +B Y +C X +B Z +B Z +C X +B Y +B Y +B Z +C X +C Z +B Y +A X +A X +A Y +C X +B Z +B X +B Y +B Y +C X +B Z +A X +C X +A Y +A X +C X +C Z +B Y +B Y +B Z +C X +B Z +B X +A Z +C Z +A X +B Y +A X +B Z +A X +B X +B Z +B Y +B Y +C X +B Y +B Y +A X +B Z +C Y +C X +B Y +C X +A Y +B Y +B Y +B Y +B Z +C Y +B Y +C X +B Y +A Z +C X +B X +A X +C Z +B Y +A X +B Z +B Z +C X +A Y +A X +B Z +B Z +B X +B Z +C Z +C Y +B Y +C X +B X +B Y +A Y +C X +B Z +B Y +C X +B X +C X +A X +B Z