diff --git a/day4.cr b/day4.cr index aa365c6..b5f3fce 100644 --- a/day4.cr +++ b/day4.cr @@ -1,49 +1,58 @@ INPUT = File.read("day4.txt").lines.map(&.chomp) +def parse_passport(string) + new_hash = {} of String => String + string.split(" ").each do |field| + k,v = field.split(":") + new_hash[k] = v + end + new_hash +end + +def parse_passports(lines) + passports = [] of Hash(String, String) + passport = [] of String + + lines.each do |line| + unless line.empty? + passport << line + next + end + + passports << parse_passport(passport.join(" ")) + passport = [] of String + end + passports << parse_passport(passport.join(" ")) +end + def part1 input = INPUT.clone - passlines = [] of Array(String) - currpass = [] of String - input.each do |line| - if line.empty? - passlines << currpass - currpass = [] of String - next + passports = parse_passports(input) + total = passports.count do |passport| + ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"].all? do |key| + passport.has_key? key end - currpass << line end - passlines << currpass + puts total +end - total = 0 - passlines.each do |pass| - fields = pass.join(" ").split(" ") - puts fields - values = {} of String => String - fields.each do |field| - key = field.split(":")[0] - values[key] = field.split(":")[1] - puts "#{key}: #{values[key]}" - end - - next unless value = values["byr"]? +def part2 + input = INPUT.clone + passports = parse_passports(input) + total = passports.count do |passport| + next unless value = passport["byr"]? value = value.to_i32 next unless value >= 1920 && value <= 2002 - puts "byr" - - next unless value = values["iyr"]? + next unless value = passport["iyr"]? value = value.to_i32 next unless value >= 2010 && value <= 2020 - puts "iry" - - next unless value = values["eyr"]? + next unless value = passport["eyr"]? value = value.to_i32 next unless value >= 2020 && value <= 2030 - puts "eyr" - - next unless value = values["hgt"]? + next unless value = passport["hgt"]? next unless value.ends_with?("cm") || value.ends_with?("in") ivalue = value[0..-3].to_i32 if value.ends_with? "cm" @@ -52,33 +61,20 @@ def part1 next unless ivalue >= 59 && ivalue <= 76 end - puts "hgt" - - next unless value = values["hcl"]? + next unless value = passport["hcl"]? next unless value[0] == '#' && (value[1..]).to_i32(16) - puts "hcl" - - next unless value = values["ecl"]? + next unless value = passport["ecl"]? next unless "amb blu brn gry grn hzl oth".split(" ").includes? value - puts "ecl" - - next unless value = values["pid"]? - puts value + next unless value = passport["pid"]? next unless value.size == 9 next unless value = value.to_i32? - - puts "pid" - - total += 1 + + true end puts total end -def part2 - input = INPUT.clone -end - part1 part2