2

2020 Advent of Code–Day 4 | Voice of the DBA

 3 years ago
source link: https://voiceofthedba.com/2021/04/28/2020-advent-of-code-day-4-2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

This series looks at the Advent of Code challenges.

As one of my goals, I’m working through challenges. This post looks at day 4. I’m going to do this one in Python here, though I did solve it in other languages in my repo.

Part 1

We have another string parsing operation. We get a series of lines that represent a passport. Passports are separated by blank lines. Therefore, we can get 1-x number of lines representing a passport.

Python seems like a good place to start here. I loaded the file and then started to concatenate rows of data until I found a blank one.

file_handle = open('2020\day4\day4_data.txt', 'r')
passports = file_handle.readlines()
part1 = 0
currpassport = ""
for row in passports:
if row not in ['\n','\r\n']:
        currpassport += row.replace('\n',' ')
#print(currpassport.split(" "))

else:

At this point, I have a passport I can look at, with all the various sections. I used another split, this time into a dictionary to get each item separate.

currdict = dict(x.split(":") for x in currpassport.split(" ") if x)

Now, I can count these. If there are 8, or if there are 7 and CID is one of them, I have a valid passport. Adding these up gets me the answer.

Part 2

This is very similar, but each part now needs validation. So, I take the same structure, but once I have passports, I assume they are valid and start to check each section. It’s really a series of IF statements for me.

            valid = 1
if ((int(currdict["iyr"]) < 2010) or (int(currdict["iyr"]) > 2020)):
                valid = 0
if int(currdict["byr"]) < 1920 or int(currdict["byr"]) > 2002 :
                valid = 0
if int(currdict["eyr"]) < 2020 or int(currdict["iyr"]) > 2030:
                valid = 0

These each could be functions, and I’d refactor that way, but I couldn’t come up with an easier way to do this. After checking if I have enough valid items, I tally another passport (or not).

Overall, this felt like busy work, not hard, but just a grind through each set of validation.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK