diff --git a/day_12/first.rb b/day_12/first.rb new file mode 100644 index 0000000..c2ea3b6 --- /dev/null +++ b/day_12/first.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +input = File.readlines('./input').map do |line| + [line[0], Integer(line[1..-1])] +end + +DIRS = { 0 => 'N', 1 => 'E', 2 => 'S', 3 => 'W' }.freeze + +$position = [0, 0, 90] + +def move(action, value) + case action + when 'N' + $position[1] += value + when 'S' + $position[1] -= value + when 'E' + $position[0] += value + when 'W' + $position[0] -= value + when 'L' + $position[2] -= value + when 'R' + $position[2] += value + when 'F' + move(DIRS[$position[2] / 90 % 4], value) + end +end + +input.each do |instr| + move(*instr) +end + +puts $position.values_at(0, 1).map(&:abs).sum diff --git a/day_12/input b/day_12/input new file mode 100644 index 0000000..7b923fc --- /dev/null +++ b/day_12/input @@ -0,0 +1,774 @@ +E2 +L180 +S4 +R90 +S1 +F49 +N2 +F18 +N2 +L180 +S5 +L90 +E3 +N2 +F11 +L180 +N5 +W3 +L180 +W2 +N5 +F80 +R90 +F89 +N1 +L180 +N2 +R180 +E4 +R90 +S1 +L90 +N5 +R180 +N2 +F17 +L90 +E2 +F58 +W5 +L90 +W3 +N3 +F78 +L90 +N4 +L90 +F15 +W1 +R90 +S1 +W4 +R90 +F41 +W4 +S4 +F37 +E5 +S1 +E3 +F19 +R90 +S1 +W4 +S2 +E2 +L180 +F51 +W5 +R90 +F76 +E2 +F40 +N4 +R180 +E5 +N3 +F72 +S4 +R90 +F99 +E3 +F76 +W5 +R90 +E2 +S5 +R180 +F76 +N4 +L180 +F10 +F83 +S1 +F46 +L90 +S5 +E1 +S1 +F14 +N4 +E1 +R180 +E1 +R180 +S3 +F52 +L90 +S4 +L90 +W3 +F18 +S2 +F81 +L180 +F76 +L180 +W1 +S2 +F73 +N2 +F77 +W1 +F28 +L180 +N2 +F76 +L180 +W5 +F61 +N4 +E2 +R180 +S2 +L90 +F14 +R180 +N5 +E4 +F11 +E1 +L90 +N3 +E3 +F58 +W3 +F72 +W1 +N2 +W5 +F44 +L90 +W4 +F37 +L90 +F4 +W5 +N3 +F57 +N4 +L90 +S2 +F43 +S4 +W3 +S5 +F84 +S2 +L90 +N1 +R180 +W3 +L180 +N2 +W3 +R90 +N2 +R90 +F66 +L90 +F73 +E4 +S2 +L270 +W2 +E2 +S4 +E1 +R90 +W1 +F49 +L270 +F70 +S3 +W1 +N2 +E1 +F65 +W3 +R90 +F27 +E5 +F80 +S4 +W5 +F68 +E5 +R90 +F94 +W2 +L90 +F37 +L180 +E1 +F38 +N2 +F15 +N4 +E3 +L90 +E1 +R90 +S1 +E5 +N4 +N2 +E4 +L270 +N4 +R90 +E1 +S4 +E4 +F71 +E2 +R180 +N5 +E3 +F17 +L90 +N2 +W1 +L90 +F62 +W1 +F85 +W1 +L180 +F33 +S4 +W1 +N5 +F81 +W2 +R90 +S2 +F49 +L180 +S5 +F4 +W4 +N3 +W1 +F17 +R90 +W4 +N4 +E4 +N3 +L90 +S2 +R90 +S3 +L90 +E4 +R90 +S5 +F88 +S1 +L180 +N5 +E5 +F55 +R90 +F81 +E5 +L180 +R90 +F55 +R90 +W5 +F13 +R90 +N5 +F58 +L180 +S5 +F27 +E4 +S3 +F42 +R90 +F39 +W3 +S3 +F31 +S4 +L90 +W1 +S3 +W3 +N4 +W2 +S3 +L90 +F61 +E1 +F23 +S2 +F31 +S3 +L180 +W1 +N1 +L90 +N3 +F81 +E2 +N1 +R90 +F64 +S4 +F88 +E1 +N5 +W1 +S3 +F10 +N5 +L90 +F58 +S1 +R90 +E3 +L90 +N4 +F94 +S1 +W1 +S4 +L90 +F51 +L180 +N4 +R90 +L90 +N4 +F66 +W2 +S3 +S3 +W4 +F68 +L90 +F42 +E1 +F43 +R90 +N3 +F20 +E1 +N3 +E4 +N3 +F4 +S4 +R180 +W1 +R270 +N3 +F86 +L90 +E5 +F84 +N3 +W3 +F16 +L90 +N2 +E3 +L90 +S5 +E5 +F53 +L270 +N2 +F91 +R90 +E5 +N4 +F57 +E5 +S5 +F61 +S4 +F89 +E3 +N3 +N5 +F3 +S5 +F59 +E5 +F66 +R180 +S1 +W1 +N2 +R180 +S4 +E2 +L90 +N1 +W2 +F13 +L90 +E5 +F6 +W3 +F78 +E1 +F7 +W1 +N4 +W5 +F58 +R90 +E4 +N3 +E5 +N3 +W1 +S3 +R90 +F16 +L90 +F93 +R270 +N5 +F2 +W1 +S3 +F54 +R270 +F18 +R180 +F95 +L90 +W1 +E4 +N2 +W1 +L90 +S2 +L90 +W2 +S4 +F92 +W2 +S3 +R180 +N5 +E3 +N5 +E5 +F22 +F88 +S3 +E2 +R90 +S5 +W1 +L90 +E4 +F77 +N1 +W3 +F14 +E3 +R90 +W1 +F21 +N1 +F58 +W4 +N2 +R90 +N2 +W4 +F68 +W5 +N3 +L90 +F22 +R90 +F90 +F84 +S5 +F30 +N1 +W4 +R90 +F17 +R90 +W4 +S5 +E2 +N1 +F92 +N2 +R180 +N5 +E2 +R90 +F38 +R90 +F15 +E5 +N4 +N4 +E4 +S4 +F92 +R90 +F22 +S3 +W4 +N3 +E1 +R180 +F96 +L90 +E1 +N1 +F9 +W2 +N4 +F17 +N2 +R90 +F76 +S2 +F5 +S5 +F34 +R90 +F7 +N4 +F83 +N5 +L90 +W1 +S3 +R90 +S3 +W2 +S3 +F51 +N5 +W4 +F8 +E3 +F10 +N5 +F39 +S3 +E2 +L90 +E5 +L90 +N5 +E2 +N3 +F42 +S3 +F38 +N5 +F19 +F97 +W2 +R180 +S4 +E4 +S2 +W3 +F39 +W4 +F70 +S1 +W1 +R90 +F41 +L90 +E1 +N1 +E3 +W5 +F13 +E4 +F2 +R180 +F27 +E4 +N2 +L270 +E1 +N3 +W4 +F81 +W3 +R90 +E1 +F57 +S5 +R90 +F13 +L180 +N5 +F98 +F32 +N3 +R90 +N3 +W3 +S3 +W3 +N4 +F73 +L180 +N1 +E4 +F7 +E4 +R90 +N4 +R90 +S2 +E5 +F32 +S2 +N5 +W3 +R90 +W5 +S2 +L90 +F4 +R270 +N5 +E3 +L90 +S5 +F24 +N4 +R90 +F27 +L90 +F16 +R90 +N2 +R90 +N3 +L90 +S3 +L90 +F85 +S3 +F47 +N1 +E1 +N3 +R270 +S2 +L90 +F50 +L90 +S2 +F23 +N4 +L180 +E3 +F91 +R90 +E1 +W4 +F81 +W5 +R90 +F46 +E1 +W1 +F91 +N5 +W5 +N3 +W1 +L90 +F60 +S2 +L90 +E1 +F82 +S3 +W5 +N5 +F90 +E3 +S1 +F61 +E4 +F98 +R180 +F8 +R270 +F73 +W4 +L90 +W5 +L90 +F86 +W5 +L180 +F61 +N5 +F88 +E2 +L270 +F90 +N5 +F21 +R270 +F40 +L90 +W1 +N2 +L90 +E2 +S5 +E2 +S1 +E5 +N3 +F51 +S1 +F58 +W3 +L180 +F13 +R90 +N1 +F79 +W2 +F61 +R90 +F22 +E2 +N5 +F1 +S4 +F99 +S1 +S3 +E2 +F97 diff --git a/day_12/second.rb b/day_12/second.rb new file mode 100644 index 0000000..4777106 --- /dev/null +++ b/day_12/second.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +input = File.readlines('./input').map do |line| + [line[0], Integer(line[1..-1])] +end + +$position = [0, 0] +$waypoint = [10, 1] + +def rad(deg) + deg * Math::PI / 180 +end + +def rotate(deg) + x,y = $waypoint + rad = rad(deg) + $waypoint[0] = (x*Math.cos(rad) - y*Math.sin(rad)).round + $waypoint[1] = (x*Math.sin(rad) + y*Math.cos(rad)).round +end + +def move(action, value) + case action + when 'N' + $waypoint[1] += value + when 'S' + $waypoint[1] -= value + when 'E' + $waypoint[0] += value + when 'W' + $waypoint[0] -= value + when 'L' + rotate(value) + when 'R' + rotate(-value) + when 'F' + $position[0] += $waypoint[0] * value + $position[1] += $waypoint[1] * value + end +end + +input.each do |instr| + move(*instr) +end + +puts $position.values_at(0, 1).map(&:abs).sum diff --git a/day_12/test b/day_12/test new file mode 100644 index 0000000..d382291 --- /dev/null +++ b/day_12/test @@ -0,0 +1,5 @@ +F10 +N3 +F7 +R90 +F11