Refactor day 1 stuff to SummingTuples

This commit is contained in:
2020-12-04 14:51:31 -07:00
parent 2cb0fcb793
commit 4074582f94
6 changed files with 31 additions and 5 deletions

View File

@@ -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;

View File

@@ -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"))

View File

@@ -0,0 +1,6 @@
package year2020;
import kiss.Prelude;
@:build(kiss.Kiss.build("src/year2020/SummingTuples.kiss"))
class SummingTuples {}

View 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)

View File

@@ -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 {}

View File

@@ -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))))