🌟 Advent of Code (AoC) 2021 🌟

PermalÀnk
●

Dag: 7
SprÄk: Haskell

Jag lade lite extra tid pÄ att stega mig fram till rÀtt svar, vilket spar en kvarts sekund.

main = interact solve solve input = "Problem 1: " ++ show (findLocalMin (cost fuel1 startPos) endPos) ++ "\n" ++ "Problem 2: " ++ show (findLocalMin (cost fuel2 startPos) endPos) ++ "\n" where startPos = map read (words (map (\c->if c==',' then ' ' else c) input)) :: [Int] endPos = [minimum startPos..maximum startPos] fuel1 from to = abs (to-from) fuel2 from to = div ((fuel1 from to)*(fuel1 from to + 1)) 2 cost fuel starts end = foldr (\from acc->acc+fuel from end) 0 starts findLocalMin f xs | length xs <= 8 = minimum (map f xs) | otherwise = if sign1 == sign2 then findLocalMin f (drop half xs) else findLocalMin f (take (half+2) xs) where sign1 = (f (xs !! 0) - f (xs !! 1)) >= 0 sign2 = (f (xs !! half) - f (xs !! half+1)) >= 0 half = div (length xs) 2

Dold text

TillÀgg, allmÀn reflektion:

Önskar jag hade kommit pĂ„ det dĂ€r med median. Jag testade medelvĂ€rde och blev förvĂ„nad att det inte gav rĂ€tt svar. Hoppas man kommer ihĂ„g det till nĂ€sta gĂ„ng.

Dold text
Lade till tillÀgg.
PermalÀnk
Medlem
●

Dag: 7
SprÄk: C++

Kod:

