1
0
Fork 0
mirror of https://github.com/HenkKalkwater/aoc-2020 synced 2024-11-22 11:05:18 +00:00
aoc-2020/source/day2.d

52 lines
1.2 KiB
D

import std.algorithm;
import std.format;
import std.functional;
import std.stdio;
import std.variant;
import dayutil;
Variant run(int day, File input, string[] args) {
auto lines = input.byLine;
Variant count = parts!ulong(day,
() => lines.count!(l => isPasswordValid1(l)),
() => lines.count!(l => isPasswordValid2(l)));
return count;
}
/// Part 1
bool isPasswordValid1(T)(T line) {
int min, max;
char c;
string password;
line.formattedRead("%d-%d %c: %s", min, max, c, password);
ulong charCount = password.count(c);
return min <= charCount && charCount <= max;
}
unittest {
assert(isPasswordValid1("1-3 a: abcde") == true);
assert(isPasswordValid1("1-3 b: cdefg") == false);
assert(isPasswordValid1("2-9 c: ccccccccc") == true);
}
/// Part 2
bool isPasswordValid2(T)(T line) {
int min, max;
char c;
string password;
line.formattedRead("%d-%d %c: %s", min, max, c, password);
// 1 2 | R
// T T | F
// T F | T
// F T | T
// F F | F
return (password[min - 1] == c) != (password[max - 1] == c);
}
unittest {
assert(isPasswordValid2("1-3 a: abcde") == true);
assert(isPasswordValid2("1-3 b: cdefg") == false);
assert(isPasswordValid2("2-9 c: ccccccccc") == false);
}