DEV Community

Viper
Viper

Posted on • Updated on

Advent of Code 2020: Python Solution Day 6

I am trying this only after few hour of the challenge unlocked. And first part was easy to solve. But for second part, I had to take help from reddit thread, specially here.
From few challenges, I first started with the toy example given there and if all the cases matches on this example input then feed my input to this algorithm and done. Here, day6_test.txt is a example input present on the challenge link. And day6.txt is my input. A repo with output is present at GitHub.

with open("day6_test.txt", "r") as fp:
    lines=fp.readlines()

with open("day6.txt", "r") as fp:
    lines=fp.readlines()

groups = []
group = []
for question in lines:
    if question!="\n":
        group.append(question.split("\n")[0])
    else:
        groups.append(group)
        group=[]
groups.append(group)

# solution to challenge 1
solution_1 = []
for group in groups:
    #print(f"Group: ", group)
    unique_ques = []
    for ques in group:
        unique_ques.extend([uq for uq in ques])

    #print(f"Unique questions: {set(unique_ques)}")
    solution_1.extend(list(set(unique_ques)))
print(f"Solution 1: {len(solution_1)}")


# solution to challenge 2
from collections import Counter
total = 0
for group in groups:
    #print(f"\nGroup: {group}")
    group_size = len(group)
    #print(f"Length of group: {group_size}")

    # make single list of enitire group and count occurence
    counts = Counter("".join(group))
    #print(counts)

    counts = Counter(list(counts.values()))[group_size]
    total+=counts
print(f"Solution 2:", total)
Enter fullscreen mode Exit fullscreen mode

I write blogs about Computer Vision projects on my GitHub page q-viper.github.io and if you got some time please share yours too.

Oldest comments (6)

Collapse
 
r0f1 profile image
Florian Rohrer

Here is my Python solution:

from collections import Counter

with open("input.txt") as f:
    grps = [x.strip().split() for x in f.read().split("\n\n")]

print(sum([len(Counter("".join(g))) for g in grps]))
print(sum([len([v for v in Counter("".join(g)).values() if v == len(g)]) for g in grps]))
Enter fullscreen mode Exit fullscreen mode

Github Link

Collapse
 
qviper profile image
Viper

So simple yet so tricky.

Collapse
 
qviper profile image
Viper

Still it is awesome. Thanks for sharing.

Collapse
 
oguimbal profile image
Olivier Guimbal

My haskell solution

groups = splitWhen (== "") . lines <$> readFile "./data.txt"
part1 = sum . map (length . Set.fromList . intercalate "") <$> groups
part2 = sum . map (Set.size . foldl1 Set.intersection . map Set.fromList)  <$> groups
Enter fullscreen mode Exit fullscreen mode
Collapse
 
qviper profile image
Viper

Just in 3 lines. It is great.

Collapse
 
caloma11 profile image
Gianluca Perrone • Edited

Ruby two liner

group_answers = File.open("input.txt").read.split("\n\n")
group_answers.reduce(0) { |sum, group| sum + group.split("\n").map { |i| i.split("") }.inject(:&).count }
Enter fullscreen mode Exit fullscreen mode