# Day 4: High-Entropy Passphrases
from itertools import permutations
from time import perf_counter
from u.colors import cyan, purple, red

def d4a():
  # A passphrase is valid for part 1 if every word is unique.
  return sum(1 for row in rows if len(set(row)) == len(row))

def is_anagram(row):
  for w1, w2 in permutations(row, 2):
    if len(w1) == len(w2) and sorted(w1) == sorted(w2):
      return True

def d4b():
  # Part 2 keeps the duplicate-word rule and rejects anagram pairs as well.
  return sum(1 for row in rows if len(set(row)) == len(row) and not is_anagram(row))

t = perf_counter()

# Parse each passphrase once so both parts can reuse the same rows.
rows = [line.split() for line in open('y2017/d4/i.txt').read().splitlines()]

cyan(f'\na) {d4a()}')
purple(f'b) {d4b()}')
red(f'T: {(perf_counter() - t) * 1000} ms\n')
