Inlägg

Inlägg som Mickur har skrivit i forumet
Av Mickur

Woohoo! Inet's shipping is so reliable, they're basically just shipping soap in a box and calling it a computer! I mean, who needs a functional product when you can have a wet, soggy mess that's been sitting in a box with a hole in it? It's like they're trying to break some sort of record for most creative way to ruin a customer's day!

And the best part? It's not even a unique problem! They've managed to repeat the same mistake TWICE! I'm starting to think they're just a team of genius soap-ologists, carefully crafting each box to be just soapy enough to ruin a customer's computer. Who needs quality control when you can have soap control?!

I'm sure Postnord is thrilled to be involved in this soap-filled disaster. I mean, who needs a functioning postal service when you can just have a bunch of soggy cardboard and soap? It's like they're competing in some sort of bizarre, soap-themed Olympics!

In short, Inet's shipping is a soap opera... and not the good kind. More like the kind that makes you want to take a long, hot shower to wash away the disappointment.

Av Mickur

Och där tappade dom bort nästa försändelse. "Levererat till brevlåda", men brevlådan är tom...

Av Mickur

Mina linser kom fram till slut, över två veckor försenat. Kartongen ser inte vacker ut. Den är öppnad/trasig och min adress är överstruken och ersatt med en annan. Känns jävligt suspekt faktiskt. Jag antar att dom bytte tillbaka till min riktiga adress (som var den som stod på från början) när jag kontaktade dom om det här.

Det är fan katastrof, jag har ingen aning hur dom fick för sig att byta adress och lär inte få något svar på det heller. Något försök att stjäla värdefulla saker eller bara... jävligt inkompetent?

Av Mickur
Skrivet av Joakim Ågren:

Det kan nog dröja ända till tisdag ifall det ska till ombud . Fast det vanliga för varubrev som är för stora för lådan att det istället hängs som påse på lådan eller på dörren.

Läs igen. Paketet är inte för stort. Dom har helt enkelt inte ens försökt leverera hem till mig. Och istället för att lämna det på rätt utlämningsställe så lämnade dom det på andra sidan stan istället, därav Postnords svar i sin chatt. Och ja, 1-2 vardagar från idag blir mycket riktigt på tisdag.

Edit: Här är en bild från förra gången jag beställde linser och det "inte kunde levereras". Jag ser inte problemet.

Av Mickur
Skrivet av Joakim Ågren:

Din försändelse har troligen en skadad barcode och måste därför avläsas manuellt för att hamna i rätt flöde därav förseningen.

Ja, jag vet inte ännu. Gick för att hämta ut på närmaste ICA, men där fanns det inte.

Av Mickur
Skrivet av Xeonist:

Det förutsätter ju att dom är skickade med en tjänst som får läggas i brevlåda..

Av Mickur

Önskar jag kunde säga att det här var ett undantag, men det är alltid något krångel. Beställt linser till mina ögon, här är resan dom tagit. (Får utan problem plats i mitt postfack, så förstår inte varför man inte bara levererade säg... första dagen.)

Av Mickur

Mitt första (och sista) reklamationsärende hos Webhallen var ingen höjdare. Blev inte många rätt där inte.

Av Mickur

Man blir ju lite lagom less på att Telia har monopol i den fastighet man bor i... Tänkte precis teckna nytt, men så har dom slängt på en startavgift på 400:-? Nästan så man kör på ett mobilt bredband från annan leverantör istället i ren protest...

Av Mickur

Postnord har skitit fullständigt i att leverera paket hem till mig under lång tid nu. Får aldrig något svar varför. Till och med småsaker som går ner i postfacket "kan inte levereras" och hamnar till slut hos ett ombud.

Det är tamigfan ren katastrof.

Av Mickur
Skrivet av arjansbralla:

varför gör klarna det? beloppet drogs väl först av när allt var verifierat hos foxway?

Ja, jag vet ingenting om vad som händer. Och det verkar inte Klarna eller Samsung göra heller...

Tog det på tre månaders delbetalning och när allt var klart och 100% betalt dök en ny faktura upp i Klarna-appen på det värde som mobilen hade.

Av Mickur

Jag fick precis en faktura på Klarna på värdet min mobil hade, den är ju också skoj! Klarna skickar mig bara vidare till Samsung som kan ha den sämsta kundsupporten som finns.

