Add solutions for day two and three
This commit is contained in:
parent
5c25497318
commit
5f97f44af4
33
day2.chpl
Normal file
33
day2.chpl
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
use Map;
|
||||||
|
use IO;
|
||||||
|
|
||||||
|
var winsOne = new map(string, int);
|
||||||
|
winsOne["AX"] = 3 + 1;
|
||||||
|
winsOne["AY"] = 6 + 2;
|
||||||
|
winsOne["AZ"] = 0 + 3;
|
||||||
|
winsOne["BX"] = 0 + 1;
|
||||||
|
winsOne["BY"] = 3 + 2;
|
||||||
|
winsOne["BZ"] = 6 + 3;
|
||||||
|
winsOne["CX"] = 6 + 1;
|
||||||
|
winsOne["CY"] = 0 + 2;
|
||||||
|
winsOne["CZ"] = 3 + 3;
|
||||||
|
|
||||||
|
var winsTwo = new map(string, int);
|
||||||
|
winsTwo["AX"] = 0 + 3;
|
||||||
|
winsTwo["AY"] = 3 + 1;
|
||||||
|
winsTwo["AZ"] = 6 + 2;
|
||||||
|
winsTwo["BX"] = 0 + 1;
|
||||||
|
winsTwo["BY"] = 3 + 2;
|
||||||
|
winsTwo["BZ"] = 6 + 3;
|
||||||
|
winsTwo["CX"] = 0 + 2;
|
||||||
|
winsTwo["CY"] = 3 + 3;
|
||||||
|
winsTwo["CZ"] = 6 + 1;
|
||||||
|
|
||||||
|
iter scores(map) {
|
||||||
|
for line in stdin.lines() {
|
||||||
|
yield map[line.strip().replace(" ", "")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
config const part = 1;
|
||||||
|
writeln(+ reduce (scores(if part == 1 then winsOne else winsTwo)));
|
51
day2.cr
Normal file
51
day2.cr
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
require "advent"
|
||||||
|
|
||||||
|
INPUT = input(2022, 2).lines.map do |l|
|
||||||
|
a, b = l.split(" ")
|
||||||
|
{a, b}
|
||||||
|
end
|
||||||
|
|
||||||
|
WINS1 = {
|
||||||
|
"AX" => 3 + 1,
|
||||||
|
"AY" => 6 + 2,
|
||||||
|
"AZ" => 0 + 3,
|
||||||
|
|
||||||
|
"BX" => 0 + 1,
|
||||||
|
"BY" => 3 + 2,
|
||||||
|
"BZ" => 6 + 3,
|
||||||
|
|
||||||
|
"CX" => 6 + 1,
|
||||||
|
"CY" => 0 + 2,
|
||||||
|
"CZ" => 3 + 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
WINS2 = {
|
||||||
|
"AX" => 0+3,
|
||||||
|
"AY" => 3+1,
|
||||||
|
"AZ" => 6+2,
|
||||||
|
|
||||||
|
"BX" => 0+1,
|
||||||
|
"BY" => 3+2,
|
||||||
|
"BZ" => 6+3,
|
||||||
|
|
||||||
|
"CX" => 0+2,
|
||||||
|
"CY" => 3+3,
|
||||||
|
"CZ" => 6+1,
|
||||||
|
}
|
||||||
|
|
||||||
|
def part1(input)
|
||||||
|
input.sum do |x|
|
||||||
|
a,b = x
|
||||||
|
WINS1[a+b]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2(input)
|
||||||
|
input.sum do |x|
|
||||||
|
a,b = x
|
||||||
|
WINS2[a+b]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
puts part1(INPUT)
|
||||||
|
puts part2(INPUT)
|
54
day3.chpl
Normal file
54
day3.chpl
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
use Set;
|
||||||
|
use IO;
|
||||||
|
|
||||||
|
const lowercase: [1..26] string = "abcdefghijklmnopqrstuvwxyz".these();
|
||||||
|
const uppercase: [27..52] string = "abcdefghijklmnopqrstuvwxyz".toUpper().these();
|
||||||
|
|
||||||
|
proc letterScore(letter: string): int {
|
||||||
|
var (isLower, score1) = lowercase.find(letter);
|
||||||
|
if isLower then return score1;
|
||||||
|
var (isUpper, score2) = uppercase.find(letter);
|
||||||
|
if isUpper then return score2;
|
||||||
|
halt("Should not happen");
|
||||||
|
}
|
||||||
|
|
||||||
|
proc charSet(str: string): set(string) {
|
||||||
|
return new set(string, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
proc groupScore(group): int {
|
||||||
|
var inAll = new set(string, lowercase) | new set(string, uppercase);
|
||||||
|
for chars in charSet(group) {
|
||||||
|
inAll &= chars;
|
||||||
|
}
|
||||||
|
return + reduce letterScore(inAll.these());
|
||||||
|
}
|
||||||
|
|
||||||
|
iter inputLines() {
|
||||||
|
for line in stdin.lines() do yield line.strip();
|
||||||
|
}
|
||||||
|
|
||||||
|
iter inputLineHalves() {
|
||||||
|
for line in inputLines() {
|
||||||
|
yield line[..<line.size/2];
|
||||||
|
yield line[line.size/2..];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc solveByReshaping(it, size) {
|
||||||
|
const array = it;
|
||||||
|
const shaped = reshape(array, {1..(array.size / size), 1..size});
|
||||||
|
var total = 0;
|
||||||
|
forall i in shaped.dim(0) with (+ reduce total) {
|
||||||
|
total reduce= groupScore(shaped[i,..]);
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
config const part = 1;
|
||||||
|
|
||||||
|
if part == 1 {
|
||||||
|
writeln(solveByReshaping(inputLineHalves(), 2));
|
||||||
|
} else if part == 2 {
|
||||||
|
writeln(solveByReshaping(inputLines(), 3));
|
||||||
|
}
|
37
day3.cr
Normal file
37
day3.cr
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
require "advent"
|
||||||
|
|
||||||
|
def letter_score(letter : Char)
|
||||||
|
if letter.uppercase?
|
||||||
|
letter.ord - 'A'.ord + 1 + 26
|
||||||
|
else
|
||||||
|
letter.ord - 'a'.ord + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
INPUT = input(2022, 3).lines
|
||||||
|
|
||||||
|
def part1(input)
|
||||||
|
input = input.map do |line|
|
||||||
|
first = line[0, line.size//2]
|
||||||
|
second = line[line.size//2, line.size//2]
|
||||||
|
{first.chars.to_set, second.chars.to_set}
|
||||||
|
end
|
||||||
|
input.sum do |a,b|
|
||||||
|
puts (a & b)
|
||||||
|
(a & b).to_a.map do |l|
|
||||||
|
puts letter_score(l)
|
||||||
|
letter_score(l)
|
||||||
|
end.sum
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2(input)
|
||||||
|
input
|
||||||
|
.map(&.chars.to_set)
|
||||||
|
.in_groups_of(3, Set(Char).new)
|
||||||
|
.map(&.reduce { |l,r| l & r }.sum { |l| letter_score l })
|
||||||
|
.sum
|
||||||
|
end
|
||||||
|
|
||||||
|
puts part1(INPUT.clone)
|
||||||
|
puts part2(INPUT.clone)
|
Loading…
Reference in New Issue
Block a user