day_02_1.zig (10503B)
1 const std = @import("std"); 2 const debug = std.debug; 3 4 pub fn main() void { 5 var result = checksum(input_02); 6 debug.assert(result == 4712); 7 debug.warn("02-1: {}\n", result); 8 } 9 10 fn checksum(input: [] const [] const u8) u32{ 11 var num_with_pair: u32 = 0; 12 var num_with_triple : u32 = 0; 13 for (input) |id| { 14 if (has_pair(id)) { 15 num_with_pair += 1; 16 } 17 if (has_triple(id)) { 18 num_with_triple += 1; 19 } 20 } 21 22 return num_with_pair * num_with_triple; 23 } 24 25 fn has_pair(id: [] const u8) bool { 26 // ASCII: [ 65, 66, ..., 122 ] 27 const ascii_range = u8('z' - 'A') + 1; 28 var counts = []u32{0} ** ascii_range; 29 for (id) |char| { 30 var count_index: u8 = u8(char - 'A'); 31 debug.assert(count_index < counts.len); 32 counts[count_index] += 1; 33 } 34 for (counts) |count| { 35 if (count == 2) { 36 return true; 37 } 38 } 39 return false; 40 } 41 42 fn has_triple(id: [] const u8) bool { 43 // ASCII: [ 65, 66, ..., 122 ] 44 const ascii_range = u8('z' - 'A') + 1; 45 var counts = []u32{0} ** ascii_range; 46 for (id) |char| { 47 var count_index: u8 = u8(char - 'A'); 48 debug.assert(count_index < counts.len); 49 counts[count_index] += 1; 50 } 51 for (counts) |count| { 52 if (count == 3) { 53 return true; 54 } 55 } 56 return false; 57 } 58 59 test "letter dups" { 60 debug.assert(!has_pair("abcdef")); 61 debug.assert(!has_triple("abcdef")); 62 63 debug.assert(has_pair("bababc")); 64 debug.assert(has_triple("bababc")); 65 66 debug.assert(has_pair("abbcde")); 67 debug.assert(!has_triple("abbcde")); 68 69 debug.assert(!has_pair("abcccd")); 70 debug.assert(has_triple("abcccd")); 71 72 debug.assert(has_pair("aabcdd")); 73 debug.assert(!has_triple("aabcdd")); 74 75 debug.assert(has_pair("abcdee")); 76 debug.assert(!has_triple("abcdee")); 77 78 debug.assert(!has_pair("ababab")); 79 debug.assert(has_triple("ababab")); 80 } 81 82 const input_02 = [] const [] const u8 { 83 "luojygedpvsthptkxiwnaorzmq", 84 "lucjqgedppsbhftkxiwnaorlmq", 85 "lucjmgefpvsbhftkxiwnaorziq", 86 "lucjvgedpvsbxftkxiwpaorzmq", 87 "lrcjygedjvmbhftkxiwnaorzmq", 88 "lucjygedpvsbhftkxiwnootzmu", 89 "eucjygedpvsbhftbxiwnaorzfq", 90 "lulnygedpvsbhftkxrwnaorzmq", 91 "lucsygedpvsohftkxqwnaorzmq", 92 "lucjyaedpvsnhftkxiwnaorzyq", 93 "lunjygedpvsohftkxiwnaorzmb", 94 "lucjxgedpvsbhrtkxiwnamrzmq", 95 "lucjygevpvsbhftkxcwnaorzma", 96 "lucjbgedpvsbhftrxiwnaoazmq", 97 "llcjygkdpvhbhftkxiwnaorzmq", 98 "lmcjygxdpvsbhftkxswnaorzmq", 99 "lucpygedpvsbhftkxiwraorzmc", 100 "lucjbgrdpvsblftkxiwnaorzmq", 101 "lucjfgedpvsbhftkxiwnaurzmv", 102 "lucjygenpvsbhytkxiwnaorgmq", 103 "luqjyredsvsbhftkxiwnaorzmq", 104 "lucjygedpvavhftkxiwnaorumq", 105 "gucjygedpvsbhkxkxiwnaorzmq", 106 "lucjygedpvsbhftkxlwnaordcq", 107 "lucjygedpvibhfqkxiwnaorzmm", 108 "lucjegedpvsbaftkxewnaorzmq", 109 "kucjygeqpvsbhfokxiwnaorzmq", 110 "lugjygedwvsbhftkxiwnatrzmq", 111 "lucjygedqvsbhftdxiwnayrzmq", 112 "lucjygekpvsbuftkxiwnaqrzmq", 113 "lucjygedpvsbhfbkxiwnaoozdq", 114 "lscjygedpvzchftkxiwnaorzmq", 115 "luckygedpvsbxftkxiwnaorvmq", 116 "luyjygedgvsbhptkxiwnaorzmq", 117 "lmcjygedpvsbhfckxiwnaodzmq", 118 "lucmygedwvybhftkxiwnaorzmq", 119 "lgcjhgedavsbhftkxiwnaorzmq", 120 "lucjugedpvsbhftkxiwmaoozmq", 121 "lucjygedpvybhftkxkwnaorumq", 122 "lucjygedpvzbhfakxiwnaorzpq", 123 "lucjygedpvsbhftyxzwnajrzmq", 124 "lucjygedpvsdhfakxiwnoorzmq", 125 "luyjygeopvhbhftkxiwnaorzmq", 126 "lucjygadpvsbhntkxiwnaorzmx", 127 "lucjygedzvsbhftkiiwuaorzmq", 128 "sucjygodpvsbhftkxiwuaorzmq", 129 "euijygydpvsbhftkxiwnaorzmq", 130 "lucjlgeduvsbhftkxicnaorzmq", 131 "lucjdgedpvsbhfgkxiwnhorzmq", 132 "lucjymedpvsbhotkxiqnaorzmq", 133 "lucjygmdpvsbhftkxywnairzmq", 134 "lucjggedpvsbhfxkxiqnaorzmq", 135 "sucjygedpvsbhftkxiwnaorjmv", 136 "lucjlgedpvsbhftkxiwnairzmg", 137 "lucjygedppubhftkxijnaorzmq", 138 "lucjyxedpvsvhftkxlwnaorzmq", 139 "lucjygedpvxbhftkfiwyaorzmq", 140 "lucjygedposbhftkniwnaorzmw", 141 "lucjygewpvsbhftgxiwnavrzmq", 142 "lucjynedpvsbmftkaiwnaorzmq", 143 "lucjyhedpvzbhftkxiwncorzmq", 144 "lucjygedpvsbhfikpiwnaoezmq", 145 "lupjypedpvsbhftkjiwnaorzmq", 146 "lucjygudpvsbhfwkxivnaorzmq", 147 "lucjygrdpvsbhatkxzwnaorzmq", 148 "lucjbgmdpvsbhftkxihnaorzmq", 149 "lucjmgedpvpbhftkxiwnaorcmq", 150 "lucjygedpvskhfukmiwnaorzmq", 151 "lucjygedgvsbhftkxiwnvprzmq", 152 "lucjzgedppsbhytkxiwnaorzmq", 153 "lfcjypedpvsbhftrxiwnaorzmq", 154 "lucjyqldphsbhftkxiwnaorzmq", 155 "lucjygedpvsbhftzxewnaorzqq", 156 "lucjygeapvsbhftkxiinoorzmq", 157 "lucjygedpvszhftguiwnaorzmq", 158 "luojygedpvsbhftkxawnaornmq", 159 "lucjygedpcsboetkxiwnaorzmq", 160 "lufjygedpvfbhftaxiwnaorzmq", 161 "luciygedpvsbhftkxhwaaorzmq", 162 "lucjygedpvnbhftkaiwnaorzmc", 163 "lucjygedpvsbhftkxiwcaorbdq", 164 "lucjygelpvsbhftaxiwsaorzmq", 165 "lujjygedpssbhftkxiwnaorzmr", 166 "ludjygedpvsbhftkxiynaorzmj", 167 "lukjygeedvsbhftkxiwnaorzmq", 168 "lucjqpedpvsbhftkxiwnaozzmq", 169 "jucjygedpvsbhftkxgwnaorqmq", 170 "llwjygedpvsbhetkxiwnaorzmq", 171 "rucjygedpvsbhftkxiwndorymq", 172 "lucjygedpvsbhftvxswnaorwmq", 173 "lucjygerpvsbhfykxiwnaormmq", 174 "lucjynedpvsbhftkxijnaorziq", 175 "ljcjygedpvrbhftkeiwnaorzmq", 176 "lucjygedpnsbhftkxiwhaornmq", 177 "lucjygadpvsbhftkxibnaorzqq", 178 "lucjqgedpvsihftkxiwnaorzdq", 179 "lucjygedpvsqhfttjiwnaorzmq", 180 "llcjygedsvsbhftkxiwwaorzmq", 181 "lfckygedpvsbhftkxiunaorzmq", 182 "lucjyeedpdsbhftkxiwnaotzmq", 183 "lucjygedpvsbhftkoiwnaoqzcq", 184 "huwjvgedpvsbhftkxiwnaorzmq", 185 "lucjygldpvsbdhtkxiwnaorzmq", 186 "lycxygedpvsbhftmxiwnaorzmq", 187 "lucjygedpvsbhftyxianvorzmq", 188 "lucuygedpdsbhqtkxiwnaorzmq", 189 "lucjyggdpvsbhftkxiwnavremq", 190 "lucjyggdpvsbkftkxiwnaorbmq", 191 "luchyqedpvsbhftixiwnaorzmq", 192 "lpcnygedpvsbhftkxzwnaorzmq", 193 "lucjygedpvsihftkxiwfaortmq", 194 "lucjygvdpvsbhgtkxiwnamrzmq", 195 "lucjygodpvrbhqtkxiwnaorzmq", 196 "lucjygedpfsbhftkxipnaorzma", 197 "lucjygedpvsbhftkxpcjaorzmq", 198 "lucjygodbmsbhftkxiwnaorzmq", 199 "lucjygedpvsbhftkxipnaogzmb", 200 "luxjygjdpvsbhltkxiwnaorzmq", 201 "lucxygedpvsbhftkxzwnaorjmq", 202 "luajygedpvsbhftzxiwaaorzmq", 203 "lhcjygedpvsqhftfxiwnaorzmq", 204 "lucjygecphsbhftkxiwnaprzmq", 205 "lucjygedpvsbhptkxifnaorqmq", 206 "lucjygedpvichftkpiwnaorzmq", 207 "lucjygedpcsbhstkxswnaorzmq", 208 "kucjygedpvsbhftkxiwbyorzmq", 209 "lfpjxgedpvsbhftkxiwnaorzmq", 210 "lucjytldpvsbhftkxiwdaorzmq", 211 "lufjygedpvfbhftbxiwnaorzmq", 212 "lucjygebpvgbhftkxipnaorzmq", 213 "luujygedpvdbhftkxiwnaorzmd", 214 "lucjygedpvsbhfbyxwwnaorzmq", 215 "lucjygedpvsbhftkxiwnaoqpmw", 216 "qucgygedpvsbhftkxiwnaortmq", 217 "ludjtgedpvsbhftkxiunaorzmq", 218 "lucjyiedovsbhftkxiwjaorzmq", 219 "lucjygedpysbjftoxiwnaorzmq", 220 "lumjygedpvsbuftkxiknaorzmq", 221 "lucjygedpvsbhfokxgonaorzmq", 222 "lucjygeqpvsbhftkfiwnaorzeq", 223 "lucjygedpvskhftkxiwntorkmq", 224 "luujygedpvsbhftkxiwraorzmt", 225 "lucwygedpvsbjftkxiwnaorzmj", 226 "jucjyfedcvsbhftkxiwnaorzmq", 227 "luujygedpnsehftkxiwnaorzmq", 228 "lucjygedpvszhfckxiwnaorzmi", 229 "lucjyredpvsbzftkpiwnaorzmq", 230 "lucjygedpvsbwfgkxiwnaorzoq", 231 "lucjygedpvgbhftkpiwnaorzms", 232 "lucjygedpvjbhftkxzwnaoizmq", 233 "vucjycedpvsbhftkxiwfaorzmq", 234 "luawygeapvsbhftkxiwnaorzmq", 235 "lucjygetpvsbhftkxiwnaafzmq", 236 "lucjvgedpvsbhftkxywnavrzmq", 237 "luolygedpvsbgftkxiwnaorzmq", 238 "likjygedpvsbhftkxiwnabrzmq", 239 "lucjygedovsbhftkxirpaorzmq", 240 "lucjygedphsshftkxqwnaorzmq", 241 "uuqjygewpvsbhftkxiwnaorzmq", 242 "lucjygedcvsbhftkxiwoarrzmq", 243 "lucnygedpvsbhfakxiwnaorzms", 244 "lucjygedpvsbhntkxiwnawrzmb", 245 "lucjygedpvsblfxkxivnaorzmq", 246 "lucjygedpvsghftkxiwnaawzmq", 247 "yucjygedpgsbhftkxiwnaorzbq", 248 "lucjyweapvsbhftkxiwnaoezmq", 249 "lucjygevpvsbyftcxiwnaorzmq", 250 "luejygedovsbhftkxiwnqorzmq", 251 "lucjyqedpvsbhfbkxiwnaorzms", 252 "lucjypedpvsbhftwxiwnhorzmq", 253 "lucjygedpvsbhmtkviwxaorzmq", 254 "lucjogedpvpbhftkxiwnaorqmq", 255 "lucjygedpvsbhztkxkwnaoazmq", 256 "lucjyaedpvsbcftkxiwnaorzhq", 257 "lucjygbdpvkbhftkxiznaorzmq", 258 "lucpygedpvzbhftkxfwnaorzmq", 259 "lucjmgedpcsbhftkxiwnaoezmq", 260 "lucjygedyvsbbftkxiwnnorzmq", 261 "lucjyyedpvsbhftuxiwnaonzmq", 262 "lucjygfdpvsbhutkxiwnaorzmt", 263 "uccjygedpvschftkxiwnaorzmq", 264 "lusjygedpvbbhqtkxiwnaorzmq", 265 "ducuygedpvsbhftkxiwnaorzyq", 266 "lucjygkdvwsbhftkxiwnaorzmq", 267 "cucjyyedpvsbhftkxiwnaerzmq", 268 "lucjygedavsbhftkxiwnkorzbq", 269 "lucjygedmvsyhftkxiwiaorzmq", 270 "lucjygeipvsbhfpkxiwnaorzpq", 271 "vucjugedvvsbhftkxiwnaorzmq", 272 "lucjyzedpvsbhftkxpwnaoozmq", 273 "lucjygedpvgbhftkxiwtaorzqq", 274 "lecjygedpvcwhftkxiwnaorzmq", 275 "lucjyghdpvsbhfcyxiwnaorzmq", 276 "lucjygedpvesqftkxiwnaorzmq", 277 "lucjyjehpvsbhftbxiwnaorzmq", 278 "lucjygedpvtbhdtkxignaorzmq", 279 "lucjygxdpgsbhftkxivnaorzmq", 280 "lucjygvdpvsbhftkpiwnaorzqq", 281 "lucjysedpvsbhftkxiwnalrzmc", 282 "lucjygedpvkbhjtkxiwnaorsmq", 283 "lucjygedpvsbvfgkxiwnaerzmq", 284 "lucjygedpvsihftkxilnaorzmu", 285 "lvcvygndpvsbhftkxiwnaorzmq", 286 "lucjysedpqsbhftkxiwnaordmq", 287 "lucsygeypvsbhftkwiwnaorzmq", 288 "lucjygewpotbhftkxiwnaorzmq", 289 "lucjysedpvsbhftkxiwnanrzmv", 290 "lucjygedpvsbhutkxiwnaoplmq", 291 "wucjygedpvsqbftkxiwnaorzmq", 292 "lacjygeepvsbhftkxiwnjorzmq", 293 "lucjygedpusyhftkxicnaorzmq", 294 "qucjyredpvsbhftkxiwnworzmq", 295 "lucjygedevsbhftkgiwnayrzmq", 296 "lucjygedpksbrftkliwnaorzmq", 297 "lucjygedpvsbhfgkxisnaorzeq", 298 "lucjygedpvhdhftkeiwnaorzmq", 299 "lucjsgedpvsboftkxiwnaorumq", 300 "luctygedpvsbhftouiwnaorzmq", 301 "lucjygedpvsjhfukjiwnaorzmq", 302 "lucjagrepvsbhftkxiwnaorzmq", 303 "lucjkgerpvsbhftkxiwnairzmq", 304 "turjygedpvsbnftkxiwnaorzmq", 305 "lbcjygedpvsbhftkdpwnaorzmq", 306 "lucpygedpvsbhftkxnwnoorzmq", 307 "jucjygedpvsbhbtkxicnaorzmq", 308 "lecjygedpvsbhftkriwnaogzmq", 309 "licjyvcdpvsbhftkxiwnaorzmq", 310 "lrcjygewpnsbhftkxiwnaorzmq", 311 "ltcxygedpvlbhftkxiwnaorzmq", 312 "luctygedpvhbhztkxiwnaorzmq", 313 "lucwygedplsbhfakxiwnaorzmq", 314 "lucjygedpnsbhftkxiwjaoezmq", 315 "lucpygedptsbhftkxiwnaorzmo", 316 "lucjygedpvibhqtkxiknaorzmq", 317 "lucjwgqdpvrbhftkxiwnaorzmq", 318 "lucjmgkdpvsbhftkxiwraorzmq", 319 "lucjygwupvsbhftkxiznaorzmq", 320 "lucjhgedpvobhftkxiwncorzmq", 321 "lucjygedpvsbhftkxiwnaohtmj", 322 "lucjygedpvsbeftkfiwnaorzyq", 323 "lucjygcdpvsbpftkhiwnaorzmq", 324 "lucjygedpmsbhftkxiwnkouzmq", 325 "oucjygedpvsbyftkximnaorzmq", 326 "lucjcgedpvsbhftkxywnforzmq", 327 "lfcjygedfvsbdftkxiwnaorzmq", 328 "ducjygedevsbhfttxiwnaorzmq", 329 "ldcjdgedpvsbhftkxiwnavrzmq", 330 "lucjymedmvsbhqtkxiwnaorzmq", 331 "lucjygedpvabhftkxiwnasrlmq", 332 "lucjygefpvsbhftkxmwnaorkmq", 333 };