int solve_part1(vector<int> data) { //median minimizes the sum of absolute deviations sort(data.begin(), data.end()); int median = data[data.size()/2]; int result = accumulate(data.begin(), data.end(),0,[median](int a, int b){return a + abs(b - median);}); return result; } int solve_part2(vector<int> data) { //f(m) = sum_i((x_i-m)ÂČ + abs(x_i-m))/2 //df/dm = 0 -> m = sum_i(x_i)/n +-1/2 //optimal position m is within +-1/2 of the mean (sum_i(x_i)/n) float mean = accumulate(data.begin(),data.end(),0)/(float)data.size(); int f1 = accumulate(data.begin(), data.end(),0, [mean](int a, int b){int d = abs(b-int(mean+.5)); return a + (d*d + d)/2;}); int f2 = accumulate(data.begin(), data.end(),0, [mean](int a, int b){int d = abs(b-int(mean-.5)); return a + (d*d + d)/2;}); return f1 < f2? f1 : f2; }

Dold text

Reflektioner:

Tycker som flera andra inte alls det var sjÀlvklart att medianen Àr den optimala positionen för del 1, och de tvÄ positionerna kring medelvÀrdet för del 2. Försökte mig pÄ en hÀrledning av del 2 (se kommentarer i koden), tar gÀrna emot synpunkter dÀr frÄn nÄgon som kan matematik pÄ riktigt.

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

Reflektioner:

Tycker som flera andra inte alls det var sjÀlvklart att medianen Àr den optimala positionen för del 1, och de tvÄ positionerna kring medelvÀrdet för del 2. Försökte mig pÄ en hÀrledning av del 2 (se kommentarer i koden), tar gÀrna emot synpunkter dÀr frÄn nÄgon som kan matematik pÄ riktigt.

Dold text

Jag funderade median redan frÄn början, kollade det och funderade pÄ om det var mer en slump. Men sen efter att jag löst det genom for-loopande och sÄ vidare visade det sig ju att man fick samma svar dÄ med.

För del 1 Àr vÀl Ätminstone denna SE-post relevant.

För del 2 sÄ Àr ju medel tekniskt sett inte riktigt rÀtt, det skulle det dÀremot vara för avst^2, men det Àr i samma hÀrad för avst*(avst+1)/2 sÄ antingen har man tur med sin input-data eller sÄ fÄr man titta lite i grannskapet.

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
●

Hann med dag 5 under lunchen, inte helt nöjd med if-satserna..

Dag: 5
SprÄk: Python

import numpy as np import pandas as pd df = pd.read_csv('d5.txt', names=['x1','y1x2','y2'], dtype=object) df = pd.concat([df[['x1','y2']], df['y1x2'].str.split('->', expand=True)],axis=1).astype(int) df.columns = ['x1','y2','y1','x2'] def dangerPoints(df_input, includeDiag): N = df_input.values.max() df_map = pd.DataFrame(np.zeros((N+1, N+1)), dtype=int) for row in df_input.iterrows(): x = np.array(row[1][['x1','x2']]) y = np.array(row[1][['y1','y2']]) if (x[0] == x[1]) & (y[0] != y[1]): df_map.iloc[y.min():y.max()+1, x[0]] += 1 elif (x[0] != x[1]) & (y[0] == y[1]): df_map.iloc[y[0], x.min():x.max()+1] += 1 elif includeDiag & (abs(x[0]-x[1]) == abs(y[0]-y[1])): diag = np.eye(abs(x[0]-x[1])+1).astype(int) if (x[1] - x[0]) != (y[1] - y[0]): diag = np.fliplr(diag) df_map.iloc[y.min():y.max()+1, x.min():x.max()+1] += diag print(df_map.ge(2).values.sum()) dangerPoints(df,False) # Part 1 dangerPoints(df,True) # Part 2

Dold text
Visa signatur

MacBook Pro 13" 2018

PermalÀnk
Medlem
●
Skrivet av kode:

Jag funderade median redan frÄn början, kollade det och funderade pÄ om det var mer en slump. Men sen efter att jag löst det genom for-loopande och sÄ vidare visade det sig ju att man fick samma svar dÄ med.

För del 1 Àr vÀl Ätminstone denna SE-post relevant.

För del 2 sÄ Àr ju medel tekniskt sett inte riktigt rÀtt, det skulle det dÀremot vara för avst^2, men det Àr i samma hÀrad för avst*(avst+1)/2 sÄ antingen har man tur med sin input-data eller sÄ fÄr man titta lite i grannskapet.

Dold text

Tack för input! Exakt, sÄ jag Àr lite nyfiken om min och mÄnga andras lösning pÄ del 2 (dvs att kolla för de tvÄ nÀrmaste heltalen kring medelvÀrdet) fungerar generellt för alla typer av (heltals) fördelningar pÄ input-data eller om vi bara hade tur.

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

Tack för input! Exakt, sÄ jag Àr lite nyfiken om min och mÄnga andras lösning pÄ del 2 (dvs att kolla för de tvÄ nÀrmaste heltalen kring medelvÀrdet) fungerar generellt för alla typer av (heltals) fördelningar pÄ input-data eller om vi bara hade tur.

Dold text

Jag lÀste en del i denna reddit-trÄd och det ser vÀl ut som om de kom fram till dÀr att det ÀndÄ ligger nÄnstans runt medelvÀrdet ±1, sÄ ceiling och floor tÀcker in det.

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
●

Dag: 7
SprÄk: C

#include <stdio.h> #include <limits.h> #include <stdlib.h> #define MAX_POS 2048 int g_crabs[MAX_POS]; int main(int argc, char **argv) { int crab; long long int i, j, k, acc, a, best = -1, best_tot = LLONG_MAX, tot; while (fscanf(stdin, "%i,", &crab) == 1) g_crabs[crab]++; for (i = 0; i < MAX_POS; i++) { for (j = 0, tot = 0; j < MAX_POS; j++) { a = labs(i - j); for (k = 0, acc = 0; k < a; k++) acc += (k + 1); tot += acc * g_crabs[j]; } if (tot < best_tot) best_tot = tot, best = i; } printf("Best total amount of fuel: %lli to pos %lli\n", best_tot, best); return 0; }

RÄkade titta pÄ nÄgra lösningar i förvÀg, sÄ jag straffade mig sjÀlv med att göra en brute force-lösning. Tar ett par sekunder att köra pÄ min laptop...

Dold text
PermalÀnk
Datavetare ★
●

Dag: 7
SprÄk: Rust

KÀnner till "median" tricket för #1. Skippade den dÄ man kan behöva testa tvÄ positioner, om antalet indata-element Àr udda Àr medianen medelvÀrdet av de tvÄ mittenvÀrdena.

Kör en variant av binÀrsökning, vill inte göra bruten-force dÄ ett huvudmÄl i Är Àr effektiva lösningar (att lösa alla 25 dagar <1s, fast det kommer hÀnga pÄ eventuella outliers dÄ total spenderad tid pÄ första 7 dagarna fortfarande bara Àr 1,27ms pÄ M1 MBA)

use crate::solution::Solution; struct Day7 { sorted_positions: Vec<i32>, } impl Solution for Day7 { fn part1(&mut self) -> String { self.min_fuel_cost_find(|pos, align_pos| (align_pos - pos).abs()) .to_string() } fn part2(&mut self) -> String { self.min_fuel_cost_find(|pos, align_pos| triangle_number((pos - align_pos).abs())) .to_string() } } impl Day7 { fn min_fuel_cost_find(&self, fuel_cost: fn(i32, i32) -> i32) -> i32 { let mut lo = 0; let mut hi = self.sorted_positions.len() as i32; let mut min_cost; loop { let mid = (hi + lo) / 2; let c1 = self.total_fuel_cost(mid, fuel_cost); let c2 = self.total_fuel_cost(mid + 1, fuel_cost); if c1 < c2 { hi = mid; min_cost = c1; } else { lo = mid + 1; min_cost = c2; } if lo >= hi { return min_cost; } } } fn total_fuel_cost(&self, align_pos: i32, fuel_cost: fn(i32, i32) -> i32) -> i32 { self.sorted_positions .iter() .map(|&pos| fuel_cost(pos, align_pos)) .sum::<i32>() } } fn triangle_number(n: i32) -> i32 { n * (n + 1) / 2 } pub fn new(input: &str) -> Box<dyn Solution> { let mut positions = input .split(',') .map(|pos| pos.parse().expect("Not a number")) .collect::<Vec<_>>(); positions.sort(); Box::new(Day7 { sorted_positions: positions, }) }

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: 7
SprÄk: Golang

Ingen finess idag, mer bruteforce.

package main import ( "bufio" "fmt" "math" "os" "strconv" "strings" ) func getPartOne(numbers []int) int { sum := 0 for _, number := range numbers { sum += number } avg := sum / len(numbers) fmt.Println("avg", avg) fuels := make(map[int]int, avg) var min int var align int for i := 1; i <= avg; i++ { fuel := 0 for _, number := range numbers { fuel += int(math.Abs(float64(i - number))) } if min == 0 || fuel < min { min = fuel align = i } fuels[i] = fuel } // fmt.Println("Fuels", fuels) fmt.Println("Align", align) return min } func getPartTwo(numbers []int) int { sum := 0 for _, number := range numbers { sum += number } avg := sum / len(numbers) fmt.Println("avg", avg) fuels := make(map[int]int, avg) var min int var align int for i := 1; i <= avg*2; i++ { fuel := 0 for _, number := range numbers { difference := int(math.Abs(float64(i - number))) fuel += difference * (difference + 1) / 2 } if min == 0 || fuel < min { min = fuel align = i } fuels[i] = fuel } fmt.Println("Fuels", fuels) fmt.Println("Align", align) return min } func getRows(filename string) []int { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) var numbers []int for scanner.Scan() { row := scanner.Text() fields := strings.Split(row, ",") for _, field := range fields { val, err := strconv.Atoi(field) if err != nil { panic(err) } numbers = append(numbers, val) } } return numbers } func main() { fmt.Println("Part one:", getPartOne(getRows("../input.txt"))) fmt.Println("Part two:", getPartTwo(getRows("../input.txt"))) }

Dold text
PermalÀnk
Medlem
●

Dag: 7
SprÄk: Dyalog APL & Scala

APL:

d←⍎⊃⊃⎕NGET'7.txt'1 ⌊/+⌿|d∘.-⍳⌈/d ⌊/+⌿2Ă·âš(1∘+×⊱)|d∘.-⍳⌈/d

Brute force lösningen var tillrÀckligt snabb.

]runtime "⌊/+⌿|d∘.-⍳⌈/d" -repeat=1000 * Benchmarking "⌊/+⌿|d∘.-⍳⌈/d", repeat=1000 (ms) CPU (avg): 3.125 Elapsed: 3.135 ]runtime "⌊/+⌿2Ă·âš(1∘+×⊱)|d∘.-⍳⌈/d" -repeat=1000 * Benchmarking "⌊/+⌿2Ă·âš(1∘+×⊱)|d∘.-⍳⌈/d", repeat=1000 (ms) CPU (avg): 4.219 Elapsed: 4.22

Scala:

val input = Using.resource(Source.fromFile("7.txt"))(_.mkString.trim.split(',').map(_.toInt).toVector) (0 to input.max).map(x => input.map(y => (y - x).abs).sum).min (0 to input.max).map(x => input.map(y => ((y - x).abs * ((y - x).abs + 1)) / 2).sum).min

