diff --git a/02/input-small.txt b/02/input-small.txt new file mode 100644 index 0000000..25097e8 --- /dev/null +++ b/02/input-small.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z \ No newline at end of file diff --git a/02/input.txt b/02/input.txt new file mode 100644 index 0000000..d779263 --- /dev/null +++ b/02/input.txt @@ -0,0 +1,2500 @@ +B Z +A Y +A Y +B X +A Y +B X +A X +B X +B X +B X +C Y +C Y +A X +A Y +A Y +B X +A X +C Y +B Z +A X +B Z +C Y +C Z +A X +C Z +A Y +A X +B Z +B X +A Z +B Z +A X +A Z +B X +B X +C Y +B X +A X +A Y +C Y +B Z +C X +A X +B Z +B Y +B X +A Z +B Z +B Z +A X +B Z +B X +C X +A X +B X +B X +B Z +B X +B Z +A Y +B Z +B X +C Y +A Y +C Y +B Z +A Y +B X +A Y +C Y +A Y +B Z +B Z +C Z +B X +A X +C X +B Y +A Z +C Z +B Z +A Y +A X +B Z +C Z +B X +B Z +A Y +B X +A Y +A Y +A X +C Y +B X +B Z +C Y +B X +B X +C Z +C Y +C Y +A X +B Z +A X +A X +B Y +A Y +B Z +B Z +B Z +A Y +A X +A Y +B X +B Z +A X +B X +B X +C Y +B Z +A X +A Y +B Z +A X +B Z +A Z +A Y +A Z +B Z +A X +A Z +A X +C Y +A Y +A X +B Z +C Z +B Y +B Z +B X +A X +C Y +B Z +B Y +B X +B X +A X +C Y +A Y +B X +A Y +A Y +A Y +B X +A Z +A Y +B X +A X +A Z +B X +B X +C Z +C Y +B X +B X +A Y +C Y +C Y +A X +B Z +B Z +A Y +C Y +B Z +A Y +A Y +A X +B Z +B X +A X +A X +B X +A X +B X +A X +B X +A X +B Y +B Z +A X +B X +B X +B Z +A X +B Z +A Y +B Z +A X +A Z +B X +A X +A Y +C Y +C Y +B Z +A X +C Y +A X +B X +A Y +A X +B X +B X +A Y +A X +A X +A Z +C Y +A X +B X +A X +A X +A X +A Y +A Y +C Z +C Z +A Y +B Z +A X +B X +C Y +B Z +B Z +C Y +C Y +A Y +A Y +A Y +A Y +C Z +A Y +B Z +B Z +C Z +C Y +C Y +C Y +C Y +C X +A X +B Z +B Z +B Z +B Z +C Y +B Z +A X +A X +A X +B Z +A Y +C X +B Z +A X +A Y +B Z +C Z +B X +A X +B Z +A X +A Y +B X +C Y +B X +B Z +A X +B X +B X +A X +B X +B Z +B X +A X +B X +B X +B X +B Z +B X +B Z +C Y +A X +A X +C Y +C Z +A Y +B Z +B Z +A X +B Z +A Y +A X +A Y +A Y +A Y +B Z +C Y +A X +A Y +A Z +B X +A Z +B X +B X +B X +A X +A X +C Y +B X +A X +B Z +A Y +A Y +A X +B Z +A Y +B X +A Y +B Z +C Y +A Y +C X +B X +B Z +C Y +A Y +A X +A X +B Y +C Z +B Z +A Y +A X +A Y +A X +A Y +A Y +A X +A Y +A Z +B X +A X +C Y +A X +C X +A Y +A X +A Y +A X +A X +B X +A X +B Z +A X +C Z +B Z +B Z +A Y +B X +B X +A Y +B X +B X +C Y +A Y +C X +C Y +B Z +A Y +A X +C Z +A X +B X +B X +C X +A Y +B Z +A X +A Z +C Y +B Z +C Y +C X +A Y +B Z +B Z +A Y +B Z +B X +B X +B Z +B Z +B X +C Y +A Y +A X +A Y +B Z +A X +A Y +A Y +A X +B X +A Z +A X +B Z +B Z +A X +C Y +C Y +A Y +A X +A Y +B Z +B Z +B X +B Z +A Y +A X +A Y +A Y +A Z +C Y +C Z +A X +C Y +A Y +A X +A Y +A X +C Z +B Z +B X +B X +B X +A X +A Z +B Z +B X +B X +B X +B X +B X +B X +C Y +B X +B Z +A X +C Z +A X +C X +B Z +A X +A Y +A Z +C Y +B X +C Z +C Y +A Z +B Z +C X +A Y +A Z +B Z +B Z +B Z +A X +A X +B X +A X +B Y +A X +A Y +A Y +B X +A Y +B X +C Z +A Y +C Y +A X +A X +A Y +B X +B Z +A X +B X +B Z +A Z +C Z +B Z +B X +A X +A X +B X +A X +A Y +A Y +B Z +A X +A X +A X +A X +C Y +C Z +A X +A Z +A X +B X +A X +B X +B Z +B X +C Y +B Z +A X +B Z +A Z +A Y +A Y +A X +A X +B Z +A Y +A X +A X +B X +B Z +A Z +A Y +A Z +B X +B Z +A Y +A Z +B X +B Z +A Z +A Y +A Y +A X +A Y +B Z +A Y +A X +A X +A Y +A Y +A X +A Y +A X +C Y +B Z +B X +B X +B X +A X +B Z +B Z +A X +B Z +A Y +C Y +C Y +A Y +B Z +B X +C Y +A X +A Z +B X +B X +C Y +A X +B X +B Z +A Y +A X +B Z +A Y +A Y +C Z +B Z +B Z +A X +C Y +A Y +A Z +A Y +C Z +B Z +A Y +C Z +B X +A X +B X +B X +C Y +A Y +B Y +A Y +B X +A Y +A Y +B X +B Z +B X +A Y +A Y +C Y +C Y +A Y +C Y +A Z +B Z +A X +A Z +A X +C Y +A X +A X +B Z +B Z +C X +C Z +A X +C Y +B Z +B X +A Y +A X +A X +B Z +A X +A Y +A Y +A X +B Z +C Y +A Y +B Z +A Y +B X +A X +A X +A Y +A X +B Z +C Y +A X +A Z +B Z +B Z +A X +C Y +A X +B X +A X +A X +B X +A X +B X +B Z +C X +A X +C Y +C Y +B Z +B X +C Y +C X +A Y +B X +A Y +B Z +C Z +B Z +A Y +A X +B X +A Y +A Y +B Z +B X +A Y +B X +A X +A Y +B Z +B X +A Z +A Y +A X +A Y +B Z +B Z +A X +A X +B Z +A X +B Z +A X +B X +B X +A X +A Y +B X +A Y +A X +B X +B X +B Z +B X +C X +B Z +A Y +B Z +A Y +A X +B Z +B X +B X +C Y +B X +B X +A X +A Y +A X +B X +C Y +C Z +A X +B X +B X +A Y +B Z +B X +A X +B X +C X +A Y +A Y +A Y +A Y +C Y +A Y +A Y +A X +A Y +B X +A Z +A X +B Z +B X +A X +B Z +A X +B Y +A X +A X +A Y +B X +B Z +C X +A X +A X +A Y +B Z +C Z +A X +C X +B Z +B X +B X +B Z +B Z +A X +C Z +A Y +A Y +B Y +B X +B Y +A X +B Z +B Z +A X +B X +A X +B Z +A Y +A Y +B Y +A Y +A Y +A X +B X +A X +B Z +B X +B Z +C Y +A X +B Z +A Z +A X +A X +B X +B X +A Z +B X +A X +A Z +A X +A Z +A Y +A X +A Z +C X +A X +C Y +B X +A X +B X +B X +B X +B X +A X +B Z +B X +A Y +B X +A Y +B X +B X +A Y +B X +A X +A X +A Y +B Z +A Z +B Z +C Y +B Y +A Y +A X +A Y +B Z +A X +B Z +B X +A X +B X +B X +A X +A Y +B Z +C Y +A Y +B Z +C Y +A X +C Y +A Y +A Y +A X +C Y +A Y +B Z +B Z +A Y +B Z +B Z +C Y +A X +A Y +A Y +C Z +A X +A Y +A Y +A X +A Y +B X +A Y +A X +A Y +B X +B X +A Y +A Y +A Y +C Y +A X +A X +B X +A X +B Z +C Y +B Z +C Y +A X +C Z +C Y +B Z +B Z +A Y +B X +B Z +C Y +A X +A X +A X +B Z +A X +A Y +B Z +C X +C Y +A Z +A X +C Y +A X +A X +B X +C Y +A Z +B Z +C Y +B X +A X +A X +C Y +A X +A X +B Z +B X +A X +A Y +B X +A X +A X +B X +C Y +A Y +C Z +A Y +B Z +A X +B X +B X +A X +B X +B Y +A X +C Y +A Y +A Y +B X +A Y +B X +B Z +A Y +C Y +C Y +A Z +B Z +C Z +B Z +A Z +A Y +B Z +A X +B Z +A Z +A Z +B Z +B X +A X +A X +A X +B X +A X +A Y +C Y +B Z +B X +A X +B Z +B X +B Z +A X +B X +B X +B X +A X +B Z +A X +B X +A X +C Y +A X +A Y +A Z +C Y +A Y +A X +C Y +B Z +A X +B Z +A X +B Z +B Z +B Z +C Z +A Z +B X +A X +A Y +A Y +A Y +B X +C X +A Y +A X +A X +C Y +A Y +A Y +B X +C Y +A Z +A Z +A Y +C Y +B Z +A Z +C Y +A X +B X +B X +B X +A X +C Z +C Y +B Z +B Z +A X +A Y +A Y +A Y +C X +A Z +A X +B X +B Z +B Z +A Z +A X +B Z +A Y +B Z +C X +A X +B Z +A Y +A Y +A X +B Z +B X +A Y +A Y +A Y +A Y +A Z +A X +C Y +A Y +A Y +C Y +C Y +B X +C Y +A X +A Z +B Z +C Y +A Z +A X +A Z +A Y +C Y +B Z +A Y +B X +B X +A X +B X +A Z +B Z +A X +A X +C Y +A Y +C Y +C Y +B X +A X +C X +B X +B Z +A Y +B Z +A X +A Y +B Z +B Z +A Y +A Y +A X +A Y +B Z +A Y +B Z +C Y +C Y +B X +A Z +A Y +C Y +B X +B Z +B X +C Y +B Z +A Y +A Y +B Z +A X +A Z +B X +A X +C Z +B X +B X +B X +C X +C Y +B X +A Y +B Z +B X +B Z +C Y +A X +A Y +A X +B X +B Z +B Z +A X +B X +C Y +C X +B Z +A X +A Y +B Z +B Y +C Y +C Y +A Y +B Z +B X +A Y +B Z +A X +A X +A Y +B Z +A Y +A X +B Z +A X +C Y +A Y +C Z +B Z +C Y +B Z +A Y +C Y +A X +A Y +B X +B Z +B X +B Z +A Y +B X +A Y +B Z +A Y +C Y +A X +A X +B Y +B X +A Y +C X +B Z +B Z +A Y +C Z +B X +A X +A Y +B Z +C Y +C Y +A Y +A Y +B X +C Y +A Y +B X +A X +B X +B Z +A X +A Y +B X +B X +C Y +B Z +A X +A X +B X +C Y +B X +A X +A X +B X +C Z +C Y +B X +B Z +A X +A Y +C Y +A Y +A Y +A Y +B X +C Y +B X +A X +A Y +A X +B Z +A Z +B X +A Y +B X +A Y +B X +B Z +A X +A X +B Z +A X +A Y +B X +B Z +B Z +A X +A Y +A Y +A X +A X +B X +B Z +B Y +A X +C Y +A Y +C Y +A Y +C X +B X +B X +A X +B Z +A X +C Y +B X +C Y +A Z +A X +B Y +A X +B X +B Z +A Z +C Y +A Y +A Z +A Y +A X +A Y +A X +A X +A X +B Z +B Z +C X +A X +C Z +B X +C X +B Z +B Z +A Z +B X +A Y +B Z +C Y +A X +C Y +C Y +B Z +A Y +A Z +A X +B Z +B X +C Z +C Y +A Y +C Z +B X +B Z +C Y +A X +B X +C Z +B Z +C Y +B X +A Y +B Z +C X +A Z +A X +A Y +B Z +B X +B X +B X +B Z +A Z +A X +B Z +B X +A X +A Y +B X +B X +A X +A X +B X +B X +C Y +A Y +C Z +A Y +A Y +A X +B X +B Z +A X +B X +A X +B X +A Y +C Y +A Y +A X +A Y +A Y +C Y +B Z +B Z +A X +A Y +C Y +C Y +A Y +A X +A X +C Y +B X +A Y +B Z +C Y +B Z +A X +A Y +A X +B Z +B X +C Y +A Z +C X +A Y +A X +C X +B X +A Y +A X +B Z +B Z +C Y +A X +A Y +A Y +B X +A Y +A X +C Y +B X +C Y +A Y +A Y +A Y +A X +A X +C Z +B X +C Y +B Z +A X +A Y +B Z +C X +B Z +A X +C Y +C Y +B Z +B Z +A X +C Y +C Y +A Y +C Y +B X +B Z +A Z +C Y +A Z +B Z +A X +B Z +A X +B Z +A X +A Y +A X +B Z +A X +A X +A X +B X +C Y +B Z +B X +A Y +A Y +C Y +B X +A Z +C Z +C Y +A X +A Y +A X +B Z +A X +B X +C Z +A Y +C Y +A Y +A Y +A Z +C Y +A X +B Z +C X +B Z +A X +B Z +B Y +A X +C Y +A X +A Y +B X +A X +B X +A Z +A X +A Y +B X +A Y +B X +C Y +B X +A X +A Y +A X +B X +A X +A X +B X +A Y +B Y +A X +A Y +A X +B X +C Y +A X +A Z +C Y +A Y +C Z +B X +B Z +A Y +C X +A Z +A X +A X +B Z +C X +A Y +A X +A Y +A X +A Y +B Z +B X +A Z +B Z +A X +A Y +B X +B Z +A Y +B Z +C X +B Z +A X +B X +B X +C Y +B X +B Z +A X +A Y +B X +A X +B Z +A X +B Z +B Z +C Y +C Y +B Z +B X +B Z +A X +A Y +A X +B X +B Z +A Y +B Z +B X +B X +B X +B Z +B Z +A X +B X +A Y +B X +C Y +B Z +B Z +B X +C Z +A Y +A Y +B Z +B Z +A X +C Z +A Y +A X +A Y +B X +C Y +A Y +A X +B X +B Z +A Z +A Y +A Z +A X +B X +B X +A Z +A Y +A X +C Y +A Y +A X +C Z +A X +B X +A Y +B X +A Y +A X +A Y +B Z +B Z +C Z +A Y +A X +A Y +A Z +A Y +B Z +B X +A X +A X +B Z +C X +A Y +A X +A Z +C X +C Y +B Z +A Y +B X +B Z +C X +B Z +A Y +B Z +B X +A Y +B Z +B X +A X +B Z +C Y +A Y +B Z +A X +A X +B Z +A X +C Y +A X +B X +B Z +B Z +C Y +A X +B Z +C Z +B Z +A Y +B Z +B Z +A X +B Z +A X +B X +A X +A X +B Z +B X +A Z +B Z +B X +B Z +B Z +B Z +B Z +A Y +B X +A Y +B Z +B X +A X +A X +B X +B Z +C Y +B Z +B X +B Z +B Z +C Y +A X +A Y +B X +A Z +B Z +B Z +A X +A Y +B Z +A Z +A Y +A Y +A Y +A Y +C Y +B Z +A X +A X +B X +A Y +A Y +A Y +A Y +B X +B Z +C Y +B X +B X +A Y +B X +B Z +A X +C X +B X +B X +B X +C X +C Y +A Y +A X +B X +A Z +C X +B Z +C Y +B Z +A Y +A X +B X +B X +B X +A Y +B Z +A Z +C Y +A Y +A X +B Z +C Y +A Y +A X +B Z +C Z +C Y +A Y +A X +A Y +C Z +A Y +B Z +B X +B X +C Z +C Y +C Y +C Z +A Y +A Z +C Z +A Y +A X +B Z +A Y +A X +C X +A Y +C Y +C Y +A X +B Z +B X +A Z +B X +A X +C Y +A Z +B Z +A X +B Z +B X +A Y +C Z +B X +B Z +C Y +A X +B Z +B X +A Y +B X +C X +A X +A X +A X +A X +C Y +C Y +A X +B Z +A X +A Y +A Y +A X +A X +B Z +B Z +B X +A Y +A Z +C Y +A X +A Y +B Z +B X +B X +A X +C X +B Z +C Y +C Z +B Z +A X +B Z +A Y +A Y +A Y +C Z +C Y +A Y +C Y +A Y +A X +B Z +B Z +B X +C Z +A Y +C X +B Z +A Y +B Z +B X +B Z +A X +A X +B Z +C Y +A Z +A Y +B Z +A Z +C Y +B Z +B X +A X +B Z +B X +A X +B Z +A X +A X +B Z +C Y +B Z +A Y +A X +A X +C X +A Y +B Z +C Y +A Z +C Y +B X +A X +B X +C X +C Y +B Z +B Z +A Y +A Z +B X +B Z +A Y +B X +A Z +C Y +C Z +C Y +A Y +C X +C X +B X +A Y +A X +B X +B X +C Z +C X +A X +A Y +B X +B X +C X +B Z +A Y +B Z +A Y +B Z +C Y +A X +A X +B X +B Z +A X +C Y +B X +A X +A X +A Y +A Z +B X +A X +A Y +A Z +B X +B Z +A Y +A X +B X +A Y +C Y +B Y +B X +A Y +C X +A Z +C Y +A X +B Y +C Y +B Z +B X +C Y +C Y +A Y +A X +C X +A Z +A X +B Z +B X +B X +A X +B X +A Z +B X +B Z +B Z +C Z +B Z +B X +C Y +C Y +A Z +C X +A X +B Z +A X +C Y +A X +A Z +B Z +B Z +A X +B Z +B Z +A X +C Z +B Z +B X +C X +A Z +B X +A Y +B Z +C Y +B Z +B X +A Y +B Z +A X +B Z +A Y +A Z +B Z +C Y +C Y +A Z +B Z +B X +B X +C Z +B Z +B Z +A X +A X +A X +A X +A X +C Y +A X +B Z +A X +B Z +C Y +C X +A Y +B X +A X +B Z +A Y +B Z +C X +A Y +B X +A X +A Y +B Z +A Y +A X +B X +B Y +B X +B Z +B X +A X +B X +B X +B X +A Z +A X +A X +B X +C Y +A X +A X +B X +B X +B X +B X +A Y +A X +B Z +A X +A Y +C Y +B Z +A Y +A X +C Z +A X +B Z +A X +B Z +B Z +B Z +C Y +B X +C Y +A Z +B Z +A X +A Y +A Y +A Y +B X +B Z +B Z +A Y +B Z +B Z +B X +A X +B Z +A Y +A Y +A X +B Z +A X +A X +B Z +C Y +B X +A X +A X +A Z +C Y +A X +A X +A X +A X +A X +C Y +A X +A X +B X +B Z +C Z +B X +A Y +B Z +A X +A Y +B Z +B Z +B Z +B Z +A X +A Y +A Y +B X +A Y +A Z +A Y +B Y +A X +B Z +A X +A Y +C Y +B Z +C Y +A X +B Z +A X +A Z +B Z +A X +B X +C Y +A Y +A X +A Z +C Y +A Z +A Y +A Y +A X +A X +A Z +A Y +B X +B Z +B X +B X +C Y +A Y +A X +B X +A X +B Z +A X +A X +B Z +C Y +B X +C Y +A X +B X +C Z +A Y +B X +A Y +A Y +B X +C Y +B Z +A Y +B Z +A Y +A X +A X +A Y +B Z +B Z +A Y +A X +A X +B X +B Z +A Y +A X +C Y +B X +C Y +B Z +B Z +B X +A Y +B X +B X +A X +C Y +C Y +B Z +B X +A Y +C Z +C Z +C Y +A Y +B X +B Z +B X +A X +B Z +A Y +A X +C Y +B X +A Y +B X +A Z +A X +A Y +C Y +A Y +A X +C Y +C Z +B X +A Y +C Y +B Z +B X +A X +B X +B X +C Y +B Z +B Z +B Z +B X +B Z +A Y +B Y +B Z +A Z +A X +B Y +A X +B Z +A Y +B X +A X +B Z +C Z +B Z +B Z +A Y +B X +A X +A X +B X +A Y +A Y +A X +C Z +C X +A Y +C X +A Y +A Z +C Y +A X +B X +A X +B Z +A X +C Y +A Y +B X +C Y +A Y +A Z +A Y +A Y +B Z +C Z +C Y +A Y +A Y +B X +C X +A Z +B Z +C Y +A X +A Y +B X +A Y +C Y +C Z +A Y +B Z +A X +C Y +B X +B Z +A X +C Z +B Z +C Y +C Z +B Z +A X +A Y +A X +B X +B Z +B X +A X +B Z +C Y +A Z +A Z +C Y +A Y +C X +B X +A X +A X +B X +B Z +B X +B Z +B Z +A X +B X +A X +A Y +A X +C Z +B Z +A X +C Z +C Z +C X +A X +B X +A X +A Z +A X +C Z +A X +A X +B Z +C Z +C Y +B Z +B X +A X +A X +A Y +B Z +A Y +B X +B Z +C X +B Z +B X +A Y +B Z +A Z +A Y +A Y +B X +C X +A Y +A Y +C Y +C Y +B Z +B X +C Y +C Y +A Y +A X +A Y +A Y +B Z +B X +A X +B X +B Z +B Z +A Z +A Z +A Z +A X +B X +B Z +A X +B Z +A X +B Z +B X +C Z +B Y +A Y +A Y +A X +A X +B Z +B Z +B X +A Y +C Y +B X +A X +B X +C Y +A X +A X +B X +C Y +C Y +C X +B X +C Y +A Z +B Z +B Z +B Z +B X +B Z +A X +B X +A X +A Y +C Z +B X \ No newline at end of file diff --git a/02/solve.sql b/02/solve.sql new file mode 100644 index 0000000..8305891 --- /dev/null +++ b/02/solve.sql @@ -0,0 +1,98 @@ +-- setup +create schema if not exists day2; +drop table day2.input; +create table day2.input (line SERIAL, opp text, player text); +copy day2.input (opp, player) from '/workspace/02/input.txt' DELIMITER ' '; + +-- setup game rules table +create table day2.rock_paper_scissors (type text, beats text, loses text, value int); +insert into day2.rock_paper_scissors (type, beats, loses, value) +values + ('Rock', 'Scissors', 'Paper', 1), + ('Paper', 'Rock', 'Scissors', 2), + ('Scissors', 'Paper', 'Rock', 3); + +-- part 1 +with decode_opp as ( + ( + select 'A' as opp, + * from day2.rock_paper_scissors where type = 'Rock' + ) + UNION + ( + select 'B', + * from day2.rock_paper_scissors where type = 'Paper' + ) + UNION + ( + select 'C', + * from day2.rock_paper_scissors where type = 'Scissors' + ) +), +decode_player as ( + ( + select 'X' as player, + * from day2.rock_paper_scissors where type = 'Rock' + ) + UNION + ( + select 'Y', + * from day2.rock_paper_scissors where type = 'Paper' + ) + UNION + ( + select 'Z', + * from day2.rock_paper_scissors where type = 'Scissors' + ) +), +round_results as ( + select + decode_player.value as score, + case + when decode_opp.type = decode_player.type then 3 + when decode_opp.beats = decode_player.type then 0 + else 6 + end as outcome + from day2.input + join decode_opp using(opp) + join decode_player using(player) +) +select sum(score + outcome) +from round_results +; + +-- part 2 +with decode_opp as ( + ( + select 'A' as opp, + * from day2.rock_paper_scissors where type = 'Rock' + ) + UNION + ( + select 'B', + * from day2.rock_paper_scissors where type = 'Paper' + ) + UNION + ( + select 'C', + * from day2.rock_paper_scissors where type = 'Scissors' + ) +), +part_2_result as (select +input.*, +decode_opp.type, +player.*, + case + when input.player = 'X' then 0 + when input.player = 'Y' then 3 + else 6 + end as outcome +from day2.input +join decode_opp using(opp) +join day2.rock_paper_scissors as player +on ( +(input.player = 'X' and decode_opp.type = player.loses) +or (input.player = 'Y' and decode_opp.type = player.type) +or (input.player = 'Z' and decode_opp.type = player.beats) +)) +select sum(value+outcome) from part_2_result;