Aldrig mer Samsung, det här var droppen.

Edit: Samsung ska kontakta Foxway och återkomma. Får se hur det går!

Av Mickur

Varit borta ett par dagar och började precis kika på dag 16. Jag känner nog också att det börjar bli lite för rörigt och tidskrävande för att jag ska orka med mer.

Även om jag tror jag kommit på en lösning på del 1 så vågar jag inte ge mig på den, jag vet hur mycket småfel man brukar behöva leta efter. :')

Av Mickur

Dag: 15
Språk: C#
Den där var inte nådig. Tog väldigt mycket tid för att hitta småfel jag gjort i koden, säkert långtifrån optimalt.

using System.Diagnostics; using AoCUtils; Console.WriteLine("Mickur's Advent of Code 2022 - Day 15!"); // Setup var input = File.ReadAllLines("input.txt"); var sensors = new List<Sensor>(); var beacons = new List<Beacon>(); // Part one variables var partOneMinX = int.MaxValue; var partOneMaxX = int.MinValue; // Parse input var startTime = Stopwatch.GetTimestamp(); for(var i = 0; i < input.Length; i++) { input[i] = input[i].Replace("Sensor at x=", ""); input[i] = input[i].Replace(" closest beacon is at x=", ""); input[i] = input[i].Replace(" y=", ""); var split = input[i].Split(':'); var sensor = split[0].Split(','); var beacon = split[1].Split(','); var sensorX = AoCParsing.FastIntParse(sensor[0]); var sensorY = AoCParsing.FastIntParse(sensor[1]); var beaconX = AoCParsing.FastIntParse(beacon[0]); var beaconY = AoCParsing.FastIntParse(beacon[1]); var range = ManhattanDistance(sensorX, sensorY, beaconX, beaconY); // Set min and max if (sensorX - range < partOneMinX) partOneMinX = sensorX - range; if (sensorX + range > partOneMaxX) partOneMaxX = sensorX + range; sensors.Add(new Sensor(sensorX, sensorY, range)); beacons.Add(new Beacon(beaconX, beaconY)); } var stopTime = Stopwatch.GetTimestamp(); Console.WriteLine($"Finished parsing in {Stopwatch.GetElapsedTime(startTime, stopTime).TotalMilliseconds} ms"); startTime = Stopwatch.GetTimestamp(); var partOneAnswer = PartOne(2000000); stopTime = Stopwatch.GetTimestamp(); Console.WriteLine($"Part one answer: {partOneAnswer}"); Console.WriteLine($"Finished part one in {Stopwatch.GetElapsedTime(startTime, stopTime).TotalMilliseconds} ms"); startTime = Stopwatch.GetTimestamp(); var partTwoAnswer = PartTwo(4000000); stopTime = Stopwatch.GetTimestamp(); Console.WriteLine($"Part two answer: {partTwoAnswer}"); Console.WriteLine($"Finished part two in {Stopwatch.GetElapsedTime(startTime, stopTime).TotalMilliseconds} ms"); int PartOne(int y) { var counter = 0; for (var x = partOneMinX; x <= partOneMaxX; x++) { var isBeacon = false; foreach (var beacon in beacons) { if (beacon.X == x && beacon.Y == y) { isBeacon = true; break; } } if (!isBeacon) { foreach (var sensor in sensors) { if (sensor.IsInRange(x, y)) { counter++; break; } } } } return counter; } long PartTwo(int size) { long returnValue = -1; var cts = new CancellationTokenSource(); try { Parallel.For(0, size + 1, new ParallelOptions { CancellationToken = cts.Token }, y => { for (var x = 0; x <= size;) { var inRange = false; var xJump = x + 1; for (var i = 0; i < sensors.Count; i++) { if (sensors[i].IsInRange(x, y)) { inRange = true; // Find possible jump if (x < sensors[i].X) { var possibleJump = sensors[i].JumpForward(y); if (possibleJump > xJump) { xJump = possibleJump; } } } } if (!inRange) { returnValue = x * 4000000L + y; cts.Cancel(); } x = xJump; } }); } catch { // ignored } return returnValue; } int ManhattanDistance(int firstX, int firstY, int secondX, int secondY) { return Math.Abs(firstX - secondX) + Math.Abs(firstY - secondY); } class Sensor { public readonly int X; public readonly int Y; private readonly int _range; public Sensor(int x, int y, int range) { X = x; Y = y; _range = range; } public bool IsInRange(int x, int y) { return Math.Abs(X - x) + Math.Abs(Y - y) <= _range; } public int JumpForward(int y) { var yDiff = Math.Abs(Y - y); return X + _range - yDiff + 1; } } class Beacon { public readonly int X; public readonly int Y; public Beacon(int x, int y) { X = x; Y = y; } }

Dold text
Av Mickur

Dag: 13
Språk: C#

using System.Diagnostics; using AoCUtils; Console.WriteLine("Mickur's Advent of Code 2022 - Day 13!"); // Setup var input = File.ReadAllLines("input.txt"); var ParsedInput = new List<object>(); var PartOneAnswer = 0; var PartTwoAnswer = 0; var sw = new Stopwatch(); sw.Start(); // Parsing foreach (var line in input) { if(!string.IsNullOrWhiteSpace(line)) ParsedInput.Add(ParseArray(line)); } sw.Stop(); Console.WriteLine($"Finished parsing in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); sw.Restart(); // Part One var rightIndicies = new List<int>(); for (var i = 0; i < ParsedInput.Count; i += 2) { var leftObjects = ParsedInput[i]; var rightObjects = ParsedInput[i + 1]; var result = CompareArrays((List<object>) leftObjects, (List<object>) rightObjects); if (result == -1) { rightIndicies.Add((i / 2) + 1); } } PartOneAnswer = rightIndicies.Sum(); sw.Stop(); Console.WriteLine($"Finished part one in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); sw.Restart(); // Part Two /*var newStuff = new List<object>(); foreach (var line in input) { if(!string.IsNullOrWhiteSpace(line)) newStuff.Add(ParseArray(line)); }*/ var div1 = ParseArray("[[2]]"); var div2 = ParseArray("[[6]]"); //newStuff.Add(div1); //newStuff.Add(div2); ParsedInput.Add(div1); ParsedInput.Add(div2); ParsedInput.Sort(delegate(object arr1, object arr2) { return CompareArrays((List<object>) arr1, (List<object>) arr2); }); var div1Index = 0; var div2Index = 0; for (int i = 0; i < ParsedInput.Count; i++) { if (ParsedInput[i] == div1) { div1Index = i + 1; } if (ParsedInput[i] == div2) { div2Index = i + 1; } } PartTwoAnswer = div1Index * div2Index; sw.Stop(); Console.WriteLine($"Finished part two in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); Console.WriteLine($"Part One answer: {PartOneAnswer}"); Console.WriteLine($"Part Two answer: {PartTwoAnswer}"); List<object> ParseArray(ReadOnlySpan<char> span) { var depth = 0; var objects = new List<object>(); var tempstring = ""; for (var i = 0; i < span.Length; i++) { char currChar = span[i]; // int is complete, parse it and save it! if (currChar == ',' || currChar == ']') { if (tempstring != "") { var value = AoCParsing.FastIntParse(tempstring); objects.Add(value); tempstring = ""; } } if (currChar == '[') // This is our array! { // If we find a new array on our level, parse it! if (depth == 1) { var toAdd = ParseArray(span.Slice(i)); objects.Add(toAdd); } depth++; } if (currChar == ']') // This is our array! { if (depth == 1) return objects; depth--; } if (char.IsDigit(currChar) && depth == 1) { tempstring += currChar; } } return objects; } int CompareArrays(List<object> array1, List<object> array2) { var maxLength = Math.Max(array1.Count, array2.Count); for (var i = 0; i < maxLength; i++) { // Left is empty, right order! if (i >= array1.Count) return -1; // Right is empty, wrong order! if (i >= array2.Count) return 1; // Both are Ints if (array1[i] is int && array2[i] is int) { var a = (int)array1[i]; var b = (int)array2[i]; if (a < b) { return -1; } if (a > b) { return 1; } } // Make sure both are lists else { var a = array1[i] is List<object> ? (List<object>)array1[i] : new List<object> { (int)array1[i] }; var b = array2[i] is List<object> ? (List<object>)array2[i] : new List<object> { (int)array2[i] }; var result = CompareArrays(a, b); if (result != 0) return result; } } return 0; }

Varning för hemsk kod

Amen fyfan. Spenderat flera timmar på att leta fel i min kod och så visar det sig att jag använt fel variabel i en check. Jaja, nu borde del 1 gå igenom!

Tji fick jag, testdatat går utan problem, men inte min egen input.

Edit: Ah, det är inte bara 1-9 i input nu, attans, mer parsing!

Edit 2: Såja!

Edit 3: Verkar ha gjort precis rätt för del 2

Edit 4: Och där blev båda klara! Koden är dock helt otroligt hemsk.

Hur det gick för mig...
Av Mickur
Skrivet av Pie-or-paj:

Jag får nog titta på eventuella optimeringar senare och tar gärna emot tips på detta men just nu är jag sjukt nöjd att det gick att lösa. Riktigt kul uppgift tyckte jag som aldrig sett något liknande innan.

Det är ett standardproblem (som t.ex. sortering) som kallas "pathfinding" och precis som andra standardproblem finns det standardalgorithmer. Dijkstra är troligtvis den som är mest basic och är den "enklaste" lösningen. A* eller A-star kanske du har hört talas om i samband med spel vilket är en vanlig, mer optimerad optimerad, variant av Dijkstra.

En kodmässigt enklare lösning men lite mindre uppenbar (och ointressant om du pratar om optimeringar) är att se kartan som en graf och göra en BFS. Allt det här är olika graf-sök/navigerings algorithmer där Breadth-first search är en av de mest grundläggande och pathfinding ett specifikt subsätt. Om du pluggar coputer science kommer då få höra om och implementera ett helt gäng olika och defiinitivt dessa tre.

Så är du sugen på att lära dig lite mer och optimera koden rekommenderar jag varmt att försöka implementera Dijkstra utifrån pseudokoden på Wikipedia Ett typexempel på bra att ha gjort någon gång så att du vet vad du ska söka efter när det kommer upp men definitivt inget som en behöver kunna utantill.

Tips/lösning till dag 12

Hemska flashbacks till den tiden man pluggade dåtidens "AI"... Slag under bältet!

Av Mickur

Dag: 12
Språk: C#
Kommentar: Det knepiga var nog att få till pathfindingen, sen var det ganska lätt att lösa även del 2!

using System.Diagnostics; Console.WriteLine("Mickur's Advent of Code 2022 - Day 12!"); // Setup var input = File.ReadAllLines("input.txt"); var sw = new Stopwatch(); sw.Start(); var hill = new Hill(input); sw.Stop(); Console.WriteLine($"Finished creating the grid in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); sw.Restart(); var partOneAnswer = hill.PartOne(); sw.Stop(); Console.WriteLine($"Finished part one in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); sw.Restart(); var partTwoAnswer = hill.PartTwo(); sw.Stop(); Console.WriteLine($"Finished part two in {sw.ElapsedMilliseconds} ms ({sw.ElapsedTicks} ticks)"); Console.WriteLine($"Part One Answer: {partOneAnswer} steps"); Console.WriteLine($"Part Two Answer: {partTwoAnswer} steps"); public class Hill { private readonly int[,] _hillGrid; private readonly int _width; private readonly int _height; private readonly int _startX; private readonly int _startY; private readonly int _endX; private readonly int _endY; private readonly List<(int, int)> _possibleStartingLocations = new List<(int, int)>(); public Hill(string[] input) { _width = input[0].Length; _height = input.Length; _hillGrid = new int[_width, _height]; for (var y = 0; y < _height; y++) { for (var x = 0; x < _width; x++) { if(input[y][x] == 'a' || input[y][x] == 'S') _possibleStartingLocations.Add((x, y)); if (input[y][x] == 'S') { _startX = x; _startY = y; _hillGrid[x, y] = 96; } else if (input[y][x] == 'E') { _endX = x; _endY = y; _hillGrid[x, y] = 123; } else { _hillGrid[x, y] = input[y][x]; } } } } public int PartOne() { return SolveFromLocation(_startX, _startY); } public int PartTwo() { var shortest = int.MaxValue; foreach (var startingPoint in _possibleStartingLocations) { var steps = SolveFromLocation(startingPoint.Item1, startingPoint.Item2); if (steps >= 0 && steps < shortest) shortest = steps; } return shortest; } public int SolveFromLocation(int x, int y, bool isPartTwo = false) { var positionVisited = new HashSet<(int, int)>(); var queue = new Queue<((int, int), int)>(); // Coordinates and steps queue.Enqueue(((x, y), 0)); while (queue.Count > 0) { var positionAndCount = queue.Dequeue(); var posX = positionAndCount.Item1.Item1; var posY = positionAndCount.Item1.Item2; var count = positionAndCount.Item2; var currLocationValue = _hillGrid[posX, posY]; // In Part Two, starting value is always 97. if (isPartTwo && currLocationValue == 96) currLocationValue = 97; if (posX == _endX && posY == _endY) { return count; } if (!positionVisited.Contains((posX, posY))) { positionVisited.Add((posX, posY)); // Move up possible? if (posY > 0 && currLocationValue >= _hillGrid[posX, posY - 1] - 1) queue.Enqueue(((posX, posY - 1), count + 1)); // Move down possible? if (posY < _height - 1 && currLocationValue >= _hillGrid[posX, posY + 1] - 1) queue.Enqueue(((posX, posY + 1), count + 1)); // Move left possible? if (posX > 0 && currLocationValue >= _hillGrid[posX - 1, posY] - 1) queue.Enqueue(((posX - 1, posY), count + 1)); // Move right possible? if (posX < _width - 1 && currLocationValue >= _hillGrid[posX + 1, posY] - 1) queue.Enqueue(((posX + 1, posY), count + 1)); } } return -1; } }