Dold text
PermalÀnk
Medlem
●
PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: Dart
Lösning: GitHub

Idag gick det lite bÀttre, lite roligare.

Dold text
Visa signatur

| Mobo: Gigabyte X570 GAMING X | CPU: AMD Ryzen 9 3900X + Dark Rock 4 | RAM: 32GB @ 3000MHz | GPU: Gigabyte RTX 3080 OC | PSU: Seasonic GX 850W | Chassi: NZXT S340 Elite Matte Black | M.2: Samsung 970 Evo 500GB & 1000GB | HDD: 4TB | Monitors: Acer Predator X34 GS & Acer XB270HU |

PermalÀnk
●

Dag: 8
SprÄk: Scala

object Day8 { val data = readLines("8/data.txt") case class Line(input: Seq[String], display: Seq[String]) { val allObservations = input ++ display } val lines = data.map { l => val parts = l.split(" \\| ") Line(parts(0).split(" "), parts(1).split(" ")) } val digits = Seq("abcefg", "cf", "acdeg", "acdfg", "bcdf", "abdfg", "abdefg", "acf", "abcdefg", "abcdfg").map { p => p.map(_.toInt - 'a').toSet } def main(args: Array[String]): Unit = { part1() part2() } def part1() = { val l1478 = Set(2, 4, 3, 7) println(lines.flatMap(_.display).count(p => l1478.contains(p.length))) } def part2() = { def isValidObservation(candidate: String, observation: String): Boolean = { val leds = observation.map { ch => candidate.indexOf(ch) }.toSet digits contains leds } val candidates = "abcdefg".permutations.toSeq def process(line: Line) = { val patternOpt = candidates.find { candidate => line.allObservations.forall(observation => isValidObservation(candidate, observation)) } patternOpt match { case Some(pattern) => val toPos = (pattern.toSeq zip (0 until 7)).map { case (ch, c) => ch -> c }.toMap val ds = line.display.map { obs => digits.indexOf(obs.map(toPos).toSet) } ds.mkString("").toLong case None => throw new RuntimeException(s"Line $line seems to have no solution!") } } println(lines.map(process).sum) } }

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

Dag: 7
SprÄk: Python 3
Lösning: GitHub.

La sÀkert 5 minuter pÄ att jag inte fattade varför jag fick fel pÄ alla ökningar av position. Dvs: 16 -> 5 gav rÀtt svar (enligt testinputen) men 0 -> 5 gav fel. Givetvis var det en parentes som satt fel, aja...

Detta sagt, min lösning Àr ful. Den Àr straight forward och jag tror inte det Àr nÄgra problem att förstÄ vad den gör, men nÀr jag ser lösningar som:

def dist(a, b): return sum(range(1, abs(a-b)+1)) print(min(sum(dist(num, other) for other in nums) for num in nums))

som skrevs av en kille pÄ Kodsnacks slack (Alex Telon, kÀlla) suktar jag efter att fÄ mer intuitiv förstÄelse för list-operationer och hur man kan anvÀnda min och max i kombination med sum, sÄ som han gjorde.

Detta sagt Àr jag nöjd med att jag identifierade att brÀnslet i Del 2 berÀknas enligt en naturlig serie och sÄledes ges av n*(n+1)/2, istÀllet för att anvÀnda range() som Alex gjorde.

Edit: Ännu coolare lösning frĂ„n reddit -> https://www.reddit.com/r/adventofcode/comments/rar7ty/2021_da.... Jag var inne pĂ„ att anvĂ€nda medelvĂ€rdet pĂ„ första, men tĂ€nkte: "SĂ„ lĂ€tt kan det vĂ€l inte vara?" Tror inte jag hade kunnat dra slutsatsen kring median pĂ„ Del 2 dock.

Dold text

Dag: 8
SprÄk: Python 3
Lösning: GitHub.

Del 1 var inga konstigheter, men jag hade problem med Del 2. Tyckte uppgiften pÄminde om vÀskuppgiften frÄn förra Äret, men som vanligt kunde jag inte omformulera mina vaga tankar i kod. Slutade med att jag gick för en lösning dÀr jag kollar överlappet mellan siffror tills jag hittat alla siffror. TÀnker att det mÄste finnas en snyggare lösning Àn min while-loop, men den gör ju jobbet...

Dold text
Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●
Skrivet av MultiMike:

Hehe!
Min naiva lösning tuggade faktiskt pÄ till dag 140 inom rimlig tid, sen började datorn tycka att det var jobbigt (det var en ca 600 meg stor array vid det laget)
Men, man var ju tvungen att testa iaf!

Dag: 6
SprÄk: C

#include <stdio.h> /* reads input from stdin */ int simday(int timer, int fish, int generations) { if (generations == 0) return(fish); if (timer > 0) return(simday(timer-1, fish, generations-1)); return(simday(6, fish, generations-1) + simday(8, 1, generations-1)); } void main() { int i, starttimer; int number_of_fish = 0; i = 1; while (i > 0) { i = scanf("%d", &starttimer); getchar(); if (i == 1) number_of_fish += simday(starttimer, 1, 80); } printf("After day 80 there are %d fishes \n", number_of_fish); }

Dold text

HÀr Àr min naiva lösning pÄ dag 6 del1. Byter man int till long long sÄ skulle den teoretiskt klara del 2 om den fÄr nÄgra veckor pÄ sig

Fick till en bÀttre lösning pÄ del 2. Tricket var att slÄ samman alla fiskar med samma timervÀrde och hÄlla reda pÄ summan. DÄ blev listan inte lÀngre Àn 10-11 poster och det tog ca 2ms att exekvera

PermalÀnk
Medlem ★
●
Skrivet av Yoshman:

Dag: 6
SprÄk: Rust

Rust VecDeque Àr internt implementerad med en cirkulÀr-buffer, tar 12 ”s att lösa bÄda delarna med programmet nedan pÄ en MBA (en hel del av den tiden lÀr vara passning av input).

use crate::solution::Solution; use std::collections::VecDeque; const GENERATIONS: usize = 7; const YOUNG_GENERATIONS: usize = 9; struct Day6 { generations: VecDeque<u64>, } impl Solution for Day6 { fn part1(&mut self) -> String { self.num_after(80).to_string() } fn part2(&mut self) -> String { self.num_after(256).to_string() } } impl Day6 { fn num_after(&self, num_days: usize) -> u64 { let mut nursery = VecDeque::new(); nursery.resize(YOUNG_GENERATIONS - GENERATIONS, 0); let mut generations = self.generations.clone(); for _ in 0..num_days { let num_spawners = generations.pop_front().unwrap(); let num_new_adults = nursery.pop_front().unwrap(); nursery.push_back(num_spawners); generations.push_back(num_spawners + num_new_adults); } generations.iter().sum::<u64>() + nursery.iter().sum::<u64>() } } pub fn new(input: &str) -> Box<dyn Solution> { let mut generations = VecDeque::new(); generations.resize(GENERATIONS, 0); input .split(',') .map(|gen| gen.parse::<usize>().expect("Not a number")) .for_each(|gen| *generations.get_mut(gen).expect("Invalid generation") += 1); Box::new(Day6 { generations }) }

Dold text

12us, nu inser man att man ligger efter, och jag som var nöjd nÀr min tog 2ms...

PermalÀnk
Medlem ★
●

Dag: 8
SprÄk: Python

I dag blev det lite rörigt med konvertering mellan listor, sets och tupler. Varför kan man inte ha set som nyckel i en map (mutable, jag vet)? Och nÀr man gör en tupel av ett set, varför behÄller elementen instoppningsordning sÄ tvÄ set som var likadana kan ge tupler som inte Àr likadana? Suck

from collections import Counter lines = [l.strip().split(" | ") for l in open("input08").readlines()] d = Counter(list(len(s) for l in lines for s in l[1].split())) print(d[2] + d[4] + d[3] + d[7]) def find_digit(ss, length, needed = set()): for s in ss: if len(s) == length and s & needed == needed: ss.remove(s) return s def find_digits(ss): s = [None] * 10 s[1] = find_digit(ss, 2) s[4] = find_digit(ss, 4) s[7] = find_digit(ss, 3) s[8] = find_digit(ss, 7) s[5] = find_digit(ss, 5, s[4] - s[1]) s[3] = find_digit(ss, 5, s[7]) s[2] = find_digit(ss, 5) s[9] = find_digit(ss, 6, s[4] | s[7] | s[3]) s[6] = find_digit(ss, 6, s[4] - s[1]) s[0] = find_digit(ss, 6) return s sum = 0 for l in lines: d = {tuple(sorted(s)): str(i) for i, s in enumerate(find_digits(list(map(set, l[0].split()))))} sum += int("".join([d[tuple(sorted(set(s)))] for s in l[1].split()])) print(sum)

Dold text
Typo
PermalÀnk
Medlem
●

Dag: 8
SprÄk: C#

Idag blev det rörigt. Tyckte inte koden blev lÀttlÀst men den gör jobbet.

internal class Puzzle8 : Puzzle<int> { protected override void Solve(string[] lines) { var sums = lines .Select(x => x.Split(" | ")) .Aggregate(new List<string>(), (sums, signalPatterns) => { var decoder = CreateDecoder(signalPatterns[0].Split(" ")); sums.Add(string.Concat(signalPatterns[1].Split(" ").Select(x => Decode(x, decoder)))); return sums; }); One = sums.Sum(sum => Regex.Matches(sum, "1|4|7|8").Count); Two = sums.Sum(int.Parse); } private static IDictionary<char, char> CreateDecoder(string[] signals) { var translatedSegments = new Dictionary<char, char>(); var nums = signals .Select(signal => new { signal, digit = GetDigitByLength(signal) }) .Where(x => x.digit != null) .ToDictionary(x => x.digit!.Value, x => x.signal); nums[6] = signals.First(x => x.Length == 6 && x.Contains(nums[1][0]) != x.Contains(nums[1][1])); translatedSegments['a'] = nums[7].First(c => !nums[1].Contains(c)); translatedSegments['c'] = nums[6].Contains(nums[1][0]) ? nums[1][1] : nums[1][0]; translatedSegments['f'] = nums[6].Contains(nums[1][0]) ? nums[1][0] : nums[1][1]; nums[3] = signals.First(x => x.Length == 5 && x.Contains(translatedSegments['c']) && x.Contains(translatedSegments['f'])); translatedSegments['b'] = nums[4].First(c => !nums[3].Contains(c)); translatedSegments['g'] = nums[3].First(c => c != translatedSegments['a'] && !nums[4].Contains(c)); translatedSegments['d'] = nums[3].First(c => !translatedSegments.ContainsValue(c)); translatedSegments['e'] = "abcdefg".First(c => !translatedSegments.ContainsValue(c)); return translatedSegments.ToDictionary(x => x.Value, x => x.Key); } private static int? GetDigitByLength(string segments) => segments.Length switch { 2 => 1, 3 => 7, 4 => 4, 7 => 8, _ => null }; private static int Decode(string segment, IDictionary<char, char> decoder) => string.Concat(segment.Select(x => decoder[x]).OrderBy(c => c)) switch { "abcefg" => 0, "cf" => 1, "acdeg" => 2, "acdfg" => 3, "bcdf" => 4, "abdfg" => 5, "abdefg" => 6, "acf" => 7, "abcdefg" => 8, "abcdfg" => 9, _ => -1 }; }

Dold text
PermalÀnk
Medlem ★
●

Dag 8
SprÄk C#
Kod:

var file = File.ReadAllText("input.txt").Split('\n').Select(x => x.Split(" | ")); var sum = 0; foreach (var line in file) { var input = line[0].Trim().Split(" ").Select(x => x.ToCharArray()); var output = line[1].Trim().Split(" ").Select(x => x.ToCharArray()); //1, 4, 7, 8 can be figured out by length var digit1 = input.Where(x => x.Length == 2).First(); var digit4 = input.Where(x => x.Length == 4).First(); var digit7 = input.Where(x => x.Length == 3).First(); var digit8 = input.Where(x => x.Length == 7).First(); // right now c could be f and vice versa var seg_c_or_f = digit1[0]; var seg_f_or_c = digit1[1]; // seg_a is in 7 but not 1 var seg_a = digit7.Except(digit1).First(); // 3 is the only with length 5 which contains c and f var digit3 = input.Where(x => x.Length == 5 && x.Contains(seg_c_or_f) && x.Contains(seg_f_or_c)).First(); // seg_g is in 3, but not 4 + seg_a var seg_g = digit3.Except(digit4).Except(new char[] { seg_a }).First(); // seg_b is in 4 but not 3 var seg_b = digit4.Except(digit3).First(); // seg_e is in 8, but not 4, and it's not a nor g var seg_e = digit8.Except(digit4).Except(new char[] { seg_a, seg_g }).First(); // we have all segments for 0 var digit0 = input.Where(x => x.Length == 6 && x.Contains(seg_a) && x.Contains(seg_b) && x.Contains(seg_c_or_f) && x.Contains(seg_e) && x.Contains(seg_f_or_c) && x.Contains(seg_g)).First(); // seg_d is in 8 but not 0 var seg_d = digit8.Except(digit0).First(); var sixes = input.Where(x => x.Length == 6).ToList(); List<char> array6_cand = new() { ' ' }; foreach (var item in sixes) { // 6 is the only of length 6 that contains seg d and e if (item.Contains(seg_d) && item.Contains(seg_e)) array6_cand = new List<char>(item); } // seg_c is in 1 but not 6 var seg_c = digit1.Except(array6_cand).First(); // seg_f is in 1 but is not seg_c var seg_f = digit1.Except(new char[] { seg_c }).First(); // since we have all segments now we can construct the remaining digits var digit2 = input.Where(x => x.Length == 5 && x.Contains(seg_a) && x.Contains(seg_c) && x.Contains(seg_d) && x.Contains(seg_e) && x.Contains(seg_g)).First(); var digit5 = input.Where(x => x.Length == 5 && x.Contains(seg_a) && x.Contains(seg_b) && x.Contains(seg_d) && x.Contains(seg_f) && x.Contains(seg_g)).First(); var digit9 = input.Where(x => x.Length == 6 && x.Contains(seg_a) && x.Contains(seg_b) && x.Contains(seg_c) && x.Contains(seg_d) && x.Contains(seg_f) && x.Contains(seg_g)).First(); var digit6 = input.Where(x => x.Length == 6 && x.Contains(seg_a) && x.Contains(seg_b) && x.Contains(seg_d) && x.Contains(seg_e) && x.Contains(seg_f) && x.Contains(seg_g)).First(); Array.Sort(digit0); Array.Sort(digit1); Array.Sort(digit2); Array.Sort(digit3); Array.Sort(digit4); Array.Sort(digit5); Array.Sort(digit6); Array.Sort(digit7); Array.Sort(digit8); Array.Sort(digit9); var segment = new List<string>{ string.Join("",digit0), string.Join("", digit1), string.Join("", digit2), string.Join("", digit3), string.Join("", digit4), string.Join("", digit5), string.Join("", digit6), string.Join("", digit7), string.Join("", digit8), string.Join("", digit9) }; string outval = ""; foreach (var item in output) { Array.Sort(item); var itm = string.Join("", item); outval += segment.IndexOf(itm); } sum += int.Parse(outval); } Console.WriteLine("Part 2: " +sum);

Dold text

Kommentarer

Del 1 gjorde jag med reguljÀra uttryck i emacs, inga konstigheter alls.

Min del 2-lösning Àr jag ju dÀremot lÄngt ifrÄn nöjd med egentligen, finns vÀl garanterat snyggare sÀtt att deducera segmenten. Men den gav ju rÀtt svar i alla fall, sÄ man fÄr vÀl vara nöjd med det lilla.

Dold text

EDIT:

Tittade runt lite och sÄg dÄ att folk listat ut att man kan deducera alla siffror enbart utifrÄn att veta lÀngden, samt vad 1 och 4 Àr, sÄ jag skrev om lite utifrÄn det:

var file = File.ReadAllText("input.txt").Split('\n').Select(x => x.Split(" | ")); var sum = 0; foreach (var line in file) { var input = line[0].Trim().Split(" ").Select(sortString); var output = line[1].Trim().Split(" ").Select(sortString); var segment = new string[10]; segment[1] = input.Where(x => x.Length == 2).First(); segment[4] = input.Where(x => x.Length == 4).First(); var one = segment[1]; var four = segment[4]; segment[0] = input.Where(x => x.Length == 6 && commonWith(x, one) == 2 && commonWith(x, four) == 3).First(); segment[2] = input.Where(x => x.Length == 5 && commonWith(x, one) == 1 && commonWith(x, four) == 2).First(); segment[3] = input.Where(x => x.Length == 5 && commonWith(x, one) == 2 && commonWith(x, four) == 3).First(); segment[5] = input.Where(x => x.Length == 5 && commonWith(x, one) == 1 && commonWith(x, four) == 3).First(); segment[6] = input.Where(x => x.Length == 6 && commonWith(x, one) == 1 && commonWith(x, four) == 3).First(); segment[7] = input.Where(x => x.Length == 3).First(); segment[8] = input.Where(x => x.Length == 7).First(); segment[9] = input.Where(x => x.Length == 6 && commonWith(x, one) == 2 && commonWith(x, four) == 4).First(); string outval = ""; foreach (var item in output) { outval += segment.ToList().IndexOf(item); } sum += int.Parse(outval); } Console.WriteLine("Part 2: " + sum); string sortString(string param) { var arry = param.ToCharArray(); Array.Sort(arry); return string.Join("", arry); } int commonWith(string param, string cmp) { var it = param.ToCharArray(); var ot = it.Except(cmp.ToCharArray()); return it.Length - ot.Count(); }

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
●

Dag 6 (fastnade lite pÄ del 2 pga min dumma lösning pÄ del1 gav mig stackoverflow nÀr jag körde samma metod pÄ del2)
SprÄk: Typescript

import { readFile } from "../utils"; const array: Array<number> = []; function setup(fishes: number[]) { for (let day = 0; day <= 8; day++) { array[day] = fishes.filter((f) => f === day).length; } } function increaseWithDays(days: number) { for (let day = 0; day < days; day++) { const zeroes = array.shift(); if (zeroes) { if (!array[6]) { array[6] = zeroes; } else { array[6] = array[6] += zeroes; } array[8] = zeroes; } } } function runDay6() { const fishes: number[] = readFile(__dirname)[0] .split(",") .map((f) => parseInt(f, 10)); setup(fishes); increaseWithDays(256); console.log("Solution: " + array.reduce((prev, curr) => (prev += curr))); } runDay6();

Dold text
Visa signatur

Moderkort: ASUS PRIME Z690M-PLUS D4 | Proccesor: i5 12600K @ 3.6Ghz | Kylare: Cooler Master Hyper 212 EVO V2 | Ram: Corsair Vengeance LPX Black 32GB @ 3200Mhz | Chassi: Fractal Design Define Mini C | Grafikkort: ASUS GeForce RTX 4070 DUAL OC 12GB | NÀtagg: Corsair TX750M 80+ GOLD | Lagring: WD Black SN850 M.2 SSD - 1TB | SkÀrm: MSI 27" Optix MAG274QRF-QD IPS QHD @ 165 Hz

PermalÀnk
●

Dag: 8
SprÄk: Nim
Lösning: SkÀms för mycket för att visa upp den xD

PermalÀnk
Medlem
●

Dag: 8
SprÄk: Carth

Satt med dagens problem pinsamt lÀnge. Började kÀnna mig som en zombie, stirrandes i skÀrmen. Fick tillslut till en lösning som inte Àr sÄ elegant, men funkar bra.

(import std) (define main (do io/bind (<- input (io/map unwrap! (read-file "inputs/day8.txt"))) (let1 entries (map parse-line (lines input))) (display (str-append "Part 1: " (show-nat (part1 entries)))) (display (str-append "Part 2: " (show-int (part2 entries)))))) (define (part1 entries) (apps |> entries (flat-map (<o array/iter cadr)) (filter (apps <o (flip (list/elem? num/cmp) (list 2 3 4 7)) to-int string/length-bytes)) count)) (define (part2 entries) (sum (map output-value entries))) (define (output-value [in-patterns out-patterns]) (let ((in-patterns (array/iter in-patterns)) ((seg-set n) (apps |> in-patterns (iter/find (<o (= (to-nat n)) string/length-bytes)) unwrap! string/bytes (set/collect num/cmp))) (s1 (seg-set 2)) (s4 (seg-set 4)) ((decode pat) (let (((n x) (= (to-nat x) (string/length-bytes pat))) (s (set/collect num/cmp (string/bytes pat))) ((isect-n m s') (= (to-nat m) (set/count (set/isect num/cmp s s'))))) (cond ((and (n 6) (isect-n 1 (set/diff num/cmp s4 s1))) 0) ( (n 2) 1) ((and (n 5) (isect-n 2 s4)) 2) ((and (n 5) (isect-n 2 s1)) 3) ( (n 4) 4) ( (n 5) 5) ((and (n 6) (isect-n 1 s1)) 6) ( (n 3) 7) ( (n 7) 8) (else 9))))) (apps |> out-patterns array/iter-rev enumerate (map (fun ([i p]) (* (decode p) (powi 10 i)))) sum))) (define (parse-line s) (define segs (parse/take-bytes-while (<o not whitespace-byte?))) (unwrap! (parse (do parse/bind (<- as (parse/n-times (to-nat 10) (parse/thenl segs parse/space1))) (parse/string "|") (<- bs (parse/n-times (to-nat 4) (parse/thenr parse/space1 segs))) (parse/pure [as bs])) (trim s))))

