Add solutions for day one
This commit is contained in:
commit
1dcecf5dd4
74
day1.chpl
Normal file
74
day1.chpl
Normal file
@ -0,0 +1,74 @@
|
||||
use IO;
|
||||
use List;
|
||||
|
||||
iter linesWithEnding() {
|
||||
for line in stdin.lines() do yield line;
|
||||
yield "";
|
||||
}
|
||||
|
||||
iter elves() {
|
||||
var current = 0;
|
||||
for line in linesWithEnding() {
|
||||
const trimmedLine = line.strip();
|
||||
if trimmedLine == "" {
|
||||
yield current;
|
||||
current = 0;
|
||||
} else {
|
||||
current += trimmedLine : int;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MaxThree : ReduceScanOp {
|
||||
type eltType;
|
||||
var value: 3*eltType;
|
||||
|
||||
proc identity {
|
||||
var val: value.type;
|
||||
return val;
|
||||
}
|
||||
proc accumulate(x: eltType) { accumulateOntoState(value, x); }
|
||||
proc accumulateOntoState(ref state: 3*eltType, x: eltType) { accumulateOntoState(state, (0, 0, x)); }
|
||||
proc accumulate(x: 3*eltType) { accumulateOntoState(value, x); }
|
||||
|
||||
proc accumulateOntoState(ref state: 3*eltType, x: 3*eltType) {
|
||||
var result: state.type;
|
||||
var ptr1, ptr2: int = 3-1;
|
||||
for param idx in (0..<3 by -1) {
|
||||
if x[ptr1] > state[ptr2] {
|
||||
result[idx] = x[ptr1];
|
||||
ptr1 -= 1;
|
||||
} else {
|
||||
result[idx] = state[ptr2];
|
||||
ptr2 -= 1;
|
||||
}
|
||||
}
|
||||
state = result;
|
||||
}
|
||||
proc combine(other: MaxThree(eltType)) {
|
||||
accumulate(other.value);
|
||||
}
|
||||
proc clone() return new unmanaged MaxThree(eltType=eltType);
|
||||
proc generate() return value;
|
||||
}
|
||||
|
||||
config const part = 1;
|
||||
config const parallel = false;
|
||||
|
||||
if part == 1 {
|
||||
writeln(max reduce elves());
|
||||
} else if part == 2 {
|
||||
if parallel {
|
||||
writeln(+ reduce (MaxThree reduce elves()));
|
||||
} else {
|
||||
// Parallel
|
||||
var max3 = (0,0,0);
|
||||
// Need to read all the numbers into memory to make sure we can distribute
|
||||
var elfList = new list(elves());
|
||||
// To make a reduction parallel, we use a forall loop with a reduce intent
|
||||
forall elf in elfList with (MaxThree(int) reduce max3) {
|
||||
max3 reduce= elf;
|
||||
}
|
||||
writeln(+ reduce max3);
|
||||
}
|
||||
}
|
46
day1.cr
Normal file
46
day1.cr
Normal file
@ -0,0 +1,46 @@
|
||||
require "advent"
|
||||
INPUT = input(2022, 1).lines#.lines.map(&.to_i32)
|
||||
|
||||
|
||||
def part1(input)
|
||||
list = [] of Array(String)
|
||||
current = [] of String
|
||||
input.each do |line|
|
||||
if line.empty?
|
||||
list << current
|
||||
current = [] of String
|
||||
else
|
||||
current << line
|
||||
end
|
||||
end
|
||||
if !current.empty?
|
||||
list << current
|
||||
end
|
||||
|
||||
list.max_of do |list|
|
||||
list.map(&.to_i32).sum
|
||||
end
|
||||
end
|
||||
|
||||
def part2(input)
|
||||
list = [] of Array(String)
|
||||
current = [] of String
|
||||
input.each do |line|
|
||||
if line.empty?
|
||||
list << current
|
||||
current = [] of String
|
||||
else
|
||||
current << line
|
||||
end
|
||||
end
|
||||
if !current.empty?
|
||||
list << current
|
||||
end
|
||||
|
||||
data = list.map(&.map(&.to_i32).sum)
|
||||
data.sort!
|
||||
data[-1] + data[-2] + data[-3]
|
||||
end
|
||||
|
||||
puts part1(INPUT.clone)
|
||||
puts part2(INPUT.clone)
|
Loading…
Reference in New Issue
Block a user