Äcklig och ful kod
Av Mickur

Mitt första försök till att få det att fungera var helt enkelt att bara ta bort divisionen från del 1. Märkte då såklart att en int inte räcker till, så drog till med ulongs. När inte det heller gav rätt output började jag fastna.

Jag förstod ju snabbt att något behövde göras med talen för att hindra dom från att slå över, och det var där det mesta av min tid gick åt. Och som Yoshman säger så är ju deras förväntade lösning helt annorlunda från hur del 1 fungerade. Dels måste man komma på att man behöver komma på en lösning som "bibehåller" deras värden och sedan hitta hur man kan ta sig dit. Och jag kan väl erkänna att jag borde ha hittat lösningen snabbare.

Var inte roligt alls idag...

Mina korta tankar angående del 2

Edit: Jag verkar dock klättra en placering från gårdagen trots att jag vaknade klockan 8 idag.

Av Mickur
Skrivet av Yoshman:

Undrar om jag tog en väldigt omväg... Tänkte att det är tillfälle att lura ut hur man använder BenchmarkDotNet.

Fråga: vilka modifikationer gör du för att testa ditt program? Fick plocka ned ditt program i delar och stoppa in i ramverket för att få det att fungera, tror det ändå blev rätt i slutändan (givet att du kör med 7950X verkar det som Microsoft tillslut fått ordning på ARM64 prestanda, min M1Pro laptop är inte speciellt långt efter din 7950X )

BenchmarkDotNet=v0.12.1, OS=macOS 13.0.1 (22A400) [Darwin 22.1.0] Apple M1 Pro, 1 CPU, 10 logical and 10 physical cores .NET Core SDK=7.0.100 [Host] : .NET Core 6.0.11 (CoreCLR 6.0.1122.52304, CoreFX 6.0.1122.52304), Arm64 RyuJIT DefaultJob : .NET Core 6.0.11 (CoreCLR 6.0.1122.52304, CoreFX 6.0.1122.52304), Arm64 RyuJIT | Method | Mean | Error | StdDev | |------------- |-------------:|----------:|----------:| | SolvePartOne | 31.17 us | 0.060 us | 0.056 us | | SolvePartTwo | 13,830.25 us | 34.804 us | 32.555 us | // * Legends * Mean : Arithmetic mean of all measurements Error : Half of 99.9% confidence interval StdDev : Standard deviation of all measurements 1 us : 1 Microsecond (0.000001 sec)

Pushade mina saker till GitHub, exempel på hur tester + benchmarks ser ut för dag 11 finns här

Hela min kod i benchmark-projektet nedan. Har säkert skett ett gäng förbättringar efter jag postade min kod tidigare. Och enligt mina benchmarks några poster upp så slår min M1 Macbook Air min 7950X, ajajaj. Dock har jag ju dragit ner på single-core till fördel för multi-core på lägre volt på 7950X. Men det är ändå väldigt imponerande för en passivt kyld laptop...

using AoCUtils; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Running; namespace BenchmarkSandbox { public class Program { public static void Main(string[] args) { BenchmarkRunner.Run<Benchmarker>(); } } [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net70)] public class Benchmarker { private string[] input; [GlobalSetup] public void Setup() { input = File.ReadAllLines("inputs/2022-Day11.txt"); } [Benchmark] public List<Monkey> Parse() { return ParseMonkeys(input); } [Benchmark] public ulong SolvePartOne() { var monkeys = ParseMonkeys(input); RunRounds(monkeys, 20, false); SortMonkeys(monkeys); return monkeys[0].Activity * monkeys[1].Activity; } [Benchmark] public ulong SolvePartTwo() { var monkeys = ParseMonkeys(input); RunRounds(monkeys, 10000, true); SortMonkeys(monkeys); return monkeys[0].Activity * monkeys[1].Activity; } public List<Monkey> ParseMonkeys(IReadOnlyList<string> input) { var monkeyList = new List<Monkey>(10); for (var i = 0; i < input.Count; i++) { var monkey = new Monkey(); // Parse items var itemsString = input[i + 1].AsSpan(18).ToString(); var items = itemsString.Split(", "); for (var j = 0; j < items.Length; j++) monkey.Items.Enqueue(AoCParsing.FastULongParse(items[j])); // Parse operation var operation = input[i + 2][23]; var operationValue = input[i + 2][25] == 'o' ? 0 : AoCParsing.FastULongParse(input[i + 2].AsSpan(25)); // Set to 0 if "old", otherwise parse it monkey.Operation = (operation, operationValue); // Parse test monkey.TestDivision = AoCParsing.FastULongParse(input[i + 3].AsSpan(21)); monkey.TestTargets = (AoCParsing.FastIntParse(input[i + 4].AsSpan(29)), AoCParsing.FastIntParse(input[i + 5].AsSpan(30))); monkeyList.Add(monkey); i += 6; } return monkeyList; } public void RunRounds(IReadOnlyList<Monkey> monkeys, int rounds, bool isPartTwo) { ulong divideBy = 3; if (isPartTwo) { divideBy = 1; for (var k = 0; k < monkeys.Count; k++) divideBy *= monkeys[k].TestDivision; } for (var i = 0; i < rounds; i++) // Monkeys for (var j = 0; j < monkeys.Count; j++) // Items while (monkeys[j].Items.Count != 0) { var item = monkeys[j].Inspect(isPartTwo, divideBy); monkeys[item.Item2].Items.Enqueue(item.Item1); } } public void SortMonkeys(List<Monkey> monkeys) { monkeys.Sort(delegate(Monkey m1, Monkey m2) { if (m1.Activity < m2.Activity) return 1; if (m1.Activity > m2.Activity) return -1; return 0; }); } } } public class Monkey { public readonly Queue<ulong> Items = new(10); public ulong Activity; public (char, ulong) Operation; public ulong TestDivision; public (int, int) TestTargets; public (ulong, int) Inspect(bool isPartTwo, ulong divideBy) { Activity++; var item = Items.Dequeue(); switch (Operation.Item1) { case '+': item += Operation.Item2 == 0 ? item : Operation.Item2; break; case '*': item *= Operation.Item2 == 0 ? item : Operation.Item2; break; } if (isPartTwo) item %= divideBy; else item /= divideBy; return item % TestDivision == 0 ? (item, TestTargets.Item1) : (item, TestTargets.Item2); } }

Dold text
Av Mickur
Skrivet av Trihxeem:

Dag 11:
Löste första delen hyfsat lätt men har INGEN aning vad man ska göra i del 2, förstår inte en vad själva problemet är.
Så: I'm out, lycka till ni som fortsätter

Lite ledtrådar ifall du ångrar dig!

Hur stora tal klarar din valda datatyp av? Kan du höja taket? Kan du kanske göra talen du jobbar med mindre så du inte slår i taket?

Dold text