dns

joined 1 year ago
[โ€“] dns@aussie.zone 2 points 11 months ago (1 children)

The bug is some strings can have overlapping characters. onEight threEight fivEight. There are more cases. So if you do a search and replace your string becomes 1ight 3ight and the second number does not get found.

Possible fixes: Search and replace and add the extra letter: oneEigh then search and replace. Search and replace words to numbers but put some extra letters in just in case.

[โ€“] dns@aussie.zone 1 points 11 months ago

My solution in python

input="""Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green"""

def parse(line):
    data={}
    data['game']=int(line[5:line.index(':')])
    data['hands']=[]
    for str in line[line.index(':')+1:].split(';'):
        h={'red':0,'green':0,'blue':0}
        for str2 in str.split(','):
            tmp=str2.strip(' ').split(' ')
            h[tmp[1]]=int(tmp[0])
        data['hands'].append(h)

    data['max_red']=max([x['red'] for x in data['hands']])
    data['max_green']=max([x['green'] for x in data['hands']])
    data['max_blue']=max([x['blue'] for x in data['hands']])
    data['power']=data['max_red']*data['max_green']*data['max_blue']
    data['possible'] = True
    if data['max_red'] > 12:
        data['possible'] = False
    if data['max_green'] > 13:
        data['possible'] = False
    if data['max_blue'] > 14:
        data['possible'] = False


    return data
def loadFile(path):
    with open(path,'r') as f:
        return f.read()

if __name__ == '__main__':
    input=loadFile('day2_input')
    res=[]
    total=0
    power_sum=0
    for row in input.split('\n'):
        data=parse(row)
        if data['possible']:
            total=total+data['game']
        power_sum=power_sum+data['power']
    print('total: %s, power: %s ' % (total,power_sum,))
[โ€“] dns@aussie.zone 5 points 11 months ago

https://adventofcode.com/2023 The first question is public, login to get your test data and submit your answers and unlock part 2.

[โ€“] dns@aussie.zone 1 points 11 months ago

I believe everyone gets different input and needs to produce a different result. There can be multiple solutions. Do you process as you are going, or do you parse and build a data structure to process later so you loop through the results multiple times.

[โ€“] dns@aussie.zone 8 points 11 months ago* (last edited 11 months ago) (4 children)

My solution was worse than most: replace one -> one1one You are only going to do the replace all for each number and if the "e" is also in eight it is still there for the next set of replace.

A better quick and dirty solution from Mastodon was to just add the common character first: twone -> twoone

[โ€“] dns@aussie.zone 1 points 11 months ago

First and last number, so loop through the characters, ask is it a letter or a number. Find the first and last number in the string and add the strings together and convert it to a number. So you find a 3,4,5 in the line so find the first in the result is 3 and 5 is the last so it becomes 35.