Dold text
Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

PermalÀnk
●

Dag: 8
SprÄk: Haskell

import Data.List main = interact solve solve input = "Problem 1: " ++ show solution1 ++ "\n" ++ "Problem 2: " ++ show solution2 ++ "\n" where solution1 = length (filter(\w->elem (length w) [2,3,4,7]) allValues) allValues = foldr (\line acc -> words (drop 61 line) ++ acc) [] (lines input) solution2 = sum (map decodeOutVal (lines input)) decodeOutVal :: String -> Int decodeOutVal line = foldl (\acc cDig -> 10*acc + decode sigPatts cDig) 0 codedDigits where sigPatts = take 58 line codedDigits = words (drop 61 line) decode :: String -> String -> Int decode sigPatts digit | length digit == 2 = 1 | length digit == 4 = 4 | length digit == 3 = 7 | length digit == 7 = 8 | length digit == 5 && elem e digit = 2 | length digit == 5 && elem c digit = 3 | length digit == 5 = 5 | length digit == 6 && not (elem e digit) = 9 | length digit == 6 && elem c digit = 0 | otherwise = 6 where -- Assume the signal patterns contain one of each digit 1-0. -- Segment E should appear 4 times in the signal patterns. -- Segment F should appear 9 times in the signal patterns. -- Segment C and F appear in digit 1. If F is known, then we can find C. e = (head.head) (filter (\w->length w==4) ((group.sort.concat.words) sigPatts)) f = (head.head) (filter (\w->length w==9) ((group.sort.concat.words) sigPatts)) c = (head.head) (filter (\w->length w==1) (words (filter (/=f) sigPatts)))

Dold text
PermalÀnk
Medlem
●

Dag: 8
SprÄk: C++

Jag skÀms ocksÄ lite. Tog sÄ lÄng tid att lösa sÄ jag varken hinner eller orkar snygga till det, eller ens att försöka hitta en bÀttre lösning. Allt eftersom klockan tickade ivÀg sÄ blev det ocksÄ mer kÀnnbart med begrÀnsade C++-skills. Don't kill me, please.

int solve_part1(vector<string> string_data) { int count = 0; int n = string_data.size(); string input; for (int i = 0; i < n; i++) { string tmp = string_data[i]; tmp = tmp.substr(tmp.find("|")+2, tmp.length()-1); stringstream sstream(tmp); while(getline(sstream,input,' ')) { int strlen = input.length(); if (strlen == 2) count++; if (strlen == 3) count++; if (strlen == 4) count++; if (strlen == 7) count++; } } return count; } int solve_part2(vector<string> string_data) { int count = 0; int n = string_data.size(); string input,input_nums, output_nums; for (int i = 0; i < n; i++) { map<char,string> test; vector<string> strings_in; string tmp = string_data[i]; input_nums = tmp.substr(0, tmp.find("|")-1); output_nums = tmp.substr(tmp.find("|")+2, tmp.size()-1); stringstream sstream(input_nums); int index = 0; while(getline(sstream,input,' ')) { sort(input.begin(), input.end()); strings_in.push_back(input); int strlen = input.length(); if (strlen == 2) { test.insert({'1',input}); } if (strlen == 3) { test.insert({'7',input}); } if (strlen == 4) { test.insert({'4',input}); } if (strlen == 7) { test.insert({'8',input}); } } for (int j = 0; j < strings_in.size(); j++) { if (strings_in[j].length() == 6) { cout << strings_in[j] << endl; cout << test['7'] << endl; if (!string_in_string(test['7'],strings_in[j])) { test.insert({'6', strings_in[j]}); } else if (string_in_string(test['4'], strings_in[j])) { test.insert({'9', strings_in[j]}); } else { test.insert({'0', strings_in[j]}); } } } for (int j = 0; j < strings_in.size(); j++) { if ((strings_in[j].length() == 5)) { if (string_in_string(test['1'], strings_in[j])) { test.insert({'3', strings_in[j]}); } else if (string_in_string(strings_in[j],test['6'])) { test.insert({'5', strings_in[j]}); } else { test.insert({'2', strings_in[j]}); } } } stringstream sstream2(output_nums); string output_digits = ""; while (getline(sstream2,input,' ')) { sort(input.begin(), input.end()); for (const auto& [key, value] : test) if (value == input) { output_digits.push_back(key); } } count += stoi(output_digits); } return count; }

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

Dag: 8
SprÄk: Nim
Lösning: SkÀms för mycket för att visa upp den xD

Haha visa â˜ș

Visa signatur

"Nobody smart would play fair"

PermalÀnk
●
Skrivet av MeSaber:

Haha visa â˜ș

LÀs koden pÄ egen risk xP Github

Fick ta fram penna och papper och skissa mÄnga digitalklockor innan jag kom pÄ att med hjÀlp av dom siffror vi kunde urskilja bara med lÀngden, sÄ kunde man dela in segmenten i grupper om tvÄ. Och med dom kunde jag sen köra uteslutningsmetoden för att hitta vilka siffrorn dom andra strÀngarna stod för. Sen glömde jag helt bort att nollan fanns men koden funkade för testinputen ÀndÄ sÄ gissa om jag suttit och dragit mig i hÄret idag...

Dold text
PermalÀnk
●

Dag: 8
SprÄk: C

Dagens var lite lurigare, med betydligt mindre strukturerad kod som följd...

#include <stdio.h> #include <stdint.h> int count[10] = { 0 }; int total; uint8_t read_segment(FILE *fp) { char buff[32] = { 0 }; uint8_t segment = 0; int i; if (fscanf(fp, " %s", buff) < 1) return 0xFF; for (i = 0; buff[i]; i++) segment |= 1 << (buff[i] - 'a'); return segment; } int lookup_segment(uint8_t seg, uint8_t *list) { int i; for (i = 0; i < 10; i++) if (seg == list[i]) return i; return 0; } int count_bits(uint8_t byte) { int i, n; for (i = n = 0; i < 8; i++) if (byte & (1 << i)) n++; return n; } void solve_segments(uint8_t *input_segments) { uint8_t tmp_segments[10] = { 0 }; int i, j; for (i = j = 0; i < 10; i++) { if (count_bits(input_segments[i]) == 2) tmp_segments[1] = input_segments[i]; else if (count_bits(input_segments[i]) == 3) tmp_segments[7] = input_segments[i]; else if (count_bits(input_segments[i]) == 4) tmp_segments[4] = input_segments[i]; else if (count_bits(input_segments[i]) == 7) tmp_segments[8] = input_segments[i]; } for (i = 0; i < 10; i++) if (count_bits(input_segments[i]) == 5) if ((input_segments[i] | tmp_segments[1]) == input_segments[i]) tmp_segments[3] = input_segments[i]; // Found number 3 for (i = 0; i < 10; i++) if (count_bits(input_segments[i]) == 6) { if ((input_segments[i] | tmp_segments[3]) == input_segments[i]) tmp_segments[9] = input_segments[i]; // Found number 9 else if ((input_segments[i] | tmp_segments[1]) == 0x7F) tmp_segments[6] = input_segments[i]; // found number 6 else tmp_segments[0] = input_segments[i]; // found number 0 } for (i = 0; i < 10; i++) if (count_bits(input_segments[i]) == 5 && (input_segments[i] | tmp_segments[1]) != input_segments[i]) { if ((input_segments[i] | tmp_segments[1]) == tmp_segments[9]) tmp_segments[5] = input_segments[i]; else tmp_segments[2] = input_segments[i]; } for (i = 0; i < 10; i++) input_segments[i] = tmp_segments[i]; } int process_line(FILE *fp) { int i, j; uint8_t segments[10]; for (i = 0; i < 10; i++) if ((segments[i] = read_segment(fp)) == 0xFF) return 0; solve_segments(segments); fscanf(fp, " |"); int seg[4], num; for (j = 0; j < 4; j++) count[(seg[j] = lookup_segment(read_segment(fp), segments))]++; num = seg[0] * 1000 + seg[1] * 100 + seg[2] * 10 + seg[3]; total += num; return 1; } int main(int argc, char **argv) { while (process_line(stdin)); printf("Result A: %i\n", count[1] + count[4] + count[7] + count[8]); printf("Result B: %i\n", total); return 0; }

Dold text
PermalÀnk
Datavetare ★
●

Dag: 8
SprÄk: Rust

Blev hyfsat rÀttfram med denna. get_signal_sharing_n() hÀmtar den instans som har exakt 3:e argumentet st tÀnda segmete delade med nÄgon av de i första argumentet.

TidsmÀssigt en av de dyrare, tar rÀtt exakt 1,0 ms att lösa (inklusive inlÀsning frÄn fil) pÄ en M1 MBA.

use crate::solution::Solution; use std::{collections::HashSet, str::FromStr}; struct Day8 { samples: Vec<Sample>, } impl Solution for Day8 { fn part1(&mut self) -> String { self.samples .iter() .flat_map(|sample| { [2, 3, 4, 7] .iter() .map(|&n| sample.num_digits_with_n_active_segments(n)) }) .sum::<usize>() .to_string() } fn part2(&mut self) -> String { self.samples.iter().map(decode).sum::<u32>().to_string() } } pub fn new(input: &str) -> Box<dyn Solution> { Box::new(Day8 { samples: input .lines() .map(|s| s.parse().expect("Not a valid sample line")) .collect(), }) } fn decode(sample: &Sample) -> u32 { let d_235 = sample.signals_with_n_active_segments(5); let d_069 = sample.signals_with_n_active_segments(6); let one = &sample.signals_with_n_active_segments(2)[0]; let four = &sample.signals_with_n_active_segments(4)[0]; let seven = &sample.signals_with_n_active_segments(3)[0]; let eight = &sample.signals_with_n_active_segments(7)[0]; let six = get_signal_sharing_n(&d_069, one, 1); let nine = get_signal_sharing_n(&d_069, four, 4); let zero = get_remaining(&d_069, nine, six); let three = get_signal_sharing_n(&d_235, one, 2); let five = get_signal_sharing_n(&d_235, six, 5); let two = get_remaining(&d_235, three, five); let mappings = [zero, one, two, three, four, five, six, seven, eight, nine]; sample .digits .iter() .map(|digit| digit.translate(&mappings)) .fold(0, |total, num| total * 10 + num) } fn get_signal_sharing_n<'a>(signals: &'a [Signal], sharing: &Signal, n: usize) -> &'a Signal { signals .iter() .find(|signal| signal.share_n_segments(sharing, n)) .unwrap() } fn get_remaining<'a>(signals: &'a [Signal], a: &Signal, b: &Signal) -> &'a Signal { signals .iter() .find(|&signal| signal.active != a.active && signal.active != b.active) .unwrap() } struct Sample { signals: Vec<Signal>, digits: Vec<Signal>, } impl FromStr for Sample { type Err = &'static str; fn from_str(s: &str) -> Result<Self, Self::Err> { let mut parts = s.split(" | "); Ok(Sample { signals: parse_signals(parts.next().unwrap()), digits: parse_signals(parts.next().unwrap()), }) } } impl Sample { fn num_digits_with_n_active_segments(&self, n: usize) -> usize { self.digits .iter() .filter(|digit| digit.active.len() == n) .count() } fn signals_with_n_active_segments(&self, n: usize) -> Vec<Signal> { self.signals .iter() .filter(|signal| signal.active.len() == n) .cloned() .collect() } } fn parse_signals(signals_desc: &str) -> Vec<Signal> { signals_desc .split_ascii_whitespace() .map(|s| s.parse().expect("Invalid signal description")) .collect() } #[derive(Clone)] struct Signal { active: HashSet<char>, } impl FromStr for Signal { type Err = &'static str; fn from_str(s: &str) -> Result<Self, Self::Err> { Ok(Signal { active: HashSet::from_iter(s.chars()), }) } } impl Signal { fn share_n_segments(&self, other: &Self, n: usize) -> bool { self.active.intersection(&other.active).count() == n } fn translate(&self, mappings: &[&Signal; 10]) -> u32 { let i = mappings.iter().enumerate(); for (i, s) in i { if self.active == s.active { return i as u32; } } panic!("Failed to translate"); } }

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
●

Dag: 8
SprÄk: Python

Nytt bottenrekord för i Är, lyckades missförstÄ första uppgiften extremt. Oh well

rows = open("8.in").readlines() p1 = sum(len(segment) in [2, 3, 4, 7] for row in rows for segment in row.split(" | ")[1].split()) p2 = 0 for line in rows: inputs, outputs = line.split(" | ") segments = list(map(frozenset, inputs.split())) one = next(x for x in segments if len(x) == 2) four = next(x for x in segments if len(x) == 4) seven = next(x for x in segments if len(x) == 3) eight = next(x for x in segments if len(x) == 7) three = next(x for x in segments if len(x) == 5 and x | one == x) nine = next(x for x in segments if len(x) == 6 and x == four | three) zero = next(x for x in segments if len(x) == 6 and x != nine and x | one == x) six = next(x for x in segments if len(x) == 6 and x != nine and x != zero) five = next(x for x in segments if len(x) == 5 and (nine - one) | x == x) two = next(x for x in segments if len(x) == 5 and x != three and x != five) lookup = dict(zip((zero, one, two, three, four, five, six, seven, eight, nine), map(str, range(10)))) p2 += int("".join(lookup[o] for o in map(frozenset, outputs.split()))) print(p1, p2)

Dold text
PermalÀnk
Medlem ★
●

Hyser ett mycket starkt ogillande för de hÀr grafiska uppgifterna med linjer och grejer hit och dit sÄ har pausat nÄgon dag nu. Dvs jag har Ànnu inte fÄtt grepp om hur man löser dem och funderar pÄ att kanske börja kolla pÄ lite andra mÀnniskors lösningar i hopp om att komma pÄ nÄgot.

Har en vag tanke om hur jag ska lösa dag 4 och jag kan nog lista ut dag 5 framgent men 8 förstÄr jag knappt vad jag ska göra i. Passade dock pÄ att lösa dag 6 och 7 idag och bytte sprÄk i farten eftersom jag gjorde dem hemma snarare Àn pÄ jobbet.

Dag: 6
SprÄk: Python 3

Efter att ha löst denna och lÀst lite i megatrÄden pÄ reddit insÄg jag att det tydligen fanns en massa fallgropar med den hÀr uppgiften. Min lösning tog bÄda delarna pÄ direkten sÄ jag hade nog en sabla tur med metodvalet helt enkelt.

Jag insÄg senare att jag kunde skapat fishpop "enklare" med

fishpop = {str(k):v for k,v in enumerate(data.count(x) for x in range(9))}

men jag vet inte hur jag skulle kunnat köra loopen pÄ ett lÀmpligt sÀtt med en liknande lösning sÄ jag tÀnkte att det var bÀttre för lÀsbarheten att göra pÄ samma sÀtt pÄ bÄda stÀllena.

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from pathlib import Path def get_data(filename): data = Path(__file__).with_name(filename) data = data.open('r').read() return data def simulate_fish(fishpop,days): day = 0 while day != days: temp = list(fishpop.values()) fishpop = { "0":temp[1], "1":temp[2], "2":temp[3], "3":temp[4], "4":temp[5], "5":temp[6], "6":(temp[0]+temp[7]), "7":temp[8], "8":temp[0] } day += 1 return sum(list(fishpop.values())) def main(): data = [int(num) for num in get_data("input6").split(",")] fishpop = { "0":data.count(0), "1":data.count(1), "2":data.count(2), "3":data.count(3), "4":data.count(4), "5":data.count(5), "6":data.count(6), "7":data.count(7), "8":data.count(8) } print(simulate_fish(fishpop,80)) print(simulate_fish(fishpop,256)) main()

Dold text

Dag: 7
SprÄk: Python

Det hÀr var första uppgiften jag gjorde idag och det kan vara de första pythonraderna jag skrivit pÄ nÀrmare Äret sÄ spagettin Àr ett faktum.

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import statistics import math def import_data(filename): #Get data from a csv in the filepath dir_path = os.path.dirname(os.path.realpath(__file__)) file_path = dir_path + "\\" + filename with open(file_path, newline='',encoding='utf-8') as f: input_data = f.read() return input_data def calculate_fuel_part1(lst, median): fuel = 0 for num in lst: fuelreq = abs(num - median) fuel += fuelreq return fuel def calculate_fuel_part2(lst,mean): fuel = 0 for num in lst: distance = abs(num - mean) fuelreq = 0 for num in range(1, distance + 1): fuelreq += num fuel += fuelreq return fuel def part1(data): median = statistics.median(data) return calculate_fuel_part1(data,median) def part2(data): mean = int(statistics.mean(data)) return calculate_fuel_part2(data,mean) def main(): data = [int(num) for num in import_data("input7").split(",")] print(part1(data)) print(part2(data)) main()

Dold text
Visa signatur

PrimÀr: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |