advent/2016/04.py
2017-12-12 13:57:20 -08:00

59 lines
1.4 KiB
Python

# Python!
import collections
# Count occurences of a letter in a string (excluding dashes)
# and return a list of the five most frequent, sorted first
# by frequency (desc) and then alphabetically( asc)
def letter_frequency(string):
letter_counts = collections.defaultdict(int)
for char in string.replace('-', ''):
letter_counts[char] += 1
sortable = []
for count in letter_counts:
sortable.append([count, letter_counts[count]])
sortable = sorted(sortable, key=lambda x: x[0])
sortable = sorted(sortable, key=lambda x: x[1], reverse=True)
frequencies = ''
for n in range(5):
frequencies += sortable[n][0]
return frequencies
# Alphabetically shift each letter in the encrypted room name
# by the sector #; replace dashes with spaces
def decrypt(room_data):
alphabet = collections.deque('abcdefghijklmnopqrstuvwxyz')
decrypted = ''
for char in room_data['letters']:
if char == '-':
decrypted += ' '
else:
i = alphabet.index(char)
alphabet.rotate(-1 * room_data['sector'])
decrypted += alphabet[i]
return (decrypted, room_data['sector'])
with open('04.txt') as file:
lines = file.read().splitlines()
rooms = []
for line in lines:
data = {
'letters': line[:-11],
'sector': int(line[-10:-7]),
'most_common': line[-6:-1],
}
if letter_frequency(data['letters']) == data['most_common']:
rooms.append(decrypt(data))
rooms.sort(key=lambda k: k[0])
for room in rooms:
print(room)