Add day 4 solutions.
This commit is contained in:
		
							parent
							
								
									f3e3960ea1
								
							
						
					
					
						commit
						2ed1ce8b06
					
				
							
								
								
									
										90
									
								
								day4.cr
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user