diff --git a/AoC/2024/day_1/day_1.janet b/AoC/2024/day_1/day_1.janet index d57dfb2..956cca1 100644 --- a/AoC/2024/day_1/day_1.janet +++ b/AoC/2024/day_1/day_1.janet @@ -46,9 +46,68 @@ (break)))) @[left right]) -(defn main [script filename] +(defn sort_and_deduplicate [ arr ] + (def sorted_array (sort arr)) + (def output_array @[]) + (def count_array @[]) + + (var i 0) + (var j 0) + (while (< i (length sorted_array)) + (do + (set (output_array j) (get sorted_array i)) + (var local_count 1) + (++ i) + (while (= (get output_array j) (get sorted_array i)) + (do + (set local_count (+ 1 local_count)) + (++ i))) + (set (count_array j) local_count) + (++ j))) + + @[output_array count_array]) + +(defn find_in_dedup_array [ num data_arr count_arr ] + (var lower_bound 0) + (var upper_bound (- (length data_arr) 1)) + (var mid (math/floor (/ (+ lower_bound upper_bound) 2))) + (var output 0) + (var lo true) + (while lo + (do + (if (<= (- upper_bound lower_bound) 1) + (do + (set lo false) + (cond + (= num lower_bound) (set output (get count_arr lower_bound)) + (= num upper_bound) (set output (get count_arr upper_bound)) + (set output 0)))) + (cond + (> num (get data_arr mid)) (set lower_bound mid) + (< num (get data_arr mid)) (set upper_bound mid) + (do + (set output (get count_arr mid)) + (set lo false))) + (set mid (math/floor (/ (+ lower_bound upper_bound) 2 ))))) + output) + +(defn similarity_score [ left right ] + (def [data_arr count_arr] (sort_and_deduplicate right)) + (var output_score 0) + (for i 0 (- (length left) 1) + (do + (def temp (find_in_dedup_array (get left i) data_arr count_arr)) + (def simi (* temp (get left i))) + (set output_score (+ output_score simi)))) + output_score) + +(defn main [script part filename] (def input_arrays (read_data filename)) - (def left (get input_arrays 0)) - (def right (get input_arrays 1)) - (def distance (compute_distance left right)) - (pp distance)) + (def [left right] input_arrays) + (cond + (compare= part "1") (do + (def distance (compute_distance left right)) + (pp distance)) + (compare= part "2") (do + (def similar (similarity_score left right)) + (pp similar))))