diff --git a/2020/README.md b/2020/README.md index 24f21f2..f75ce6c 100644 --- a/2020/README.md +++ b/2020/README.md @@ -185,3 +185,17 @@ Inside after changes: ### Time `bash -c 'time sbcl --script day08.lisp'` + +## Day 09 - Chapel + +### Build + +`chpl -o day09 day09.chpl` + +### Run + +`./day09` + +### Time + +`bash -c 'time ./day09'` diff --git a/2020/day09/.gitignore b/2020/day09/.gitignore new file mode 100644 index 0000000..768f546 --- /dev/null +++ b/2020/day09/.gitignore @@ -0,0 +1 @@ +day09 diff --git a/2020/day09/build.sh b/2020/day09/build.sh new file mode 100755 index 0000000..449bb07 --- /dev/null +++ b/2020/day09/build.sh @@ -0,0 +1 @@ +chpl -o day09 day09.chpl diff --git a/2020/day09/day09.chpl b/2020/day09/day09.chpl new file mode 100644 index 0000000..217ecd3 --- /dev/null +++ b/2020/day09/day09.chpl @@ -0,0 +1,80 @@ +// TODO change list to array? +// TODO make it parallel? using forall + +module Day09 { + private use IO; + private use List; + + config const sample: bool = false; + const fileName: string = if sample then "sample.txt" else "input.txt"; + const preambleSize: int = if sample then 5 else 25; + + proc main() throws { + const input: list(int) = readInput(fileName); + + writeln("Solving Day09A..."); + // 15353384 + const resultA = solveA(input); + writeln(resultA); + + writeln("Solving Day09B..."); + // 2466556 + const resultB = solveB(input, resultA); + writeln(resultB); + } + + proc solveA(input: list(int)): int { + var result$: single int; + forall i in preambleSize .. input.size-1 { + const current = input[i]; + const preamble: domain(int) = input[i-preambleSize .. #preambleSize]; + //writeln(preamble); + //writeln("i ", i, " ", input[i]); + var valid: bool = false; + for p in preamble { + //writeln("p ", p); + if preamble.contains(current - p) && 2*p != current { + valid = true; + break; + } + } + if !valid { + result$ = current; + } + } + return result$; + } + + proc solveB(input: list(int), n: int): int { + var result$: single int; + forall i in 0 .. #(input.size - 1) { + //writeln(i, " ", input[i]); + var currNum: int = input[i]; + var contSum: int = currNum; + var contSumList: list(int); + contSumList.append(currNum); + for sumIndex in i+1 .. input.size-1 { + if contSum >= n then break; + currNum = input[sumIndex]; + contSum += currNum; + contSumList.append(currNum); + } + //writeln(contSumList); + if contSum == n && contSumList.size >= 2 { + contSumList.sort(); + result$ = contSumList.first() + contSumList.last(); + } + } + return result$; + } + + proc readInput(fname: string): list(int) throws { + var input: list(int, parSafe=true); + var f = open(fname, iomode.r); + for line in f.lines() { + input.append(line:int); + } + f.close(); + return input; + } +} diff --git a/2020/day09/sample.txt b/2020/day09/sample.txt new file mode 100644 index 0000000..28d66e4 --- /dev/null +++ b/2020/day09/sample.txt @@ -0,0 +1,20 @@ +35 +20 +15 +25 +47 +40 +62 +55 +65 +95 +102 +117 +150 +182 +127 +219 +299 +277 +309 +576