Skip to main content

Advent of Code, day 1

 Day 1 of the Advent of Code

A bit late for Christmas, isn't it?


It's been a long time since I did my last post, some days of boredom have inspired me to get back at it. I am going to be trying to solve the last Christmas' Advent of Code. For those that you don't know the Advent of Code is an Advent calendar of small programming puzzles that can be solved the way you like, each day contains two puzzles in which the first is linked to the second.

If you want to get more info about it, check out this link: https://adventofcode.com/2023/about

Without further ado, let's get at it, I'm going to copy down below the statement for the Day 1

Statement

Input

Basically we are given a long list of characters (the one shown in the picture) where each line contains numbers and letters, we first need to get just the numbers, then store somewhere else the first and last numbers in each row, and lastly sum all those values.

A link to the input file: https://adventofcode.com/2023/day/1/input

This time the challenge is fairly straightforward (or at least it seems so once I have solved it, like it always does when it's done), I'm going to copy here the solution from my Google Collab notebook.

import pandas as pd
filepath = "/content/input 1.txt"

df = pd.read_csv(filepath, header = None).iloc[:,0]

row = []
text = []
numbers = []
first_last = []

for i in df:
  for j in i:
    if j.isnumeric():
      row.append(j)
  text.append(row)
  row = []

for i in text:
  numbers.append(''.join(i))

for i in numbers:
  a = 10*int(i[0])
  b = int(i[-1])
  c = a + b
  first_last.append(c)

sum(first_last)

The result to that last step is 53194 btw, screenshot for proof.


Let's go for task number two of day 1, I guess it's going to be harder.


This one is more tricky and it actually took me a while to figure out what I was doing wrong, my first approach to transform the numbers ("one", "two", "three" and so on) into numbers was to iterate through a list that then would open a dictionary replace the value.

Well this approach was not a good one, because in instances like "eightwo" even if "eight" appears first, "two" would appear before in my list and so that it would replace it like so "eigh2". Alright, let's move on, the next approach was to use REGULAR EXPRESSIONS, it didn't work either because if in an instance like "eightwo" it would detect the "eight" in the first place it would replace it like so "8wo" and so that I would miss the second number.

At this point I was about to give up, I didn't know why it was failing, I tried in the little example that appears on top and everything to work alright, then I realized what I explained in the last paragraph, so the next strategy would be to check letter by letter until I found the match. It took me a while but I got it, here below my answer:

import pandas as pd
import re

filepath_2 = "/content/input 2.txt"
input = pd.read_csv(filepath_2, header = None).iloc[:,0]

values = {
    'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',
    'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9',
    'ten': '10'
}

pairs = []
for line in input:
    digits = []
    for i,c in enumerate(line):
        if line[i].isdigit():
            digits.append(line[i])
        else:
            for k in values.keys():
                if line[i:].startswith(k):
                    digits.append(values[k])
    pairs.append(int(f"{digits[0]}{digits[-1]}"))

sum(pairs)

And the result is

And finally, after being stucked for a long while in the second task, I got my second star, there you go, the proof that I did it:

Fantastic, let's see if I convince myself to do the Day 2.



Comments

Popular posts from this blog

A first approach to IoT, connecting my 3D printer to the internet

My first approach to the IoT, connecting my 3D printer to the internet IoT is one of those fancy words that people like to talk about in conferences and in TedTalks without (apparently) having too much idea of what it is all about. Set up to manage the 3D printer through the internet This one is going to be a short entry where I don't go through code or anything, just wanted to talk about a bit about how I connected my 3D printer to the internet.  I've been in the 3D printing thing for a while now, about a year and I haven't stopped printing ever since I bought my Ender 3. Fortunately enough, I live in a big house where my room/working place is on the fourth floor and my 3D printing is on the first one. You might be thinking as well: "OK Pablo but where do you want to bring us? Go to the point" Well, as you might have noticed there are two floors in betw...

Advent of Code, day 2

We made it to Day 2 of Advent of Code I have kept my promise for 2 days in a row. As weird as it seems for this day and age, I have kept my promise and today is the day 2 of the Advent of Code, this time with elves involved. There you go, the statement of today's first problem down below: And usual, my solution: import pandas as pd import re import numpy as np filepath = "/content/input 1.txt" with open (filepath, 'r' ) as file :     lines = [line.strip() for line in file .readlines()] lines_split = [] for line in lines:   token = re.findall(r '\w+|[^\s\w]' , line)   lines_split.append(token) blue_list = [] green_list = [] red_list = [] for line in lines_split:   blue,green,red = 0 , 0 , 0   for ix, word in enumerate (line):     if word == "blue" :       if blue < int (line[ix -1 ]):         blue = int (line[ix -1 ])     if word == "green" :       if green < int (...

How many paths the snake in the Snake game can take?

How many paths the snake in the Snake game can take? I was given this challenge last week and I thought I would share my way of solving it with you all Y'all know the famous game "Snake", so no need for an introduction now. The question is easy: given the position of the snake within a map of known size and the number of movements the snake can do, how many distinct paths can the snake follow without intersecting itself and without going out of the map's boundaries? Maybe once you go over it the question is not as easy as it sounds, so let's illustrate it with an example. Let's imagine we have a map that contains 4 rows and 3 columns, like the one below. And let's imagine that we have a snake whose body occupies the following cells: [(2,2),(3,2),(3,1),(3,0),(2,0),(1,0),(0,0)]. The figure on the left represents the empty map and the one on the right represents the one with the snake, where the numbers are the positions of each "piece" of the snake...