🌟 Advent of Code (AoC) 2023 🌟

PermalÀnk
Hedersmedlem ★
●

Dag: 1
SprÄk: Python 3
Lösning:

lines = open('data/day1.txt', 'r').readlines() digitMap = {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9} sum = 0 for line in lines: digits = list(filter(str.isdigit, line)) sum += int(digits[0] + digits[-1]) print(f"Part 1: {sum}") sum = 0 for line in lines: digits = [] pos = 0 while (partialLine := line[pos:]): if partialLine[0].isdigit(): digits.append(partialLine[0]) else: for k,v in digitMap.items(): if partialLine.startswith(k): digits += str(v) # pos += len(k) - 1 break pos += 1 sum += int(digits[0] + digits[-1]) print(f"Part 2: {sum}")

Dold text

Inte jÀttevackert, men det fungerar.
FörstÄr inte riktigt varför den kommenterade raden inte fungerar dock... vad missar jag? FÄr ett lÀgre svar om den inte Àr kommenterad.
Den ser ocksÄ ut att göra precis vad förvÀntar mig om jag printar allting.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
●
Skrivet av Thomas:

FörstÄr inte riktigt varför den kommenterade raden inte fungerar dock... vad missar jag? FÄr ett lÀgre svar om den inte Àr kommenterad.
Den ser ocksÄ ut att göra precis vad förvÀntar mig om jag printar allting.

Det Àr vÀl ord som överlappar, t.ex. twone.

Dold text
PermalÀnk
Hedersmedlem ★
●
Skrivet av Gubbjekeln:

Det Àr vÀl ord som överlappar, t.ex. twone.

Dold text

Jo, sÄ Àr det förstÄs.
TÀnkte inte pÄ att det skulle vara tillÄtet.

Dold text
Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
Medlem ★
●

Del 2 var lite nasty för att vara dag 1. En del edgecases dÀr man fick brÄka med för att fÄ rÀtt.

jag tÀnkte först köra en rövare och helt enkelt ersÀtta twone med 2ne och sedan bara söka efter siffrorna men det krashade ju nÀr man letar efter sista siffran pÄ raden och man dÄ vill ha tw1 istÀllet sÄ fick Àndra strategi men det löste sig.

Dold text

Tycker det brukar vara en avvÀgning gÀllande hur jobbigt/korrekt man vill göra det och hur mycket fulhack man kan stÄ ut med

Visa signatur

Att föresprÄka Mac pÄ Swec Àr som att föresprÄka hybridbilar pÄ en raggartrÀff i Mora.

PermalÀnk
Medlem ★
●

Dag: 1
SprÄk: Python 3 (One-liner, eller i alla fall ett uttryck)

Som sÄ mÄnga andra sagt: ovanligt elak del tvÄ för att vara första dagen. Om man satsade pÄ strÀngsubstitution fanns det mÄnga möjligheter att göra fel. Jag tror jag hittade alla
Lösning:

print([sum([(lambda line, numbers: (min([(i, d) for n,d in numbers if (i := line.find(n)) != -1])[1] * 10 + max([(line.rfind(n), d) for n,d in numbers])[1])) (line, [("1", 1),("2", 2),("3", 3),("4", 4),("5", 5), ("6", 6),("7", 7),("8", 8),("9", 9)] + n) for line in open("input01.txt").readlines()]) for n in [[],[("one", 1),("two", 2),("three", 3),("four", 4),("five", 5), ("six", 6),("seven", 7),("eight", 8),("nine", 9)]]])

Dold text
PermalÀnk
Medlem ★
●
Skrivet av woostie:

I guess the overlaps could have been done with more regex...

Dold text

oneightwoneightwone...

Dold text
PermalÀnk
●

Dag 1:
SprÄk: Python (Testar nÄgot nytt)

JadÄ, var lite vÀl drygt för dag 1!

# TÀnkte inte pÄ överlapp som Regex inte hanterar direkt, utan att man mÄste lÀgga till lookahead

import re

dict = {
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
"six": 6,
"seven": 7,
"eight": 8,
"nine": 9
}

def values_combined(a, b):
return str(a) + str(b)

def to_int(a):
if a.isnumeric():
return a
else:
return dict[a.lower()]

f = open("aoc1-data.txt", "r")
total = 0

for strings in f.readlines():
to_array = re.findall("(?=([1-9]|one|two|three|four|five|six|seven|eight|nine))", strings, re.IGNORECASE)
char1 = to_array[0]
char2 = to_array[-1]
int1 = to_int(char1)
int2 = to_int(char2)
comb = values_combined(int1, int2)
total += int(comb)

print(total)

Dold text
Visa signatur

XBL: Framfart Steam: Flanders_one
Reserverad för alla felstavningar eller grammatiska fel som kan uppstÄ.

PermalÀnk
Medlem
●

Dag: 1
SprÄk: Rust

Det hÀr var min första kontakt med Rust och det kÀndes... sÄdÀr. Lösningen blev dÀrefter. Men man ska vÀl börja nÄgonstans?

För övrigt inte heller jÀtteglad för del 2.

Lösning: Github eller se nedan.

Vad gÀller del 2 sÄ visade det sig efter lite efterforskningar att regex-biblioteket i rust inte stöder överlappande matchningar. SÄ det fick bli en ful loop för att komma runt det.

Dold text

use regex::Regex; use std::collections::HashMap; use std::fs::read_to_string; fn read_lines(filename: &str) -> Vec<String> { let mut result = Vec::new(); for line in read_to_string(filename).unwrap().lines() { result.push(line.to_string()) } result } fn create_map() -> HashMap<String, u8> { let mut map: HashMap<String, u8> = HashMap::new(); map.insert(String::from("one"), 1); map.insert(String::from("two"), 2); map.insert(String::from("three"), 3); map.insert(String::from("four"), 4); map.insert(String::from("five"), 5); map.insert(String::from("six"), 6); map.insert(String::from("seven"), 7); map.insert(String::from("eight"), 8); map.insert(String::from("nine"), 9); return map; } fn get_sum(lines: &Vec<String>, re: Regex, map: Option<&HashMap<String, u8>>) -> u32 { let mut sum: u32 = 0; for line in lines.iter() { let mut first: u8 = 0; let mut last: u8 = 0; let mut first_matched: bool = false; let mut i = 0; while i < line.len() { let substr = &line[i..]; i += 1; for caps in re.captures_iter(substr) { let mut num_str = "".to_string(); num_str.push_str(&caps[1].to_string()); if num_str.len() > 1 { last = Option::expect(map, "err").get(&num_str).unwrap().to_owned(); } else { last = num_str.parse().unwrap(); } if !first_matched { first = last; first_matched = true; } } } let mut num_str = "".to_string(); num_str.push_str(&first.to_string()); num_str.push_str(&last.to_string()); let num: u32 = num_str.parse().unwrap(); sum += num; } return sum; } fn day_01() -> (u32, u32) { let lines = read_lines("input/day_01.txt"); let mut re = Regex::new(r"([0-9])").unwrap(); let part1 = get_sum(&lines, re, None); re = Regex::new("([0-9]|one|two|three|four|five|six|seven|eight|nine)").unwrap(); let map = create_map(); let part2 = get_sum(&lines, re, Some(&map)); return (part1, part2); } fn main() { let res: (u32, u32) = day_01(); println!("**AoC-2023 day 1 part 1: {} **", res.0); println!("**AoC-2023 day 1 part 2: {} **", res.1); }

Dold text
PermalÀnk
Medlem
●

DÄ var det dags igen! Oklart om jag har tid att köra igenom allt i Är.

Dag: 1
SprÄk: C#

namespace AOC2022.Puzzles; internal class Puzzle1 : Puzzle<int> { private static readonly List<string> Digits = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]; protected override void Solve(string[] lines) { One = lines .Sum(line => { var numbers = line.Where(char.IsNumber).ToArray(); return int.Parse(string.Concat(numbers[0], numbers[^1])); }); Two = lines .Sum(line => { var numbers = Enumerable.Range(0, line.Length) .Select(idx => char.IsNumber(line[idx]) ? line[idx] - '0' : 1 + Digits.FindIndex(word => line[idx..].StartsWith(word))) .Where(x => x > 0) .ToArray(); return int.Parse(string.Concat(numbers[0], numbers[^1])); }); } }

Dold text
PermalÀnk
Medlem ★
●
Skrivet av gbroll:

Dag: 1
SprÄk: Rust

Det hÀr var min första kontakt med Rust och det kÀndes... sÄdÀr. Lösningen blev dÀrefter. Men man ska vÀl börja nÄgonstans?

För övrigt inte heller jÀtteglad för del 2.

Lösning: Github eller se nedan.

Vad gÀller del 2 sÄ visade det sig efter lite efterforskningar att regex-biblioteket i rust inte stöder överlappande matchningar. SÄ det fick bli en ful loop för att komma runt det.

Dold text

use regex::Regex; use std::collections::HashMap; use std::fs::read_to_string; fn read_lines(filename: &str) -> Vec<String> { let mut result = Vec::new(); for line in read_to_string(filename).unwrap().lines() { result.push(line.to_string()) } result } fn create_map() -> HashMap<String, u8> { let mut map: HashMap<String, u8> = HashMap::new(); map.insert(String::from("one"), 1); map.insert(String::from("two"), 2); map.insert(String::from("three"), 3); map.insert(String::from("four"), 4); map.insert(String::from("five"), 5); map.insert(String::from("six"), 6); map.insert(String::from("seven"), 7); map.insert(String::from("eight"), 8); map.insert(String::from("nine"), 9); return map; } fn get_sum(lines: &Vec<String>, re: Regex, map: Option<&HashMap<String, u8>>) -> u32 { let mut sum: u32 = 0; for line in lines.iter() { let mut first: u8 = 0; let mut last: u8 = 0; let mut first_matched: bool = false; let mut i = 0; while i < line.len() { let substr = &line[i..]; i += 1; for caps in re.captures_iter(substr) { let mut num_str = "".to_string(); num_str.push_str(&caps[1].to_string()); if num_str.len() > 1 { last = Option::expect(map, "err").get(&num_str).unwrap().to_owned(); } else { last = num_str.parse().unwrap(); } if !first_matched { first = last; first_matched = true; } } } let mut num_str = "".to_string(); num_str.push_str(&first.to_string()); num_str.push_str(&last.to_string()); let num: u32 = num_str.parse().unwrap(); sum += num; } return sum; } fn day_01() -> (u32, u32) { let lines = read_lines("input/day_01.txt"); let mut re = Regex::new(r"([0-9])").unwrap(); let part1 = get_sum(&lines, re, None); re = Regex::new("([0-9]|one|two|three|four|five|six|seven|eight|nine)").unwrap(); let map = create_map(); let part2 = get_sum(&lines, re, Some(&map)); return (part1, part2); } fn main() { let res: (u32, u32) = day_01(); println!("**AoC-2023 day 1 part 1: {} **", res.0); println!("**AoC-2023 day 1 part 2: {} **", res.1); }

Dold text

Tack för den dÀr spoilern! Jag har suttit och stirrat pÄ min kod i mer Àn en timme nu och tycker att allt ser rÀtt ut. Men det du sÀger om det relevanta biblioteket förmÄgor förklarar allt

DÄ fÄr jag tÀnka om med min lösning...

PermalÀnk
Medlem ★
●
Skrivet av Chibariku:

Tackar, inte lika elegant. Jag Àr ju ingenjör inom berg och markbyggnad i grundenmed programmering som hobbyintresse och förenkla lite arbetsflöden. SÄ mina programmeringar Àr oftast quick and dirty ,speciellt fullösningen pÄ del tvÄ som jag fick lite inspiration frÄn Reddit

del 1

import re values = [] with open('input.txt', 'r') as file: for row in file: values.append(row.strip()) n = 0 total = 0 int_list = [] for row in values: int_list.append(re.sub('\D', '', values[n])) n = n + 1 total = total + int(int_list[-1][0])*10 + int(int_list[-1][-1]) print (total)

Del 2

import re values = [] with open('input.txt', 'r') as file: for row in file: values.append(row.strip()) new_values = [] n = 0 for row in values: new_values.append(values[n].replace('one','on1e').replace('two','tw2o').replace('three','th3ree') .replace('four','fo4ur').replace('five','fi5ve').replace('six','si6x').replace('seven','sev7en') .replace('eight','eig8ht').replace('nine','ni9ne')) n = n + 1 n = 0 total = 0 int_list = [] for row in new_values: int_list.append(re.sub('\D', '', new_values[n])) n = n + 1 total = total + int(int_list[-1][0])*10 + int(int_list[-1][-1]) print (total)

Dold text

Nu fick jag tid att stÀda upp lite i koden

Dag 1
SprÄk Python

del 1

import re values = [] total = 0 with open('input.txt', 'r') as file: for row in file: values.append(re.sub('\D', '',row)) total = total + int(values[-1][0])*10 + int(values[-1][-1]) print (total)

del 2

import re values = [] total = 0 new_values = [] with open('input.txt', 'r') as file: for row in file: values.append(row.replace('one','on1e').replace('two','tw2o').replace('three','th3ree') .replace('four','fo4ur').replace('five','fi5ve').replace('six','si6x').replace('seven','sev7en') .replace('eight','eig8ht').replace('nine','ni9ne')) new_values.append(re.sub('\D', '', values[-1])) total = total + int(new_values[-1][0])*10 + int(new_values[-1][-1]) print (total)

Dold text
PermalÀnk
Medlem ★
●

Dag: 1
SprÄk: Windows PowerShell

param( $inputfile ) if( -not $inputfile ){ $inputdata = Get-Content -Path "$PSScriptRoot\input.txt" } else { $inputdata = Get-Content -Path $inputfile } function Get-Numbers { param( [array]$inputdata ) $returnArray = @() $inputdata | ForEach-Object { $returnArray += [pscustomobject]@{ original = $psitem numbersOnly = $( -join( (($PSItem -replace "[^0-9]" , '').ToCharArray() | Select-Object -First 1), (($PSItem -replace "[^0-9]" , '').ToCharArray() | Select-Object -Last 1) ) ) } } return $returnArray } $part2 = $inputdata -replace "one","o1e" $part2 = $part2 -replace "two","t2o" $part2 = $part2 -replace "three","t3e" $part2 = $part2 -replace "four","f4r" $part2 = $part2 -replace "five","f5e" $part2 = $part2 -replace "six","s6x" $part2 = $part2 -replace "seven","s7n" $part2 = $part2 -replace "eight","e8t" $part2 = $part2 -replace "nine","n9e" Write-Host "Part 1: $( ((Get-Numbers -inputdata $inputdata).numbersOnly | measure-object -sum).sum)" Write-Host "Part 2: $( ((Get-Numbers -inputdata $part2).numbersOnly | measure-object -sum).sum)"

Dold text

Kör igen pÄ PowerShell.
Blev lite tagen pÄ sÀngen av hur del 2 var utformad men det gick ÀndÄ. Tyckte @kode gjorde en variant jag gillade sÄ jag snodde faktiskt den rakt av i stort sett

Visa signatur

🟱 Main: Ryzen7 5800X | Strix x470-I | 32GB | RTX2070S | Samsung C49RG9
đŸ”” unRaid: Ryzen5 2700X | B450M DS3H | 32GB
🟠 Tfn: Google Pixel 7 Lime Green

-:| @ eller citera för svar |:-

PermalÀnk
●

Jag lÀser instruktionerna hÀr: https://adventofcode.com/2023/day/1

Input Àr hÀr: https://adventofcode.com/2023/day/1/input

Jag ser att input innehÄller bÄde faktiska siffror (0-9) sÄvÀl som dess strÀngnamn (one, two, etc.).

Men exemplet sÀger inget om att vi ska övervÀga "one, two" som ocksÄ siffror? (först konvertera dem)

EDIT: Jag fick rĂ€tt. Helt otroligt! Jag vet att jag kmr bli "Ă€gd" av de kommande utmaningarna dessa dagar. Men ÄNTLIGEN sĂ„ har drygt 1+ Ă„rs webbkodande "lönat" sig!

Jag kör gamla hederliga JavaScript:

/* Advent of Code 2023 - Day 1 | By WebbKodsLĂ€rlingen 2023-12-01 kl.22:06 Part 1 */ // All Input from Day 1 | https://adventofcode.com/2023/day/1/input // All lines there, so not included fully! // Just make sure it starts with `9dlvndqbddghpxc // and last line ends with zvhzgfpkhkone93nine`; const day1Input = `9dlvndqbddghpxc... zvhzgfpkhkone93nine`; // Convert multiline to array by array split const day1InputArr = day1Input.split("\n"); // Store all correctly pushed numbers here! let summarizedCollection = []; // Loop through each Line | FOR PART 1 day1InputArr.forEach((line) => { // Extract all digits separated into an array with Regex let extractDigits = line.match(/(\d)/g); // Only one digit per array element! console.log("Digits: ", extractDigits); // Remove if you do not wanna see what is happening // Insert first and last integer (converted from string) if (extractDigits.length > 1) { summarizedCollection.push( parseInt( extractDigits[0].toString() + extractDigits[extractDigits.length - 1].toString() ) ); } // Insert duplication of the single integer (converted from string) otherwise else { summarizedCollection.push( parseInt(extractDigits[0].toString() + extractDigits[0].toString()) ); } }); // Use Array Reduce Method to summarize all elements now! const summarizedCollectionSum = summarizedCollection.reduce((a, b) => a + b, 0); console.log(summarizedCollectionSum); // Final answer! o7 (PART 1 ONLY!)

Dold text

Ska prova pÄ Del 2 nu! Nu mÄste jag ersÀtta alla ord till enstaka till siffror som ocksÄ ska matas in. Hm... `.replace(All)` here I come!

Jag fÄr för lÄgt vÀrde för Del 2:

const sumPart1 = summarizedCollectionSum; console.log("Day 1, Part 1: ", summarizedCollectionSum); // PART 2 ONLY!!! (Part 1 ended at line="console.log("Day 1, Part 1: ", summarizedCollectionSum);" summarizedCollection = []; // Empty summarized collection of array elements again! const spelledoutNumbers = [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; // Loop through each Line | FOR PART 2 day1InputArr.forEach((line) => { // Extract all digits separated into an array with Regex // By first replacing all stringers with their respective numberts from that array console.log("Line first: ", line); line = line.replaceAll( /one|two|three|four|five|six|seven|eight|nine/g, function (x) { return spelledoutNumbers.indexOf(x) !== -1 ? spelledoutNumbers.indexOf(x) + 1 : x; // When a match from | is found, return its index + 1 (since array starts at 0 but value at one=1) } ); console.log("Line after: ", line); // And then extracting the digits as usual! let extractDigits = line.match(/(\d)/g); // Only one digit per array element! console.log("Digits: ", extractDigits); // Insert first and last integer (converted from string) if (extractDigits.length > 1) { summarizedCollection.push( parseInt( extractDigits[0].toString() + extractDigits[extractDigits.length - 1].toString() ) ); } // Insert duplication of the single integer (converted from string) otherwise else { summarizedCollection.push( parseInt(extractDigits[0].toString() + extractDigits[0].toString()) ); } }); summarizedCollectionSum = summarizedCollection.reduce((a, b) => a + b, 0); console.log("Day 1, Part 1: ", sumPart1); console.log("Day 1, Part 2: ", summarizedCollectionSum);

Dold text

NÄgon som vill kika pÄ min Del 2 och bara sÀga om jag gjort nÄgon uppenbar tabbe dÀr? Jag körde en replaceAll mot arrayen med orden och den ser rÀtt ut. Sedan kör den ju samma grej för att hÀmta siffrorna igen precis som vanligt.

Mvh,
WKL.

Visa signatur

"Den sÀkraste koden Àr den som aldrig skrivs"

PermalÀnk
Medlem ★
●

Dag 1
SprÄk: BaSH

#!/bin/bash sed 's/twone/t21e/g ; s/oneight/o18t/g ; s/eightwo/e82o/g ; s/eighthree/e83e/g ; s/fiveight/f58t/g ; s/sevenine/s79e/g ; s/nineight/n98t/g ; s/one/1/g ; s/two/2/g ; s/three/3/g ; s/four/4/g ; s/five/5/g; s/six/6/g; s/seven/7/g ; s/eight/8/g; s/nine/9/g ; s/[^0-9]*//g' $1 > /tmp/foo while read -r line; do sum=$((`echo ${line:0:1}${line: -1}` + sum)) done < /tmp/foo echo $sum rm /tmp/foo

Dold text

Jag brukar aldrig köra mer Àn en eller ett par slumpvis valda dagar, sÄ rÀkna inte med att se mig sÀrskilt ofta hÀr i trÄden, men ja ...
[edit: missade tydligen del tvÄ ocksÄ, sÄ det blev "lite" förlÀngning av sed:en :D]

Visa signatur

Desktop: AMD 3950X, 64 GB RAM, Nvidia 4070 ... (Windows 11)
Serverdesktop: AMD 5600G, 64 GB RAM (Proxmox)
Labbmiljö: Supermicro SC825 X9DRi-F 2xE5-2667v2 64GB RAM
Kamera: Canon R5, Canon RF 100-500, Laowa 100mm f/2.8, Canon RF 24-70 f/2,8

PermalÀnk
Medlem ★
●

Dag 1
SprÄk: Matlab

Inte vÀrldens elegantaste sprÄk, men det funkar i alla fall.

Det var lite lurigt att de utskrivna siffrorna gÄr in i varandra.

fid=fopen('day1.txt'); sum1 = 0; sum2 = 0; while ~feof(fid) line = fgetl(fid); %% Task 1 numbers = cell2mat(extract(line,digitsPattern(1))); sum1 = sum1 + str2num([numbers(1) numbers(end)]); %% Task2 numberNames = ["one", "two", "three", "four", "five", "six", ... "seven", "eight", "nine"]; digitTable = []; % Table of digits and their position in the string % Add spelled numbers to table for name = numberNames if contains(line, name) digitTable = [digitTable [strfind(line, name); ... ones(1, length(strfind(line, name))) * ... find(matches(numberNames, name))]]; end end % Add digits to table for index = strfind(line, digitsPattern(1)) digitTable = [digitTable [index; str2num(line(index))]]; end % Sort the table according to position in string [~, I] = sort(digitTable(1, :)); digitTable=digitTable(:, I); sum2 = sum2 + digitTable(2, 1) * 10 + digitTable(2, end); end fclose(fid); disp(['Task 1: ' num2str(sum1)]) disp(['Task 2: ' num2str(sum2)])

Dold text
PermalÀnk
Hedersmedlem ★
●
Skrivet av Crazy Ferret:

Jag brukar aldrig köra mer Àn en eller ett par slumpvis valda dagar, sÄ rÀkna inte med att se mig sÀrskilt ofta hÀr i trÄden, men ja ... Kul att se era verbosa lösningar!

Tss, du fÄr vÀl köra del 2 innan du kallar andras lösningar verbosa.
Del 1 Àr ju klart lÀttare att hÄlla kort, det Àr del 2 som gör de flesta lösningarna i trÄden ganska lÄnga.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
Medlem
●

Otydliga instruktioner pÄ del 2 gjorde att jag fick fel utan att veta varför. Börjar inte bra...

Kör Python för en gÄngs skull och det Àr lite lurigt.

PermalÀnk
Medlem ★
●
Skrivet av Thomas:

Tss, du fÄr vÀl köra del 2 innan du kallar andras lösningar verbosa.
Del 1 Àr ju klart lÀttare att hÄlla kort, det Àr del 2 som gör de flesta lösningarna i trÄden ganska lÄnga.

Sade 'verbosa', inte "lÄnga". Men ja, missade att det dök upp en del tvÄ ocksÄ, den fÄr tas en titt pÄ nÀr det hinns.

Visa signatur

Desktop: AMD 3950X, 64 GB RAM, Nvidia 4070 ... (Windows 11)
Serverdesktop: AMD 5600G, 64 GB RAM (Proxmox)
Labbmiljö: Supermicro SC825 X9DRi-F 2xE5-2667v2 64GB RAM
Kamera: Canon R5, Canon RF 100-500, Laowa 100mm f/2.8, Canon RF 24-70 f/2,8

PermalÀnk
●

FrĂ„ga om Day 1 Del 2: (döljer Del 1 för andra som ej Ă€r klara med den) - Är min RegEx för "one","two","etc" Ă„t skogen trots allt?

I Del 2 sÄ kan jag anvÀnda exakt samma del som i Del 1 för att ta första och sista vÀrdet ur den skapade arrayen för varje given rad. Men den (=AdventofCode) gnÀller pÄ att mitt vÀrde Àr för lÄgt. PÄ bilden syns ju tydligt att "one", "two", etc. blir siffror till strÀngen vars siffror sedan extraheras ur. Dessa lÀggs sedan till pÄ exakt samma vis som för del 1 vilket jag fick rÀtt pÄ.

Menas "find the real first and last digit on each line" att 'real'=1,2,3,4,5,6,7,8,9 medan "last digit" kan vara bokstaviserat? Fast nÀr jag tittar pÄ deras exempel sÄ verkar det inte vara sÄ.

Mvh,
WKL.

Visa signatur

"Den sÀkraste koden Àr den som aldrig skrivs"

PermalÀnk
Hedersmedlem ★
●
Skrivet av WebbkodsLĂ€rlingen:

I Del 2 sÄ kan jag anvÀnda exakt samma del som i Del 1 för att ta första och sista vÀrdet ur den skapade arrayen för varje given rad. Men den (=AdventofCode) gnÀller pÄ att mitt vÀrde Àr för lÄgt. PÄ bilden syns ju tydligt att "one", "two", etc. blir siffror till strÀngen vars siffror sedan extraheras ur. Dessa lÀggs sedan till pÄ exakt samma vis som för del 1 vilket jag fick rÀtt pÄ.

Kolla sÄ att du inte gör samma miss som jag delvis gjorde.
#20286155

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
●
Skrivet av Thomas:

Kolla sÄ att du inte gör samma miss som jag delvis gjorde.
#20286155

Jag försökte mig pÄ att bara regexa första förekomst av digits och/eller deras bokstavering och sedan regexa frÄn slutet till vÀnster pÄ samma vis men den lyckas inte "traversa" igenom utan försöker bara direkt i slutet sÄ lyckas den inte sÄ fortsÀtter den inte frÄn slutet till vÀnster i strÀngen som jag trodde den skulle göra.

Jag inser att detta Àr bÄde fel Är (fortfarande utbildning kvar) och dessutom inget för mig för jag kÀnner det mer som en "tÀvling-mot-eliten" Àn en rolig julaktivitet att delta i. Det slog Ätminstone hÄl i alla min Ladok-betyg och fick mig att inse att de inte betyder ett skit (bÄde pÄ gott och ont) nÀr det vÀl kommer till kritan!

Jag önskar alla andra fortsatt GL HF i AoC 2023! ^_^

Mvh,
WKL.

Visa signatur

"Den sÀkraste koden Àr den som aldrig skrivs"

PermalÀnk
●

Dag: 2
SprÄk: Nim
Lösning: Github

Dagens uppgift kÀndes lite enklare Àn gÄrdagens. Det fanns inte sÄ mÄnga corner-cases att tÀnka pÄ idag, var ganska straight forward.

PermalÀnk
Hedersmedlem ★
●
Skrivet av WebbkodsLĂ€rlingen:

Jag försökte mig pÄ att bara regexa första förekomst av digits och/eller deras bokstavering och sedan regexa frÄn slutet till vÀnster pÄ samma vis men den lyckas inte "traversa" igenom utan försöker bara direkt i slutet sÄ lyckas den inte sÄ fortsÀtter den inte frÄn slutet till vÀnster i strÀngen som jag trodde den skulle göra.

Jag inser att detta Àr bÄde fel Är (fortfarande utbildning kvar) och dessutom inget för mig för jag kÀnner det mer som en "tÀvling-mot-eliten" Àn en rolig julaktivitet att delta i. Det slog Ätminstone hÄl i alla min Ladok-betyg och fick mig att inse att de inte betyder ett skit (bÄde pÄ gott och ont) nÀr det vÀl kommer till kritan!

Jag önskar alla andra fortsatt GL HF i AoC 2023! ^_^

Mvh,
WKL.

Uppgifterna varierar i svÄrighetsgrad, och kan vara svÄra pÄ olika sÀtt -- den hÀr verkar ju de flesta överens om var ganska dryg, speciellt för att vara dag #1 som brukar vara enkel. Jag tycker ÀndÄ inte att du ska ge upp redan.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
Medlem ★
●

Dagens var betydligt lÀttare Àn gÄrdagens del 2.

Dag 2:
SprÄk: F#
Lösning:

open System open System.Text.RegularExpressions type Reveals = { Blue: int; Green: int; Red: int; } type Game = { Id : int; Reveals : Reveals list } let parseLine (input:string) = let parts = input.Split(":") let id = Int32.Parse(parts[0].Split(" ")[1]) let parseReveal (round:string) = let rx = Regex("([0-9]+) (blue|red|green)") let matches = rx.Matches(round) let getColorCount color = matches |> Seq.toList |> List.tryFind (fun c -> c.Groups[2].Value = color) |> Option.map (fun c -> Int32.Parse(c.Groups[1].Value)) |> Option.defaultValue 0 let reds = getColorCount "red" let greens = getColorCount "green" let blues = getColorCount "blue" {Blue = blues; Red = reds; Green = greens } let reveals = parts[1].Split(";") |> List.ofSeq |> List.map parseReveal { Id = id; Reveals = reveals } let filterGame (game:Game) = game.Reveals |> List.exists (fun c -> c.Red > 12 || c.Green > 13 || c.Blue > 14) let cubeSize (game:Game) = let maxReds = game.Reveals |> List.map (fun c -> c.Red) |> List.max let maxBlues = game.Reveals |> List.map (fun c -> c.Blue) |> List.max let maxGreens = game.Reveals |> List.map (fun c -> c.Green) |> List.max maxReds*maxBlues*maxGreens let input = System.IO.File.ReadAllLines "input.txt" |> List.ofSeq let games = input |> List.map parseLine let task1 = List.filter (fun c -> not (filterGame c)) let task2 = List.map cubeSize printfn $"Task 1: %A{task1 games |> List.sumBy (fun c -> c.Id)}" printfn $"Task 2: %A{task2 games |> List.sum}"

Dold text
Visa signatur

Jag Àr en optimist; det Àr aldrig sÄ dÄligt sÄ att det inte kan bli sÀmre.

PermalÀnk
Medlem
●

Jag kör i JavaScript. Löste andra uppgiften (första dagen) genom att helt enkelt hitta indexet av första och sista siffran i varje rad text, samt indexet av första och sista "ordet" i varje rad. Skapade sedan radens nummer genom att ta den siffra med lÀgst respektive högst index.

Inte snyggaste koden, men den funkar. Finns pÄ min Git => https://github.com/ZyntaaX/advent_of_code_2023

Edit: Ändrat till TypeScript. Lösningarna för dag 1 & 2 Ă€r fortfarande JS.

Visa signatur

Ryzen 7 7800X3D | Nvidia Geforce RTX 4070 Ti 12gb | Corsair Vengeance DDR5 6000MHz RGB CL30 2x16GB | EVGA Supernova G2 750W | ASUS ROG Strix B650E-F Gaming | Be Quiet! Dark Rock Pro 5
Citera för svar!

PermalÀnk
Medlem ★
●

Dag 2 var ju vÀldigt enkel jÀmfört med Part 2 pÄ dag 1..

Jag lyckades inte fÄ till den. NÄgon som hittar mitt fel?

Dag 1:
SprÄk: TypeScript

NÀr jag kikar igenom andras lösningar sÄ kÀnns min ganska sÄ ekvivalent med kodes lösning högre upp.
line.replace(number, `${number}${numbersMap.get(number)!.toString()}${number}`)

Blir ju egentligen mer eller mindre samma resultat som att köra ['nine' = 'n9e'] osv...
Ger rÀtt resultat pÄ test-input men inte den riktiga.

const numbersMap = new Map<string, number>([ ['one', 1], ['two', 2], ['three', 3], ['four', 4], ['five', 5], ['six', 6], ['even', 7], ['eight', 8], ['nine', 9] ]) const parseLintPart2 = (line: string) => { for (const number of numbersMap.keys()) { if(line.includes(number)) { line = line.replace(number, `${number}${numbersMap.get(number)!.toString()}${number}`) } } return line } const solver = (input: string[], part: number) => input.reduce((acc, line) => { const newLines = part === 1 ? line : parseLintPart2(line) const numbers: number[] = [] for(const char of newLines) { if(Number(char)) numbers.push(parseInt(char)) } if(numbers.length >= 1) { acc += (numbers[0] * 10) + numbers[numbers.length - 1] } return acc }, 0)

Dold text

Dag 2:
SprÄk: TypeScript

import { parseInput } from "../parseInput" const blueRegex = /(\d+)\sblue/g; const redRegex = /(\d+)\sred/g; const greenRegex = /(\d+)\sgreen/g; const getMaxColor = (line: string, colorRegex: RegExp) => { const matches = [...line.matchAll(colorRegex)]; return matches.length > 0 ? Math.max(...matches.map(match => parseInt(match[1]))) : 0; } const getMaxColors = (line: string) => { return { maxBlue: getMaxColor(line, blueRegex), maxRed: getMaxColor(line, redRegex), maxGreen: getMaxColor(line, greenRegex) }; } const part1 = (input: string[]) => input.reduce((acc, line, index) => { const {maxBlue, maxRed, maxGreen } = getMaxColors(line) if(maxBlue <= 14 && maxRed <= 12 && maxGreen <= 13) { acc += index + 1 } return acc }, 0) const part2 = (input: string[]) => input.reduce((acc, line, index) => { const {maxBlue, maxRed, maxGreen } = getMaxColors(line) const product = maxBlue * maxRed * maxGreen return acc + product }, 0) const parsedInput = parseInput('part1') console.log(part1(parsedInput)) console.log(part2(parsedInput))

Dold text
Visa signatur

10700K | NVIDIA RTX 3080

PermalÀnk
Datavetare ★
●

Dag: 2
SprÄk: Go

package main import ( "fmt" "os" "strconv" "strings" ) type Cubes struct { Red int Green int Blue int } func (cubes *Cubes) StoreMaxCount(color string, count int) { colorCount := map[string]*int{ "red": &cubes.Red, "green": &cubes.Green, "blue": &cubes.Blue, }[color] if *colorCount < count { *colorCount = count } } func (cubes *Cubes) IsPossible(limit Cubes) bool { return cubes.Red <= limit.Red && cubes.Green <= limit.Green && cubes.Blue <= limit.Blue } func (cubes *Cubes) Power() int { return cubes.Red * cubes.Green * cubes.Blue } func SumPossible(cubesForGames []Cubes) int { sum := 0 limit := Cubes{Red: 12, Green: 13, Blue: 14} for i, cubes := range cubesForGames { if cubes.IsPossible(limit) { sum += i + 1 } } return sum } func SumPower(cubesForGames []Cubes) int { sum := 0 for _, cubes := range cubesForGames { sum += cubes.Power() } return sum } func ParseReveal(reveal string) (string, int) { colorCount := strings.Split(reveal, " ") count, _ := strconv.Atoi(colorCount[0]) return colorCount[1], count } func ParseCubes(input []string) []Cubes { cubesForGames := []Cubes{} for _, line := range input { reveals := strings.Split(strings.ReplaceAll(strings.ReplaceAll(line[strings.Index(line, ": ")+2:], ";", ","), ", ", ","), ",") cubes := Cubes{} for _, reveal := range reveals { cubes.StoreMaxCount(ParseReveal(reveal)) } cubesForGames = append(cubesForGames, cubes) } return cubesForGames } func main() { input, _ := os.ReadFile("day2.txt") cubes := ParseCubes(strings.Split(string(input), "\n")) fmt.Println(SumPossible(cubes)) fmt.Println(SumPower(cubes)) }

Lösning
Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

PermalÀnk
Medlem ★
●

Dag: 2
SprÄk: Python (One-liner)

import re from functools import reduce print( (lambda f1, f2, l: (f1(l), f2(l))) (lambda l: sum([t[0] for t in l if t[1] <= 12 and t[2] <= 13 and t[3] <= 14]), lambda l: sum(t[1] * t[2] * t[3] for t in l), [reduce(lambda a,b : tuple(map(max, zip(*map(lambda v: map(lambda s: int('0' + str(s)), v), [a, b])))), m) for m in [[matches for matches in re.findall(r"Game (\d+)|(\d+) red|(\d+) green|(\d+) blue", line)] for line in open("input02.txt").readlines()]]) )

Dold text

Med kommentarer. Börja inifrÄn och lÀs dem i nummerordning.

print( # 13. Apply part 1 and part 2 on the list (lambda f1, f2, l: (f1(l), f2(l))) # 12. Part 1 Accumulate game (t[0]) if the element was possible (lambda l: sum([t[0] for t in l if t[1] <= 12 and t[2] <= 13 and t[3] <= 14]), # 13. Sum the power for each element in the list lambda l: sum(t[1] * t[2] * t[3] for t in l), # 4. Reduce "accumulates" a list by applying a function to the accumulator # and each element in the list. Here we want to collect the max of each # match in list to get the highest values. To compute the max of two # matches (a and b) we want to apply max to each pair of elements in a # and b. Max does work for strings, but unfortunately "5" is greater # than "15" so we have to convert the values to integers first. It gets # a bit messy. # # 11. Apply 10 to each element in the list to compute the max values for # game, red, green, and blue. The result is a list with all the max # values per line. # # 10. Apply max to each pair in (a[0], b[0]), # (a[1], b[1]),... [reduce(lambda a,b : tuple(map(max, # 9 Zip a and b together, now we get # (a[0], b[0]), (a[1], b[1]),... zip( # 8. The * operator converts the list # in zip([A, B]) to zip(A, B) # 7. Map the match conversion function # (6) to both a and b # 6: Map the conversion function # (5) to each game, red, green, # blue component in a match. Now # the red 6 match is on the # form [0, 6, 0, 0] *map(lambda v: # 5. Convert a value to an int. The # "0" part ensures '' gets the # value 0 and str(s) converts the # integer value in the accumulator # to a string so it can be # concateted with the '0'. Convert # the string to an int. map(lambda s: int('0' + str(s)), v), [a, b])))), m) # 3. Collect all the matches per line in m # 2: Per number in the input line the regex produces a match on the # form (game, red, gren, blue). All the non-matched entries are # empty strings so 'red 6' would generate ('', '6', '', ''). for m in [re.findall(r"Game (\d+)|(\d+) red|(\d+) green|(\d+) blue", line) # 1: Read all lines in the imput file for line in open("input02.txt").readlines()]]) )

Dold text
PermalÀnk
Hedersmedlem ★
●

Dag: 2
SprÄk: Python

import re import math from collections import defaultdict lines = open('data/day2.txt', 'r').read().splitlines() GAME_REGEX = re.compile('[:;] ') COLOR_REGEX = re.compile('(\d+) (red|green|blue)') MAX_ALLOWED = {'red': 12, 'green': 13, 'blue': 14} game_id_sum = 0 power_sum = 0 for game in lines: id, *picks = GAME_REGEX.split(game) id = int(id[5:]) game_possible = True min_required = defaultdict(int) for pick in picks: color_map = defaultdict(int) # Split picks into a list e.g. [(3, 'red'), (2, 'green')], # and transform into a dict e.g. {'red': 3, 'green': 2} for color_matches in COLOR_REGEX.findall(pick): v, k = color_matches color_map[k] = int(v) # Part 1 if any(color_map[color] > MAX_ALLOWED[color] for color in ('red', 'green', 'blue')): game_possible = False # Part 2 min_required = {color: max(min_required[color], color_map[color]) for color in ('red', 'green', 'blue')} # Part 1 if game_possible: game_id_sum += id # Part 2 power = math.prod(min_required.values()) power_sum += power print(f'Part 1: {game_id_sum}') print(f'Part 2: {power_sum}')

Dold text

Mer nöjd med denna Àn gÄrdagens.

Edit: Ändrade koden en aning för att anvĂ€nda list/dictionary comprehensions istĂ€llet för separata if-satser och en for-loop.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

PermalÀnk
●

Dag: 2
SprÄk: C++
Lösning: Github

Lite snabbare Àn gÄrdagens att lösa.

Visa signatur

Mobo: Asus ROG Strix B350-F Gaming CPU: AMD Ryzen 7 5800X3D GPU: XFX Radeon RX 6950 XT Speedster MERC 319 Kylare: Thermalright Peerless Assassin Ram: Kingston fury renegade 3600 MHZ 32GB Lagring: CORSAIR MP600 CORE 1 TB M2 NVME SSD, Samsung 870 evo 1TB ssd och en 2 TB mekaniskdisk