Podriamos explicar la solucion no? Repasando para hacer la parte 2 si que he hecho la solucion optima, filter hace un short circuit.
veo cosas muy raras y es el primer ejercicio xd
(ns aocl.1
(:gen-class)
(:require [aocl.core :refer [read-file]]))
(def input (clojure.string/split-lines (read-file "1.txt")))
(defn make-hm [input]
(zipmap (map #(- 2020 %) input) input))
(defn find-values [input]
(let [hm (make-hm input)
v1 (nth (filter #(contains? hm %) input) 0)
v2 (get hm v1)]
(* v1 v2)))
(def part1 (str "part1: " (find-values (map #(Integer/parseInt %) input))))
(defn -main [& args] (run! println [part1]))
part 1
Tienes una lista de elementos e [1 2 3 4 5] y un numero objetivo N
Creas un hasmap poniendo como key N - e y como valor e, para cada e en tu lista de inputs O(N)
Iteras una segunda vez tu lista de inputs y buscas e. O (N)
si la encuentras ya has encontrado N = a + b, tansolo tienes que consultar el hashmap O(1)
coste en tiempo y espacio N.
El one liner en pseudocodigo.
input
/> generarHashMap
=> buscarPair
=> devolverMultiplacionDelPair
edit: con la part2, ha sido facil, 1 minuto adaptar el codigo
(ns aocl.1
(:gen-class)
(:require [aocl.core :refer [read-file]]))
(def input (clojure.string/split-lines (read-file "1.txt")))
(defn make-hm [input]
(zipmap (map #(- 2020 %) input) input))
(defn find-values [input]
(let [hm (make-hm input)
v1 (nth (filter #(contains? hm %) input) 0)
v2 (get hm v1)]
(* v1 v2)))
(defn make-hm2 [input]
(zipmap (map #(- 2020 (first %) (second %)) input) input))
(defn find-values2 [input]
(let [all-pairs (for [x input y input] (vector x y))
pairs (filter #(not= (first %) (second %)) all-pairs)
hm (make-hm2 pairs)
v1 (nth (filter #(contains? hm %) input) 0)
v2 (first (get hm v1))
v3 (second (get hm v1))]
(* v1 v2 v3)))
(def part1 (str "part1: " (find-values (map #(Integer/parseInt %) input))))
(def part2 (str "part2: " (find-values2 (map #(Integer/parseInt %) input))))
(defn -main [& args] (run! println [part1 part2]))