From 967da066ce8d1902f486397c64067cda0a0bccf7 Mon Sep 17 00:00:00 2001 From: earnest ma Date: Thu, 11 May 2023 20:24:50 -0400 Subject: [PATCH] 2015/day05: Complete! --- 2015/day05.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 2015/day05.txt | Bin 0 -> 17022 bytes 2015/day05_test.py | 13 +++++++ 3 files changed, 108 insertions(+) create mode 100644 2015/day05.py create mode 100644 2015/day05.txt create mode 100644 2015/day05_test.py diff --git a/2015/day05.py b/2015/day05.py new file mode 100644 index 0000000..2e9ab70 --- /dev/null +++ b/2015/day05.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 + + +from typing import TextIO + + +def nice_or_naughty(string: str) -> int: + """0 for naughty and 1 for nice""" + # count vowels + cv = ( + string.count("a") + + string.count("e") + + string.count("i") + + string.count("o") + + string.count("u") + ) + + if cv < 3: + return 0 + + # twice in a row + dbl = 0 + for ch in range(0, len(string)): + if len(string) > ch + 1 and string[ch] == string[ch + 1]: + dbl += 1 + + if dbl == 0: + return 0 + + # naughty strings + n = ("ab", "cd", "pq", "xy") + for x in n: + if x in string: + return 0 + + return 1 + + +def nn2(string: str) -> int: + # first + a = 0 # we can only have 0 or 1, because of the return + # not anymore b/c it's BOTH, but whatever + + for c in range(0, len(string) - 1): + pair = string[c : c + 2] + # print("pair is", pair) + + for d in range(c + 2, len(string) - 1): # , len(string) - 2): + # print("trying to match", pair, string[d : d + 2]) + if d + 1 < len(string) and string[d : d + 2] == pair: + # print("yay") + a += 1 + break + else: # ?? huuhhh? https://stackoverflow.com/questions/653509/breaking-out-of-nested-loops + continue + + break + + # second + b = 0 + + for c in range(0, len(string) - 2): + if string[c] == string[c + 2]: + b += 1 + break + + if a == 1 and b == 1: + return 1 + return 0 + + +def part1(file: TextIO) -> int: + count = 0 + + for string in file: + count += nice_or_naughty(string.strip()) + + return count + + +def part2(file: TextIO) -> int: + count = 0 + + for string in file: + count += nn2(string.strip()) + + return count + + +if __name__ == "__main__": + with open("day05.txt", "r") as f: + print(part1(f)) + + with open("day05.txt", "r") as f: + print(part2(f)) diff --git a/2015/day05.txt b/2015/day05.txt new file mode 100644 index 0000000000000000000000000000000000000000..150325bf3075f3aa1e57e012308c3220472d12fe GIT binary patch literal 17022 zcmV(pK=8i+M@dveQdv+`0J5^bR5n3TPKEKtz2?}eImU*SZuz_$BB5GZ_`p4nYwv1d z_P(mbj=JH;@cOfeA47PiSY0idM?i=M7Cg?!{pr^?HwEq*ZN(cl*59H3E*r*a*GW$6 z7kWJt(6=_IAT9ls9UV)Q3e@pwK7Pn!gTN!PAXSXrLO`ISH~6J|&TpA00s8yrihKQ9 z9z;(n9<+RmhD8`sky<-Nf$(K6@DCD*5PHHsF$pfuAi=Y2<&9=@p9HAE6^lR~H z*!eXkC{+t%^7vhXrH&|ul}1AkV6W!IP}3|lH>B_Hy9Kn6g#&~RkT-=nE1A&P3pm6{ zZS62}ne$q02cq)CbGz)AHXctJE**HlT}_%-JDrsi5#5WvL@vtgDB@>29y)hT3ERCS z*LM`$!ixV$of5wHV?2k7B84%Lv_rR*A(@EL(H{X~59a>G76vfPu)QeC%w_SRs2HaC ze_owaC6M1*7ZC?)^!<$of*3)*ci_fd!t}kj_CCEyq?{0@e!^PF)F%0AS^FQ7y!+->*&74V|tN) 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 literal 0 HcmV?d00001 diff --git a/2015/day05_test.py b/2015/day05_test.py new file mode 100644 index 0000000..fc4c687 --- /dev/null +++ b/2015/day05_test.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +from day05 import * + + +def test_part1() -> None: + with open("day05.txt", "r") as f: + assert part1(f) == 238 + + +def test_part2() -> None: + with open("day05.txt", "r") as f: + assert part2(f) == 69