đŸ•Żïž Advent of Code 2019 đŸ•Żïž

PermalÀnk
Hedersmedlem ★
●

Dag: 1
SprÄk: PowerShell
Lösning:

function _FuelRequirement { Param([int]$Mass) [Math]::Truncate($Mass / 3) - 2 } function Get-RocketModule { $Path = Join-Path $PSScriptRoot "aoc2019-1-input" Get-Content $Path | Select ` @{n='Mass'; e={[int]$_}}, ` @{n='FuelRequirement'; e={_FuelRequirement $_}} } (Get-RocketModule | Measure-Object -Sum FuelRequirement).Sum

Dold text

Programmerat i olika sprÄk sedan 90-talet men har aldrig haft det som primÀrt jobb. Jobbar som systemadministratör. HÀr finns ofta behov av att lÀsa in data och transformera/analysera. Har valt PowerShell det hÀr Äret mycket eftersom det Àr det sprÄk jag ofta gör den hÀr sortens grejer i pÄ sistone.

Övertygad om att man i de flesta jobb kan spara en stor mĂ€ngd tid pĂ„ att kunna hacka ihop den hĂ€r sortens utrĂ€kningar!

Edit: Jag missade att det fanns en "stage 2"! HÀr Àr min kod som Àven tar hÀnsyn till detta:

function _FuelRequirement { Param( [parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][int]$Mass ) Process { [Math]::Truncate($Mass / 3) - 2 } } function _FuelRequirement2 { Param( [parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][int]$Mass ) Process { $FuelRequirement = _FuelRequirement $Mass if ($FuelRequirement -lt 0) { 0 } else { $FuelRequirement + (_FuelRequirement2 $FuelRequirement) } } } function Get-RocketModuleMass { $Path = Join-Path $PSScriptRoot "aoc2019-1-input" Get-Content $Path } $RocketModuleMass = Get-RocketModuleMass $FuelRequirement = ($RocketModuleMass | _FuelRequirement | Measure-Object -Sum).Sum $FuelRequirement2 = ($RocketModuleMass | _FuelRequirement2 | Measure-Object -Sum).Sum [pscustomobject]@{ FuelRequirement=$FuelRequirement FuelRequirement2=$FuelRequirement2 }

Dold text
PermalÀnk
Medlem
●

Det fick bli Haskell i Är ÀndÄ.

Dag: 1
SprÄk: Haskell
Lösning:

-- Part 1 part1 :: IO Word part1 = fmap part1' readInput where part1' = sum . map (directFuelToLaunchMass . read) . lines readInput :: IO String readInput = readFile "inputs/day-1" directFuelToLaunchMass :: Word -> Word directFuelToLaunchMass m = saturatingSub (div m 3) 2 saturatingSub :: Word -> Word -> Word saturatingSub a b = if a < b then 0 else a - b -- Part 2 part2 :: IO Word part2 = fmap part2' readInput where part2' = sum . map (fuelToLaunchMass . read) . lines fuelToLaunchMass :: Word -> Word fuelToLaunchMass = \case 0 -> 0 m -> let f = directFuelToLaunchMass m in f + fuelToLaunchMass f

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

En enkel naiv lösning i C#

public class Program { public async static Task Main(string[] args) { var input = await File.ReadAllLinesAsync("input.txt"); var fuelRequirement = input .Select(double.Parse) .Select(CalculateFuel) .Sum(); Console.WriteLine($"Fuel requirement: {fuelRequirement}"); } private static double CalculateFuel(double mass) { double fuelRequirement = 0; var fuelSubMass = mass; do { fuelSubMass = CalculateFuelPart(fuelSubMass); fuelRequirement += fuelSubMass; } while (fuelSubMass != 0); return fuelRequirement; } private static double CalculateFuelPart(double mass) => Math.Max(0, Math.Floor(mass / 3) - 2); }

Dold text
PermalÀnk
Medlem
●

Om mig: Nybörjare som aldrig jobbat som utvecklare. (Ha överseende)

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

Del 1

file1 = 'Input'
sum=0

with open(file1) as fp:
line = fp.readline()

while line:

answer = int("{}".format(line.strip()))
sum = sum + ((answer/3)-2)

line = fp.readline()

print sum

Dold text

Del 2

file1 = 'Input'
result = 0
value = 0

with open(file1) as fp:
line = fp.readline()

while line:
answer = int("{}".format(line.strip()))
value = answer

while value > 0:
value = value/3-2

if value > 0:
result = result + value

line = fp.readline()

print result

Dold text
PermalÀnk
Medlem ★
●

Är nybörjare och kĂ€nd bland kollegorna för att hitta pĂ„ allt för lĂ„nga lösningar till simpla problem. HĂ€r Ă€r sĂ„ledes min överdrivna lösning till första dagen i python. Kan vĂ€l sĂ€ga att min overkill csv import beror pĂ„ att jag ofta Ă€r pĂ„ bĂ„de mac och windows och dĂ€rmed har en jag skrev för lĂ€nge sedan som jag bara kopierar in de delar jag behöver av...

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

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import csv import os import math def import_csv(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 csvfile: input_data = [int(row[0]) for row in csv.reader(csvfile)] return input_data def calculate_fuel(lst): fuel_amounts = [] for mass in lst: while (math.floor(mass / 3) - 2) > 0: fuel = math.floor(mass / 3) - 2 fuel_amounts.append(fuel) mass = fuel fuel_sum = 0 for fuel in fuel_amounts: fuel_sum += fuel return fuel_sum def main(): input_data = import_csv('input.csv') fuel_sum = calculate_fuel(input_data) print(fuel_sum) if __name__ == "__main__": 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 |

PermalÀnk
Medlem ★
●

Dag: 1
SprÄk: C#
Lösning: Del 1 + 2

public class DayOne { private readonly List<int> _fuelInputs; public DayOne(IEnumerable<int> data) { _fuelInputs = data.ToList(); } public DayOne() { var reader = File.ReadAllLinesAsync("input.txt").Result; _fuelInputs = reader.Select(int.Parse).ToList(); } public int GetRequiredFuel(Stage stage) { if (stage == Stage.One) return _fuelInputs.Sum(DoCalculation); return _fuelInputs.Sum(CalculateFuel); } private int CalculateFuel(int num) { var result = 0; while (true) { var sum = DoCalculation(num); if (sum <= 0) break; result += sum; num = sum; } return result; } private int DoCalculation(int num) => (int)Math.Floor(((double)num / 3)) - 2; }

Stage Àr en enum jag sÀtter för att kunna bibehÄlla funktionerna för Stage 1 och 2 för Day1.
Detta för att mina unit tester ska kunna fungera för bÄda dagarna.
Kommer att fortsÀtta lÀgga upp varje solution pÄ min repository i mÄn av tid.
https://github.com/Ronnehag/AdventOfCode2019

Dold text

Kodat i ca 1,5 Ă„r.
Pluggar .NET pÄ YH och gör just nu min LIA (praktik) som systemutvecklare.

PermalÀnk
Datavetare ★
●

Rust - day 1

Alla dagar kommer ha ett par Äterkommande moment, t.ex. varje problem Àr tvÄ delar och input Àr nÄgon form av text-strÀng.

Hoppas kunna hÀnga med lÀngre Àn 18:e som Àr sÄ lÄngt jag kom förra Äret. Gjorde dÀrför ett litet ramverk som lÀser in indata, stoppar in det i en vektor av strÀngar (en för varje rad) och varje dag implementerar detta interface

trait Solution { // Create a solution state from the input fn new(input: &Vec<String>) -> Self; // Solves first part of the problem fn part1(&self) -> String; // Solves second part of the problem fn part2(&self) -> String; }

Varje dag blir dÄ en ny implementation av interfacet Solution. Och som sagt, Àr totalt grön pÄ Rust. Detta Àr det första jag skriver i sprÄket utöver "hello world" och liknande.

Klicka för mer information

type Mass = i32; type Fuel = i32; // State required for solving day 1 pub struct State { modules: Vec<Mass>, } // Fuel required to launch with a specific mass fn fuel_required(mass: &Mass) -> Fuel { mass / 3 - 2 } // Fuel required to launch with a specific mass when fuel itself got mass fn fuel_with_mass_required(mass: &Mass) -> Fuel { let fuel = fuel_required(mass); if fuel <= 0 { 0 } else { fuel + fuel_with_mass_required(&fuel) } } impl super::Solution for State { fn new(lines: &Vec<String>) -> State { State { modules: lines.iter().map(|line|line.parse::<Mass>().unwrap()).collect() } } fn part1(&self) -> String { let fuel: Fuel = self.modules.iter().map(fuel_required).sum(); fuel.to_string() } fn part2(&self) -> String { let fuel: Fuel = self.modules.iter().map(fuel_with_mass_required).sum(); fuel.to_string() } }

Visa mer
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 ★
●

Har inte kodat nÄgot mer Àn lite HTML/ASP runt Är 2000 fram tills för 3-4 Är sedan nÀr jag gjorde mina första one-liners i Powershell.
DÄ jag var driftsadmin sÄ passade det bra ( i M$-miljö ) och har endast haft med sÄdana saker att göra. SÄ pÄhittade projekt som detta Àr jag vÀldigt ovan vid men kul!

Dag: 1
SprÄk: Powershell
Lösning: Del 1 + 2

function New-FuelRequirementCalculation { param( [parameter(mandatory=$true)][int]$Mass ) $FuelRequirements = ( ([math]::Floor($Mass / 3)) - 2 ) $Output = [pscustomobject]@{ Mass = $Mass NeededFuel = $FuelRequirements } Write-Output $Output } ((( Get-Content '.\Advent of Code\2019\input.txt' ) | Foreach-Object { New-FuelRequirementCalculation $_ }).NeededFuel | Measure-Object -Sum).Sum

Dold text

function New-FuelRequirementCalculation2 { param( [parameter(mandatory=$true)][int]$Mass ) Write-Verbose "Input mass: $Mass" $FuelRequirements = ( ([math]::Floor($Mass / 3)) - 2 ) if($FuelRequirements -lt 0){ Write-Verbose "Calculated fuel for $Mass mass: $FuelRequirements" Write-Verbose "Recalculating negative fuel..." $Output = 0 Write-Verbose "Fuel requirements are 0." } else{ Write-Verbose "New fuel calculations needed. Newly calculated fuel: $FuelRequirements" $Output = $FuelRequirements + (New-FuelRequirementCalculation2 $FuelRequirements) } Write-Output $Output } ((( Get-Content '.\Advent of Code\2019\input.txt' ) | Foreach-Object { New-FuelRequirementCalculation2 -Mass $_ -Verbose }) | Measure-Object -Sum).Sum

Dold text
Visa signatur

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

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

PermalÀnk
Medlem ★
●

Har ingen erfarenhet egentligen. Tror jag skriver mer kod under AOC Àn vad jag gör under hela Äret...

Tar gÀrna emot synpunkter om det finns saker som kan förbÀttras!

Dag: 1
SprÄk: Javascript
Lösning: Del 1

const fs = require('fs'); let text = fs.readFileSync('./input.txt') .toString() .split('\n') .map(s => s.replace(/\r$/, '')) .filter(s => s.length > 0); const intArray = text.map(Number); const sumArray = arr => arr.map(x => (x / 3 | 0) - 2).reduce((a, b) => a + b); console.log(sumArray(intArray));

Dold text
Visa signatur

Grubblare

PermalÀnk
Medlem ★
●

Dag 2
SprÄk c#
Lösning del 1&2

private void button2_Click(object sender, EventArgs e) { int maxPos = 1; if (this.numSubTask.Value==2) { maxPos = Math.Min(100, GetIntArray(this.txtInput.Text.Trim()).Length); } for (int noun = 0; noun < maxPos; noun++) { for (int verb = 0; verb < maxPos; verb++) { bool endedCorrectly = false; int?[] values = GetIntArray(this.txtInput.Text.Trim()); if (this.numSubTask.Value == 2) { values[1] = noun; values[2] = verb; } else { values[1] = 12; values[2] = 2; } for (int i = 0; i < values.Length; i += 4) { if (values[i] != null && (values[i] == 1 || values[i] == 2)) { if (values.Length > (i + 3) && values[i + 1] != null && values[i + 1] < values.Length && values[i + 2] != null && values[i + 2] < values.Length && values[i + 3] != null && values[i + 3] < values.Length) { int code = (int)values[i]; int pos1 = (int)values[i + 1]; int pos2 = (int)values[i + 2]; int toPos = (int)values[i + 3]; switch (code) { case 1: values[toPos] = values[pos1] + values[pos2]; break; case 2: values[toPos] = values[pos1] * values[pos2]; break; default: break; } } else { if (values[i] != null && values[i] == 99) { endedCorrectly = true; break; } else { throw new System.ArgumentException("Parameter array error"); } } } else { if (values[i] != null && values[i] == 99) { endedCorrectly = true; break; } else { throw new System.ArgumentException("Parameter cannot be null"); } } } if (endedCorrectly) { switch (this.numSubTask.Value) { case 1: txtAnswer.Text = values[0].ToString(); txtInput.Text = string.Join(",", values.Select(x => x.ToString()).ToArray()); break; case 2: if (values[0]== 19690720) { txtAnswer.Text = (values[1] * 100 + values[2]).ToString(); txtInput.Text = string.Join(",", values.Select(x => x.ToString()).ToArray()); return; } break; default: break; } } } } } private int?[] GetIntArray(string input) { string[] strArr = input.Split(','); int?[] intArr = new int?[strArr.Length]; for (int i = 0; i < strArr.Length; i++) { intArr[i] = ToInt(strArr[i]); } return intArr; }

Dold text
PermalÀnk
Medlem
●

Ojoj, det blev ju klurigare ganska fort hÀr. KÀnner mig lite hemsk för att anvÀnda lÀnkade listor till det hÀr.

Dag: 2
SprÄk: Haskell
Lösning: 1 & 2

{-# LANGUAGE LambdaCase #-} module Day2 (part1, part2) where import Data.List.Split import Numeric.Natural type Pos = Natural data Instr = Add Pos Pos Pos | Mul Pos Pos Pos | Halt -- Program counter type Pc = Natural type Mem = [Natural] -- Part 1 part1 :: IO Natural part1 = fmap part1' readInput where part1' = evalPgm 12 2 . parse readInput :: IO String readInput = readFile "inputs/day-2" parse :: String -> Mem parse = map read . splitOn "," evalPgm :: Natural -> Natural -> Mem -> Natural evalPgm a b = eval 0 . store a 1 . store b 2 eval :: Pc -> Mem -> Natural eval pc mem = let instr = getInstr pc mem pc' = pc + 4 in case evalInstr mem instr of Left mem' -> eval pc' mem' Right r -> r getInstr :: Pc -> Mem -> Instr getInstr pc mem = case (drop (fromIntegral pc) mem) of 1 : ia : ib : dest : _ -> Add ia ib dest 2 : ia : ib : dest : _ -> Mul ia ib dest 99 : _ -> Halt mem' -> error $ "getInstr: " ++ show (take 4 mem') ++ "..." evalInstr :: Mem -> Instr -> Either Mem Natural evalInstr mem = \case Add ia ib dest -> Left $ store (lookupMem ia mem + lookupMem ib mem) dest mem Mul ia ib dest -> Left $ store (lookupMem ia mem * lookupMem ib mem) dest mem Halt -> Right (lookupMem 0 mem) store :: Natural -> Pos -> Mem -> Mem store x i mem = case (i, mem) of (0, _ : mem') -> x : mem' (_, a : mem') -> a : store x (i - 1) mem' _ -> error "store" lookupMem :: Pos -> Mem -> Natural lookupMem i = (!! fromIntegral i) -- Part 2 part2 :: IO Natural part2 = fmap part2' readInput where part2' = findNounVerb . parse findNounVerb :: Mem -> Natural findNounVerb mem = head $ do noun <- [0 .. 99] verb <- [0 .. 99] if evalPgm noun verb mem == expectedOutput then [100 * noun + verb] else [] expectedOutput :: Natural expectedOutput = 19690720

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

En dag sen, fanns annat att göra en söndag
Jag tog tillfÀllet att lÀra mig nÄgot nytt sprÄk.

SprÄk: python3

Dag 1
Lösning 1:

import math mass = [int(line.rstrip('\n')) for line in open("input")] totalFuel = 0 for i in mass: totalFuel += math.floor(i/3)-2 print(totalFuel)

Dold text

Lösning 2:

import math mass = [int(line.rstrip('\n')) for line in open("input")] totalFuel = 0 for i in mass: fuelForFuel = 0 while i > 0: i = math.floor(i/3)-2 if i > 0: fuelForFuel += i totalFuel += fuelForFuel print(totalFuel)

Dold text
Visa signatur

en dator

PermalÀnk
●

Kul med advent of code igen! Jag har kört varje Är sedan starten och har som ambition att anvÀnda ett nytt sprÄk varje Är. Tidigare Är har jag kört Elixir, Haskell, Java, Scala och i Är tog jag Kotlin (tÀnkte ta Go men fegade ur med Kotlin vilket kÀndes betydligt enklare dÄ jag kan Java och Scala). Har inte blivit fÀrdig de tvÄ senaste Ären dÄ jag fick barn sÄ tid och prioriteringar Àndrades, lÀr vÀl knappast bli klar i Är heller.

Dag: 1
SprÄk: Kotlin

fun calculateFuelPart1(value: Int): Int = value / 3 - 2 fun calculateFuelPart2(value: Int): Int { val result = calculateFuelPart1(value) return if (result <= 0) 0 else result + calculateFuelPart2(result) } fun solve(input: List<Int>, f: (Int) -> Int): Int = input.foldRight(0) { next, acc -> f(next) + acc }

Dold text

Dag: 2
SprÄk: Kotlin

fun run(input: MutableList<Int>, position: Int = 0): List<Int> { return if (input[position] == 1 || input[position] == 2) { val a = input[input[position + 1]] val b = input[input[position + 2]] input[input[position + 3]] = if (input[position] == 1) a + b else a * b run(input, position + 4) } else if (input[position] == 99) { input } else { throw RuntimeException("oh no!") } } fun part2(input: List<Int>, target: Int): Pair<Int, Int>? { return (0..99) .asSequence() .flatMap { noun -> (0..99).asSequence().map { Pair(noun, it) } } .find { (noun, verb) -> val mutableInput = input.toMutableList() mutableInput[1] = noun mutableInput[2] = verb run(mutableInput)[0] == target } }

Dold text
Visa signatur

"Knowledge amplification. What he learns, we all learn. What he knows, we all benefit from."

PermalÀnk
Medlem
●

Dag: 2
SprÄk: Scala

@main def day02 = val input = Using .resource(Source.fromFile(path.toFile))(_.mkString.split(",")) .flatMap(_.toIntOption) .toVector def execute(program: Vector[Int], noun: Int, verb: Int): Int = def loop(state: Vector[Int], pc: Int): Int = state.slice(pc, pc + 4) match case Vector(1, a, b, dst) => loop(state.updated(dst, state(a) + state(b)), pc + 4) case Vector(2, a, b, dst) => loop(state.updated(dst, state(a) * state(b)), pc + 4) case Vector(99, _*) => state(0) loop(program.updated(1, noun).updated(2, verb), 0) println(execute(input, 12, 2)) (for noun <- (0 to 99).iterator verb <- (0 to 99).iterator res = execute(input, noun, verb) if res == 19690720 yield 100 * noun + verb).nextOption().foreach(println)

Dold text

Eftersom det verkar populÀrt att lÀra sig ett nytt sprÄk sÄ skrev jag om dag 1 i ett sprÄk jag aldrig anvÀnt förut, APL. Fokuserade pÄ lÀsbar kod.
Dag: 1
SprÄk: Dyalog APL

I←⍎¹⊃⎕nget'day01.txt'1⋄c←{⌊(â”Ă·3)-2}⋄+/c I⋄+/{⍔>0:⍔+∇c⍔⋄0}šc I

Dold text
PermalÀnk
Medlem ★
●

Jag Àr noob pÄ detta men jag kör pÄ Scala sÄ lÀnge jag kan och sedan kommer jag byta till Java eller JS. Tar gÀrna kritik om det finns nÄgra funktionella mÀstare som tittar

DAG 1, problem 1

def calcFuel(input: Int): Int = input/3-2 val sum = inputs.foldLeft(0){(acc, i) => acc + calcFuel(i)}

Dold text

DAG 1, problem 2

def massToFuel(mass: Int): Int = { @tailrec def fuelHelper(remainingMass: Int, acc: Int): Int ={ val newFuel = calcFuel(remainingMass) if(newFuel <= 0) acc else fuelHelper(newFuel, acc+newFuel) } fuelHelper(mass, 0) }

Dold text
PermalÀnk
Datavetare ★
●

Rust - dag 2

BrÄkat med Rust "mod" semantik samt exakt hur man ska anvÀnda "traits". Fick designa om den generella lite, projektet ligger nu pÄ github.

use super::Solution; use Instruction::*; type Intcode = usize; type Addr = Intcode; #[derive(PartialEq,Debug)] enum Instruction { Add(Addr, Addr, Addr), Mul(Addr, Addr, Addr), Halt, } // State required for solve day 2 pub struct State { memory: Vec<Intcode>, } pub fn solution(lines: Vec<&str>) -> Box<dyn Solution> { Box::new(State { memory: lines[0].split(",").map(|ic|ic.parse::<Intcode>().unwrap()).collect() }) } fn fetch(mem: &Vec<Intcode>, ip: Addr) -> Instruction { let opcode = mem[ip]; match opcode { 1 => Add(mem[ip+1], mem[ip+2], mem[ip+3]), 2 => Mul(mem[ip+1], mem[ip+2], mem[ip+3]), 99 => Halt, _ => panic!("Invalid opcode"), } } fn exec(instr: Instruction, mem: &mut Vec<Intcode>, ip: &mut Addr) -> bool { let mut new_ip = *ip + 4; match instr { Add(src0, src1, dst) => mem[dst] = mem[src0] + mem[src1], Mul(src0, src1, dst) => mem[dst] = mem[src0] * mem[src1], Halt => new_ip = *ip, }; *ip = new_ip; instr == Halt } fn run(memory: &Vec<Intcode>, noun: Intcode, verb: Intcode) -> Intcode { let mut mem = memory.clone(); let mut ip: Addr = 0; // The value placed in address 1 is called the noun, and the value // placed in address 2 is called the verb mem[1] = noun; mem[2] = verb; loop { let instr = fetch(&mem, ip); if exec(instr, &mut mem, &mut ip) { break } } // Output is value at position 0 after the program halts. mem[0] } impl Solution for State { fn part1(&self) -> String { run(&self.memory, 12, 2).to_string() } fn part2(&self) -> String { let wanted_output = 19690720; let mut noun = 0; let mut verb = 0; loop { noun = noun + 1; if noun > 99 { noun = 0; verb = verb + 1; } if run(&self.memory, noun, verb) == wanted_output { break; } } (100 * noun + verb).to_string() } }

Relevanta delarna för dag 2

GÄr att skriva detta vÀsentligt kortare i Rust, Àven med mina Àn sÄ lÀnge medioka kunskaper. Men just detta fallet med datorn lÀr Äterkomma senare dagar med nya instruktioner, t.ex. hopp. Sedan Àr det lite sjÀlvÀndamÄl att anvÀnda Rust-finesser (som enums med associerat tillstÄnd).

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
●

Del 1

const { p2 } = require('./puzzle_input'); const ins = p2.split(',').map(o => parseInt(o, 10)); ins[1] = 12; ins[2] = 2; let end = false; for (let i = 0; i < ins.length; i += 4) { switch (ins[i]) { case 1: ins[ins[i+3]] = ins[ins[i+1]]+ins[ins[i+2]]; break; case 2: ins[ins[i+3]] = ins[ins[i+1]]*ins[ins[i+2]]; break; case 99: end = true; break; } if (end) { break; } } console.log(ins[0]);

Del 2

const { p2 } = require('./puzzle_input'); const main = () => { for (let noun = 0; noun < 100; noun++) { for (let verb = 0; verb < 100; verb++) { let end = false; const ins = p2.split(',').map(o => parseInt(o, 10)); ins[1] = noun; ins[2] = verb; for (let i = 0; i < ins.length; i += 4) { switch (ins[i]) { case 1: ins[ins[i+3]] = ins[ins[i+1]]+ins[ins[i+2]]; break; case 2: ins[ins[i+3]] = ins[ins[i+1]]*ins[ins[i+2]]; break; case 99: end = true; break; } if (end) { if (ins[0] === 19690720) { return 100 * noun + verb; } break; } } } } } console.log(main());

Node.js svar dag 2

https://github.com/johanbx/AoC-2019

PermalÀnk
Medlem ★
●

Jag hakade pÄ det hÀr i morse. Jag sitter mellan konsultuppdrag just nu sÄ jag tar tillfÀllet i akt att lÀra mig Rust, som jag har tÀnkt pÄ i ett par Är nu. SvÄrt men kul! Ska kolla pÄ hur @Yoshman har löst grejerna nÀr jag klarar dem sjÀlv. Jag Àr datalog och har kodat sedan jag började pÄ Teknis 2011 men jag har alltid varit dÄlig pÄ att ta mig för sÄdana hÀr saker.

PermalÀnk
Medlem ★
●

Har en elak kÀnsla av att det inte Àr det sista vi ser av den dÀr datorn... kanske blir nÄgon mer kompetent lösning i framtiden isÄfall.

Dag: 2
SprÄk: Python3
Lösning:

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys def get_started(input_data): input_data[1] = 12 input_data[2] = 2 return input_data def run_intcode(input_data): def opcode_1(parameter1, parameter2): return parameter1 + parameter2 def opcode_2(parameter1, parameter2): return parameter1 * parameter2 pos = 0 while input_data[pos] != 99: if input_data[pos] == 1: calc = opcode_1(input_data[input_data[pos+1]], input_data[input_data[pos+2]]) input_data[input_data[pos+3]] = calc elif input_data[pos] == 2: calc = opcode_2(input_data[input_data[pos+1]], input_data[input_data[pos+2]]) input_data[input_data[pos+3]] = calc else: print(input_data[pos]) raise ValueError("Something went horrible wrong at pos", pos) pos += 4 return input_data def main_1(): input_data = [1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,10,19,1,19,5,23,2,23,9,27,1,5,27,31,1,9,31,35,1,35,10,39,2,13,39,43,1,43,9,47,1,47,9,51,1,6,51,55,1,13,55,59,1,59,13,63,1,13,63,67,1,6,67,71,1,71,13,75,2,10,75,79,1,13,79,83,1,83,10,87,2,9,87,91,1,6,91,95,1,9,95,99,2,99,10,103,1,103,5,107,2,6,107,111,1,111,6,115,1,9,115,119,1,9,119,123,2,10,123,127,1,127,5,131,2,6,131,135,1,135,5,139,1,9,139,143,2,143,13,147,1,9,147,151,1,151,2,155,1,9,155,0,99,2,0,14,0] input_data = get_started(input_data) output_data = run_intcode(input_data) print(output_data[0]) def main_2(): for noun in range(0,100): for verb in range(0,100): test_data = [1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,10,19,1,19,5,23,2,23,9,27,1,5,27,31,1,9,31,35,1,35,10,39,2,13,39,43,1,43,9,47,1,47,9,51,1,6,51,55,1,13,55,59,1,59,13,63,1,13,63,67,1,6,67,71,1,71,13,75,2,10,75,79,1,13,79,83,1,83,10,87,2,9,87,91,1,6,91,95,1,9,95,99,2,99,10,103,1,103,5,107,2,6,107,111,1,111,6,115,1,9,115,119,1,9,119,123,2,10,123,127,1,127,5,131,2,6,131,135,1,135,5,139,1,9,139,143,2,143,13,147,1,9,147,151,1,151,2,155,1,9,155,0,99,2,0,14,0] test_data[1] = noun test_data[2] = verb test_output = run_intcode(test_data) if test_output[0] == 19690720: print(100*noun + verb) sys.exit() if __name__ == "__main__": main()

Dold text

Kan sÀga att del 2 kastade mig in i galenskapen och jag höll pÄ att Äteruppfinna for-loopen mha while innan jag insÄg vad jag höll pÄ med och gjorde som ovan istÀllet.

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 |

PermalÀnk
Hedersmedlem ★
●

Dag: 2
SprÄk: Powershell
Lösning:

function Run-Computer { Param($noun, $verb) $InputString = Get-Content (Join-Path $PSScriptRoot "aoc2019-2-input.txt") [int[]]$Memory = $InputString.Split(',') $memory[1] = $noun $memory[2] = $verb $i_ptr = 0 $running = $true while ($running) { $instruction = $Memory[$i_ptr++] switch ($instruction) { 1 { # Add $a_ptr = $memory[$i_ptr++] $b_ptr = $memory[$i_ptr++] $out_ptr = $memory[$i_ptr++] $memory[$out_ptr] = $memory[$a_ptr] + $memory[$b_ptr] } 2 { # Multiply $a_ptr = $memory[$i_ptr++] $b_ptr = $memory[$i_ptr++] $out_ptr = $memory[$i_ptr++] $memory[$out_ptr] = $memory[$a_ptr] * $memory[$b_ptr] } 99 { # Halt $running = $false } default { throw "Unknown instruction $instruction at $i_ptr!" } } } $memory[0] } Run-Computer 12 2 :nounloop for ($noun = 0; $noun -lt 100; $noun++) { for ($verb = 0; $verb -lt 100; $verb++) { $result = Run-Computer $noun $verb if ($result -eq 19690720) { 100 * $noun + $verb break nounloop } } }

Dold text

Inte direkt ideomatisk PowerShell... men det Àr Ä andra sidan svÄrt med tanke pÄ vad det hÀr Àr för problem. C hade varit perfekt!

Det hÀr var första gÄngen jag hade nytta av postincrement-operatorn i Powershell. Kul att se att just denna funktion frÄn C verkar ha hamnat i sprÄket.

PermalÀnk
Hedersmedlem ★
●
Skrivet av Xenofonus:

Jag Àr noob pÄ detta men jag kör pÄ Scala sÄ lÀnge jag kan och sedan kommer jag byta till Java eller JS. Tar gÀrna kritik om det finns nÄgra funktionella mÀstare som tittar

DAG 1

def calcFuel(input: Int): Int = input/3-2 val sum = inputs.foldLeft(0){(acc, i) => acc + calcFuel(i)}

Dold text

DAG 2

def massToFuel(mass: Int): Int = { @tailrec def fuelHelper(remainingMass: Int, acc: Int): Int ={ val newFuel = calcFuel(remainingMass) if(newFuel <= 0) acc else fuelHelper(newFuel, acc+newFuel) } fuelHelper(mass, 0) }

Dold text

För ordningens skull: Det dÀr Àr lösningar för dag 1 (första och andra halvan)!

PermalÀnk
Medlem ★
●

@pv2b: HÄller med. Hade verkligen problem med att fÄ till detta med PoSh.... Men det gick till slut. Dock lÄngsam och jag Àr generellt missnöjd ( sÄ inget hackande pÄ koden, tack - kommer lÄsa in, brÀnna och strö vitlök över den imorgon...)

Dag: 2
SprÄk: Powershell
Lösning: Del 1 + 2

function Get-Code { param( [parameter(Mandatory=$true)]$Input ) if(!$Input){$Input = "Day2.Input.txt"} $InstructionsList = @() (Get-Content $Input).Split(',') | ForEach-Object { $InstructionsList += [int]$_ } $CounterStart = 0 $CounterEnd = $CounterStart + 4 while( ($InstructionsList[$CounterStart..($CounterEnd -1)] | Select-Object -First 4).count -eq 4 ){ if( $CounterStart -eq 0 ){ $OperationsSet = $InstructionsList[$CounterStart..($CounterEnd -1)] | Select-Object -First 4 } else{ $OperationsSet = $InstructionsList[$CounterStart..$CounterEnd] | Select-Object -First 4 } if( $OperationsSet[0] -eq 1 ){ $InstructionsList[($OperationsSet[3])] = $InstructionsList[($OperationsSet[1])] + $InstructionsList[($OperationsSet[2])] } elseif( $OperationsSet[0] -eq 2 ){ $InstructionsList[($OperationsSet[3])] = $InstructionsList[($OperationsSet[1])] * $InstructionsList[($OperationsSet[2])] } elseif( $OperationsSet[0] -eq 99 ){ $OutputObject = $InstructionsList[0] Return $OutputObject } $CounterStart = $CounterStart + 4 $CounterEnd = $CounterEnd + 4 } $OutputObject = $InstructionsList[0] Write-Output $OutputObject } Get-Code -Input "Day2.Input.txt"

Dold text

function Get-CodeReversed { param( [parameter(Mandatory=$true)][int]$EndResult, [parameter(Mandatory=$true)]$InputFile ) $Noun = 0 $Verb = 0 $Noun..99 | ForEach-Object { $Noun++ $Verb..99 | ForEach-Object { if( $_ -ge 0 -and $_ -lt 99 ){ $Verb++ } else { $Verb = 0 } $OP = Get-Code -Input $InputFile if($OP.Operator -eq $EndResult){ Return ((100 * $Noun) + $Verb);break } } } } Get-CodeReversed -EndResult 19690720 -InputFile "Day2.Input.txt"

Dold text
Visa signatur

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

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

PermalÀnk
Medlem ★
●

@pv2b: Ja sÄ klart, hjÀrnslÀpp! Texten Àr fixad nu, tackar

PermalÀnk
Medlem
●

Dag: 2
SprÄk: Python
Lösning: Del 1

import csv text = "" nummer = 0 number1 = 0 index = 0 register = [] position1=1 position2=2 positionOutput=3 with open('testcsv.csv') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: text = ",".join(row) number1 = text.split(",") for number in number1: nummer = int(number) register.append(nummer) while register[index] == 1 or register[index] == 2: if register[index] == 1: register[register[positionOutput]] = register[register[position1]]+register[register[position2]] index = index + 4 position1 = position1 + 4 position2 = position2 + 4 positionOutput = positionOutput + 4 elif register[index] == 2: register[register[positionOutput]] = register[register[position1]]*register[register[position2]] #Output index = index + 4 position1 = position1 + 4 position2 = position2 + 4 positionOutput = positionOutput + 4 elif register[index] == 99: print "99! Program Halt" else: print "Unavailable" print register[:1]

Dold text

Klarade inte av Del 2. FörstÄr inte riktigt instruktionen, om jag ska vara Àrlig.

Fixat code-taggar! /Mod
PermalÀnk
Medlem ★
●
Skrivet av pv2b:

Dag: 2
SprÄk: Powershell
Lösning:

function Run-Computer { Param($noun, $verb) $InputString = Get-Content (Join-Path $PSScriptRoot "aoc2019-2-input.txt") [int[]]$Memory = $InputString.Split(',') $memory[1] = $noun $memory[2] = $verb $i_ptr = 0 $running = $true while ($running) { $instruction = $Memory[$i_ptr++] switch ($instruction) { 1 { # Add $a_ptr = $memory[$i_ptr++] $b_ptr = $memory[$i_ptr++] $out_ptr = $memory[$i_ptr++] $memory[$out_ptr] = $memory[$a_ptr] + $memory[$b_ptr] } 2 { # Multiply $a_ptr = $memory[$i_ptr++] $b_ptr = $memory[$i_ptr++] $out_ptr = $memory[$i_ptr++] $memory[$out_ptr] = $memory[$a_ptr] * $memory[$b_ptr] } 99 { # Halt $running = $false } default { throw "Unknown instruction $instruction at $i_ptr!" } } } $memory[0] } Run-Computer 12 2 :nounloop for ($noun = 0; $noun -lt 100; $noun++) { for ($verb = 0; $verb -lt 100; $verb++) { $result = Run-Computer $noun $verb if ($result -eq 19690720) { 100 * $noun + $verb break nounloop } } }

Dold text

Inte direkt ideomatisk PowerShell... men det Àr Ä andra sidan svÄrt med tanke pÄ vad det hÀr Àr för problem. C hade varit perfekt!

Det hÀr var första gÄngen jag hade nytta av postincrement-operatorn i Powershell. Kul att se att just denna funktion frÄn C verkar ha hamnat i sprÄket.

Skrivet av GreyWilk:

@pv2b: HÄller med. Hade verkligen problem med att fÄ till detta med PoSh.... Men det gick till slut. Dock lÄngsam och jag Àr generellt missnöjd ( sÄ inget hackande pÄ koden, tack - kommer lÄsa in, brÀnna och strö vitlök över den imorgon...)

Dag: 2
SprÄk: Powershell
Lösning: Del 1 + 2

function Get-Code { param( [parameter(Mandatory=$true)]$Input ) if(!$Input){$Input = "Day2.Input.txt"} $InstructionsList = @() (Get-Content $Input).Split(',') | ForEach-Object { $InstructionsList += [int]$_ } $CounterStart = 0 $CounterEnd = $CounterStart + 4 while( ($InstructionsList[$CounterStart..($CounterEnd -1)] | Select-Object -First 4).count -eq 4 ){ if( $CounterStart -eq 0 ){ $OperationsSet = $InstructionsList[$CounterStart..($CounterEnd -1)] | Select-Object -First 4 } else{ $OperationsSet = $InstructionsList[$CounterStart..$CounterEnd] | Select-Object -First 4 } if( $OperationsSet[0] -eq 1 ){ $InstructionsList[($OperationsSet[3])] = $InstructionsList[($OperationsSet[1])] + $InstructionsList[($OperationsSet[2])] } elseif( $OperationsSet[0] -eq 2 ){ $InstructionsList[($OperationsSet[3])] = $InstructionsList[($OperationsSet[1])] * $InstructionsList[($OperationsSet[2])] } elseif( $OperationsSet[0] -eq 99 ){ $OutputObject = $InstructionsList[0] Return $OutputObject } $CounterStart = $CounterStart + 4 $CounterEnd = $CounterEnd + 4 } $OutputObject = $InstructionsList[0] Write-Output $OutputObject } Get-Code -Input "Day2.Input.txt"

Dold text

function Get-CodeReversed { param( [parameter(Mandatory=$true)][int]$EndResult, [parameter(Mandatory=$true)]$InputFile ) $Noun = 0 $Verb = 0 $Noun..99 | ForEach-Object { $Noun++ $Verb..99 | ForEach-Object { if( $_ -ge 0 -and $_ -lt 99 ){ $Verb++ } else { $Verb = 0 } $OP = Get-Code -Input $InputFile if($OP.Operator -eq $EndResult){ Return ((100 * $Noun) + $Verb);break } } } } Get-CodeReversed -EndResult 19690720 -InputFile "Day2.Input.txt"

Dold text

Kul att se PoSh lösningar, har varit sugen pÄ att lÀra mig mer av det nÀr fler och fler av mina arbetsuppgifter krÀver en terminal och det börjar bli trÄkigt att skriva samma sak sÄ ofta.

Ser fram emot att se fler av era lösningar framöver

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 |

PermalÀnk
Medlem ★
●

@ZonYx: Du skall rÀkna ut vilka tvÄ vÀrden pÄ index 1 och 2 som ger det förvÀntade vÀrdet pÄ index 0.
NÀr du vÀl har dessa sÄ Àr svaret de söker 100 * vÀrde1 + vÀrde2

PermalÀnk
Medlem
●
Skrivet av adzer:

@ZonYx: Du skall rÀkna ut vilka tvÄ vÀrden pÄ index 1 och 2 som ger det förvÀntade vÀrdet pÄ index 0.
NÀr du vÀl har dessa sÄ Àr svaret de söker 100 * vÀrde1 + vÀrde2

Ex:
FörvÀntat vÀrde: 19690720

"Each of the two input values will be between 0 and 99"
vÀrde1=99
vÀrde2=99

(100*99)+99 = 9999
*****************
"the number of values in the instruction; until you add more instructions to the computer, this is always 4"
Vad gör sista parametern?

Dold text

Jag hÀnger inte med.

PermalÀnk
Medlem ★
●

@ZonYx: Ok hÀr kommer lite mer handfasta tips.

Enklast Àr om du gör din lösning ifrÄn del1 som en funktion som tar emot tvÄ vÀrden. index1(noun) och index2(verb). Det Àr dessa som Àr 12 och 2 i första uppgiften. I del2 vill vi kunna testa olika parametrar.

Testa sedan alla kombination av noun och verb mellan 0 och 99 och se vilken kombination som ger index0 pÄ 19690720. Detta kan du tex göra med 2 nÀstlade loopar.

NÀr du vÀl har hittar korrekt vÀrden pÄ noun och verb sÄ Àr svaret de söker 100 * noun + verb.

Dold text
PermalÀnk
Medlem ★
●

Jag ska inte koda nÄt (för det kan jag inte), men jag Àr ÀndÄ nyfiken. Jag tycker bara att det saknas information i första uppgiften. Det stÄr inte hur mÄnga moduler man ska rÀkna pÄ. SvÄrt att svara utan att veta indatat...

Visa signatur

Moderkort: Gigabyte X570 Aorus Master | CPU: AMD Ryzen R9 5900X | CPU-kylare: Noctua NH-D15 chromax.black | RAM: Corsair Vengeance LPX 64 GB (4x16) DDR4-3600 CL18 | GPU: Gigabyte RTX 4080 Eagle OC | SSD: 2 x Samsung 970 EVO Plus 1 TB NVMe + Kingston A400 480 GB + Samsung QVO860 1 TB | PSU: EVGA SuperNOVA G2 1000 W Gold | Chassi: Lian Li O11 Dynamic XL | SkÀrm: BenQ PD3200U @ 3840x2160 + ASUS ROG Strix XG32VQ @ 2560x1440 | Tangentbord: Corsair K68 RGB Cherry MX Red | Mus: Logitech MX Master 2S

PermalÀnk
Medlem ★
●

@cyklonen: LÀngst ned pÄ sidan med uppgiften sÄ finns en lÀnk "get your puzzle input.". Det Àr denna data du skall utgÄ ifrÄn.