Working on 2015/05 part 2
This commit is contained in:
parent
ee99eeb0e4
commit
d2d97b442b
67
2015/05/5.md
Normal file
67
2015/05/5.md
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
## \-\-- Day 5: Doesn\'t He Have Intern-Elves For This? \-\--
|
||||||
|
|
||||||
|
Santa needs help figuring out which strings in his text file are naughty
|
||||||
|
or nice.
|
||||||
|
|
||||||
|
A *nice string* is one with all of the following properties:
|
||||||
|
|
||||||
|
- It contains at least three vowels (`aeiou` only), like `aei`,
|
||||||
|
`xazegov`, or
|
||||||
|
`aeiouaeiouaeiou`{title="John Madden John Madden John Madden"}.
|
||||||
|
- It contains at least one letter that appears twice in a row, like
|
||||||
|
`xx`, `abcdde` (`dd`), or `aabbccdd` (`aa`, `bb`, `cc`, or `dd`).
|
||||||
|
- It does *not* contain the strings `ab`, `cd`, `pq`, or `xy`, even if
|
||||||
|
they are part of one of the other requirements.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- `ugknbfddgicrmopn` is nice because it has at least three vowels
|
||||||
|
(`u...i...o...`), a double letter (`...dd...`), and none of the
|
||||||
|
disallowed substrings.
|
||||||
|
- `aaa` is nice because it has at least three vowels and a double
|
||||||
|
letter, even though the letters used by different rules overlap.
|
||||||
|
- `jchzalrnumimnmhp` is naughty because it has no double letter.
|
||||||
|
- `haegwjzuvuyypxyu` is naughty because it contains the string `xy`.
|
||||||
|
- `dvszwmarrgswjxmb` is naughty because it contains only one vowel.
|
||||||
|
|
||||||
|
How many strings are nice?
|
||||||
|
|
||||||
|
Your puzzle answer was `236`.
|
||||||
|
|
||||||
|
The first half of this puzzle is complete! It provides one gold star: \*
|
||||||
|
|
||||||
|
## \-\-- Part Two \-\-- {#part2}
|
||||||
|
|
||||||
|
Realizing the error of his ways, Santa has switched to a better model of
|
||||||
|
determining whether a string is naughty or nice. None of the old rules
|
||||||
|
apply, as they are all clearly ridiculous.
|
||||||
|
|
||||||
|
Now, a nice string is one with all of the following properties:
|
||||||
|
|
||||||
|
- It contains a pair of any two letters that appears at least twice in
|
||||||
|
the string without overlapping, like `xyxy` (`xy`) or `aabcdefgaa`
|
||||||
|
(`aa`), but not like `aaa` (`aa`, but it overlaps).
|
||||||
|
- It contains at least one letter which repeats with exactly one
|
||||||
|
letter between them, like `xyx`, `abcdefeghi` (`efe`), or even
|
||||||
|
`aaa`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- `qjhvhtzxzqqjkmpb` is nice because is has a pair that appears twice
|
||||||
|
(`qj`) and a letter that repeats with exactly one letter between
|
||||||
|
them (`zxz`).
|
||||||
|
- `xxyxx` is nice because it has a pair that appears twice and a
|
||||||
|
letter that repeats with one between, even though the letters used
|
||||||
|
by each rule overlap.
|
||||||
|
- `uurcxstgmygtbstg` is naughty because it has a pair (`tg`) but no
|
||||||
|
repeat with a single letter between them.
|
||||||
|
- `ieodomkazucvgmuy` is naughty because it has a repeating letter with
|
||||||
|
one between (`odo`), but no pair that appears twice.
|
||||||
|
|
||||||
|
How many strings are nice under these new rules?
|
||||||
|
|
||||||
|
Answer:
|
||||||
|
|
||||||
|
Although it hasn\'t changed, you can still [get your puzzle
|
||||||
|
input](5/input).
|
||||||
|
|
104
2015/05/solution.py
Normal file
104
2015/05/solution.py
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#!/bin/python3
|
||||||
|
import sys,re
|
||||||
|
from pprint import pprint
|
||||||
|
sys.path.insert(0, '../../')
|
||||||
|
from fred import list2int
|
||||||
|
|
||||||
|
input_f = 'input'
|
||||||
|
|
||||||
|
part = 2
|
||||||
|
#########################################
|
||||||
|
# #
|
||||||
|
# Part 1 #
|
||||||
|
# #
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
def isNaughty(inst):
|
||||||
|
bad_words = ['ab','cd','pq','xy']
|
||||||
|
|
||||||
|
if any(w in inst for w in bad_words):
|
||||||
|
return True
|
||||||
|
if sum(inst.lower().count(v) for v in "aeiou") < 3:
|
||||||
|
return True
|
||||||
|
for i in range(0,len(inst)-1):
|
||||||
|
if inst[i] == inst[i+1]:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
instructions = []
|
||||||
|
|
||||||
|
if part == 1:
|
||||||
|
count = 0
|
||||||
|
with open(input_f) as file:
|
||||||
|
for line in file:
|
||||||
|
instructions.append(line.rstrip())
|
||||||
|
|
||||||
|
for inst in instructions:
|
||||||
|
if not isNaughty(inst):
|
||||||
|
count += 1
|
||||||
|
print(count)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#########################################
|
||||||
|
# #
|
||||||
|
# Part 2 #
|
||||||
|
# #
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
def isNaughty2(inst):
|
||||||
|
# bad_words = ['ab','cd','pq','xy']
|
||||||
|
|
||||||
|
# if any(w in inst for w in bad_words):
|
||||||
|
# return True
|
||||||
|
# if sum(inst.lower().count(v) for v in "aeiou") < 3:
|
||||||
|
# return True
|
||||||
|
# for i in range(0,len(inst)-1):
|
||||||
|
# if inst[i] == inst[i+1]:
|
||||||
|
# return False
|
||||||
|
# return True
|
||||||
|
|
||||||
|
pairs = []
|
||||||
|
for i in range(0,len(inst)-1):
|
||||||
|
tmp = inst[i]+inst[i+1]
|
||||||
|
pairs.append(tmp)
|
||||||
|
#print(inst)
|
||||||
|
#print(pairs)
|
||||||
|
n_pairs = []
|
||||||
|
sdx = 0
|
||||||
|
while sdx < len(pairs)-2:
|
||||||
|
#for sdx in range(0,len(pairs)-1):
|
||||||
|
if pairs[sdx] != pairs[sdx+1]:
|
||||||
|
n_pairs.append(pairs[sdx])
|
||||||
|
if pairs[sdx] == pairs[sdx+1] and pairs[sdx] == pairs[sdx+2]:
|
||||||
|
n_pairs.append(pairs[sdx])
|
||||||
|
n_pairs.append(pairs[sdx+2])
|
||||||
|
sdx+=1
|
||||||
|
#print(n_pairs)
|
||||||
|
|
||||||
|
opt = [item for item in set(pairs) if n_pairs.count(item) > 1]
|
||||||
|
|
||||||
|
|
||||||
|
#print(opt)
|
||||||
|
if len(opt) > 0:
|
||||||
|
for i in range(0,len(inst)-2):
|
||||||
|
if inst[i] == inst[i+2]:
|
||||||
|
print(inst[i], inst[i+1],inst[i+2])
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
return True
|
||||||
|
|
||||||
|
if part == 2:
|
||||||
|
instructions = []
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
with open(input_f) as file:
|
||||||
|
for line in file:
|
||||||
|
instructions.append(line.rstrip())
|
||||||
|
|
||||||
|
for inst in instructions:
|
||||||
|
if not isNaughty2(inst):
|
||||||
|
#print('Nice')
|
||||||
|
count += 1
|
||||||
|
#input()
|
||||||
|
print(count)
|
4
2015/05/test2
Normal file
4
2015/05/test2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
qjhvhtzxzqqjkmpb
|
||||||
|
xxyxx
|
||||||
|
uurcxstgmygtbstg
|
||||||
|
ieodomkazucvgmuy
|
2
2015/05/test3
Normal file
2
2015/05/test3
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
aaaa
|
||||||
|
aaabcb
|
Loading…
Reference in New Issue
Block a user