Refactor day 1 stuff to SummingTuples
This commit is contained in:
@@ -4,6 +4,7 @@ import haxe.ds.Map;
|
||||
import StringTools;
|
||||
import kiss.Prelude;
|
||||
import year2020.Util;
|
||||
import year2020.SummingTuples;
|
||||
import year2020.Passwords;
|
||||
import year2020.Toboggan;
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
(defun main []
|
||||
// Day 1
|
||||
(let [p (pairWithSum 2020 [1721 979 366 299 675 1456])]
|
||||
(let [p (SummingTuples.pairWithSum 2020 [1721 979 366 299 675 1456])]
|
||||
(assert (and (has p 1721) (has p 299)) "pairWithSum is broken"))
|
||||
(let [[a b] (pairWithSum 2020 (Util.readInts "src/year2020/inputs/day1-1.txt"))]
|
||||
(let [[a b] (SummingTuples.pairWithSum 2020 (Util.readInts "src/year2020/inputs/day1-1.txt"))]
|
||||
(assert (= 545379 (* a b)) "pairWithSum is broken"))
|
||||
(let [t (trioWithSum 2020 [1721 979 366 299 675 1456])]
|
||||
(let [t (SummingTuples.trioWithSum 2020 [1721 979 366 299 675 1456])]
|
||||
(assert (and (has t 675) (has t 366) (has t 979))
|
||||
"trioWithSum is broken"))
|
||||
(let [[a b c] (trioWithSum 2020 (Util.readInts "src/year2020/inputs/day1-1.txt"))]
|
||||
(let [[a b c] (SummingTuples.trioWithSum 2020 (Util.readInts "src/year2020/inputs/day1-1.txt"))]
|
||||
(assert (= 257778836 (* a b c))
|
||||
"trioWithSum is broken"))
|
||||
|
||||
|
||||
6
projects/advent-of-code/src/year2020/SummingTuples.hx
Normal file
6
projects/advent-of-code/src/year2020/SummingTuples.hx
Normal file
@@ -0,0 +1,6 @@
|
||||
package year2020;
|
||||
|
||||
import kiss.Prelude;
|
||||
|
||||
@:build(kiss.Kiss.build("src/year2020/SummingTuples.kiss"))
|
||||
class SummingTuples {}
|
||||
17
projects/advent-of-code/src/year2020/SummingTuples.kiss
Normal file
17
projects/advent-of-code/src/year2020/SummingTuples.kiss
Normal file
@@ -0,0 +1,17 @@
|
||||
(defun :kiss.List<Int> pairWithSum [sum :kiss.List<Int> numbers]
|
||||
// Put the numbers in a map for random access. This gives an O(n) solution
|
||||
(deflocal :Map<Int,Int> numbersMap (new Map))
|
||||
(doFor number numbers
|
||||
(dict-set numbersMap number (- sum number))
|
||||
(let [requiredForPair (dict-get numbersMap number)]
|
||||
(when (numbersMap.exists requiredForPair)
|
||||
(return [number requiredForPair]))))
|
||||
null)
|
||||
|
||||
(defun :kiss.List<Int> trioWithSum [sum :kiss.List<Int> numbers]
|
||||
(doFor number numbers
|
||||
(let [requiredForTrio (- sum number)
|
||||
pairThatSatisfies (pairWithSum requiredForTrio numbers)]
|
||||
(when pairThatSatisfies
|
||||
(return [number (nth pairThatSatisfies 0) (nth pairThatSatisfies 1)]))))
|
||||
null)
|
||||
@@ -3,5 +3,7 @@ package year2020;
|
||||
import sys.io.File;
|
||||
import kiss.Prelude;
|
||||
|
||||
using StringTools;
|
||||
|
||||
@:build(kiss.Kiss.build("src/year2020/Util.kiss"))
|
||||
class Util {}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
(.filter
|
||||
(.map
|
||||
// TODO implement escape sequences in kiss string literals
|
||||
(.split (File.getContent file) #|"\n"|#)
|
||||
(.split (.replace (File.getContent file) #|"\r"|# "") #|"\n"|#)
|
||||
StringTools.trim)
|
||||
(lambda [l] (< 0 l.length))))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user