🌟 Advent of Code (AoC) 2020 🌟

PermalÀnk
Medlem ★
●

Dag 22, Python. SvÄrt att vara funktionell nÀr man har en while-loop.

from copy import deepcopy def plain1(deck, seen): return False def plain2(deck, c0, c1, cond1, cond2): return c0 > c1 def recursive1(deck, seen): t = (tuple(deck[0]), tuple(deck[1])) if t in seen: return True seen.add(t) return False def recursive2(deck, c0, c1, cond1, cond2): if c0 < len(deck[0]) and c1 < len(deck[1]): return len(Combat([deepcopy(deck[0][1:c0 + 1]), deepcopy(deck[1][1:c1 + 1])], cond1, cond2)[0]) return c0 > c1 def Combat(deck, cond1, cond2): seen = set() while len(deck[0]) and len(deck[1]): if cond1(deck, seen): return [[1],[]] c0, c1 = deck[0][0], deck[1][0] cond = cond2(deck, c0, c1, cond1, cond2) deck = [deck[0][1:] + ([c0, c1] if cond else []), deck[1][1:] + ([c1, c0] if not cond else [])] return deck deck = [[int(i) for i in l.strip().split('\n')[1:]] for l in open("input").read().split('\n\n')] print([sum([sum([(i + 1) * v for i, v in enumerate(d[::-1])]) for d in ds]) for ds in [Combat(deepcopy(deck), plain1, plain2), Combat(deepcopy(deck), recursive1, recursive2)]])

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

SvÄrt att vara funktionell nÀr man har en while-loop.

while-loopar blir i regel rekursiva funktioner i funktionell stil (while-villkoret flyttas till en if som antingen returnerar slutresultatet eller kallar pÄ sig sjÀlv med ny input). Men Python har ju varken tail call optimization eller sÀrskilt stort stack-djup, sÄ jag hade nog hÄllit mig till while.

PermalÀnk
Medlem
●

Dag: 22
SprÄk: Rust

use std::{collections::hash_map, ops::Not}; use std::{ collections::HashSet, hash::{Hash, Hasher}, }; use std::{collections::VecDeque, io}; pub fn run<R>(mut input: R) where R: io::BufRead, { let mut data = vec![]; let mut buf = String::new(); loop { if input.read_line(&mut buf).unwrap() == 0 { break; } { let buf = buf.trim(); if buf.starts_with("Player ") { data.push(VecDeque::new()); } else if buf.is_empty().not() { if let Some(deq) = data.last_mut() { deq.push_back(buf.parse::<u32>().unwrap()) } } } buf.clear(); } println!("Svar 1: {:?}", solve1(data.clone())); // Svar 1: (0, 32629) println!("Svar 2: {:?}", solve2(data.clone())); // Svar 2: (0, 32519) } fn solve1(mut data: Vec<VecDeque<u32>>) -> (usize, u32) { let vinnare = loop { // Samla ihop alla dragna kort let round = data .iter_mut() .enumerate() .filter_map(|(no, dec)| { if let Some(value) = dec.pop_front() { return Some((no, value)); } None }) .collect::<Vec<_>>(); // Tilldela högsta kortets Àgare alla kort dragna if let Some((a, _)) = round.iter().max_by_key(|(_, v)| v) { let mut win_round = round.iter().map(|v| v.1).collect::<VecDeque<_>>(); win_round.rotate_left(*a); data[*a].append(&mut win_round); } // Kontrollera om nÄgon part har slut kort och returnera vinnarens kort. if data.iter().any(|v| v.is_empty()) { break data .iter() .enumerate() .max_by_key(|(_, v)| v.len()) .unwrap(); } }; // Returnera vinnande spelare och summa (vinnare.0, summera(vinnare.1)) } fn solve2(mut data: Vec<VecDeque<u32>>) -> (usize, u32) { let mut seen = HashSet::new(); let vinnare = loop { if !seen.insert(hash(data.as_slice())) { break (0usize, &data[0]); } // Samla ihop alla dragna kort let round = data .iter_mut() .enumerate() .filter_map(|(no, dec)| { if let Some(value) = dec.pop_front() { return Some((no, value)); } None }) .collect::<Vec<_>>(); // Tilldela högsta kortets Àgare eller subgame alla kort dragna let index = if round .iter() .all(|(index, value)| *value as usize <= data[*index].len()) { // Kör subgame endast pÄ urval av korten let subgame_data = data .iter() .enumerate() .map(|(a, b)| { b.iter() .take(round[a].1 as usize) .cloned() .collect::<VecDeque<_>>() }) .collect::<Vec<_>>(); solve2(subgame_data).0 } else { round.iter().max_by_key(|(_, v)| v).unwrap().0 }; let mut win_round = round.iter().map(|v| v.1).collect::<VecDeque<_>>(); win_round.rotate_left(index); data[index].append(&mut win_round); // Kontrollera om nÄgon part har slut kort och returnera vinnarens kort. if data.iter().any(|v| v.is_empty()) { break data .iter() .enumerate() .max_by_key(|(_, v)| v.len()) .unwrap(); } }; // Returnera vinnande spelare och summa (vinnare.0, summera(vinnare.1)) } fn summera(data: &VecDeque<u32>) -> u32 { data.iter() .rev() .enumerate() .fold(0, |acc, (no, val)| acc + (no as u32 + 1) * val) } fn hash(vec: &[VecDeque<u32>]) -> u64 { let mut hasher = hash_map::DefaultHasher::new(); for v in vec { v.hash(&mut hasher) } hasher.finish() }

Dold text

Det blev sĂ„ att lösningen hanterar fler Ă€n tvĂ„ spelare (Även om jag inte provat). Del 1 och 2 ser vĂ€ldigt lika ut.

Visa signatur

AMD Ryzen 3700X, Gigabyte Elite X570, 32GB Ballistix Sport, NH-D15S, SAPPHIRE NITRO+ RX 7900 XTX, Corsair AX760, LG OLED C2 42"

PermalÀnk
Medlem ★
●

Dag 22 del tvÄ.

Citat:

Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks, the game instantly ends in a win for player 1. Previous rounds from other games are not considered. (This prevents infinite games of Recursive Combat, which everyone agrees is a bad idea.)

Jag gjorde först:

if str(deck1+deck2) in decks_prev:

Det fungerade inte sÄ jag provade:

if deck1 in decks_prev1 or deck2 in decks_prev2:

BÄda loopade i all oÀndlighet och tog flera timmar senare och gick luslÀsning av andra lösningar senare och sedan mÀrkte jag att man skulle köra:

if deck1 in decks_prev1 and deck2 in decks_prev2:

Är det jag som Ă€r dĂ„lig pĂ„ engelska?

Edit: Nu fungerar det visst med alla tre varianterna. Var vÀl fel pÄ nÄt annat.

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

Är det jag som Ă€r dĂ„lig pĂ„ engelska?

Jag tycker engelskan Àr tydlig.

Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks,

Blir alltsÄ:
- Innan nÄgon av spelarna drar översta kortet frÄn leken;
- kolla om det finns ett "tidigare state" dÀr: bÄda spelarna hade samma kort, i samma ordning, som de nu har.

Dina varianter:

Skrivet av Larrxi:

if str(deck1+deck2) in decks_prev:

tar inte hÀnsyn till vilken av spelarna som har korten, det blir t.ex. fel om följande sker:

OmgÄng 1: Spelare 1: [1, 2, 3] Spelare 2: [4, 5, 6] OmgÄng k: Spelare 1: [1] Spelare 2: [2, 3, 4, 5, 6]

Huruvida det Àr möjligt att hamna i k vet jag dock inte. Kan vara dÀrför din input terminerar.

Skrivet av Larrxi:

if deck1 in decks_prev1 or deck2 in decks_prev2:

Tar bara hÀnsyn till den ena spelaren. Om din input terminerar ÀndÄ har du tur.

Skrivet av Larrxi:

if deck1 in decks_prev1 and deck2 in decks_prev2:

Är sĂ€ttet jag löste det pĂ„.

Ett annat alternativ skulle kanske vara att skapa en hashning: Hash(spelare1+kortlek1, spelare2+kortlek2)?

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Idag var det straight forward och kul

LÀste beskrivningen och det sÄg kul ut indeed, sÄ jag tog i och löste dag 22 Àven om jag inte gjort nÄn sedan dag 16.

Dag: 22 (del 1)
SprÄk: Kotlin
Lösning: GitHub

Det var en vÀldigt trevlig lösning dÄ jag lÀrt mig att: removeAt(index) Àven returnerar elementen den tagit bort och inte bara tar bort frÄn sjÀlva listan och att det Àven finns foldIndexed() metoden. Praktisk i detta fall.

Min klyftiga stackBehind extension Àr extremt overkill, skrev den bara för att anvÀnda mina ganska sÄ nya kunskaper om vararg.

NÀr jag skulle lÀsa beskrivningen för del 2 kÀnde jag att jag inte orkade kanske en annan gÄng.

PermalÀnk
Medlem ★
●

@Larrxi, @GLaDER

Som jag lÀser raden

Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks,

Ă€r inte denna kod korrekt:

if deck1 in decks_prev1 and deck2 in decks_prev2:

Borde ni inte testa att deck1 och deck2 var i samma runda? Koden ovan testar om deck1 har varit med tidigare och att deck2 har varit med tidigare, men inte att det var i samma runda.

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

@Larrxi, @GLaDER

Som jag lÀser raden

Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks,

Ă€r inte denna kod korrekt:

if deck1 in decks_prev1 and deck2 in decks_prev2:

Borde ni inte testa att deck1 och deck2 var i samma runda? Koden ovan testar om deck1 har varit med tidigare och att deck2 har varit med tidigare, men inte att det var i samma runda.

Dold text

Huh. Du har helt rÀtt. DÄ hade jag ocksÄ bara flax, för jag tittar det som stÄr ovan.

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Datavetare ★
●

Dag: 22
SprÄk: Swift
Lösning: Github

Sen idag, allt svÄrare att hitta tid ju nÀrmare jul man kommer... Verkar som allt som Àr vÀrt att skriva om dag 22 redan Àr skrivet.

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 ★
●
Skrivet av GLaDER:

Dag: 22
SprÄk: Go
Lösning: Main

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Idag var det straight forward och kul En av mina bÀttre placeringar pÄ Del 1, trots att jag klantade mig lite med summeringen av slutresultatet. DÀremot Àr jag kass pÄ rekursion sÄ det tog lite för lÄng tid att lösa Del 2, Àven om tanken var rÀtt frÄn början.

Dold text

Dag: 23
SprÄk: Go
Lösning: Main

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Det Àr ju kuluppgiften frÄn 2018!

Jag antog frÄn början att Del 2 skulle vara "öka antalet koppar", "snurra mer", el.dyl., sÄ jag gav mig ut pÄ jakt i Golangs standardbibliotek för att hitta en effektiv datastruktur för problemet. NÀr jag gjorde kulproblemet 2018 (i Python) anvÀnde jag deque, sÄ jag försökte hitta motsvarande för Golang. Jag hittade ef-ds/deque, men den Àr inte del av standardlib och den saknade en metod för att rotera kön. I 2018-problemet var detta superviktigt och jag sÄg framför mig hur min lösning skulle snurra fram och tillbaka för att plocka ur/sÀtta i koppar pÄ rÀtt stÀllen.

Efter ytterligare letande -> container/ring. Yay!

Del 1 var nu trivial. Problemet kom i Del 2.

Det tog 15 minuter att iterera 250 000 gÄnger. Jag skulle alltsÄ behövt vÀnta ~10h för att fÄ svar. Det Àr orimligt, men jag förstod inte vad som var sÄ lÄngsamt. Jag hade ju "gjort rÀtt". Jag gav mig av till subredditen för att se om nÄgon annan anvÀnt Go och hittat en bra lösning.

Jag hittade en anvÀndare vars lösning var vÀldigt lik min egna (kommentarstrÄd) och frÄgade kort och gott om vederbörande kunde svara pÄ varför vÄra (sÄ lika) lösningar var sÄ olika snabba.

Svaret: Det Àr dyrt att snurra pÄ en container/ring, anvÀnd en LUT för att hÄlla koll pÄ vilken destination som pekar pÄ vilken kopp.

With just a ring, every time you need to do ANYTHING that involves finding another number, (eg finding the destination), at worst you need to iterate the ENTIRE linked list. And its not cheap fun range over a slice iteration, its awful pointer resolution and and and, then the GC will get involved because you're mucking with pointers too (note that I flat out disabled the GC -- though it shouldnt matter too much).

LUT will be O(1) lookup time, vs... what? O(N*N?) or something similar.

Jag bytte ut tvÄ snurrningar (en som hittade destination och en som snurrade tillbaka för att fÄ rÀtt current cup) och nu terminerar scriptet pÄ ~3 sekunder. VANSINNE!

Tack /u/A-UNDERSCORE-D.

Dold text
Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●

Dag 23

Jag började först jyra med textstrÀngar men sen gick jag över till lÀnkade listor och de Àr jag bekanta med. Sen en liten optimering att stoppa alla nodes i dictionary för att kunna slÄ upp pÄ cup label. BÀttre Àn att hoppa igenom miljontals nodes.

Dold text
PermalÀnk
Datavetare ★
●

Dag: 23
SprÄk: Swift
Lösning: Github

Gjorde först en lösning pÄ del 1 med binary coded decimals, den var riktigt snabb dÄ hela serien kan hÄllas i ett 64-bitars register.

Borde naturligtvis löst del 1 först för att se om BCD ens var en framkomlig vÀg, vilket inte var fallet... SÄ blev en variant dÀr index i en Array<Int> motsvarar en kopp med ett visst nummer pÄ, innehÄllet pÄ ett visst index Àr "next-pekaren" till nÀsta kopp i ringen.

$ swift run -c release 🌟 Part 1 : 97342568 ⌚ Elapsed : 0 ms 🌟 Part 2 : 902208073192 ⌚ Elapsed : 171 ms

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 23, idag behövde jag inte skÀmmas allt för mycket över min awk..

part1$ <in awk -v p1=1 -f d23.awk part2$ <in awk -f d23.awk

d23.awk

{ split($0, cups, "") current = cups[1] max = current last = current for (i = 2; i <= length(cups); i++) { nxt[last] = cups[i] last = cups[i] max = max > last ? max : last } nxt[last] = current if (!p1) { prev_max = max max = 1000000 for (i = prev_max + 1; i <= max; i++) { nxt[i] = i + 1 } nxt[last] = prev_max + 1 nxt[max] = current } for (move = 1; move <= (p1 ? 100 : 10000000); move++) { pick1 = nxt[current] pick2 = nxt[pick1] pick3 = nxt[pick2] dst = current do { dst = dst - 1 ? dst - 1 : max } while (dst == pick1 || dst == pick2 || dst == pick3) nxt[current] = nxt[pick3] nxt[pick3] = nxt[dst] nxt[dst] = pick1 current = nxt[current] } if (p1) { for (i = nxt[1]; i != 1; i = nxt[i]) { res = res""i } print res } else { print nxt[1] * nxt[nxt[1]] } }

Dold text
Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

PermalÀnk
Medlem
●

Dag: 23
SprÄk: Rust

use std::io; const INPUT: &[u8] = b"872495136"; pub fn run<R>(_input: R) where R: io::BufRead, { let data = INPUT.iter().map(|&u| (u - b'0') as u64).collect::<Vec<_>>(); println!("Svar 1: {}", solve1(data.clone()).unwrap()); // 27865934 println!("Svar 2: {}", solve2(data.clone()).unwrap()); // 170836011000 } fn solve1(mut data: Vec<u64>) -> Option<String> { crab_cups(data.as_mut_slice(), 100)?; let index = hamta_index(&data, 1)?; data.rotate_left(index); Some( data.iter() .skip(1) .map(|v| v.to_string()) .collect::<String>(), ) } // Extremt trött att fÄ fram svaret. :) fn solve2(mut data: Vec<u64>) -> Option<u64> { data.extend((10..=1_000_000).into_iter()); crab_cups(data.as_mut_slice(), 10_000_000)?; let index = hamta_index(&data, 1)?; Some(data[(index + 1) % data.len()] * data[(index + 2) % data.len()]) } fn crab_cups(data: &mut [u64], length: u64) -> Option<()> { let &min = data.iter().min()?; let &max = data.iter().max()?; for i in 0..length { data.rotate_left((i != 0) as usize); let mut dp = data[0] - 1; let index = loop { match dp { x if data[1..4].contains(&x) => dp -= 1, x if x < min => dp = max, x => break hamta_index(data, x)?, } }; data[1..=index].rotate_left(3); } Some(()) } fn hamta_index(data: &[u64], search: u64) -> Option<usize> { data.iter().position(|&b| b == search) }

Dold text

Jag glömde bort att jag hade DEL: 2 körandes i bakgrunden och fick korrekt svar. Den Àr inte snabb

Visa signatur

AMD Ryzen 3700X, Gigabyte Elite X570, 32GB Ballistix Sport, NH-D15S, SAPPHIRE NITRO+ RX 7900 XTX, Corsair AX760, LG OLED C2 42"

PermalÀnk
Medlem ★
●

Dag 24, god jul pÄ er! Jag blev precis klar med mitt första försök att baka lussebullar nÀr klockan slog AoC, bra timing dÀr. Nu dags att provsmaka!

$ <in awk -f d24.awk

d24.awk

BEGIN { dirs["e"]; dirs["se"]; dirs["sw"]; dirs["w"]; dirs["nw"]; dirs["ne"] } { coord = 0" "0 while ($0) { for (dir in dirs) { if ($0 ~ "^"dir) { coord = step(coord, dir) $0 = substr($0, length(dir) + 1) } } } flip(coord) } END { print length(tiles) for (day = 1; day <= 100; day++) { delete flips delete whites for (tile in tiles) { cnt = 0 for (dir in dirs) { check(tile, dir, whites) } if (cnt == 0 || cnt > 2) { flips[tile] } } for (tile in whites) { cnt = 0 for (dir in dirs) { check(tile, dir) } if (cnt == 2) { flips[tile] } } for (tile in flips) { flip(tile) } } print length(tiles) } function flip(tile) { if (tile in tiles) { delete tiles[tile] } else { tiles[tile] } } function step(coord, dir) { split(coord, cs); x = cs[1]; y = cs[2] if (dir == "e") { x += 1 } if (dir == "se") { if (y % 2) { y -= 1 } else { y -= 1; x += 1 } } if (dir == "sw") { if (y % 2) { y -= 1; x -= 1 } else { y -= 1 } } if (dir == "w") { x -= 1 } if (dir == "nw") { if (y % 2) { y += 1; x -= 1 } else { y += 1 } } if (dir == "ne") { if (y % 2) { y += 1 } else { y += 1; x += 1 } } return x" "y } function check(coord, dir, neighbours) { check_c = step(coord, dir) if (check_c in tiles) { cnt++ } else { neighbours[check_c] } }

Dold text
Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Dag: 23
SprÄk: Go
Lösning: Main

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Det Àr ju kuluppgiften frÄn 2018!

Jag antog frÄn början att Del 2 skulle vara "öka antalet koppar", "snurra mer", el.dyl., sÄ jag gav mig ut pÄ jakt i Golangs standardbibliotek för att hitta en effektiv datastruktur för problemet. NÀr jag gjorde kulproblemet 2018 (i Python) anvÀnde jag deque, sÄ jag försökte hitta motsvarande för Golang. Jag hittade ef-ds/deque, men den Àr inte del av standardlib och den saknade en metod för att rotera kön. I 2018-problemet var detta superviktigt och jag sÄg framför mig hur min lösning skulle snurra fram och tillbaka för att plocka ur/sÀtta i koppar pÄ rÀtt stÀllen.

Efter ytterligare letande -> container/ring. Yay!

Del 1 var nu trivial. Problemet kom i Del 2.

Det tog 15 minuter att iterera 250 000 gÄnger. Jag skulle alltsÄ behövt vÀnta ~10h för att fÄ svar. Det Àr orimligt, men jag förstod inte vad som var sÄ lÄngsamt. Jag hade ju "gjort rÀtt". Jag gav mig av till subredditen för att se om nÄgon annan anvÀnt Go och hittat en bra lösning.

Jag hittade en anvÀndare vars lösning var vÀldigt lik min egna (kommentarstrÄd) och frÄgade kort och gott om vederbörande kunde svara pÄ varför vÄra (sÄ lika) lösningar var sÄ olika snabba.

Svaret: Det Àr dyrt att snurra pÄ en container/ring, anvÀnd en LUT för att hÄlla koll pÄ vilken destination som pekar pÄ vilken kopp.

With just a ring, every time you need to do ANYTHING that involves finding another number, (eg finding the destination), at worst you need to iterate the ENTIRE linked list. And its not cheap fun range over a slice iteration, its awful pointer resolution and and and, then the GC will get involved because you're mucking with pointers too (note that I flat out disabled the GC -- though it shouldnt matter too much).

LUT will be O(1) lookup time, vs... what? O(N*N?) or something similar.

Jag bytte ut tvÄ snurrningar (en som hittade destination och en som snurrade tillbaka för att fÄ rÀtt current cup) och nu terminerar scriptet pÄ ~3 sekunder. VANSINNE!

Tack /u/A-UNDERSCORE-D.

Dold text

Först och frÀmst -- GOD JUL! Hoppas du har snö dÀr du befinner dig (det har vi inte hÀr) och att du fÄr en supertrevlig julafton. (Men glöm inte att det Àr en AoC i morgon ocksÄ!)

Dag: 24
SprÄk: Go
Lösning: Main

Det tog sin tid att köra Del 2, nÄgon som hittade pÄ en snabbare lösning Àn brute force?

🌟 Fetching today's input! 🌟 Answer for first question: 400 First answer retrieved in: 720”s Answer for second question: 3768 Second answer retrieved in: 13s

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Dagens stora tack gÄr till Red Blob Games, som har skrivit en ypperlig artikel om hexagonala koordinatsystem. Mha den knep jag min bÀsta Del-1-placering hittills

Del 2 var vÀrre.

  1. Jag tyckte det var otydligt om resultatet frÄn Del 1 skulle rÀknas med som en av dagarna i Del 2.

  2. Jag hade vÀnt pÄ en if-sats och kollade sÄledes alla vita plattor.

  3. Jag hade svÄrt att bestÀmma mig för hur generell jag ville göra min lösning.

padTiles(tiles) map[hexTile]int, var sista funktionen jag skrev; nÀr jag förstod att resultatet frÄn Del 1 skulle ses som Dag 0 i Del 2. Med andra ord:

  1. LÀgg alla plattor för Del 1

  2. Addera en ring av vita plattor runtom, sÄ det finns grannar till alla ursprungsplattor

  3. Kör igÄng for-loopen

I Del 1 hade jag 433 tiles i min map[hexTile]int. I slutet pÄ Del 2 var det 446221.

Nu ska jag packa ryggsÀckarna inför dagens Àventyr. Det blir en heldag i vildmarken, samt vindskyddsövernattning, för att fira en riktigt grön jul.

Dold text
Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Medlem ★
●
Skrivet av GLaDER:

Först och frÀmst -- GOD JUL! Hoppas du har snö dÀr du befinner dig (det har vi inte hÀr) och att du fÄr en supertrevlig julafton. (Men glöm inte att det Àr en AoC i morgon ocksÄ!)

Dag: 24
SprÄk: Go
Lösning: Main

Det tog sin tid att köra Del 2, nÄgon som hittade pÄ en snabbare lösning Àn brute force?

🌟 Fetching today's input! 🌟 Answer for first question: 400 First answer retrieved in: 720”s Answer for second question: 3768 Second answer retrieved in: 13s

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Dagens stora tack gÄr till Red Blob Games, som har skrivit en ypperlig artikel om hexagonala koordinatsystem. Mha den knep jag min bÀsta Del-1-placering hittills

Del 2 var vÀrre.

  1. Jag tyckte det var otydligt om resultatet frÄn Del 1 skulle rÀknas med som en av dagarna i Del 2.

  2. Jag hade vÀnt pÄ en if-sats och kollade sÄledes alla vita plattor.

  3. Jag hade svÄrt att bestÀmma mig för hur generell jag ville göra min lösning.

padTiles(tiles) map[hexTile]int, var sista funktionen jag skrev; nÀr jag förstod att resultatet frÄn Del 1 skulle ses som Dag 0 i Del 2. Med andra ord:

  1. LÀgg alla plattor för Del 1

  2. Addera en ring av vita plattor runtom, sÄ det finns grannar till alla ursprungsplattor

  3. Kör igÄng for-loopen

I Del 1 hade jag 433 tiles i min map[hexTile]int. I slutet pÄ Del 2 var det 446221.

Nu ska jag packa ryggsÀckarna inför dagens Àventyr. Det blir en heldag i vildmarken, samt vindskyddsövernattning, för att fira en riktigt grön jul.

Dold text

Ingen snö hÀr inte.

Jag kan inte Go men tror vi har ganska snarlik lösning, vilket kanske kan rÀknas som lite brute forcig. Min gÄr rÀtt snabbt dock, awk till trotts. Du sÀger att du hade 446221 tiles pÄ slutet, kanske du kan fÄ snabbare resultat om du bara hÄller koll pÄ de svarta tilesen som jag gör?

Ha kul dÀr ute! SÄg att du köpt en ny sovsÀck för detta, enjoy!

Smyger in en bild pÄ mina bullar som belv total succé. Enda smaken av jul jag fick i Är, med lite glögg ocksÄ, nÀr flyget hem inte kunde gÄ.

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

PermalÀnk
Datavetare ★
●

🎄 God Jul 🎄

Dag: 24
SprÄk: Swift
Lösning: Github

Tricket Àr som @GLaDER redan pÄpekat: anvÀnd rÀtt koordinatsystem! Kör med axial coordinates.

Swift Àr rÀtt lÄngsamt pÄ att skapa/förstöra Set/Dictionary med relativt mÄnga "structs".

$ swift run -c release 🌟 Part 1 : 424 ⌚ Elapsed : 0 ms 🌟 Part 2 : 3737 ⌚ Elapsed : 364 ms

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 24, Python. Ganska nÀtt, Àven om den Àr imperativ.

from collections import defaultdict tiles = defaultdict(bool) dirs = (('nw', 0, +1), ('sw', -1,-1), ('w', -1, 0), ('ne', +1, +1), ('se', 0,-1), ('e', +1, 0)) def walk(s, x = 0, y = 0): if not s: return x, y for d in dirs: if s.startswith(d[0]): return walk(s[len(d[0]):], x + d[1], y + d[2]) for l in open('input'): x, y = walk(l.strip()) tiles[(x,y)] = not tiles[(x,y)] print(sum(tiles.values())) for i in range(100): flip = set() for k in list(tiles): if tiles[k]: neighbors = sum([tiles[(k[0] + d[1], k[1] + d[2])] for d in dirs]) if neighbors == 0 or neighbors > 2: flip.add(k) for k in list(tiles): if not tiles[k]: neighbors = sum([tiles[(k[0] + d[1], k[1] + d[2])] for d in dirs]) if neighbors == 2: flip.add(k) for f in flip: tiles[f] = not tiles[f] print(sum(tiles.values()))

Dold text
PermalÀnk
Medlem ★
●

Dag 25, awk hela vÀgen! Det gick ÀndÄ.. Med lite bekymmer pÄ vissa dagar.

Idag var det inte mycket att göra.

$ <in awk 'NR==1 { val = 1; do { val *= 7; val %= 20201227; loop_size++ } while (val != $0) } NR==2 { val = 1; for (i = 1; i <= loop_size; i++) { val *= $0; val %= 20201227 }; print val }'

Dold text

Grattis till alla som hade tÄlamod att ta sig igenom alla dagar. För mig var det första gÄngen, och jag tror jag gled in pÄ en 5e plats. (anonymous user #122421) Som en sjÀlvidentifierande trögtÀnkt person Àr jag ÀndÄ ganska nöjd med det.
god jul & gott nytt

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

PermalÀnk
Medlem
●

Dag: 24
SprÄk: Rust

use std::io; use std::{collections::HashSet, ops::Not}; const NARLIGGANDE: &[(i32, i32)] = &[(1, 0), (1, -1), (0, -1), (-1, 0), (-1, 1), (0, 1)]; pub fn run<R>(mut input: R) where R: io::BufRead, { let mut buffer = String::new(); let mut svarta_brickor = HashSet::new(); let mut nya_svarta_brickor = HashSet::new(); loop { if input.read_line(&mut buffer).unwrap() == 0 { break; } let mut rad = buffer.trim(); let mut koordinater = (0, 0); while rad.is_empty().not() { (0..3) .into_iter() .find_map(|len| match &rad[..len] { "e" => Some((1, (1, 0))), "se" => Some((2, (1, -1))), "sw" => Some((2, (0, -1))), "w" => Some((1, (-1, 0))), "nw" => Some((2, (-1, 1))), "ne" => Some((2, (0, 1))), _ => None, }) .map(|(size, pos)| { koordinater = (koordinater.0 + pos.0, koordinater.1 + pos.1); rad = &rad[size..]; }); } if !svarta_brickor.insert(koordinater) { svarta_brickor.remove(&koordinater); } buffer.clear(); } println!("Svar 1: {:?}", svarta_brickor.len()); // 479 for _ in 0..100 { svarta_brickor .iter() .flat_map(|&bricka| { narliggande(bricka) .map(|b| (b, false)) .chain(std::iter::once((bricka, true))) }) .for_each(|(bricka, svart)| { let antal_svarta = narliggande(bricka) .filter(|pos| svarta_brickor.contains(pos)) .count(); if svart && (1 == antal_svarta || antal_svarta == 2) || svart.not() && 2 == antal_svarta { nya_svarta_brickor.insert(bricka); } }); svarta_brickor = std::mem::take(&mut nya_svarta_brickor); } println!("Svar 2: {:?}", svarta_brickor.len()); // 4135 } fn narliggande(bricka: (i32, i32)) -> impl Iterator<Item = (i32, i32)> { NARLIGGANDE .iter() .map(move |b| (b.0 + bricka.0, b.1 + bricka.1)) }

Dold text
Visa signatur

AMD Ryzen 3700X, Gigabyte Elite X570, 32GB Ballistix Sport, NH-D15S, SAPPHIRE NITRO+ RX 7900 XTX, Corsair AX760, LG OLED C2 42"

PermalÀnk
Medlem ★
●

Sista dagen, Python.

keys = (17607508, 15065270) def loop(subject, times, key = -1): count, value = 0, 1 while True: count, value = count + 1, value * subject % 20201227 if value == key: return count if count == times: return value loops = [loop(7, 0, k) for k in keys] print(loop(loop(7, loops[1]), loops[0]))

Dold text

Bra jobbat, alla ni som höll ut alla dagarna! Jag har lÀrt mig ny saker, dels har jag lÀrt mig nya saker om Python eftersom jag har lÀst pÄ om Python-biblioteken, men Àven lÀrt mig nya trick nÀr jag lÀst era lösningar.

Att konvertera den enkellÀnkade listan av { cup, next } till en array för att fÄ O(1) söktid var fyndigt. DÄ kan man ju dessutom skippa cup, dÄ det alltid Àr samma som indexet i arrayen Snyggt!

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

Först och frÀmst -- GOD JUL! Hoppas du har snö dÀr du befinner dig (det har vi inte hÀr) och att du fÄr en supertrevlig julafton. (Men glöm inte att det Àr en AoC i morgon ocksÄ!)

Dag: 24
SprÄk: Go
Lösning: Main

Det tog sin tid att köra Del 2, nÄgon som hittade pÄ en snabbare lösning Àn brute force?

🌟 Fetching today's input! 🌟 Answer for first question: 400 First answer retrieved in: 720”s Answer for second question: 3768 Second answer retrieved in: 13s

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

Dagens stora tack gÄr till Red Blob Games, som har skrivit en ypperlig artikel om hexagonala koordinatsystem. Mha den knep jag min bÀsta Del-1-placering hittills

Del 2 var vÀrre.

  1. Jag tyckte det var otydligt om resultatet frÄn Del 1 skulle rÀknas med som en av dagarna i Del 2.

  2. Jag hade vÀnt pÄ en if-sats och kollade sÄledes alla vita plattor.

  3. Jag hade svÄrt att bestÀmma mig för hur generell jag ville göra min lösning.

padTiles(tiles) map[hexTile]int, var sista funktionen jag skrev; nÀr jag förstod att resultatet frÄn Del 1 skulle ses som Dag 0 i Del 2. Med andra ord:

  1. LÀgg alla plattor för Del 1

  2. Addera en ring av vita plattor runtom, sÄ det finns grannar till alla ursprungsplattor

  3. Kör igÄng for-loopen

I Del 1 hade jag 433 tiles i min map[hexTile]int. I slutet pÄ Del 2 var det 446221.

Nu ska jag packa ryggsÀckarna inför dagens Àventyr. Det blir en heldag i vildmarken, samt vindskyddsövernattning, för att fira en riktigt grön jul.

Dold text

Dag: 25 och 20
SprÄk: Go
Lösning: 25, 20

Glöm inte att kika in pÄ vÄr leaderboard: 115994-59705230

DÄ var det över för i Är! DÄ jag inte haft tid att göra 20 tog jag tag i den idag med. (Var ju tvungen, annars kunde jag ju inte betala för mig...) Det var en rejÀler ena uppgift, med mÄnga loopar, och mycket rekursion. Ugh. Men tillslut fick jag ordning pÄ allting.

NÄgon som har bra koll pÄ rekursion fÄr gÀrna ta en titt pÄ min findTiling(), jag Àr inte riktigt nöjd med If-satsen pÄ rad 89. Det kÀnns som att det borde gÄ att göra en snyggare rekursiv funktion.

Skrivet av gibbon_:

Ha kul dÀr ute! SÄg att du köpt en ny sovsÀck för detta, enjoy!

Smyger in en bild pÄ mina bullar som belv total succé. Enda smaken av jul jag fick i Är, med lite glögg ocksÄ, nÀr flyget hem inte kunde gÄ.

Det blev ingen vidare övernattning. Vi fick pÄhÀlsning av möss och en -- för mig -- ny fobi hos frun uppdagades. Det var bara att riva lÀgret, rulla ihop allting, och traska tillbaka mot bilen i pannlampssken. TrÄkigt avslut pÄ en kvÀll vi sett fram lÀnge emot. Men men...

Lussebullarna sÄg dock fina ut! Skicka över en vettja

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕

PermalÀnk
Datavetare ★
●

Dag: 25
SprÄk: Swift
Lösning: Github

Förra Äret anvÀnde jag Rust för första gÄngen i Advent of Code. Hade lÀst om sprÄket innan, sÄ var vÀldigt positivt instÀlld till allt och det blev ingen besvikelse.

Var inte lika övertygad om Swift, valde detta i Är mest för att modern MacOS programmering krÀver i praktiken att man har lite koll pÄ Swift. Men blev positivt överraskad, Swift Àr lite lurigt att lÀra sig dÄ man Àndrat rÀtt mycket mellan de tidiga versionerna, det leder till att lösningar kanske inte lÀngre Àr relevanta.

I slutÀndan Àr det nog bra att man gick den vÀgen, version 1, 2 och 3 fÄr nog sÄ hÀr i efterhand ses lite som beta-versioner. Det som kom ut i andra Ànden, frÄn Swift 4 och framÄt (Swift 5 Àr den aktuella huvud-versionen idag) blev riktigt bra.

I vissa lÀgen Àr Swift Àr inte fullt lika effektivt som C, C++ och Rust. Men det Àr inte allt fÄr lÄngt ifrÄn och Swift Àr ett klart enklare sprÄk att lÀra sig jÀmfört med C++ och Rust

$ swift run -c release 🌟 Part 1 : 15467093 ⌚ Elapsed : 34 ms

Dold text
Och en vit jul blev det ocksÄ tillslut, fotat runt 14:30 idag (NorrtÀlje)!
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 ★
●
Skrivet av GLaDER:

NÄgon som har bra koll pÄ rekursion fÄr gÀrna ta en titt pÄ min findTiling(), jag Àr inte riktigt nöjd med If-satsen pÄ rad 89. Det kÀnns som att det borde gÄ att göra en snyggare rekursiv funktion.

Du har en lite egen variant av rekursion hÀr Normal brukar man ha testet pÄ om rekursionen skall avslutas som första test i funktionen, inte efter att du redan gjort det rekursiva anropet. Att det funkar i detta fallet beror pÄ att tileInSlice kommer att upptÀcka att alla tiles redan Àr tagna och returnera samma vÀrden som kom in i anropet. Sedan kommer du upptÀcka att lÀngderna Àr lika och returnera. Det funkar, men bygger pÄ att du inte försöker göra nÄgot i fallet dÄ rekursionen skall avslutas. I rekursionen typexempel fakultet, skulle du inte kunna anropa fac(-1) och sedan kolla om returvÀrdet var konstigt.

Du gör en hel del extra jobb hÀr. I och med att pusselbitarna bara passar med en annan pusselbit sÄ bestÀmmer hörnet allting. Om du hade en datastruktur sÄ att du enkelt kunde hitta den andra biten (och dess rotation) som passade med bit X rÀcker det att
1) Hitta ett hörn (och det har vi redan gjort i uppgift 1)
2) Rotera den biten sÄ att det ligger i övre vÀnstra hörnet,
3) Hitta alla bitar som passar i x led (spelar ingen roll om du ser det som nedÄt eller höger). Eftersom det bara finns en bit som passar kan du fortsÀtta sÄ lÀnge du hittar en bit som passar med de redan lagda bitarna.
4 LÀgga alla rader/kolumner som passar med den kolumn/rad du redan lagt. Samma princip hÀr; det finns bara en bit som passar.

Dold text
PermalÀnk
Medlem
●

Dag:25
SprÄk: Rust

use std::io; pub fn run<R>(input: R) where R: io::BufRead, { let mut iter = input .lines() .filter_map(|r| r.ok()) .filter_map(|s| s.parse::<u64>().ok()); let pubk_card = iter.next().unwrap(); // Input: 8458505 let pubk_room = iter.next().unwrap(); // Input: 16050997 let find = |subject: u64, result: u64| -> u64 { (0..) .into_iter() .skip_while(|v| transform(subject, *v) != result) .next() .unwrap() }; println!("Svar: {}", transform(pubk_room, find(7, pubk_card))); // Svar: 448851 } fn transform(subject: u64, loop_size: u64) -> u64 { // (0..loop_size).fold(1, |acc, _| (acc * subject) % 20201227) mod_pow(subject, loop_size, 20201227) } fn mod_pow(base: u64, exp: u64, modulus: u64) -> u64 { if exp == 0 { 1 } else if exp % 2 == 0 { mod_pow(base.pow(2) % modulus, exp >> 1, modulus) } else { base * mod_pow(base, exp - 1, modulus) % modulus } }

Dold text

Jag tÀnkte inte ens lÀgga upp lösningen dÄ den Àr typ likadan som övriga. MEN..

Den bortkommenterade (0..loop_size).fold(1, |acc, _| (acc * subject) % 20201227) Àr alltför seg och jag ser exempel dÀr reduce anvÀnts i andra lösningar. Reduce och fold bara olika namn pÄ samma sak.

Det kan ju vara sÄ att jag bara har sÄdan input:
8458505
16050997

Ska ge 448851 som svar.

Hittade exempel pÄ en snabbare variant att berÀkna detta och skapade mod_pow som dÄ ger ett svar detta Är iallafall.

Dold text
Visa signatur

AMD Ryzen 3700X, Gigabyte Elite X570, 32GB Ballistix Sport, NH-D15S, SAPPHIRE NITRO+ RX 7900 XTX, Corsair AX760, LG OLED C2 42"

PermalÀnk
Medlem ★
●

SÄ dÄ fick jag klart dag 25 och dÀrmed Àr allt gjort. LÀrde mig mycket och mest om scopes.

Det tog ofta 4-5 timmar att lösa en dag sÄ det tog lite vÀl mycket tid och energi.
Detta Àr första Äret jag gör advent of code.
Blir man snabbare med tiden?

PermalÀnk
Datavetare ★
●
Skrivet av Sajox:

Den bortkommenterade (0..loop_size).fold(1, |acc, _| (acc * subject) % 20201227) Àr alltför seg och jag ser exempel dÀr reduce anvÀnts i andra lösningar. Reduce och fold bara olika namn pÄ samma sak.

Det kan ju vara sÄ att jag bara har sÄdan input:
8458505
16050997

Ska ge 448851 som svar.

Skillnaden ligger i hur din kod berÀknar loop_size jÀmfört med t.ex. min Swift-lösning (som anvÀnder reduce).

Med fold/reduce blir det dyrare att berÀkna resultatet ju högre vÀrde man har pÄ loop_size och framförallt blir resultatet O(N^2) om man anropar transform() vid berÀkningen av loop_size

Min Swift-lösning översatt till Rust blir ungefÀr detta (med din indata)

type Num = u64; const CARD_PUB_KEY: Num = 8458505; const DOOR_PUB_KEY: Num = 16050997; const DIVISOR: Num = 20201227; fn transform(subject_number: Num, loop_size: Num) -> Num { (0..loop_size).fold(1, |value, _| (value * subject_number) % DIVISOR) } fn loop_size_calc(pub_key: Num) -> Num { let subject_number: Num = 7; let mut loop_size: Num = 0; let mut value: Num = 1; while value != pub_key { loop_size += 1; value = (value * subject_number) % DIVISOR; } return loop_size; } fn day25(card_pub_key: Num, door_pub_key: Num) { let card_loop_size = loop_size_calc(card_pub_key); let secret_key = transform(door_pub_key, card_loop_size); println!("🌟 Part 1 : {}", secret_key) } fn bench(f: &dyn Fn()) { let start = std::time::Instant::now(); f(); println!("⌚ Took : {}ms", start.elapsed().as_millis()); } fn main() { bench(&||day25(CARD_PUB_KEY, DOOR_PUB_KEY)); }

Denna lösning hittar loop_size pÄ linjÀr tid mot storleken pÄ loop_size. PÄ min 3900X tar ovan 84 ms för att slutföra berÀkningen.

Ändrar man den markerade delen till detta blir det i stĂ€llet O(N^2), orkade inte vĂ€nta till berĂ€kningen blev klar dĂ„ (tar mer Ă€n en minut).

fn loop_size_calc(pub_key: Num) -> Num { let subject_number: Num = 7; let mut loop_size: Num = 0; while transform(subject_number, loop_size) != pub_key { loop_size += 1 } return loop_size; }

Implementerar man istÀllet transform() pÄ det sÀtet du gjort blir den funktionen tillrÀckligt effektiv för att anvÀnda transform() Àven i loop_size_calc(), men ÀndÄ lÄngsammare Àn den iterativa lösningen dÀr man inte alls anvÀnder transform().

PÄ min dator tar din Rust-lösning 1,4s.

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 ★
●
Skrivet av Larrxi:

Blir man snabbare med tiden?

Som jag skrev till nÄgon annan tidigare i trÄden: En viktig del av programmerandet Àr rutin. Ju fler olika typer problem du redan löst, desto bÀttre lÀmpad Àr du att angripa nÀsta problem. NÀsta Ärs problem kommer se annorlunda ut, men du kommer sannolikt kunna anvÀnda metoder liknande de du anvÀnde i Är. Exempelvis sÄ Àr problemet att gÄ i ett hexrutsystem i grunden likadant som att gÄ ett rutsystem med kvadrater om man vrider en av axlarna 30 grader och att man kan gÄ i sex riktningar istÀllet för fyra.

Ibland kan dock det faktum att man löst förra Ärets kalender leda en pÄ villovÀgar. I krabbproblemet med 1 miljon koppar fastnade jag i att det var ganska likt ett problem i förra Ärets kalender dÀr man kunde utföra ett antal operationer pÄ en kortlek, typ kupera och reversera, och man skulle hitta pÄ vilken position ett specifikt kort hamnade. Det gick ju fint sÄ lÀnge vi pratade om normala storlekar pÄ kortleken, men nÀr man skalade upp problemet till miljoner kort och miljoner operationer blev det lite tungt. Tricket dÀr var att bara hÄlla reda pÄ positionen pÄ kortet vi brydde oss om och hur dess position Àndrades för varje operation. Jag ville göra samma sak hÀr och missade helt att det var ett lÀtt problem med en vanlig cirkulÀr lista. Den cirkulÀra listan fanns ju i erfarenhetsbanken, men det Àr sÄ lÀnge sedan den kom till anvÀndning att jag helt enkelt inte kom att tÀnka pÄ den. SÄ hÀr i efterhand Àr det ju sjÀlvklart den bÀsta angreppsmetoden (kopparna stod ju i en cirkel, pucko!), men det var det inte pÄ söndagseftermiddagen.

Jag gav upp och kikade pÄ andra lösningar i trÄden och hittade lösningen @gibbon_ postade. Det var inte helt lÀtt att först vad som hÀnde dÀr men efter en hel del pannveckande insÄg jag att det egentligen var en cirkulÀr lista men att han bara höll reda pÄ next-"pekarna" och struntade i koppnumret för det var alltid samma som indexet i tabellen. Man lÀr sig mycket av att lÀsa andras lösningar och jÀmföra med sin egen lösning. Man lÀr sig Ànnu mer om man har tid att skriva om sin egen lösning och byta till en bÀttre metod som nÄgon annan anvÀnt. Offra inte för mycket tid pÄ mina lösningar i ful-Python och gibbon_s awk, vi har inte haft lÀttlÀsthet högst upp pÄ prioritetslistan

Uppgifterna i sig blir lite knepiga framÄt slutet och de Àr vÀldigt oförlÄtande. Svaret Àr binÀrt rÀtt eller fel. (Den lilla hinten om för lÄgt eller för högt Àr egentligen inte till nÄgon större hjÀlp.) NÄgra erfarenheter frÄn i Är och förra Äret:

* LÀs hela uppgiften innan du börjar lösa problemet. Noga! Om du raskt paste:ar in resultatet frÄn berÀkningen in i formulÀret och fÄr fel, kolla om du verkligen gjort allt du skulle göra. Tog ett antal försök innan jag fixade Crab Cups, del 1. 593412786, fel, hmm, efter ettan: 2786, fel, hmm, efter ettan plus det före ettan: 2786593, fel, suck, typo: 27865934, rÀtt.

* Om du fÄr fel svar, kolla om du verkligen har skrivit rÀtt överallt. Minsta slarvfel, som om man tar modulo 2021227 istÀllet för 20201227, gör att det inte blir samma resultat som i exemplet och dÄ blir det vÀldigt svÄrt att förstÄ hur kryptonycklarna hÀnger ihop. Samma sak med den riktiga uppgiften. Det spelar ingen roll hur bra din hitta-rÀtt-i-labyrinten-lösning Àr, du kommer fÄ fel lÀngd pÄ vÀgen om du gÄr till position 6,4 istÀllet 4,6.

* Försök gissa dig till vad som kommer bli "vÀrre" i del tvÄ. Om du redan frÄn början tror att problemstorleken kommer bli större och att vÀrdena kommer strÀcka sig utanför 1-9 Àr det dumt att bygga datastrukturer och lösningsmetoder i del 1 pÄ att vÀrdena ryms i en character. Man kan visserligen anvÀnda ha kopparna i en strÀng och anvÀnda strÀng/regexp-funktioner för att göra en liten och elegant lösning pÄ del 1, men det Àr bortkastat jobb om man ÀndÄ har pÄ kÀnn att det inte kommer funka för del tvÄ. Men ibland mÄste man bara pröva...

Även om det stundtals var tungt och jag undrade varför jag höll pĂ„ med det hĂ€r sĂ„ har det varit lĂ€rorikt och det kĂ€nns skönt nĂ€r man fĂ„r guldstjĂ€rnan. Vi ses nĂ€sta Ă„r!

PermalÀnk
Medlem ★
●
Skrivet av drwlz:

Ser fram emot att ge upp dag 4-5 i Är igen!

Hur lÄngt kom du?

Visa signatur

:(){ :|:& };:

đŸŠđŸ»â€â™‚ïž   đŸšŽđŸ»â€â™‚ïž   đŸƒđŸ»â€â™‚ïž   ☕