@@ -39,47 +39,17 @@ defmodule Day01 do
3939 d_cycles = div ( distance , 100 )
4040 d_offset = rem ( distance , 100 )
4141
42- new_pos =
43- case dir do
44- :L -> cur_pos - d_offset
45- :R -> cur_pos + d_offset
46- end
47-
42+ new_pos = move ( cur_pos , dir , d_offset )
4843 # IO.puts("New Pos A: #{new_pos}")
4944
5045 # if I end up on zero or 100 add one
51- end_on_zero =
52- if rem ( new_pos , 100 ) == 0 do
53- 1
54- else
55- 0
56- end
46+ end_on_zero = if rem ( new_pos , 100 ) == 0 , do: 1 , else: 0
5747
58- # If I crossed from positive to negative or vice versa
59- # Or we cross from 95 to 105
60- crossed_zero =
61- if ( cur_pos < 0 && new_pos > 0 ) || ( new_pos < 0 && cur_pos > 0 ) ||
62- ( cur_pos < 100 && new_pos > 100 ) do
63- 1
64- else
65- 0
66- end
48+ # If I crossed from positive to negative or vice versa or we cross from 95 to 105
49+ crossed_zero = crossed_zero? ( cur_pos , new_pos )
6750
68- # Ensure we're always working with a positive number
69- new_pos =
70- if new_pos < 0 do
71- new_pos + 100
72- else
73- new_pos
74- end
75-
76- # Ensure we're working with numbers < 100
77- new_pos =
78- if new_pos >= 100 do
79- rem ( new_pos , 100 )
80- else
81- new_pos
82- end
51+ # Ensure we're working with numbers < 100 and > 0
52+ new_pos = wrap ( new_pos )
8353
8454 cycles = d_cycles + crossed_zero + end_on_zero
8555
@@ -94,6 +64,22 @@ defmodule Day01 do
9464 Enum . sum ( rotation_list )
9565 end
9666
67+ defp move ( pos , :L , offset ) , do: pos - offset
68+ defp move ( pos , :R , offset ) , do: pos + offset
69+
70+ defp wrap ( pos ) when pos < 0 , do: pos + 100
71+ defp wrap ( pos ) when pos >= 100 , do: rem ( pos , 100 )
72+ defp wrap ( pos ) , do: pos
73+
74+ defp crossed_zero? ( old , new ) do
75+ cond do
76+ old < 0 and new > 0 -> 1
77+ old > 0 and new < 0 -> 1
78+ old < 100 and new > 100 -> 1
79+ true -> 0
80+ end
81+ end
82+
9783 def main do
9884 input_path = "lib/day01/input.txt"
9985 answer = part1 ( input_path )
0 commit comments