Advertisement
anonymous1184

Advent of Code 2020.4 AHK

Dec 4th, 2020 (edited)
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. global  keys := ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid", "cid"]
  2.     , keysCount := keys.Count()
  3.  
  4. passports =
  5. (
  6. ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
  7. byr:1937 iyr:2017 cid:147 hgt:183cm
  8.  
  9. iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
  10. hcl:#cfa07d byr:1929
  11.  
  12. hcl:#ae17e1 iyr:2013
  13. eyr:2024
  14. ecl:brn pid:760753108 byr:1931
  15. hgt:179cm
  16.  
  17. hcl:#cfa07d eyr:2025 pid:166559648
  18. iyr:2011 ecl:brn hgt:59in
  19. )
  20. OutputDebug, % "Valid Passports: " countValidPassports(passports) "`n"
  21.  
  22. passports := genPassports()
  23. OutputDebug, % "Valid Passports: " countValidPassports(passports) "`n"
  24.  
  25. genPassports(qty := 10)
  26. {
  27.     ; wikipedia.org/wiki/Human_hair_color#Natural_hair_colors
  28.     static hairColors := [ "brn"   ; Brown
  29.                          , "bld"   ; Blond
  30.                          , "blk"   ; Black
  31.                          , "aub"   ; Auburn
  32.                          , "red"   ; Red
  33.                          , "gry"   ; Gray
  34.                          , "wte" ] ; White"
  35.         , hairColorsCount := hairColors.Count()
  36.         ; wikipedia.org/wiki/Eye_color#Eye_color_chart_(Martin_scale)
  37.         , eyeColors := [ "amb"   ; Amber
  38.                        , "blu"   ; Blue
  39.                        , "brn"   ; Brown
  40.                        , "gry"   ; Gray
  41.                        , "grn"   ; Green
  42.                        , "hzl"   ; Hazel
  43.                        , "red"   ; Red
  44.                        , "vio" ] ; Violet
  45.         , eyeColorsCount := eyeColors.Count()
  46.         ; worldometers.info/geography/how-many-countries-are-there-in-the-world/
  47.         , countriesCount := 195
  48.         , passports := ""
  49.  
  50.     loop, % qty
  51.     {
  52.         passport := {}
  53.  
  54.         ; Birth Year
  55.         Random, byr, % A_Year - 90, % A_Year
  56.         passport.byr := byr
  57.  
  58.         ; Issue Year
  59.         Random, iyr, % A_Year - 10, % A_Year
  60.         iyr := (byr > iyr ? byr : iyr)
  61.         passport.iyr := iyr
  62.  
  63.         ; Expiration Year
  64.         Random, eyr, % iyr, % iyr + 10
  65.         passport.eyr := eyr
  66.  
  67.         ; Height
  68.         Random, hgt, 50, 210
  69.         passport.hgt := hgt "cm"
  70.  
  71.         ; Hair Color
  72.         Random, hcl, 1, % hairColorsCount
  73.         passport.hcl := hairColors[hcl]
  74.  
  75.         ; Eye Color
  76.         Random, ecl, 1, % eyeColorsCount
  77.         passport.ecl := eyeColors[ecl]
  78.  
  79.         ; Passport ID
  80.         Random, hasPid, 0, 1
  81.         if (hasPid)
  82.         {
  83.             passport.pid := A_TickCount
  84.         }
  85.  
  86.         ; Country ID
  87.         Random, cid, 1, % countriesCount
  88.         passport.cid := cid
  89.  
  90.         ; Randomly invalidate
  91.         Random, rnd, 0, 1
  92.         if (rnd)
  93.         {
  94.             Random, rem, 1, % keysCount
  95.             passport.Delete(keys[rem])
  96.         }
  97.  
  98.         for key,val in passport
  99.         {
  100.             Random, separator, 0, 1
  101.             passports .= key ":" val (separator ? " " : "`n")
  102.         }
  103.         passports := RTrim(passports) "`n`n"
  104.     }
  105.  
  106.     return passports
  107. }
  108.  
  109. countValidPassports(data)
  110. {
  111.     passport := ""
  112.     , count := tot := pos := 0
  113.     , data .= "`n" ; Must end in new line
  114.  
  115.     Loop, parse, data, `n, `r
  116.     {
  117.         if (A_LoopField)
  118.         {
  119.             passport .= A_LoopField " "
  120.             while (pos := InStr(A_LoopField, ":",, ++pos))
  121.             {
  122.                 tot++
  123.             }
  124.         }
  125.         else if (tot)
  126.         {
  127.             count += isValid := (tot = keysCount || (tot = (keysCount-1) && !InStr(passport, "cid")))
  128.             ; OutputDebug, % isValid " | " tot " | " passport "`n"
  129.             passport := "", tot := pos := 0
  130.         }
  131.     }
  132.     return count
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement