Rösta fram din favoritbakgrundsbild!

🌟 Advent of Code (AoC) 2024 🌟

PermalÀnk
Medlem ★
●
Skrivet av kode:

Dag 11, C#

Kul att lanternfishes Àr tillbaks igen...

using System.Diagnostics; Stopwatch sw = Stopwatch.StartNew(); var line = File.ReadAllText("input.txt").Split(' '); Dictionary<string, long> dict = []; foreach (var item in line) dict[item] = 1; dict = blink_times(dict, 25); Console.WriteLine("Part 1: " + dict.Sum(x => x.Value)); Console.WriteLine(sw.Elapsed); dict = blink_times(dict, 50); Console.WriteLine("Part 2: " + dict.Sum(x => x.Value)); Console.WriteLine(sw.Elapsed); static Dictionary<string, long> blink(Dictionary<string, long> dict) { Dictionary<string, long> ret = []; foreach (var item in dict) { if (item.Key == "0") { add(ret, "1", item.Value); } else if (item.Key.Length % 2 == 0) { add(ret, long.Parse(item.Key[(item.Key.Length / 2)..]).ToString(), item.Value); add(ret, long.Parse(item.Key[..(item.Key.Length / 2)]).ToString(), item.Value); } else { add(ret, (long.Parse(item.Key) * 2024).ToString(), item.Value); } } return ret; static void add(Dictionary<string, long> d, string k, long v) { if (d.TryGetValue(k, out long value)) d[k] = value + v; else d[k] = v; } } static Dictionary<string, long> blink_times(Dictionary<string, long> dict, int times) { for (int i = 0; i < times; i++) { var output = blink(dict); dict = output; } return dict; }

Dold text

Bara 50 gÄnger i del 2?

Min jobbdator verkar för övrigt inte riktigt palla med detta.. strömsnÄl 4-kÀrnig historia som tar orimligt lÄng tid sÄ fort det gÄr över 50 iterationer (Minuter) oavsett om det Àr parallellt eller ej

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

PermalÀnk
Medlem ★
●

Jag tror AoC Àr buggat för mig...
Kan nÄgon som kört dag 11 verifiera resultatet frÄn min input i spoilern nedan? Svaret de menar att jag fÄtt i del 1 Àr nÀmligen inget jag skickat in

4329 385 0 1444386 600463 19 1 56615

Jag fÄr svaret frÄn 25 iterationer;
217983
Men AoC menar att det Àr (som jag har fÄtt en stjÀrna för):
218079

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

PermalÀnk
Medlem
●
Skrivet av Pamudas:

Jag tror AoC Àr buggat för mig...
Kan nÄgon som kört dag 11 verifiera resultatet frÄn min input i spoilern nedan? Svaret de menar att jag fÄtt i del 1 Àr nÀmligen inget jag skickat in

4329 385 0 1444386 600463 19 1 56615

Jag fÄr svaret frÄn 25 iterationer;
217983
Men AoC menar att det Àr (som jag har fÄtt en stjÀrna för):
218079

Dold text

Jag fick 218079 med 25 iterationer och din input.

Dold text
Visa signatur

Starka Äsikter om onödiga saker.

PermalÀnk
Medlem ★
●
Skrivet av Pamudas:

Bara 50 gÄnger i del 2?

Min jobbdator verkar för övrigt inte riktigt palla med detta.. strömsnÄl 4-kÀrnig historia som tar orimligt lÄng tid sÄ fort det gÄr över 50 iterationer (Minuter) oavsett om det Àr parallellt eller ej

Dold text

Ja, jag har ju redan kört den 25 gÄnger för del 1.

Dold text

Edit:

Om det tar flera minuter att köra Àr du inne pÄ fel spÄr.

LedtrÄd:

Det stÄr i problembeskrivningen att ordningen Àr densamma oavsett. Detta behöver du inte ta i beaktning i din lösning, eftersom det Àr irrelevant för att fÄ fram rÀtt svar.

Dold text

LedtrÄd 2

Samlar man stenar med samma vÀrde pÄ nÄgot sÀtt kan man göra samma operation en gÄng pÄ dem enbart, istÀllet för en gÄng per sten

Dold text
Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

PermalÀnk
Medlem ★
●
Skrivet av bjoen:

Jag fick 218079 med 25 iterationer och din input.

Dold text

Fattar noll 😅 testet med exemplet fungerar perfekt.
Kopierade in en kod hÀrifrÄn och den ger rÀtt... Intressant

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

PermalÀnk
Medlem ★
●
Skrivet av Pamudas:

Fattar noll 😅 testet med exemplet fungerar perfekt.
Kopierade in en kod hÀrifrÄn och den ger rÀtt... Intressant

Dold text

Jag gjorde en naiv version för del 1 och sedan nÀr jag gjorde en mer genomtÀnkt lösning sÄ började jag fÄ alldeles felaktiga nummer för del 1, bÄde lÀgre och högre, nÀr det var 25 iterationer pÄ inputdatan eller exemplet (men rÀtt pÄ 6 iterationer). Du kanske tolkar nÄgra 00 som just 00 istÀllet för 0 eller liknande?

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

PermalÀnk
Medlem ★
●
Skrivet av kode:

Ja, jag har ju redan kört den 25 gÄnger för del 1.

Dold text

Edit:

Om det tar flera minuter att köra Àr du inne pÄ fel spÄr.

LedtrÄd:

Det stÄr i problembeskrivningen att ordningen Àr densamma oavsett. Detta behöver du inte ta i beaktning i din lösning, eftersom det Àr irrelevant för att fÄ fram rÀtt svar.

Dold text

LedtrÄd 2

Samlar man stenar med samma vÀrde pÄ nÄgot sÀtt kan man göra samma operation en gÄng pÄ dem enbart, istÀllet för en gÄng per sten

Dold text

Avrundning nÀr jag rÀknade ut "hÀlften hÀlften" spökade med utrÀkningen. Funkade perfekt i exemplet vilket gjorde att jag antog att det fungerade.

Ang. Lösningen sÄ körde jag rekursivt vilket sÄklart Àr bruteforce. Fungerade perfekt i början men tog för lÄng tid vid fler iterationer.

FÄr klura pÄ nÄgon cachning istÀllet

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

PermalÀnk
Datavetare ★
●

Dag: 11
SprÄk: Rust

part 1: 36”s (M3), 146”s (Orange Pi 5)
part 2: 1.8ms (M3), 7.0ms (Orange Pi 5)

use ahash::AHashMap; use std::fs::read_to_string; pub const INPUT_FILE: &str = "input.txt"; type Number = u64; type Stones = AHashMap<Number, usize>; pub fn read_stones(path: &str) -> Stones { read_to_string(path) .expect("File does not exist") .split_whitespace() .map(|num| num.parse::<Number>().unwrap()) .fold(AHashMap::new(), |mut acc, num| { *acc.entry(num).or_insert(0) += 1; acc }) } pub fn part1(stones: &Stones) -> usize { blink_n_times(stones, 25) } pub fn part2(stones: &Stones) -> usize { blink_n_times(stones, 75) } fn blink_n_times(stones: &Stones, n: usize) -> usize { let mut stones_odd_blink = AHashMap::new(); let mut stones_even_blink = stones.clone(); for blink_cnt in 0..n { if blink_cnt % 2 == 0 { blink(&stones_even_blink, &mut stones_odd_blink); } else { blink(&stones_odd_blink, &mut stones_even_blink); } } if n % 2 == 0 { stones_even_blink } else { stones_odd_blink } .values() .sum() } fn blink(current: &Stones, next: &mut Stones) { next.clear(); for (&number, &count) in current.iter() { if number == 0 { *next.entry(1).or_default() += count; } else { let num_digits = log10(number) + 1; if num_digits % 2 == 0 { let factor = (10 as Number).pow(num_digits / 2); let a = number / factor; let b = number % factor; *next.entry(a).or_default() += count; *next.entry(b).or_default() += count; } else { let a = number * 2024; *next.entry(a).or_default() += count; } } } } fn log10(n: Number) -> u32 { let mut l = 0; let mut factor = 10; while factor <= n { factor *= 10; l += 1; } l }

Dold text
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: 11
SprÄk: C#
Dag 11

Nu sÄ blev det Àntligen löst. Min stackars hjÀrna fick gÄ pÄ högvarv idag
Började med att jag tÀnkte "Det hÀr Àr ju lÀtt! Bara skapa en lista med alla nummer.. sen summerar jag dom i slutet!"
.. Ja, det funkade ju med 25 iterationer (typ typ 200ms?) men minnet kÀkades upp ganska snabbt.

Gjorde om till rekursiva funktioner istÀllet och fick ner minnesanvÀndningen till nÄgra enstaka MB - stenarnas vÀrden sparades aldrig, ökade endast en counter nÀr jag var pÄ sista indexet i min iteration. Funkade Ànnu bÀttre vid 25 iterationer (20ms ish).

Del 2.. jahopp, för att Del 2 ska bli klar (75 iterationer) hade jag tydligen behövt vÀnta ett Är eller tvÄ Bruteforce (trots effektiv minnesanvÀndning) hade alltsÄ inte funkat.
Fick skriva om lösningen till att anvÀnda ett cache istÀllet.
Om jag rÀknat ut ett vÀrde redan sÄ ÄteranvÀnder jag resultatet istÀllet för att berÀkna det pÄ nytt.

Samma gÀller antalet stenar med ett visst vÀrde - öka antalet med nÀsta vÀrde med nuvarande vÀrdes antal. SÄ har jag 4 stenar med vÀrdet 2024 sÄ lÀgger jag nu in att vÀrdena 20 och 24 ökat med 4st. Tack @kode för ledtrÄden

Del 1 tar ca 0.8ms
Del 2 tar ca 25ms

public static class Solver { private static long GetNumberOfDigits(long n) => n > 0 ? (long)Math.Log10(n) + 1 : 1; private static RuleResult ExecuteRules(long number) { if (number == 0) return new RuleResult(1, -1); var numberOfDigits = GetNumberOfDigits(number); if (numberOfDigits % 2 != 0) return new RuleResult(number * 2024, -1); var divisor = (long)Math.Pow(10, numberOfDigits * 0.5); return new RuleResult(number / divisor, number % divisor); } private static Dictionary<long, long> GetNewValues(Dictionary<long, long> prevValues, Dictionary<long, RuleResult> cachedRuleValues) { var newValues = new Dictionary<long, long>(); foreach (var kvp in prevValues) { if (!cachedRuleValues.TryGetValue(kvp.Key, out var val)) { val = ExecuteRules(kvp.Key); cachedRuleValues[kvp.Key] = val; } if (newValues.TryGetValue(val.A, out _)) newValues[val.A] += kvp.Value; else newValues[val.A] = kvp.Value; if (val.B == -1) continue; if (newValues.TryGetValue(val.B, out _)) newValues[val.B] += kvp.Value; else newValues[val.B] = kvp.Value; } return newValues; } private static long GenerateStones(List<int> numbers, int iterations) { var dict = numbers.GroupBy(n => (long)n) .ToDictionary(group => group.Key, group => (long)group.Count()); var cache = new Dictionary<long, RuleResult>(); for (var i = 0; i < iterations; i++) { var output = GetNewValues(dict, cache); dict = output; } return dict.Values.Sum(); } public static long Run_PartOne(string input) { var numbers = input.Split(" ").Select(int.Parse).ToList(); return GenerateStones(numbers, 25); } public static long Run_PartTwo(string input) { var numbers = input.Split(" ").Select(int.Parse).ToList(); return GenerateStones(numbers, 75); } private readonly struct RuleResult(long a, long b) { public long A { get; } = a; public long B { get; } = b; } }

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz