DEV Community

loading...

Advent of Code 2020: Python Solution Day 6

qviper profile image Viper Updated on ・2 min read

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.

Discussion (7)

pic
Editor guide
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
philippurwoko profile image
Philip Purwoko

This is my solution using python for part 1 ( Not using python list comprehension version )

answers = []

with open('input.txt') as file:
    answer = []
    for i in file.readlines():
        if i != '\n':
            for q in i[:-1]:
                if q not in answer:
                    answer.append(q)
        else:
            answers.append(len(answer))
            answer = []
    answers.append(len(answer))

print(sum(answers))
Enter fullscreen mode Exit fullscreen mode
Collapse
qviper profile image
Viper Author

Still it is awesome. Thanks for sharing.

Collapse
qviper profile image
Viper Author

So simple yet so tricky.

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 Author

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