Passphrases

A valid passphrase must contain no duplicate words.

Part 1


In [11]:
import numpy as np

def valid_passphrase(l):
    counter = np.array([l.count(v) for v in l])
    return len(counter[counter == 1]) == len(l)

In [12]:
import csv

valid_counter = 0
with open('input.txt', 'rt') as f_input:
    csv_reader = csv.reader(f_input, delimiter=' ')
    solution = sum([valid_passphrase(line) for line in csv_reader])
solution


Out[12]:
386

Part 2

Now, a valid passphrase must contain no two words that are anagrams of each other - that is, a passphrase is invalid if any word's letters can be rearranged to form any other word in the passphrase.

In [13]:
import itertools
from collections import Counter

def anagram(s, t):
    return Counter(list(s)) == Counter(list(t))

def valid_passphrase_anagram(l):
    for i, s in enumerate(l):
        for t in l[i+1:]:
            if anagram(s, t):
                return False
    return True

Solution


In [14]:
import csv

valid_counter = 0
with open('input.txt', 'rt') as f_input:
    csv_reader = csv.reader(f_input, delimiter=' ')
    solution = sum([valid_passphrase_anagram(line) for line in csv_reader])
solution


Out[14]:
208

In [ ]: