🌟 Advent of Code (AoC) 2023 🌟

PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: Matlab
Körtid: 26 s

Orkade inte implementera nÄgot bÀttre Àn bubble-sort, sÄ hastigheten blev dÀrefter.

fid=fopen('day7.txt'); handM = []; while ~feof(fid) line = fgetl(fid); handM = [handM; handNo(line)', str2double(extractAfter(line, " "))]; end handM1 = bubbleSort(handM, @isBetter1); Score1 = sum(handM1(:, end).*[length(handM1(:, end)):-1:1]'); handM2 = bubbleSort(handM, @isBetter2); Score2 = sum(handM2(:, end).*[length(handM2(:, end)):-1:1]'); fclose(fid); disp(['Task 1: ', num2str(Score1)]) disp(['Task 2: ', num2str(Score2)]) function y = isBetter1(hand1, hand2) y = true; a = groupcounts(reshape(hand1, [], 1)); b = groupcounts(reshape(hand2, [], 1)); if max(b)<max(a) return end if numel(a)<numel(b) return elseif (numel(a) == numel(b)) && (max(b)==max(a)) if find(hand1>hand2, 1) < find(hand2>hand1, 1) return elseif isempty(find(hand2>hand1, 1)) return end end y = false; end function y = isBetter2(hand1, hand2) y = true; joker1 = sum(hand1==11); hand1(hand1==11)=1; joker2 = sum(hand2==11); hand2(hand2==11)=1; a = groupcounts(reshape(hand1(hand1~=1), [], 1)); b = groupcounts(reshape(hand2(hand2~=1), [], 1)); if isempty(a) a = 0; end if isempty(b) b = 0; end if (max(b)+joker2)<(max(a)+joker1) return end if max(numel(a), 1)<max(numel(b), 1) return elseif (numel(a)) == (numel(b)) && ((max(b)+joker2)==(max(a)+joker1)) if find(hand1>hand2, 1) < find(hand2>hand1, 1) return elseif isempty(find(hand2>hand1, 1)) return end end y = false; end function hand = handNo(line) hand = char(extractBefore(line, " ")); hand = strrep(hand, "A","E"); hand = strrep(hand, "T","A"); hand = strrep(hand, "J","B"); hand = strrep(hand, "Q","C"); hand = char(strrep(hand, "K","D")'); hand = hex2dec(hand'); end function handM=bubbleSort(handM, isBetter) swap = true; sw=0; while swap swap = false; for k = 1:length(handM(:, 1))-max(1,sw) if isBetter(handM(k+1, 1:end-1), handM(k, 1:end-1)) temp = handM(k, :); handM(k,:) = handM(k+1,:); handM(k + 1,:) = temp; swap = true; end end sw=sw+1; end end

Dold text
PermalÀnk
●

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

Den hÀr kÀndes ganska lagom svÄr. Han inte göra klart del2 innan jag behövde dra men hade en hyffsad idé sen nÀr jag kom hem om hur jag ville göra. Den Àr hemskt ineffektiv men den funkar.

PermalÀnk
●

Dag: 7
SprÄk: C

Jag löser alltid uppgiften sjÀlv innan jag kollar andras lösningar. Det Àr sÀllan jag bryr mig om att skriva om lösningen. Men idag hittade jag en fin kodsnutt att sno idéer frÄn sÄ detta Àr efter att jag fÄtt nÄgra tips som tog mig frÄn 180 rader kod och 50 ms till 123 rader och 5 ms.

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 64 #define MAXHANDS 1000 #define NUMCARDS 13 #define HANDSIZE 5 // Datatype for problem description. typedef struct Hand { char cards[HANDSIZE+1]; int bid; int strength; } Hand; // Global variables for game rules. char CARDS[NUMCARDS+1] = "23456789TJQKA"; char* JOKERCARDS = NULL; // Function declarations. int play(Hand* hands); Hand* parseInput(); void score(Hand* h); int typestrength(Hand* h); int secondarystrength(Hand* h); int countcards(Hand* h, char card); int cmp(const void* a, const void* b); int main() { Hand* hands = parseInput(); int part1 = play(hands); JOKERCARDS = "J23456789TQKA"; // Activates joker rules. int part2 = play(hands); free(hands); printf("Part 1: %i\nPart 2: %i\n", part1, part2); } int play(Hand* hands) { int result = 0, numhands = 0; // Update score for each hand, also count number of hands. while (numhands<MAXHANDS && hands[numhands].cards[0] != '\0') score(&hands[numhands++]); // Sort based on scores, and sum the winnings. qsort(hands, numhands, sizeof (Hand), cmp); for (int i=0; i<MAXHANDS && hands[i].cards[0] != '\0'; ++i) result += (i+1)*hands[i].bid; return result; } Hand* parseInput() { Hand* hands = calloc(MAXHANDS, sizeof (Hand)); int i = 0; char line[MAXLINE]; FILE* fptr = fopen("input", "r"); while (fgets(line, sizeof line, fptr) != NULL) { strncpy(hands[i].cards, line, HANDSIZE); hands[i].cards[HANDSIZE] = '\0'; hands[i++].bid = atoi(line + 6); } fclose(fptr); return hands; } // Calculate and store the relative strength of a hand. void score(Hand* h) { h->strength = typestrength(h) + secondarystrength(h); } // The primary hand strength, based on hand type. int typestrength(Hand* h) { int first = 0; // Number of cards in the first group. int snd = 0; // Number of cards in 2nd first group. int jokers = JOKERCARDS ? countcards(h, 'J') : 0; for (int i=0; i<NUMCARDS; ++i) { if (JOKERCARDS && CARDS[i] == 'J') continue; int num = countcards(h, CARDS[i]); if (num >= first) { snd = first; first = num; } else if (num > snd) snd = num; } if (first + jokers >= 5) return 6e6; // Five of a kind. if (first + jokers >= 4) return 5e6; // Four of a kind. if (first + snd + jokers >= 5) return 4e6; // Full house. if (first + jokers >= 3) return 3e6; // Three of a kind. if (first + snd + jokers >= 4) return 2e6; // Two pair. if (first + jokers >= 2) return 1e6; // One pair. return 0; } // In a given hand h, return the number of cards equal to c. int countcards(Hand* h, char c) { int count = 0; for (int i=0; i<HANDSIZE; ++i) count += h->cards[i] == c; return count; } // The strength based on card values, used to break ties. int secondarystrength(Hand* h) { int str = 0; char* card_order = JOKERCARDS ? JOKERCARDS : CARDS; for (int i=0; i<HANDSIZE; ++i) str = NUMCARDS*str + strchr(card_order, h->cards[i]) - card_order; return str; } // Help function to qsort, compares hand strengths. int cmp(const void* a, const void* b) { return ((const Hand*)a)->strength - ((const Hand*)b)->strength; }

Dold text
PermalÀnk
Medlem ★
●

Dag: 7
SprÄk: Rust
Lösning: Github
Körtid: 4/5 ms (del 1/2)

Blev sent idag p.g.a. annat som kom emellan men var en trevlig uppgift att avsluta dagen med.

PermalÀnk
Medlem
●

Dag: 8
SprÄk: Scala

val path = """8.txt""" val input = Using.resource(Source.fromFile(path))(_.getLines().toVector) lazy val instructions: LazyList[Char] = input.head.to(LazyList) #::: instructions val network = input .drop(2) .map: case s"$from = ($toL, $toR)" => from -> (toL, toR) .toMap def solve(net: Map[String, (String, String)], instr: LazyList[Char], start: String, goal: String => Boolean) = def recur(instr: LazyList[Char], curr: String, steps: Int): Int = if goal(curr) then steps else val next = instr.head match case 'L' => net(curr)._1 case 'R' => net(curr)._2 recur(instr.tail, next, steps + 1) recur(instr, start, 0) // del 1: solve(network, instructions, "AAA", _ == "ZZZ") def lcm(a: Long, b: Long): Long = def gcd(a: Long, b: Long): Long = if b == 0 then a else gcd(b, a % b) (a * b) / gcd(a, b) // del 2: network.keysIterator .filter(_.endsWith("A")) .map(start => solve(network, instructions, start, _.endsWith("Z")).toLong) .reduce(lcm)

Dold text

Dag: 1 & 2
SprÄk: uiua

I ← ⊜□≠@\n.&fras "1.txt" D ← +@0⇡10 W ← {"zero""one""two""three""four""five""six""seven""eight""nine"} /+≡(⋕⊏0_ÂŻ1▜∊:D.°□) I # del1 /+≡(/+×10_1⊏0_ÂŻ1▜≠0./+ↄ∩(×⇡10)∩(≡⊐⌕)D,W€) I # del2

Dold text

I ← ⊜□≠@\n.&fras "2.txt" C ← ⊠(/ↄ≥(⋕⊏1)regex $"(\\d+) _") "rgb" I /++1⊚/↧≀12_13_14 C # del1 /+/× C # del2

Dold text
PermalÀnk
Medlem
●

Dag: 8
SprÄk: TypeScript
Lösning: GitHub

Uppgift 1

import fs from 'fs' const FILE_PATH = './src/resources/08.txt' type NodeValue = string interface Node { value: NodeValue leftNode: NodeValue rightNode: NodeValue } const START_NODE = 'AAA' const FINAL_NODE = 'ZZZ' const TYPE_INSTRUCTION = ['L', 'R'] type Instruction = typeof TYPE_INSTRUCTION[number] export default function findCorrectNode (): void { const lines = fs.readFileSync(FILE_PATH, 'utf-8').trim().split('\n') // First line is our instructions const instructions: Instruction[] = getInstructions(lines[0]) const nodes: Node[] = createNodes(lines) const steps: number = getStepsBetweenNodes(START_NODE, FINAL_NODE, nodes, instructions) console.log('Total step: ', steps) } function getInstructions (line: string): Instruction[] { const instructions: Instruction[] = [] for (const char of line) { if (TYPE_INSTRUCTION.includes(char)) { instructions.push(char) } } return instructions } function createNodes (lines: string[]): Node[] { const nodes: Node[] = [] lines.slice(1).forEach((line, index) => { const values = line.replace(/\s/g, '').split(/[=(),]/).filter(Boolean) if (values.length === 0) return nodes.push({ value: values[0], leftNode: values[1], rightNode: values[2] }) }) return nodes } function getStepsBetweenNodes (start: NodeValue, end: NodeValue, nodes: Node[], instructions: Instruction[]): number { let currentNode: Node = getNodeWithValue(nodes, start) let steps = 0 let currentInstructionIndex = 0 while (currentNode?.value !== end) { steps++ // Move on to the left or right node depending on instruction if (instructions[currentInstructionIndex] === 'R') { currentNode = getNodeWithValue(nodes, currentNode.rightNode) } else if (instructions[currentInstructionIndex] === 'L') { currentNode = getNodeWithValue(nodes, currentNode.leftNode) } currentInstructionIndex++ // Restart if we passed the end of our instructions if (currentInstructionIndex >= instructions.length) currentInstructionIndex = 0 } return steps } function getNodeWithValue (nodes: Node[], value: NodeValue): Node { return (nodes.find((node) => node.value === value) ?? { value: '', leftNode: '', rightNode: '' }) }

Dold text

Uppgift 2
Denna löser uppgiften pÄ ca 30ms. Hade jag försökt bruteforca hade det tagit ca 400 Är...

import fs from 'fs' import { findLCM } from '../helpers/array_helpers' const FILE_PATH = './src/resources/08.txt' type NodeValue = string interface Node { value: NodeValue leftNode?: Node rightNode?: Node } const START_NODE_LAST_VALUE = 'A' const FINAL_NODE_LAST_VALUE = 'Z' const TYPE_INSTRUCTION = ['L', 'R'] type Instruction = typeof TYPE_INSTRUCTION[number] export default function findCorrectNodesSimultaneously (): void { const lines = fs.readFileSync(FILE_PATH, 'utf-8').trim().split('\n') // First line is our instructions const instructions: Instruction[] = getInstructions(lines[0]) const nodes: Node[] = createNodes(lines) const nodeStepsToFinnish: number[] = [] const startNodes: Node[] = nodes.filter((node) => node.value.endsWith(START_NODE_LAST_VALUE)) startNodes.forEach((node) => { nodeStepsToFinnish.push(getStepsBetweenNodes(node, FINAL_NODE_LAST_VALUE, nodes, instructions)) }) console.log('Minimum number of steps: ', findLCM(nodeStepsToFinnish)) } function getInstructions (line: string): Instruction[] { const instructions: Instruction[] = [] for (const char of line) { if (TYPE_INSTRUCTION.includes(char)) { instructions.push(char) } } return instructions } function createNodes (lines: string[]): Node[] { const nodes: Node[] = [] const rawValues: string[][] = [] lines.slice(1).forEach((line, index) => { const values = line.replace(/\s/g, '').split(/[=(),]/).filter(Boolean) if (values.length === 0) return rawValues.push(values) nodes.push({ value: values[0] }) }) rawValues.forEach((value) => { const index = nodes.findIndex((node) => node.value === value[0]) nodes[index].leftNode = nodes.find((node) => node.value === value[1]) nodes[index].rightNode = nodes.find((node) => node.value === value[2]) }) return nodes } function getStepsBetweenNodes (start: Node, end: NodeValue, nodes: Node[], instructions: Instruction[]): number { let currentNode: Node | undefined = start let steps = 0 let currentInstructionIndex = 0 while (true) { steps++ // Move on to the left or right node depending on instruction if (instructions[currentInstructionIndex] === 'R') { currentNode = currentNode?.rightNode } else if (instructions[currentInstructionIndex] === 'L') { currentNode = currentNode?.leftNode } currentInstructionIndex++ // Restart if we passed the end of our instructions if (currentInstructionIndex >= instructions.length) currentInstructionIndex = 0 // We found the end if (currentNode?.value[2] === end) break } return steps }

Dold text
Optimering av kod
Visa signatur

Ryzen 7 7800X3D | Nvidia Geforce RTX 4070 Ti 12gb | Corsair Vengeance DDR5 6000MHz RGB CL30 2x16GB | EVGA Supernova G2 750W | ASUS ROG Strix B650E-F Gaming | Be Quiet! Dark Rock Pro 5
Citera för svar!

PermalÀnk
Medlem
●

Dag 7 (Del 1 & 2)
SprÄk: Java
GitHub

Overengineered och lÄngsamt (dÄlig bubblesort).
Men det funkar.

Dag 8 (Del 1 & 2)
SprÄk: Java
GitHub

Trodde först att en trÀdstruktur skulle vara bra. Lekte runt med detta tills jag insÄg att det var lite onödig. Men det var roligt.
Som andra sade, del 2 behövde LCM för att lösa problemet.

PermalÀnk
●

Dag: 8
SprÄk: C

Idag var jag inte klyftig nog att hitta en snabb lösning. Runt 90 sekunder tar denna pÄ min dator. Jag kom sÄ lÄngt att jag hittar slingor som upprepar sig men sen vet jag inte riktigt vad jag ska göra med den informationen. Kanske det kommer till mig nÀr jag sover.

#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 300 #define MAXLINES 1000 #define NODENAMELEN 4 #define MAXLOOPS 10 typedef struct Node { char name[NODENAMELEN]; struct Node* left; struct Node* right; } Node; typedef struct Problem { char path[MAXLINE]; int pathlen; Node nodes[MAXLINES]; int numnodes; } Problem; int part1(Problem* p); long int part2(Problem* p); Problem* parseInput(char* filename); void findloop(Problem* p, int n, long int* loopstart, int* looplen); Node* setlocation(Problem* p, char* dst); int main() { Problem* prob = parseInput("input"); int p1 = part1(prob); long int p2 = part2(prob); printf("Part 1: %i\nPart 2: %li\n", p1, p2); free(prob); assert(p1 == 16531); assert(p2 == 24035773251517); } int part1(Problem* p) { Node* loc = setlocation(p, "AAA"); Node* dest = setlocation(p, "ZZZ"); int count = 0; while (loc != dest) { loc = p->path[count%p->pathlen] == 'L' ? loc->left : loc->right; ++count; } return count; } /* For part 2, walk from each starting node until we can * identify a loop. For each loop, save its start point and * its length. */ long int part2(Problem* p) { long int* loop = calloc(MAXLOOPS, sizeof (long int)); int* step = calloc(MAXLOOPS, sizeof (int)); // Find nodes ending with 'A' and loop. int numloops = 0; for (int n=0; n<p->numnodes; ++n) if (p->nodes[n].name[2] == 'A') { findloop(p, n, &(loop[numloops]), &(step[numloops])); ++numloops; } while (1) { // Check if we are done. int done = 1; for (int i = 1; i < numloops; ++i) if (loop[i] != loop[0]) done = 0; if (done) break; // Step the loop least farthest along. int smallest = 0; for (int i = 1; i < numloops; ++i) if (loop[i] < loop[smallest]) smallest = i; loop[smallest] += step[smallest]; } return loop[0]; } void findloop(Problem* p, int n, long int* loopstart, int* looplen) { int i = 0; Node* loc = &(p->nodes[n]); while (1) { loc = p->path[i%p->pathlen] == 'L' ? loc->left : loc->right; ++i; if (loc->name[2] == 'Z') { if (*loopstart == 0) *loopstart = i; else if (*looplen == 0) { *looplen = i - *loopstart; return; } } } } // Set location to a name, rather than pointer. Node* setlocation(Problem* p, char* dst) { for (int n=0; n<p->numnodes; ++n) if (strncmp(p->nodes[n].name, dst, NODENAMELEN) == 0) return &(p->nodes[n]); return NULL; } Problem* parseInput(char* filename) { Problem* p = calloc(1, sizeof (Problem)); // Temporary storage for left/right names, do be // replaced with pointers when all names are read. char leftnames[MAXLINES][NODENAMELEN]; char rightnames[MAXLINES][NODENAMELEN]; memset(leftnames, 0, MAXLINES*NODENAMELEN); memset(rightnames, 0, MAXLINES*NODENAMELEN); FILE* fptr = fopen(filename, "r"); if (fgets(p->path, MAXLINE, fptr) != NULL) p->path[strcspn(p->path, "\n")] = '\0'; p->pathlen = strlen(p->path); fgetc(fptr); // Skip blank line. while (3 == fscanf(fptr, "%3s = (%3s, %3s)", p->nodes[p->numnodes].name, leftnames[p->numnodes], rightnames[p->numnodes])) ++p->numnodes; // When all node names are read, go back and update // left/right pointers. for (int i=0; i<p->numnodes; ++i) { for (int j=0; j<p->numnodes; ++j) { if (strncmp(leftnames[i], p->nodes[j].name, NODENAMELEN) == 0) p->nodes[i].left = &(p->nodes[j]); if (strncmp(rightnames[i], p->nodes[j].name, NODENAMELEN) == 0) p->nodes[i].right = &(p->nodes[j]); } } fclose(fptr); return p; }

Dold text
PermalÀnk
Medlem ★
●

Dag: 8
SprÄk: Python

Uppgiften var snÀll sÄ till vida att cykellÀngden sammanföll med lÀngden till första stoppnoden, sÄ jag rÀknar ut den istÀllet för lÀngden pÄ en cykel.

from math import gcd from functools import reduce instructions, maps = tuple(open("input08.txt").read().split('\n\n')) nodes = {l[0:3] : (l[7:10], l[12:15]) for l in maps.splitlines()} def walk(pos, done): steps = 0 while not done(pos): for direction in instructions: pos = nodes[pos]["LR".index(direction)] steps += 1 return steps print(walk('AAA', lambda x: x == 'ZZZ'), reduce(lambda a, b: (a * b) // gcd(a,b), map(lambda x: walk(x, lambda p: p.endswith('Z')), [x for x in nodes.keys() if x.endswith('A')])))

Dold text
PermalÀnk
Hedersmedlem ★
●

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

HÄller med att det var snÀllt att cykellÀngden Àr samma som lÀngden till första som slutar pÄ Z. KÀnner mig dÀrför inte helt nöjd med lösningen, som kÀnns som om den bara fungerar i ett specialfall... men det fungerar ju Ätminstone till problemet man ska lösa för att fÄ rÀtt.

Dold text
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: 8
SprÄk: Rust
Lösning: Github
Körtid: 0.06 / 0.2 ms

Ganska enkel tack vare att ha löst Advent of Code i flera Är nu och omedelbart kÀnde igen tidigare Ärs problem i del 2 men personligen Àr det ett icke-intressant problem iom. att lösningen för denna aldrig dyker upp i verkligheten :/ Tur att det inte brukar vara flera per Är iaf.

PermalÀnk
Medlem ★
●

Dag 8, Uppgift 1
SprÄk TypeScript

const {readFileSync} = require('fs') type NodeChild = { left: string, right: string } const START_NODE = 'AAA' const FINAL_NODE = 'ZZZ' const generateNodes = (input: string[]) => { const nodes = new Map<string, NodeChild>() for(let i=1; i<input.length; i++) { const [parent, child] = input[i].split('=') const [left, right] = child.split(',') nodes.set(parent.replace('=', '').trim(), { left: left.replace('(', '').trim(), right: right.replace(')', '').trim() }) } return nodes } const solver = (input: string[]) => { console.time('solver') const instructions = input[0] const NodesMap = generateNodes(input) let path: string | null = null let i=0 while(path !== FINAL_NODE) { const nodeChild: NodeChild = i === 0 ? NodesMap.get(START_NODE)! : NodesMap.get(path || '')! const currentInstruction: string = instructions[i % instructions.length] path = currentInstruction === 'L' ? nodeChild?.left : nodeChild?.right i++ } console.timeEnd('solver') return i } const input = readFileSync('testInput.txt', 'utf8') .split('\n') .map((line: string) => line.trim()) .filter((line: string) => line.length > 0) console.log(solver(input))

Dold text

Dag 8, Uppgift 2
SprÄk: TypeScript

import { findPathSteps, generateNodes, getLcmFromArray } from "./utils" const {readFileSync} = require('fs') const START_NODE = 'AAA' const FINAL_NODE = 'ZZZ' const solver = (input: string[]) => { const instructions = input[0] const {nodes} = generateNodes(input, START_NODE) return findPathSteps(START_NODE, nodes, instructions, (path: string | null) => path === FINAL_NODE) } const FIRST_NODE_CHAR = 'A' const LAST_NODE_CHAR = 'Z' const solver2 = (input: string[]) => { const instructions = input[0] const {nodes, nodesEndingWithA} = generateNodes(input, FIRST_NODE_CHAR) return getLcmFromArray(nodesEndingWithA.reduce((acc: number[], curr: string) => { acc.push(findPathSteps(curr, nodes, instructions, (path: string | null) => path?.endsWith(LAST_NODE_CHAR) ||false)) return acc }, [])) } const input = readFileSync('testInput.txt', 'utf8') .split('\n') .map((line: string) => line.trim()) .filter((line: string) => line.length > 0) console.log(solver(input)) console.log(solver2(input))

Utils

type NodeChild = { left: string, right: string } export const findPathSteps = (startNode: string, nodes: Map<string, NodeChild>, instructions: string, isFound: (path: string | null) => boolean) => { let path: string | null = null let i = 0 for(i; !isFound(path); i++) { const nodeChild: NodeChild = i === 0 ? nodes.get(startNode)! : nodes.get(path || '')! const currentInstruction: string = instructions[i % instructions.length] path = currentInstruction === 'L' ? nodeChild?.left : nodeChild?.right } return i } export const generateNodes = (input: string[], findNodesStartingWith: string) => { const nodes = new Map<string, NodeChild>() const nodesEndingWithA: string[] = [] for(let i=1; i<input.length; i++) { const [parent, child] = input[i].split('=') const [left, right] = child.split(',') const parentToAdd = parent.replace('=', '').trim() nodes.set(parentToAdd, { left: left.replace('(', '').trim(), right: right.replace(')', '').trim() }) if(parentToAdd.endsWith(findNodesStartingWith)) { nodesEndingWithA.push(parentToAdd) } } return {nodes, nodesEndingWithA} } export function getLcmFromArray(arr: number[]) { let currentLcm = arr[0]; for (let i = 1; i < arr.length; i++) { currentLcm = lcm(currentLcm, arr[i]); } return currentLcm; } function gcd(a: number, b: number) { if (!b) { return a; } return gcd(b, a % b); } function lcm(a: number, b: number) { return (a * b) / gcd(a, b); }

Dold text
Visa signatur

10700K | NVIDIA RTX 3080

PermalÀnk
Medlem
●

Dag: 9
SprÄk: uiua

uiua pad dag 9 exempel

I ← ⊜(⊜⋕≠@\s.)≠@\n.&fras "9.txt" E ← /+≡(;⍱⊃(≡/-◫2|+⊱⇌)(/ↄ≠0):0) E I # del1 E ≡⇌I # del2

Dold text
3 tecken kortare...
PermalÀnk
Datavetare ★
●

Dag: 9
SprÄk: Python3

from itertools import pairwise def parse_oasis(input): return [[int(num) for num in line.split()] for line in input] def prediction(history, predFn): if all([num == 0 for num in history]): return 0 return predFn(history, prediction([b - a for (a, b) in pairwise(history)], predFn)) def prediction_sum(histories, predFn): return sum([prediction(history, predFn) for history in histories]) def prediction_forward(history, subPrediction): return history[-1] + subPrediction def prediction_backward(history, subPrediction): return history[0] - subPrediction def solve(input): histories = parse_oasis(input) print(prediction_sum(histories, prediction_forward)) print(prediction_sum(histories, prediction_backward)) if __name__ == "__main__": solve(open("input/day9.txt").readlines())

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: 9
SprÄk: Nim
Lösning: Github

GÄrdagens uppgift var inte nÄgon favorit.
Dagens var dÀremot vÀldigt trevlig.

Dold text
PermalÀnk
Medlem ★
●

Dag: 9
SprÄk: Rust
Lösning: Github
Körtid: 0.4ms / 0.4ms

Inte helnöjd med hur denna blev. KÀnns som det dels borde gÄ att göra snyggare och dels borde vara mycket enklare att undvika allokeringar av alla mellanstegen, men nu har jag pillat tillrÀckligt sÄ fÄr duga.

PermalÀnk
Medlem ★
●

Dag: 9
SprÄk: Python (lite numpy)

import numpy as np from functools import reduce def diffs(l): while (l[-1] != 0).any(): d = np.diff(l[-1]) l.append(d) return l differences = [diffs([np.fromiter(map(int, l.split()), dtype=np.int_)]) for l in open("input09.txt").readlines()] print(sum([sum(map(lambda a: int(a[-1]), ds)) for ds in differences]), sum(reduce(lambda a, b: b - a, list(map(lambda a: int(a[0]), ds))[::-1]) for ds in differences))

Dold text
PermalÀnk
Medlem ★
●

Är det nĂ„gon som kan förkalra för mig dag 8 del 2? Jag fattar ej hur man ska lösa det med eller hur mgn hjĂ€lper.

Vad jag har:

Jag hÀmtar alla startpunkterna och lÀgger dem i en array sÄ jag har alla som startar pÄ **A dÀr. Sen har jag försökt loopa det men det gÄr ju uppenbarligen inte för det Àr för lÄngt.

Loopen sÄg ut lite sÄhÀr:

while (!allOk){ let currentTurn = instruction[count % instruction.length] let boolList = [] for (let i = 0; i < startPoints.length; i++){ let key = currentTurn === 'R' ? startPoints[i].right : startPoints[i].left; boolList.push(key.endsWith('Z')) startPoints[i] = map[key] } count++; allOk = boolList.every(x => x === true) }

Dold text
Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

PermalÀnk
Medlem ★
●
Skrivet av Pelegrino:

Är det nĂ„gon som kan förkalra för mig dag 8 del 2? Jag fattar ej hur man ska lösa det med eller hur mgn hjĂ€lper.

Vad jag har:

Jag hÀmtar alla startpunkterna och lÀgger dem i en array sÄ jag har alla som startar pÄ **A dÀr. Sen har jag försökt loopa det men det gÄr ju uppenbarligen inte för det Àr för lÄngt.

Loopen sÄg ut lite sÄhÀr:

while (!allOk){ let currentTurn = instruction[count % instruction.length] let boolList = [] for (let i = 0; i < startPoints.length; i++){ let key = currentTurn === 'R' ? startPoints[i].right : startPoints[i].left; boolList.push(key.endsWith('Z')) startPoints[i] = map[key] } count++; allOk = boolList.every(x => x === true) }

Dold text

Antal steg det tar för ett spöke komma fram till en **Z plats Àr en konstant interval/cycle. I exemplet Àr det 2 och 3 t.ex, i min data hade ett spöke nÄgot pÄ 17000, en annan nÄt pÄ 18000, osv.
Om du rÀknar fram intervallet för varje spöke, sÄ kan du göra en sak med dem siffrorna

LedtrÄd 1
Visa signatur

13600KF, RTX 4070 FE, B760I, 32GB DDR4, NR200P

PermalÀnk
Datavetare ★
●
Skrivet av Pie-or-paj:

Dag: 9
SprÄk: Rust
Lösning: Github
Körtid: 0.4ms / 0.4ms

Inte helnöjd med hur denna blev. KÀnns som det dels borde gÄ att göra snyggare och dels borde vara mycket enklare att undvika allokeringar av alla mellanstegen, men nu har jag pillat tillrÀckligt sÄ fÄr duga.

Brydde mig inte om att optimera bort allokeringar, översatte min Python-lösning rakt av till Go. MÀrkligt nog blev den snabbare Àn din Rust-lösning, Go har i.o.f.s. fÄtt en del prestandaoptimeringar senaste Äret och Go-program Àr typiskt nÀstan lika snabba som C, C++ och Rust program (som ur alla praktiska hÀnseenden brukar vara lika snabba om man skriver motsvarande kod).

PĂ„ min dator

Rust

======== DAY 9 ======== Part 1: 2175229206 Part 1 took 0.354792ms Part 2: 942 Part 2 took 0.357041ms

Go

2175229206 Took 144.083”s 942 Took 142.75”s

package main import ( "fmt" "os" "strconv" "strings" "time" ) type PredFn func(history []int, subPrediction int) int func parseOasis(content string) [][]int { histories := [][]int{} for _, line := range strings.Split(content, "\n") { history := []int{} for _, numStr := range strings.Fields(line) { num, _ := strconv.Atoi(numStr) history = append(history, num) } histories = append(histories, history) } return histories } func prediction(history []int, predFn PredFn) int { if allZeros(history) { return 0 } return predFn(history, prediction(pairwiseDiff(history), predFn)) } func pairwiseDiff(xs []int) []int { ys := make([]int, len(xs)-1) for i := 0; i < len(xs)-1; i++ { ys[i] = xs[i+1] - xs[i] } return ys } func allZeros(history []int) bool { for _, num := range history { if num != 0 { return false } } return true } func sumHistories(histories [][]int, predFn PredFn) int { sum := 0 for _, history := range histories { sum += prediction(history, predFn) } return sum } func predictionForward(history []int, subPrediction int) int { return history[len(history)-1] + subPrediction } func predictionBackward(history []int, subPrediction int) int { return history[0] - subPrediction } func main() { content, _ := os.ReadFile("input.txt") histories := parseOasis((string(content))) start := time.Now() part1 := sumHistories(histories, predictionForward) part1Duration := time.Since(start) start = time.Now() part2 := sumHistories(histories, predictionBackward) part2Duration := time.Since(start) fmt.Println(part1) fmt.Println("Took ", part1Duration) fmt.Println(part2) fmt.Println("Took ", part2Duration) }

Go source
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 9, Uppgift 1
SprÄk: TypeScript

FÄr se om jag hoppar pÄ del 2 senare.

const { readFileSync} = require('fs') const findCurrentDiff = (input: number[]) => input.reduce((acc: number[], curr: number, index: number) => { if(index === input.length - 1) return acc acc.push(input[index+1] - curr) return acc }, [] as number[]) const findDiffs = (input: number[], diffs: number[]): number[] => { const currentDiff = findCurrentDiff(input) if(currentDiff.every((number: number) => number === 0)) return diffs if(diffs.length === 0) diffs.push(currentDiff[currentDiff.length - 1]) else diffs.push(currentDiff[currentDiff.length - 1] + diffs[diffs.length - 1]) return findDiffs(currentDiff, diffs) } export const solver = (input: number[][]) => input.reduce((sum, line) => { const diffs = findDiffs(line, []); return sum + line[line.length - 1] + diffs[diffs.length - 1]; }, 0); const input = readFileSync('testInput.txt', 'utf-8') .split('\n') .map((line: string) => line.split(' ')) .map((line: string[]) => line.map((word: string) => parseInt(word))) console.log(solver(input))

Dold text
Visa signatur

10700K | NVIDIA RTX 3080

PermalÀnk
Medlem ★
●
Skrivet av lambdan:

Antal steg det tar för ett spöke komma fram till en **Z plats Àr en konstant interval/cycle. I exemplet Àr det 2 och 3 t.ex, i min data hade ett spöke nÄgot pÄ 17000, en annan nÄt pÄ 18000, osv.
Om du rÀknar fram intervallet för varje spöke, sÄ kan du göra en sak med dem siffrorna

LedtrÄd 1

Tack, jag ska testa det!

Visste ej det var en konstant cykel.

Dold text

EDIT: Löste det nu. Gud vad mycket lÀttare det blev. Jag hade som sagt inte förstÄtt ovan spoiler vilket jag tyckte uppgiften borde sagt.

for (let i = 0; i < startPoints.length; i++) { let count = 0 let currentPoint = startPoints[i] while (!currentPoint.key.endsWith('Z')) { let currentTurn = instruction[count % instruction.length] let currentKey = currentTurn === 'L' ? currentPoint.left : currentPoint.right; currentPoint = list.find(x => x.key === currentKey) count++ } currentPoint.distance = count startPoints[i] = currentPoint } const distancesArray = startPoints.map(x => x.distance); console.log(getLCMOfArray(distancesArray))

lösning
Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

PermalÀnk
Hedersmedlem ★
●

Dag: 9
SprÄk: Python
Lösning: GitHub

RÀtt nöjd med denna! KÀnns ganska elegant. Kul uppgift.

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 9 (Del 1 & 2)
SprÄk: Java
GitHub

Matte.
Tydligen fungerar inte "absolut" för problemet.

PermalÀnk
Medlem
●

Dag: 9
SprÄk TypeScript
Lösning: GitHub

Tyckte om dagens uppgifter. Lagom kluriga

Uppgift 1

import { readFileSync } from 'fs' const FILE_PATH = './src/resources/09.txt' type Sequence = number[] export default function (): void { const lines = readFileSync(FILE_PATH, 'utf-8').trim().split('\n') const sequences: Sequence[] = getValuesArray(lines) const predictions: number[] = [] sequences.forEach((sequence) => { predictions.push(getPrediction(sequence)) }) console.log('Sum of predictions: ', predictions.reduce((acc, next) => acc + next)) } function getPrediction (sequence: Sequence): number { const currentSequenceArray: Sequence[] = [] currentSequenceArray.push(sequence) // Loops until every value of last sequence is 0 while (!currentSequenceArray[currentSequenceArray.length - 1].every((val) => val === 0)) { const currentSeq: Sequence = currentSequenceArray[currentSequenceArray.length - 1] const newSeq: Sequence = [] for (let i = 0; i < currentSeq.length - 1; i++) { const diff = currentSeq[i + 1] - currentSeq[i] newSeq.push(diff) } currentSequenceArray.push(newSeq) } let valueForNextIteration: number = 0 const reversedArr = currentSequenceArray.reverse() for (let i = 0; i < reversedArr.length; i++) { const currentSequence: Sequence = reversedArr[i] const valueToAdd: number = currentSequence[currentSequence.length - 1] + valueForNextIteration valueForNextIteration = valueToAdd } return valueForNextIteration } function getValuesArray (lines: string[]): Sequence[] { const arr: Sequence[] = [] lines.forEach((line) => { const values = line.split(' ') const currentSequence: Sequence = [] values.forEach((value) => { currentSequence.push(parseInt(value)) }) arr.push(currentSequence) }) return arr }

Dold text

Uppgift 2
NĂ€stan identisk med uppgift 1. Ändrar plus till minus samt Ă€ndrar 1 index pĂ„ 1 stĂ€lle

import { readFileSync } from 'fs' const FILE_PATH = './src/resources/09.txt' type Sequence = number[] export default function (): void { const lines = readFileSync(FILE_PATH, 'utf-8').trim().split('\n') const sequences: Sequence[] = getValuesArray(lines) const predictions: number[] = [] sequences.forEach((sequence) => { predictions.push(getPrediction(sequence)) }) console.log('Sum of predictions: ', predictions.reduce((acc, next) => acc + next)) } function getPrediction (sequence: Sequence): number { const currentSequenceArray: Sequence[] = [] currentSequenceArray.push(sequence) // Loops until every value of last sequence is 0 while (!currentSequenceArray[currentSequenceArray.length - 1].every((val) => val === 0)) { const currentSeq: Sequence = currentSequenceArray[currentSequenceArray.length - 1] const newSeq: Sequence = [] for (let i = 0; i < currentSeq.length - 1; i++) { const diff = currentSeq[i + 1] - currentSeq[i] newSeq.push(diff) } currentSequenceArray.push(newSeq) } let valueForNextIteration: number = 0 const reversedArr = currentSequenceArray.reverse() for (let i = 0; i < reversedArr.length; i++) { const currentSequence: Sequence = reversedArr[i] const valueToAdd: number = currentSequence[0] - valueForNextIteration valueForNextIteration = valueToAdd } return valueForNextIteration } function getValuesArray (lines: string[]): Sequence[] { const arr: Sequence[] = [] lines.forEach((line) => { const values = line.split(' ') const currentSequence: Sequence = [] values.forEach((value) => { currentSequence.push(parseInt(value)) }) arr.push(currentSequence) }) return arr }

Dold text
Visa signatur

Ryzen 7 7800X3D | Nvidia Geforce RTX 4070 Ti 12gb | Corsair Vengeance DDR5 6000MHz RGB CL30 2x16GB | EVGA Supernova G2 750W | ASUS ROG Strix B650E-F Gaming | Be Quiet! Dark Rock Pro 5
Citera för svar!

PermalÀnk
Medlem ★
●
Skrivet av Yoshman:

Brydde mig inte om att optimera bort allokeringar, översatte min Python-lösning rakt av till Go. MÀrkligt nog blev den snabbare Àn din Rust-lösning, Go har i.o.f.s. fÄtt en del prestandaoptimeringar senaste Äret och Go-program Àr typiskt nÀstan lika snabba som C, C++ och Rust program (som ur alla praktiska hÀnseenden brukar vara lika snabba om man skriver motsvarande kod).

PĂ„ min dator

Rust

======== DAY 9 ======== Part 1: 2175229206 Part 1 took 0.354792ms Part 2: 942 Part 2 took 0.357041ms

Go

2175229206 Took 144.083”s 942 Took 142.75”s

package main import ( "fmt" "os" "strconv" "strings" "time" ) type PredFn func(history []int, subPrediction int) int func parseOasis(content string) [][]int { histories := [][]int{} for _, line := range strings.Split(content, "\n") { history := []int{} for _, numStr := range strings.Fields(line) { num, _ := strconv.Atoi(numStr) history = append(history, num) } histories = append(histories, history) } return histories } func prediction(history []int, predFn PredFn) int { if allZeros(history) { return 0 } return predFn(history, prediction(pairwiseDiff(history), predFn)) } func pairwiseDiff(xs []int) []int { ys := make([]int, len(xs)-1) for i := 0; i < len(xs)-1; i++ { ys[i] = xs[i+1] - xs[i] } return ys } func allZeros(history []int) bool { for _, num := range history { if num != 0 { return false } } return true } func sumHistories(histories [][]int, predFn PredFn) int { sum := 0 for _, history := range histories { sum += prediction(history, predFn) } return sum } func predictionForward(history []int, subPrediction int) int { return history[len(history)-1] + subPrediction } func predictionBackward(history []int, subPrediction int) int { return history[0] - subPrediction } func main() { content, _ := os.ReadFile("input.txt") histories := parseOasis((string(content))) start := time.Now() part1 := sumHistories(histories, predictionForward) part1Duration := time.Since(start) start = time.Now() part2 := sumHistories(histories, predictionBackward) part2Duration := time.Since(start) fmt.Println(part1) fmt.Println("Took ", part1Duration) fmt.Println(part2) fmt.Println("Took ", part2Duration) }

Go source

Intressant. Är inte ett dugg förvĂ„nad att Go mĂ€ter sig med Rust hĂ€r. Rusts prestandafördelar Ă€r ingen GC och lĂ€gre overhead vid trĂ„dning pga. ingen runtime för "goroutines", men inget av det blir aktuellt hĂ€r. BĂ„da Ă€r singeltrĂ„dat och problemet Ă€r över innan GC hunnit köra. Men att Go kör pĂ„ under halva tiden Ă€r lite förvĂ„nande. Kommer inte att lĂ€gga tiden att profilera som hade krĂ€vts för att förstĂ„ vad och varför, men möjligtvis ger GCn en fördel hĂ€r. Rust behöver freea varje allokering nĂ€r den lĂ€mnar scope för att hĂ„lla sina garantier medan Go antagligen inte behöver göra nĂ„gon free alls för att allt Ă€r över för snabbt och OSet fĂ„r rensa upp istĂ€llet. Har dock svĂ„rt att tro att det förklarar hela skillnaden.
Möjligtvis Àr det bara slump, fem körningar direkt efter varandra visar ganska stora variationer:

❯ cargo run --release run
Finished release [optimized] target(s) in 0.09s
Running `target/release/aoc_2023 run`
No day parameter specified, attempting to run today
Running day 9
======== DAY 9 ========
Part 1: 1974232246
Part 1 took 0.193821ms
Part 2: 928
Part 2 took 0.187184ms

❯ cargo run --release run
Finished release [optimized] target(s) in 0.15s
Running `target/release/aoc_2023 run`
No day parameter specified, attempting to run today
Running day 9
======== DAY 9 ========
Part 1: 1974232246
Part 1 took 0.624884ms
Part 2: 928
Part 2 took 0.634925ms

❯ cargo run --release run
Finished release [optimized] target(s) in 0.09s
Running `target/release/aoc_2023 run`
No day parameter specified, attempting to run today
Running day 9
======== DAY 9 ========
Part 1: 1974232246
Part 1 took 0.395739ms
Part 2: 928
Part 2 took 0.462267ms

❯ cargo run --release run
Finished release [optimized] target(s) in 0.15s
Running `target/release/aoc_2023 run`
No day parameter specified, attempting to run today
Running day 9
======== DAY 9 ========
Part 1: 1974232246
Part 1 took 0.502348ms
Part 2: 928
Part 2 took 0.496514ms

❯ cargo run --release run
Finished release [optimized] target(s) in 0.09s
Running `target/release/aoc_2023 run`
No day parameter specified, attempting to run today
Running day 9
======== DAY 9 ========
Part 1: 1974232246
Part 1 took 0.126647ms
Part 2: 928
Part 2 took 0.125929ms

Dold text

❯ go run test.go
1974232246
Took 388.464”s
928
Took 352.828”s

❯ go run test.go
1974232246
Took 520.51”s
928
Took 452.75”s

❯ go run test.go
1974232246
Took 496.584”s
928
Took 247.923”s

❯ go run test.go
1974232246
Took 285.674”s
928
Took 219.55”s

❯ go run test.go
1974232246
Took 543.054”s
928
Took 421.379”s

Dold text
PermalÀnk
Medlem ★
●

Tyckte jag lyckats med dagens men av nÄgon anledning fÄr jag nÄgot fel. Funkar perfekt för test input och nÀr jag rÀknar manuellt pÄ ex första och sista vÀrdet i inputen sÄ fÄr jag samma matchning som min kod. NÄgons om kan slÄ sig ett getöga?

JS, del 1:

const fs = require('fs'); const allFileContents = fs.readFileSync('input.txt', 'utf-8'); const linesplit = allFileContents.split(/\r?\n/); let createDifferenceArray = array => { let differences = [] if(array.length === 1){ return [0] } for (let i = 1; i < array.length; i++){ differences.push(array[i] - array[i-1]) } return differences } let extrapolate = sequences => { sequences = sequences.reverse(); sequences[0].push(0); for (let i = 1; i < sequences.length; i++){ let a = parseInt(sequences[i-1][sequences[i-1].length-1]) let b = parseInt(sequences[i][sequences[i].length-1]) let newNumber = a + b ; sequences[i].push(newNumber) } let finalValue = sequences[sequences.length-1][sequences[sequences.length-1].length-1]; return finalValue } let result = 0 for (let i = 0; i < linesplit.length; i++){ let lastSequence = linesplit[i].split(' ') let results = [] results.push(lastSequence) while(lastSequence.reduce((partialSum, a) => partialSum + a, 0) !== 0){ lastSequence = createDifferenceArray(lastSequence); results.push(lastSequence) } result+= extrapolate(results) } console.log(result)

Dold text
Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

PermalÀnk
Medlem ★
●
Skrivet av Pelegrino:

Tyckte jag lyckats med dagens men av nÄgon anledning fÄr jag nÄgot fel. Funkar perfekt för test input och nÀr jag rÀknar manuellt pÄ ex första och sista vÀrdet i inputen sÄ fÄr jag samma matchning som min kod. NÄgons om kan slÄ sig ett getöga?

JS, del 1:

const fs = require('fs'); const allFileContents = fs.readFileSync('input.txt', 'utf-8'); const linesplit = allFileContents.split(/\r?\n/); let createDifferenceArray = array => { let differences = [] if(array.length === 1){ return [0] } for (let i = 1; i < array.length; i++){ differences.push(array[i] - array[i-1]) } return differences } let extrapolate = sequences => { sequences = sequences.reverse(); sequences[0].push(0); for (let i = 1; i < sequences.length; i++){ let a = parseInt(sequences[i-1][sequences[i-1].length-1]) let b = parseInt(sequences[i][sequences[i].length-1]) let newNumber = a + b ; sequences[i].push(newNumber) } let finalValue = sequences[sequences.length-1][sequences[sequences.length-1].length-1]; return finalValue } let result = 0 for (let i = 0; i < linesplit.length; i++){ let lastSequence = linesplit[i].split(' ') let results = [] results.push(lastSequence) while(lastSequence.reduce((partialSum, a) => partialSum + a, 0) !== 0){ lastSequence = createDifferenceArray(lastSequence); results.push(lastSequence) } result+= extrapolate(results) } console.log(result)

Dold text

Ser inte exakt vad som gÄr fel, men din kod ger 13730168 som svar pÄ

16 26 35 54 107 245 582 1364 3093 6750 14202 28955 57552 112141 215085 406987 760190 1400714 2542733 4541092 7969025

men den borde ge 13730157, prova att bryta ner den per steg och se om nÄgot uppenbarar sig

Edit:
Kom pÄ det, spoiler för om du vill hitta det sjÀlv. Ovan tips om att bryta ner den per steg kommer att hjÀlpa.

Ett av de sista stegen i ovan exempel Àr

[9, 7, 5, 3, 1, -1, -3, -5, -7, -9]

, din filter funktion baserat pÄ reduce kollar inte om alla vÀrden Àr noll utan om alla vÀrden summerar till noll. Vilket ovan delsteg gör. Vilket gör att du skippar den och missar en -11 i totalen. Om du istÀllet byter ut den till

while (lastSequence.some((partialSum) => +partialSum !== 0)) {

eller liknande sÄ fungerar det.

Dold text
PermalÀnk
Medlem ★
●
Skrivet av Pie-or-paj:

Ser inte exakt vad som gÄr fel, men din kod ger 13730168 som svar pÄ

16 26 35 54 107 245 582 1364 3093 6750 14202 28955 57552 112141 215085 406987 760190 1400714 2542733 4541092 7969025

men den borde ge 13730157, prova att bryta ner den per steg och se om nÄgot uppenbarar sig

Edit:
Kom pÄ det, spoiler för om du vill hitta det sjÀlv. Ovan tips om att bryta ner den per steg kommer att hjÀlpa.

Ett av de sista stegen i ovan exempel Àr

[9, 7, 5, 3, 1, -1, -3, -5, -7, -9]

, din filter funktion baserat pÄ reduce kollar inte om alla vÀrden Àr noll utan om alla vÀrden summerar till noll. Vilket ovan delsteg gör. Vilket gör att du skippar den och missar en -11 i totalen. Om du istÀllet byter ut den till

while (lastSequence.some((partialSum) => +partialSum !== 0)) {

eller liknande sÄ fungerar det.

Dold text

Haha jag hittade faktiskt felet sjÀlv nu och skrattade jÀvligt gott. Fyfan vad man skÀms nu. Tack för test-inputen, jag rÀknade pÄ det manuellt sjÀlv och blev vÀldigt förvirrad varför den bara stoppade. Otroligt korkat villkor av mig.

Edit: Det var ocksÄ allt. Pinsamt feltÀnk.

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

PermalÀnk
Medlem
●
Skrivet av Pelegrino:

Haha jag hittade faktiskt felet sjÀlv nu och skrattade jÀvligt gott. Fyfan vad man skÀms nu. Tack för test-inputen, jag rÀknade pÄ det manuellt sjÀlv och blev vÀldigt förvirrad varför den bara stoppade. Otroligt korkat villkor av mig.

Edit: Det var ocksÄ allt. Pinsamt feltÀnk.

Haha hÀrligt att du löste det sjÀlv. Jag testkörde din kod med min input och fick rÀtt svar. MÀrkligt

Visa signatur

Ryzen 7 7800X3D | Nvidia Geforce RTX 4070 Ti 12gb | Corsair Vengeance DDR5 6000MHz RGB CL30 2x16GB | EVGA Supernova G2 750W | ASUS ROG Strix B650E-F Gaming | Be Quiet! Dark Rock Pro 5
Citera för svar!