🌟 Advent of Code (AoC) 2021 🌟

PermalÀnk
Hedersmedlem ★
●

Dag: 6
SprÄk: TypeScript (med Node.js)
Lösning: GitHub

Den naiva varianten gick som vÀntat inte sÄ bra till del 2, sÄ jag skrev om.

Edit: Tar omkring 130 ÎŒs om man rĂ€knar bort console.log(). Över 2000 inklusive. Lite kul att det tar 14 ggr lĂ€ngre tid att skriva ut tvĂ„ textrader Ă€n att lösa uppgiften.

Visa signatur

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

PermalÀnk
Medlem
●

Dag: 6
SprÄk: Rust

fn main() { let index: Vec<usize> = std::fs::read_to_string("input.txt") .unwrap() .split(',') .filter_map(|s| s.parse().ok()) .collect(); count_fish(&index, 80); // 352872 count_fish(&index, 256); // 1604361182149 } fn count_fish(data: &[usize], days: usize) { let mut window = [0usize; 9]; for i in data.iter() { window[*i] += 1; } for _ in 0..days { window.rotate_left(1); window[6] += window[8]; } println!("{:?}", window.iter().sum::<usize>()); }

Dold text
onödig temp
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: 6
SprÄk: Python 3
Lösning: GitHub

Började som mÄnga andra med den naiva varianten imorse nÀr pusslet slÀpptes och för del tvÄ tÀnkte jag att min 5600x löser sÀkert det hÀr om jag gÄr o hÀmtar en kaffe. Förstod nog inte riktigt hur pass omfattande det var (Àven om jag hade en kÀnsla av att sÄhÀr enkelt kan det inte vara). NÀr jag kom tillbaka till datorn var det bara acceptera nederlaget och tÀnka om

Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
Medlem ★
●
Skrivet av wurpan:

Vad gör if-satsen pÄ rad 25 och framÄt? Vad Àr det för skillnad pÄ de tvÄ fallen?

PermalÀnk
Medlem
●

Dag: 6
SprÄk: C#

Som mÄnga andra fick jag tÀnka om min lösning för del tvÄ. IstÀllet för att ha ett element för varje fisk sÄ la jag dem i en array dÀr deras Älder Àr dess index och vÀrdet dess antal.

internal class Puzzle6 : Puzzle<long> { protected override void Solve(string[] lines) { var initialFishes = Enumerable.Range(0, 9).Select(_ => 0L).ToArray(); foreach (var fish in lines[0].Split(",").Select(int.Parse)) { initialFishes[fish] += 1; } One = CountFishes(initialFishes, 80); Two = CountFishes(initialFishes, 256); } private static long CountFishes(long[] fishes, int days) { fishes = fishes.ToArray(); foreach (var _ in Enumerable.Range(0, days)) { SimulateDay(fishes); } return fishes.Sum(); } private static void SimulateDay(long[] fishes) { var newSpawns = fishes[0]; foreach (var age in Enumerable.Range(1, 8)) { fishes[age - 1] = fishes[age]; } fishes[6] += newSpawns; fishes[8] = newSpawns; } }

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

Vad gör if-satsen pÄ rad 25 och framÄt? Vad Àr det för skillnad pÄ de tvÄ fallen?

Mycket bra frÄga faktiskt. En frÄga jag Àven stÀllde mig sjÀlv tidigare men som jag just dÄ inte orkade fundera mer pÄ. Sen tÀnkte jag inte mer pÄ det. Testade att ta bort den och mycket riktigt sÄ fungerar det fortfarande ÀndÄ vilket Àr rimligt nÀr man faktiskt orkar tÀnka lite

Tack för uppmÀrksammandet

Om newborns Àr noll blir resultatet samma i bÄda fallen och if-satsen Àr dÀr med onödig.
Tror jag tÀnkte att om det inte Àr nÄgra newborns sÄ blir det fel om hela listan roteras ett steg Ät vÀnster men vid en nÀrmare analys sÄ Àr det inte ett problem eftersom dom individer som vid en ny dag har en timer med vÀrde 0 ÀndÄ kommer att hanteras korrekt.

if newborns > 0: population = population[1:] + [newborns] population[6] += newborns else: population = population[1:] + population[:1]

Dold text
Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
●

Dag: 6
SprÄk: Haskell

main = interact solve solve input = "Problem 1: " ++ (show.sum.cycle) 80 ++ "\n" ++ "Problem 2: " ++ (show.sum.cycle) 256 ++ "\n" where -- cycle n returns a list where the element at index i -- is the number of fish at age i after n generations. cycle 0 = map (\age->length (filter (\c->c==age) input)) ['0'..'8'] cycle n = zipWith (+) (prevTail++[0]) ([0,0,0,0,0,0,prevHead,0,prevHead]) where (prevHead:prevTail) = cycle (n-1)

Dold text
PermalÀnk
Medlem ★
●

Helt Àrligt tror jag inte att det spelar sÄ stor roll att köra en mer naiv lösning för del 1, tar man dag 6 som exempel sÄ skulle ju del 2 t.ex. kunnat stÀlla frÄgan

hur mÄnga Àr det vid dag 80 om prickfiskarna bara föder x barn som mest och lever i y dagar som mest?

Dold text

det hade ju isf troligen kunnat bli en omskrivning pga prematur optimering.

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

Positivt överraskad att min första spontana tanke till lösning höll. 6 minuter frÄn början till bÄda delar godkÀnda.

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> int main(int argc, char **argv) { uint64_t fish[9] = { 0 }, total; int i, n; while (fscanf(stdin, "%i,", &i) == 1) fish[i]++; for (n = atoi(argv[1]), i = 0; i < n; i++) { uint64_t today; today = fish[0]; memmove(fish, fish + 1, sizeof(*fish) * 8); fish[6] += today; fish[8] = today; } for (i = 0, total = 0; i < 9; i++) total += fish[i]; printf("Total fishes after %i days: %lu\n", n, total); return 0; }

Dold text
PermalÀnk
●

Ligger lite efter dĂ„ jag började igĂ„r. Vill bli bĂ€ttre med pandas, sĂ„ försöker anvĂ€nda det sĂ„ mycket jag kan i mina lösningar. Bieffekten Ă€r att det inte alltid blir sĂ„ snyggt 😅

Delade upp en del rader sÄ det ser snyggare ut hÀr.
SprÄk: Python 3

Dag: 1

import pandas as pd import numpy as np df = pd.read_csv('d1.txt', header=None) def compare(idx): print(np.sum(np.where(df.iloc[idx:].reset_index(drop=True) > \ df.iloc[:-idx].reset_index(drop=True),1,0))) compare(1) # Part 1 compare(3) # Part 2

Dold text

Dag: 2

import numpy as np import pandas as pd df = pd.read_csv('d2', header=None) df2 = pd.concat([df[0].str.strip().str[:-2].copy(), \ df[0].str.strip().str[-1].astype(int).copy()], axis=1) df2.columns = ['direction', 'value'] horizontal = df2.loc[df2['direction'] == 'forward', 'value'].sum() depth_1 = (df2.loc[df2['direction'] == 'down', 'value'].sum()) - \ df2.loc[df2['direction'] == 'up', 'value'].sum() print(horizontal * depth_1) # Part 1 df2.loc[df2['direction'] == 'up', 'value'] = \ -df2.loc[df2['direction'] == 'up', 'value'] df2['aim'] = df2['value'].iloc[np.where((df2['direction'] == 'down') | \ (df2['direction'] == 'up'))].cumsum() df2.loc[0,'aim'] = 0 df2.loc[:,'aim'] = df2['aim'].fillna(method='ffill') depth_2 = (df2.loc[df2['direction'] == 'forward', 'value'] * \ df2.loc[df2['direction'] == 'forward', 'aim']).sum().astype(int) print(horizontal * depth_2) # Part 2

Dold text

Dag: 3

import numpy as np import pandas as pd df = pd.read_csv('d3.txt', header=None, dtype= object) df2 = df[0].str.replace('\s+', '')\ .apply(lambda x: pd.Series(list(x))).add_prefix('pos_')\ .replace('[89]', 0, regex=True).astype(int) gamma = ''.join(list(round(df2.sum(axis=0)/df2.shape[0]).astype(int).astype(str))) epsilon = ''.join('1' if x == '0' else '0' for x in gamma) print(int(gamma, 2) * int(epsilon, 2)) # Part 1 def findRating(element, check): pos = 0 majority = round(element.sum(axis=0)/element.shape[0]).astype(int) while element.shape[0] > 1: if 0.5 == element.iloc[:,pos].sum(axis=0)/element.shape[0]: element = element.drop(np.where((element.iloc[:,pos] == 0) \ == check)[0]).reset_index(drop=True) else: element = element.drop(np.where((element.iloc[:,pos] != \ majority[pos])== check)[0]).reset_index(drop=True) majority = round(element.sum(axis=0)/element.shape[0]).astype(int) pos += 1 return ''.join(list(element.iloc[0,:].astype(int).astype(str))) oxygen = findRating(df2.copy(), True) CO2 = findRating(df2.copy(), False) print(int(oxygen, 2) * int(CO2, 2)) # Part 2

Dold text

Dag: 4

import numpy as np import pandas as pd df_num = pd.read_csv('d4_numbers.txt', header=None).astype(int) df_boards = pd.read_csv('d4_boards.csv', header=None, dtype= object)[0]\ .str.split(';', expand=True) df_boards = df_boards[df_boards[0] != ''].reset_index(drop=True).astype(int) MN = df_boards.shape Boards = {elem : pd.DataFrame for elem in \ np.linspace(0,MN[0]//MN[1]-1,MN[0]//MN[1], dtype=int)} for key in Boards.keys(): Boards[key] = df_boards.iloc[key*MN[1]:(key+1)*MN[1],:]\ .astype(int).reset_index(drop=True) def bingo(Boards, positions): wins = 0 noWin = list(np.linspace(0,len(Boards)-1,len(Boards), dtype=int)) finished = False for number in df_num.iloc[0,:]: new_winners = [] for board in noWin: if number in Boards[board].values: Boards[board] = Boards[board].replace(number,-1) if max(sum([(Boards[board] < 0).all(axis=0),\ (Boards[board] < 0).all(axis=1)])) >= 1: new_winners.append(board) wins += 1 if wins in positions: print(int(Boards[board].where(Boards[board] > 0)\ .sum().sum() * number)) if wins == max(positions): finished = True if finished: break for win in new_winners: noWin.remove(win) bingo(Boards, [1,100]) # Part 1 & 2

Dold text
förtydligande
Visa signatur

MacBook Pro 13" 2018

PermalÀnk
Medlem
●

Dag: 6
Lösning: Golang

Enklare idag, skönt

package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func getPartOne(numbers []int) int { return getLanternfish(numbers, 80) } func getPartTwo(numbers []int) int { return getLanternfish(numbers, 256) } func getLanternfish(numbers []int, end int) int { fishes := [11]int{} for _, number := range numbers { fishes[number]++ } for day := 1; day <= end; day++ { for i := 0; i < len(fishes)-1; i++ { if i == 0 { fishes[9] = fishes[i] fishes[7] += fishes[i] } fishes[i] = fishes[i+1] } } sum := 0 for _, val := range fishes { sum += val } return sum } 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() // Test data input.. if strings.Contains(row, "Initial") { values := strings.Fields(row) fields := strings.Split(values[2], ",") for _, field := range fields { val, err := strconv.Atoi(field) if err != nil { panic(err) } numbers = append(numbers, val) } break } else { 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: 6
SprÄk: Dart
Lösning: GitHub

Jag ska inte ha ett dugg cred. Skrev av en lösning (som jag förstod) frÄn Reddit och modifierade. Min svaga punkt Àr verkligen att inte anvÀnda mig utav listor vid sÄna hÀr problem. (Jag fattar ju att det Àr poÀngen hÀr...)

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
Medlem
●

Ligger fortfarande en dag efter, detta Àr lösningen för dag 5 i Dyalog APL.

]dinput to←{⎕IO←0 ⍝ Sequence âș .. ⍔ from step←1 ÂŻ1×-\2↑âș,âș+Ă—â”-âș ⍝ step default is +/- 1. from+step×⍳0⌈1+⌊(⍔-from)Ă·step+step=0 ⍝ âș thru ⍔ inclusive. } vents←⍎¹'[^\d]+'⎕R' '⊱⊃⎕NGET 'data/2021_dag5.txt'1 ⍝ Read and shape coordinates in groups of four (x1 y1 x2 y2) coords←↑{2 2⍎⍔}švents ⍝ Select the lines that are either vertical or horizontal lines←(√/(=âŒżâ€2)coords)⌿coords ⍝ fill all lines and get the points marked marked←↑↑,/,š/↑(⊂to⌿)⍀2⊱lines ⍝ Count points with more than one mark 'Part one:', +/2â‰€â‰ąâ€âŠąâŒžmarked ⍝ For part 2, do not filter out only vertical or horizontal lines allmarked←↑↑,/,š/↑(⊂to⌿)⍀2⊱coords ⍝ As before, count points with more than one mark 'Part two:' , +/2â‰€â‰ąâ€âŠąâŒžallmarked

Dold text
PermalÀnk
Medlem
●

Dag: 6
SprÄk: Dyalog APL & Scala

APL:

⎕IO←0 ⎕PP←13 fishes←+/(⍳9)∘.=⍎⊃⊃⎕NGET'6.txt'1 f←{(⊃⍔)(+@6)1⌜⍔} +/f⍣80⊱fishes +/f⍣256⊱fishes

Beskrivning:

⎕IO←0 indexering och ⎕PP←13 signifikanta siffror

fishes←+/(⍳9)∘.=⍎⊃⊃⎕NGET'6.txt'1

LÀser in filen, omvandlar till nummer och tar sedan en yttre = produkt mellan inlÀst data och arrayen 0,1,2,..8 Resultatet summeras radvis

⍳ Y - genererar alla index för en array av storleken Y (med start frĂ„n ⎕IO - anvĂ€nder ⎕IO←1 i alla exempel):

⍳5 1 2 3 4 5

X ∘.f Y anvÀnder funktionen f för yttre produkten mellan X och Y:

(⍳3) ∘.× ⍳5 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 (⍳3) ∘.= 1 2 3 2 3 3 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1

f←{(⊃⍔)(+@6)1⌜⍔}

Funktion som tar en array, roterar den ett steg och sen uppdaterar position 6 i arrayen med nuvarande vÀrde + första elementet i orginal arrayen.

X ⌜ Y roterar Y X ggr:

1âŒœâł5 2 3 4 5 1 2âŒœâł5 3 4 5 1 2

X (f@g) Y uppdaterar alla g (index array eller en funktion som returnerar bool array) i Y med hjÀlp av funktionen X f (array med nuvarande vÀrden för de element som uppdateras):

10 100 (× @ 2 4) ⍳5 1 20 3 400 5

+/f⍣80⊱fishes +/f⍣256⊱fishes

Uppdaterar fishes 80/256 ggr med hjÀlp av f och summerar resultatet

f ⍣ g kör funktionen f g gĂ„nger eller till funktionen g returnerar 1:

({1⌜⍔} ⍣ 0) ⍳5 1 2 3 4 5 ({1⌜⍔} ⍣ 1) ⍳5 2 3 4 5 1 ({1⌜⍔} ⍣ 2) ⍳5 3 4 5 1 2

Dold text

Scala:

val input = Using.resource(Source.fromFile("6.txt"))(_.mkString.trim.split(',').map(_.toInt).toVector) val fishes = Vector.tabulate(9)(input.groupMapReduce(identity)(_ => 1L)(_ + _).withDefaultValue(0L)) LazyList.iterate(fishes)((_: @unchecked) match { case h +: t => t.updated(6, t(6) + h) :+ h })(80).sum LazyList.iterate(fishes)((_: @unchecked) match { case h +: t => t.updated(6, t(6) + h) :+ h })(256).sum

Fick fÄnigt mÄnga fel svar pÄ scala koden. Missade först att copilot föreslog _ + 1L istÀllet för _ => 1L i groupMapReduce och sen en .trim vilket doldes av .flatMap(_.toIntOption) sÄ sista vÀrdet lÀstes inte in.

Dold text
PermalÀnk
●

Dag: 6
SprÄk: Python

fishes = list(map(int, open("6.in").readline().split(","))) for num_days in (80, 256): days = [0] * 7 for fish in fishes: days[fish] += 1 tot = len(fishes) prev_spawned = 0 prev_prev_spawned = 0 for day in range(num_days): spawned = days[day % 7] tot += spawned days[day % 7] += prev_prev_spawned prev_prev_spawned = prev_spawned prev_spawned = spawned print(tot)

Dold text
PermalÀnk
Medlem ★
●

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

RÀtt enkel uppgift idag mÄste jag sÀga. MEN med tanke pÄ hur lÄng tid det tar för min kod att lösa del 2 sÄ finns det garanterat bÀttre sÀtt att göra det pÄ. Det fÄr bli eftermiddagens uppgift. Gissar att finns nÄgot smart sÀtt för att inte behöva testa flera mÄlpositioner och eventuellt nÄgot bÀttre sÀtt att rÀkna ut brÀnsleÄtgÄngen i del tvÄ. Ska bli kul o se hur andra löser det.

Dold text
Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
●

Dag: 7
SprÀk: Scala

Inte sÄ kul idag nÀr det gÄr för fort tycker jag. Hoppas pÄ lite mer utmaningar lÀngre fram..

object Day7 { val data = readLines("7/data.txt") def main(args: Array[String]): Unit = { val crabs = data.head.split(",").map(_.toInt) println(crabs.length + " crabs") def calc(cost: (Int, Int) => Int) = { (0 until crabs.max).map { pos => crabs.map(crab => cost(crab, pos)).sum }.min } // part 1 println(calc((v, c) => abs(v - c))) // part 2 println(calc((c, p) => { val diff = abs(c - p) diff * (diff + 1) / 2 })) } }

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

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

"80 iterationer, det Àr vÀl inget för min gamla bettan hÀr?"
*klappar pÄ datorn och implementerar en naiv array-lösning i Python*

Trodde att idag var min dag dÄ jag fick till en naiv lösning pÄ mindre Àn en minut. Sen tryckte jag pÄ play, och nÀr programmet inte terminerat pÄ 30 sekunder förstod jag att jag varit -- naiv. Inte ens testinputen terminerade inom rimlig tid

Gav mig i kast med Counter() men jag har lite svÄrt att förstÄ den sÄ jag fick inspireras av Internet och ta till en dictionary-lösning istÀllet.

Dold text

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
Visa signatur

:(){ :|:& };:

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

PermalÀnk
●
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

Han gör faktiskt precis tvÀrt om. Median i del 1, och medel i del 2.

Dold text
PermalÀnk
●

Dag: 7
SprÄk: Python

Ugh, mÀngden tankevurpor pÄ del2 var rÀtt extrem idag*facepalm*.

data = list(map(int, open("7.in").read().split(","))) dist_costs = [sum(range(x)) + x for x in range(max(data) + 1)] print(min(sum(dist_costs[abs(x - i)] for x in data) for i in range(max(data))))

Dold text
PermalÀnk
Medlem
●

Dag: 7
SprÄk: Rust

#![feature(int_abs_diff)] fn main() { let input: Vec<u32> = std::fs::read_to_string("input.txt") .unwrap() .split(',') .filter_map(|s| s.parse().ok()) .collect(); fuel(&input, |a, b| a.abs_diff(b)); // 355592 fuel(&input, |a, b| (0..=a.abs_diff(b)).sum::<u32>()); // 101618069 } fn fuel(data: &[u32], func: fn(u32, u32) -> u32) { let mut fuel = u32::MAX; for v in 1.. { let curr_fuel = data.iter().map(|&a| func(a, v)).sum::<u32>(); fuel = curr_fuel.min(fuel); if fuel < curr_fuel { break; } } println!("{}", fuel); }

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
●

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

Undrade varför jag hela tiden fick för lÄga svar tills jag insÄg att jag returnade positionen och inte brÀnslet för den minimala platsen...

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

Han gör faktiskt precis tvÀrt om. Median i del 1, och medel i del 2.

Dold text

Same same

Visa signatur

:(){ :|:& };:

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

PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: Numpy

Detta Àr ineffektiva lösningar med tanke pÄ att man rÀknar varje krabba för sig, men det blev oneliners om man inte rÀknar inlösningsraden

Dagens lÀrdom: lÀs vad det stÄr i uppgiften och svara med mÀngden brÀnsle inte vilket djup de skall befinna sig pÄ...

import numpy as np crabs = np.array(list(map(int, open("input07").read().strip().split(",")))) print(min([abs(crabs - i).sum() for i in range(crabs.min(), crabs.max() + 1)])) print(min([((abs(crabs - i) * (abs(crabs - i) + 1)) / 2).sum() for i in range(crabs.min(), crabs.max() + 1)]))

Dold text
PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: F#

Första iterationen hade en betydligt mer naiv implementation för task2's poÀngsÀttning, men jag lyckades skrÀmma fram den slutna formeln för triangeltal ur nÄgot mörkt hörn i hjÀrnan.

open System.IO let input = File.ReadAllText "input.txt" |> (fun x -> x.Split (",")) |> Seq.map int let task1 level = fun x -> abs (level-x) let task2 level = fun x -> abs (level-x) |> (fun y ->((y*(1+y)/2))) let findEnergyLevel energyCalculator input = let min = Seq.min input let max = Seq.max input [for i in min..max -> i] |> List.map (fun x -> (input |> Seq.map (energyCalculator x) |> Seq.sum)) |> List.min printfn "Task 1: %i" (findEnergyLevel task1 input) printfn "Task 2: %i" (findEnergyLevel task2 input)

Dold text
Visa signatur

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

PermalÀnk
Medlem ★
●
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

Suck... var ocksÄ inne pÄ att anvÀnda medelvÀrdet pÄ del ett men övergav det och hade inte en tanke pÄ det för del tvÄ. Var nÀstan lite för enkelt

Snyggt dÀr med formeln för berÀkningen av brÀnslet. SÄnt dÀr som man sjÀlv Àr usel pÄ att hitta. Förhoppningsvis nÄgot man blir bÀttre pÄ av att lösa uppgifter som det hÀr.

Dold text

Det hÀr som Àr det roliga... lösa uppgiften sjÀlv pÄ sitt eget primitiva sÀtt och sedan se andras lösningar och förhoppningsvis lÀra sig nÄgot

Visa signatur

StationÀra | Define 7 Compact | RM750x White | X570S AERO G | Ryzen 5 5600x | NH-D15 Chromax | Flare X 4x8GB 3200MHz | RTX 4070 Super | MP600 1TB | 980 1TB | A2000 1TB | 970 EVO 500GB | 850 EVO 500GB |
Acer X34A + 2x Dell U2719D | Wave 1 | Arctis Nova Pro Wireless |
Laptop | Macbook Air M1 2020 | 16GB | 256GB |
3dkatten.se

PermalÀnk
Medlem
●

Dag: 7
SprÄk: C#

internal class Puzzle7 : Puzzle<int> { protected override void Solve(string[] lines) { var positions = lines[0].Split(',').Select(int.Parse).ToArray(); One = GetCheapestPosition(positions, true); Two = GetCheapestPosition(positions, false); } private static int GetCheapestPosition(IReadOnlyCollection<int> positions, bool burnAtConstantRate) => Enumerable.Range(0, positions.Max() + 1) .Aggregate(int.MaxValue, (lowestFuel, pos) => Math .Min(lowestFuel, positions .Where(x => x != pos) .Aggregate(0, (a, b) => { var distance = Math.Abs(pos - b); return a + (burnAtConstantRate ? distance : (distance * (distance + 1)) / 2); })) ); }

Dold text
PermalÀnk
Hedersmedlem ★
●

Dag: 7
SprÄk: TypeScript (med Node.js)
Lösning: GitHub

Det gick inte att köra map() pÄ en generator (utan lösningar som i sig inte var sÄ snygga), sÄ för att kunna göra det nÄgorlunda funktionellt (och slippa let x = []; for (...) x.push()) gjorde jag en ful range-kopia.

Edit: Jag blir dock sugen pÄ Rust igen nÀr jag ser prestandaskillnaderna. Visserligen rör det sig om sÄ ofantligt lite tid för sÄna hÀr uppgifter, men det gör lite ont ÀndÄ.
Testade att skriva om min lösning med for-loopar, variabler för att hÄlla svaret, med en massa kodduplicering osv, och det blev tre gÄnger sÄ snabbt.

let least_fuel = Number.MAX_SAFE_INTEGER; for (let target = 0; target < this.positions.length; target++) { let fuel = 0; for (let submarine of this.positions) { fuel += Math.abs(target - submarine); } if (fuel < least_fuel) least_fuel = fuel; } // lÀs av least_fuel som svar // Triangle least_fuel = Number.MAX_SAFE_INTEGER; for (let target = 0; target < this.positions.length; target++) { let fuel = 0; for (let submarine of this.positions) { const dist = Math.abs(target - submarine); fuel += dist*(dist+1)/2; } if (fuel < least_fuel) least_fuel = fuel; } // lÀs av least_fuel som svar

Dold text

Fult som stryk, men körs pÄ c:a 1/3 av tiden mot originalet. Och dÄ har jag ÀndÄ for-of-loopar som ocksÄ gÄr att göra snabbare.

22-23 ms original, 8-8.2 ms sÄhÀr, 5.2 ms om man Àven ersÀtter for-of ovan med for (let i = 0; i < this.positions.length; i++). MÄlet med zero-cost abstractions i Rust kÀnns trevligt.

Visa signatur

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

PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: C#
Lösning: GitHub

Var ju inte sÄ komplicerat idag i alla fall. KÀnde man igen att del 2 helt enkelt var triangeltal sÄ var det ju klappat och klart sen.

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
●

Dag: 7
SprÄk: Carth

Efter en del slarvfel och dyl. sÄ fick jag Àntligen till en snabb, elegant lösning.

(import std) (define main (do io/bind (<- input (io/map unwrap! (read-file "inputs/day7.txt"))) (let1 crabs (apps |> input trim (string/splits-on ",") (map (<o unwrap! parse-int)) array/collect (merge-sort int/cmp))) (display (apps str-append "Part 1: " (show-int (total-fuel id (median crabs) crabs)))) (display (apps str-append "Part 2: " (show-int (total-fuel sum-nats-to-n (mean crabs) crabs)))))) (define (median sorted) (array/lookup! (/ (array/length sorted) (to-nat 2)) sorted)) (define (mean xs) (/ (+ (sum (array/iter xs)) 1) (to-int (array/length xs)))) (define (total-fuel f align crabs) (sum (map (apps <o f abs (- align)) (array/iter crabs)))) (define (sum-nats-to-n n) (/ (* n (+ 1 n)) 2)) ; Formula for sum of range [1,n]

Dold text
Visa signatur

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