Advent of Code Solutions
advent-of-code aoc
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

2015: Day 7

yemou a984fd43 03652988

+218
+9
2015/07/part1-tests/expected
··· 1 + 123 2 + 456 3 + 72 4 + 507 5 + 492 6 + 114 7 + 65412 8 + 65079 9 + 72
+8
2015/07/part1-tests/input1
··· 1 + 123 -> a 2 + 456 -> y 3 + a AND y -> d 4 + a OR y -> e 5 + a LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT a -> h 8 + NOT y -> i
+8
2015/07/part1-tests/input2
··· 1 + 123 -> x 2 + 456 -> a 3 + x AND a -> d 4 + x OR a -> e 5 + x LSHIFT 2 -> f 6 + a RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT a -> i
+8
2015/07/part1-tests/input3
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> a 4 + x OR y -> e 5 + x LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT y -> i
+8
2015/07/part1-tests/input4
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> d 4 + x OR y -> a 5 + x LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT y -> i
+8
2015/07/part1-tests/input5
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> d 4 + x OR y -> e 5 + x LSHIFT 2 -> a 6 + y RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT y -> i
+8
2015/07/part1-tests/input6
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> d 4 + x OR y -> e 5 + x LSHIFT 2 -> f 6 + y RSHIFT 2 -> a 7 + NOT x -> h 8 + NOT y -> i
+8
2015/07/part1-tests/input7
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> d 4 + x OR y -> e 5 + x LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT x -> a 8 + NOT y -> i
+8
2015/07/part1-tests/input8
··· 1 + 123 -> x 2 + 456 -> y 3 + x AND y -> d 4 + x OR y -> e 5 + x LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT y -> a
+8
2015/07/part1-tests/input9
··· 1 + x AND y -> a 2 + x OR y -> e 3 + x LSHIFT 2 -> f 4 + y RSHIFT 2 -> g 5 + NOT x -> h 6 + NOT y -> i 7 + 123 -> x 8 + 456 -> y
+4
2015/07/part2-tests/expected
··· 1 + 1968 2 + 123 3 + 28 4 + 456
+8
2015/07/part2-tests/input1
··· 1 + 123 -> b 2 + 456 -> y 3 + b AND y -> d 4 + b OR y -> e 5 + b LSHIFT 2 -> a 6 + y RSHIFT 2 -> g 7 + NOT b -> h 8 + NOT y -> i
+8
2015/07/part2-tests/input2
··· 1 + 123 -> b 2 + 456 -> y 3 + b AND y -> d 4 + b OR y -> e 5 + b LSHIFT 2 -> f 6 + y RSHIFT 2 -> g 7 + NOT b -> a 8 + NOT y -> i
+8
2015/07/part2-tests/input3
··· 1 + 123 -> x 2 + 456 -> b 3 + x AND b -> d 4 + x OR b -> e 5 + x LSHIFT 2 -> f 6 + b RSHIFT 2 -> a 7 + NOT x -> h 8 + NOT b -> i
+8
2015/07/part2-tests/input4
··· 1 + 123 -> x 2 + 456 -> b 3 + x AND b -> d 4 + x OR b -> e 5 + x LSHIFT 2 -> f 6 + b RSHIFT 2 -> g 7 + NOT x -> h 8 + NOT b -> a
+101
2015/07/solution.escript
··· 1 + #!/usr/bin/env escript 2 + -mode(compile). 3 + 4 + % --- Part 1 Code 5 + part1(Input) -> io:format("Part 1: ~b~n", [binary:decode_unsigned(resolve("a", Input))]). 6 + 7 + resolve(Signal, _Map) when is_binary(Signal) -> Signal; 8 + resolve(Signal, Map) -> 9 + case erlang:get({resolve, Signal, Map}) of 10 + Mem when is_binary(Mem) -> Mem; 11 + undefined -> 12 + case maps:get(Signal, Map) of 13 + {binary_and, Left, Right} -> 14 + Result = << 15 + (binary:decode_unsigned(resolve(Left, Map)) band 16 + binary:decode_unsigned(resolve(Right, Map))):16 17 + >>, 18 + erlang:put({resolve, Signal, Map}, Result), 19 + Result; 20 + {binary_or, Left, Right} -> 21 + Result = << 22 + (binary:decode_unsigned(resolve(Left, Map)) bor 23 + binary:decode_unsigned(resolve(Right, Map))):16 24 + >>, 25 + erlang:put({resolve, Signal, Map}, Result), 26 + Result; 27 + {binary_lshift, Left, Right} -> 28 + Result = << 29 + (binary:decode_unsigned(resolve(Left, Map)) bsl 30 + binary:decode_unsigned(resolve(Right, Map))):16 31 + >>, 32 + erlang:put({resolve, Signal, Map}, Result), 33 + Result; 34 + {binary_rshift, Left, Right} -> 35 + Result = << 36 + (binary:decode_unsigned(resolve(Left, Map)) bsr 37 + binary:decode_unsigned(resolve(Right, Map))):16 38 + >>, 39 + erlang:put({resolve, Signal, Map}, Result), 40 + Result; 41 + {binary_not, Value} -> 42 + Result = <<(bnot binary:decode_unsigned(resolve(Value, Map))):16>>, 43 + erlang:put({resolve, Signal, Map}, Result), 44 + Result; 45 + Value when is_binary(Value) -> 46 + erlang:put({resolve, Signal, Map}, Value), 47 + Value; 48 + Value -> 49 + Result = resolve(Value, Map), 50 + erlang:put({resolve, Signal, Map}, Result), 51 + Result 52 + end 53 + end. 54 + 55 + % --- Part 2 Code 56 + part2(Input) -> 57 + InputB = maps:put("b", resolve("a", Input), Input), 58 + io:format("Part 2: ~b~n", [binary:decode_unsigned(resolve("a", InputB))]). 59 + 60 + % --- Read Input 61 + make_value(Item) -> 62 + case string:to_integer(Item) of 63 + {Integer, []} -> <<Integer:16>>; 64 + _ -> Item 65 + end. 66 + 67 + parse_line(Data, Map) -> 68 + case string:split(string:trim(Data), " ", all) of 69 + [Value, "->", Identifier] -> 70 + maps:put(Identifier, make_value(Value), Map); 71 + [Left, "AND", Right, "->", Identifier] -> 72 + maps:put(Identifier, {binary_and, make_value(Left), make_value(Right)}, Map); 73 + [Left, "OR", Right, "->", Identifier] -> 74 + maps:put(Identifier, {binary_or, make_value(Left), make_value(Right)}, Map); 75 + [Left, "LSHIFT", Right, "->", Identifier] -> 76 + maps:put(Identifier, {binary_lshift, make_value(Left), make_value(Right)}, Map); 77 + [Left, "RSHIFT", Right, "->", Identifier] -> 78 + maps:put(Identifier, {binary_rshift, make_value(Left), make_value(Right)}, Map); 79 + ["NOT", Value, "->", Identifier] -> 80 + maps:put(Identifier, {binary_not, make_value(Value)}, Map) 81 + end. 82 + 83 + read_input() -> read_input(#{}). 84 + read_input(Map) -> 85 + case io:get_line("") of 86 + eof -> Map; 87 + {error, _} -> halt(1); 88 + Data -> read_input(parse_line(Data, Map)) 89 + end. 90 + 91 + main(Args) -> 92 + Input = read_input(), 93 + case Args of 94 + ["1"] -> 95 + part1(Input); 96 + ["2"] -> 97 + part2(Input); 98 + _ -> 99 + part1(Input), 100 + part2(Input) 101 + end.