Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Zou het cluster echt snellere cores en sneller geheugen hebben dan? Vergeleken met consumentenhardware zijn clusters meestal snel vanwege de hoeveelheid cores en geheugenbandbreedte, maar leveren in op kloksnelheid en latency. Voor speelgoedprobleemjes als dit zou ik de voorkeur hebben voor hoge kloksnelheid en lage latency,Cranzai schreef op zaterdag 4 december 2021 @ 16:01:
[...]
De cluster zou het wel enigszins sneller maken door de snellere cores en meer/sneller geheugen neem ik aan?
Om nou direct met OpenACC te gaan werken o.i.d is me ook zo wat
Goed punt, de structuren die jij gebruikt heb ik deels ook of in ieder geval geprobeerd. Lukte alleen niet altijd om het te implementeren door de vorm en de datatypes iddDataGhost schreef op zaterdag 4 december 2021 @ 16:04:
[...]
Vaak gaat een groot deel al vanzelf als je de juiste datastructuren kiest, die voor het doel wat je beoogt en de operaties die je vaak doet een snelle looptijd hebben. Iets simpels als het verschil tussen een linked list en een normale list is al O(n) voor element access. Op dezelfde manier is
spoiler:zoeken naar een getal in een array/list O(n) terwijl dat sneller kan met andere structuren
Dan hoef je qua leesbaarheid nog niet eens heel veel in te leveren. Je kan eens een blik werpen op mijn implementatie (dat zijn wel spoilers) en daarna op die van @Soultaker, die weliswaar iets lastiger te lezen is maar nog sneller omdat zijn aanpak nog iets beter/sneller is.
Classes, zoals jouw oplossing, ben ik niet zo bedreven in. Subroutine achtige dingen zoals de oplossing van Soultaker wat meer, alleen had ik het nog niet zo vernuftig voor elkaar qua logica.
Maar bedankt voor de discussie vandaag, weer wat mooie inzichten gedaan
[ Voor 3% gewijzigd door Cranzai op 04-12-2021 17:10 ]
Oh het kan allebei hoor. Classes zijn alleen vaak een manier om bij elkaar horende logica en data bij elkaar te houden. In principe kan je alles omschrijven naar functies, in Python is het ook niet meer dan dat. Het is zelfs behoorlijk expliciet in Python te zien, aangezien het eerste argument van een class function (a.k.a. method) altijd "self" is. Dus object.functie() is dezelfde aanroep als klasse.functie(object), waarbij je object zou kunnen zien als gewoon een dictionary met wat data erin. Uiteindelijk is het niet heel spannend maar als je er nog nooit mee gewerkt hebt moet je dat beeld even correct in je hoofd zien te krijgen.Cranzai schreef op zaterdag 4 december 2021 @ 17:08:
[...]
Goed punt, de structuren die jij gebruikt heb ik deels ook of in ieder geval geprobeerd. Lukte alleen niet altijd om het te implementeren door de vorm en de datatypes idd
Classes, zoals jouw oplossing, ben ik niet zo bedreven in. Subroutine achtige dingen zoals de oplossing van Soultaker wat meer, alleen had ik het nog niet zo vernuftig voor elkaar qua logica.
Zo zou je in de code van Soultaker het een en ander om kunnen schrijven zodat bijv. row_left[i][c] iets wordt als i.row_left[c] waarbij i dan een bingokaart-object is. De logica die nu in zijn hoofdcode staat kan dan verplaatsen naar binnen de bingokaart-klasse, waardoor je bijv. ook tegelijkertijd een ander soort bingokaarten zou kunnen gebruiken (dwars door elkaar zelfs) zonder dat je de hoofdcode aan hoeft te passen, mocht dat ooit een logische toepassing hebben. Bijvoorbeeld als je een andere speler een 6x6-bingokaart geeft met 11 vakjes al afgestreept.
Mijn code is binnen de seconde klaar, maar wel met een verkeerd antwoordDataGhost schreef op zaterdag 4 december 2021 @ 12:32:
[...]
Ik heb wat testinvoer gemaakt voor deel twee, met
spoiler:grotere bingokaarten, deze zijn 100x100. Deel 2 met deze kaarten duurt bij mij zo'n 4 seconden (Python, in een VM op een 11 jaar oude laptop) met als antwoord 3074334900. Ik ben benieuwd hoe snel dat bij jou gaat dan, als je daar zin in hebt
https://sigyn.dataghost.com/aoc/2021/aoc-2021-day3-part2.txt
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Alvast graag gedaan voor de onvermijdelijke keer dat je daar anders nog tegenaan ging lopen deze maandEfBe schreef op zaterdag 4 december 2021 @ 17:23:
[...]
Mijn code is binnen de seconde klaar, maar wel met een verkeerd antwoord(-1220632396). Had een int overflow. Nadat ik de nodige code naar long's had geconverteerd werkt het nu. .NET 6 release build, met file laden/parsen heeft mijn oplossing 318ms nodig
Dat is sneller dan ik had verwacht
Mijn implementatie doet deze in 182ms, en dan heeft hij A en B berekendDataGhost schreef op zaterdag 4 december 2021 @ 12:32:
[...]
Ik heb wat testinvoer gemaakt voor deel twee, met
spoiler:grotere bingokaarten, deze zijn 100x100. Deel 2 met deze kaarten duurt bij mij zo'n 4 seconden (Python, in een VM op een 11 jaar oude laptop) met als antwoord 3074334900. Ik ben benieuwd hoe snel dat bij jou gaat dan, als je daar zin in hebt
https://sigyn.dataghost.com/aoc/2021/aoc-2021-day3-part2.txt
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Het is wel duidelijk, I need to step up my gameDataGhost schreef op zaterdag 4 december 2021 @ 14:47:
[...]
Hm, gek. Ik kon ook niet direct vinden waarom jouw uitkomst niet klopte. Met wat simpele aanpassingen aan je magic numbers (in revisie g3929193) komt er bij mij nog een andere (wederom verkeerde) uitkomst uit, namelijk 3098648098 na 25 seconden. Dus dat is zo mogelijk nog vreemder
PS5 PSN: UnrealKazu
Ben jaloers op de programmeersels die voor part 1 in luttele (sub)second resultaat geven, dat gaat 'm niet worden hier
Als er iemand wat commentaar wil leveren graag
TrailBlazer schreef op zaterdag 4 december 2021 @ 20:55:
spoiler:achteraf had ik geen aparte matrix voor de hits hoeven te maken maar had ik gewoon de waardes van de gevonden posities op nul moeten zetten. Als er dan een kolom of rij 0 was geweest was dat ook voldoende geweest.
Alhoewel... Net jouw code uitgevoerd met mijn input en loopt gewoon netjes. Dus om één of andere reden loopt 't toch goed
[ Voor 10% gewijzigd door ShitHappens op 04-12-2021 21:09 ]
ShitHappens schreef op zaterdag 4 december 2021 @ 20:58:
[...]
spoiler:Relatief gevaarlijke aanname, ik had in m'n te trekken nummers en in de kaarten daadwerkelijke nullen zitten. Dus misschien werkt je oplossing wel met jouw input, maar niet met alle?
Mooiste is denk ik gwn deleties toepassen en dan lege rijen/kolommen checken.
ShitHappens schreef op zaterdag 4 december 2021 @ 20:58:
[...]
spoiler:Relatief gevaarlijke aanname, ik had in m'n te trekken nummers en in de kaarten daadwerkelijke nullen zitten. Dus misschien werkt je oplossing wel met jouw input, maar niet met alle?
https://github.com/martyw/AOC2021/blob/main/day4.py
[ Voor 4% gewijzigd door martyw op 04-12-2021 21:26 ]
Algemene tip, niet alleen voor jou maar ook voor anderen: probeer magic numbers en "magic/copypaste code" (bijv. wat je op regel 10 doet) te vermijden. Als het echt moet is het beter om constanten te gebruiken zodat je die op 1 plek in je code kan wijzigen, mocht deel 2 van een opdracht daar aanleiding toe geven. Dat is niet alleen makkelijker maar zorgt er ook voor dat je minder fouten kan maken bij het aanpassen. Liefst bepaal je dat soort dingen automatisch aan de hand van de input, waar dat logisch is. Er zullen vast opdrachten komen waarbij dit een issue gaat opleveren.TrailBlazer schreef op zaterdag 4 december 2021 @ 20:55:
ben best wel trots op mijn Python baksel uiteindelijk. Voor het eerst met Numpy en matrixen gewerkt
Als er iemand wat commentaar wil leveren graag
Nu maar even
1
2
| ini_set('display_errors', 1); error_reporting(E_ALL); |
Zo scherp als een voetbal!
je bedoelt dat het beter zo kan dus in plaats van die afmeting van die matches matrix te hard coden het zo op te lossen.DataGhost schreef op zaterdag 4 december 2021 @ 21:34:
[...]
Algemene tip, niet alleen voor jou maar ook voor anderen: probeer magic numbers en "magic/copypaste code" (bijv. wat je op regel 10 doet) te vermijden. Als het echt moet is het beter om constanten te gebruiken zodat je die op 1 plek in je code kan wijzigen, mocht deel 2 van een opdracht daar aanleiding toe geven. Dat is niet alleen makkelijker maar zorgt er ook voor dat je minder fouten kan maken bij het aanpassen. Liefst bepaal je dat soort dingen automatisch aan de hand van de input, waar dat logisch is. Er zullen vast opdrachten komen waarbij dit een issue gaat opleveren.
1
2
3
4
5
6
7
8
9
| class Bingo: def __init__(self,card_data): self.card = np.array(card_data) self.shape = self.card.shape #self.matches = np.array([[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]) #self.matches = np.array([[0 for i in range(0,self.shape[1])] for j in range(0,self.shape[0])]) self.matches = np.full(self.shape,0) self.card_won = False |
[ Voor 1% gewijzigd door TrailBlazer op 04-12-2021 22:23 . Reden: np.full is veel makkelijker ]
Waar ik denk dat @DataGhost op doelt is dat je die bingokaart beter kan initialiseren met iets als BINGO_CARD_DEFAULT_STATE. Dan is het voor de lezer duidelijk wat er gaande is. Nu moet jouw opvolger in de toekomst gaan gokken wat je in godesnaam zou bedoelen. Beetje hetzelfde met het gebruik van het getal pi.TrailBlazer schreef op zaterdag 4 december 2021 @ 22:19:
[...]
je bedoelt dat het beter zo kan dus in plaats van die afmeting van die matches matrix te hard coden het zo op te lossen.
Python:
1 2 3 4 5 6 7 8 9 class Bingo: def __init__(self,card_data): self.card = np.array(card_data) self.shape = self.card.shape #self.matches = np.array([[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]) #self.matches = np.array([[0 for i in range(0,self.shape[1])] for j in range(0,self.shape[0])]) self.matches = np.full(self.shape,0) self.card_won = False
Nog wat gerefactored, zit nu op 29 msmartyw schreef op zaterdag 4 december 2021 @ 21:16:
Heb de hitstate in de bingokaart opgenomen, mijn versie draait in ~40ms op mijn core i5-11500@Ubuntu 21.10 (Python 3.9.7)
https://github.com/martyw/AOC2021/blob/main/day4.py
Ik blijf haken op ~46ms(alleen part 2).. matig dus. en de 100x100 van DataGhost duurt 36 minuten.. oeps
Mooi voor vandaag, morgen weer een dag !
Me think, why waste time say lot word, when few word do trick.
Python is single threaded, en mijn i5 is daarin rapper dan jouw Ryzen: https://www.cpubenchmark....Intel-i5-11500/3797vs4238, maar als we nog wat puzzels gaan krijgen waar je ze over de cores kan verdelen win je!YoToP schreef op zaterdag 4 december 2021 @ 23:18:
@martyw jouw code doet er bij mij 36 ms(3800XT@Manjaro) over. (part 1+ part 2)
Ik blijf haken op ~46ms(alleen part 2).. matig dus. en de 100x100 van DataGhost duurt 36 minuten.. oeps
Mooi voor vandaag, morgen weer een dag !
Ook is het wel raadzaam wat te leren over list comprehensions, laat de taal voor je werken in plaats van dat je het zelf doet!
[ Voor 14% gewijzigd door martyw op 04-12-2021 23:37 ]
Idem hier, ik zit op 299ms, en simuleer het hele spel.Varienaja schreef op zaterdag 4 december 2021 @ 15:28:
[...]
Mijn oplossing doet 400ms over jouw 100x100 invoer.![]()
[...]
Bij mijn weten simuleer ik het hele spel en dat duurt echt niet lang.
[...]
https://github.com/Janoz-.../com/janoz/aoc/y2021/day4
Binnen 200ms los ik de 100x100 dataset van @DataGhost op.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Dat bedoelde ik juist niet voor die regelkeeperson schreef op zaterdag 4 december 2021 @ 22:26:
[...]
Waar ik denk dat @DataGhost op doelt is dat je die bingokaart beter kan initialiseren met iets als BINGO_CARD_DEFAULT_STATE. Dan is het voor de lezer duidelijk wat er gaande is. Nu moet jouw opvolger in de toekomst gaan gokken wat je in godesnaam zou bedoelen. Beetje hetzelfde met het gebruik van het getal pi.
Ik heb numpy nooit gebruikt maar als die vanzelf een vierkante matrix met de juiste afmetingen maakt adhv de lijst getallen die je erin stopt, dan ja, dat is precies wat ik bedoel.TrailBlazer schreef op zaterdag 4 december 2021 @ 22:19:
[...]
je bedoelt dat het beter zo kan dus in plaats van die afmeting van die matches matrix te hard coden het zo op te lossen.
[..]
https://github.com/rogier...er/AOC2021/Day04/Day04.fs
Heb relatief lang aan deel 1 gezeten om kennis te krijgen van Array2d in F#. Ook het parsen naar een matrix ging niet van een leien dak. Deel 2 had ik binnen een minuut opgelost door
En ik dacht dat ik voor onderdeel B alleen maar de if x1==x2 || y1==y2 moest weghalen, maar mijn code was toch nog lang niet voorbereid op diagonalen.
Alstublieft: https://github.com/varien...tofcode2021/Puzzle05.java
Siditamentis astuentis pactum.
https://github.com/rverst.../blob/main/Y2021/Day05.cs
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Deze was onverwachts makkeljk.
Deel 2 was super makkelijk, omdat ik in deel 1 al rekening gehouden had met diagonale lijnen van 45 graden. Voor deel 1 had ik al alle diagonale lijnen uit de input gefilterd. Voor deel 2 was de enige wijziging dat ik dat filteren niet meer hoefde te doen.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Een mooiere oplossing dan die van mij :-)Rogier V schreef op zondag 5 december 2021 @ 01:02:
Opgelost!
https://github.com/rogier...er/AOC2021/Day04/Day04.fs
Heb relatief lang aan deel 1 gezeten om kennis te krijgen van Array2d in F#. Ook het parsen naar een matrix ging niet van een leien dak. Deel 2 had ik binnen een minuut opgelost doorspoiler:.List.MinBy met een List.MaxBy te vervangen
Ik ga deze vandaag of morgen nog even aanpassen, want er zitten net iets teveel while-loopjes en mutable in. (en een seq met seq.head opddeze manier gebuiken is gewoon ranzig). Eens kijken of ik een early return kan fabriceren met takewhile. https://github.com/ajeckm...ob/master/Puzzles/day4.fs.
Was weer goed te doen. Ik hou er altijd van om het mooi te maken met wat helpers die ik nog had van vorige edities (zoals Alignment en ranges tussen twee points). Dan is het meteen een eitje en wordt de code lekker clean.
Engineering is like Tetris. Succes disappears and errors accumulate.
Heel veel code-reuse hier. Most alleen wel een angle functie fixen want die was stuk
https://niels.nu
Jouw util functie voor regex parsing is wel elegant, dat moet ik ook maar eens toevoegen, maakt het parsen een stuk duidelijker.Hydra schreef op zondag 5 december 2021 @ 09:18:
En dag 5 in Kotlin
Heel veel code-reuse hier. Most alleen wel een angle functie fixen want die was stukUiteindelijk wel in m'n nopjes met hoe simpel de code eigenlijk is.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Dag 5 in Python
Deel 1 had ik zo, maar deel 2 was even puzzelen. Uiteindelijk toch wel blij met mijn code.
Sorry, ik maak graag code van anderen kapot. Daarom vandaag ook weer een heel simpele "upping the ante":coop schreef op zondag 5 december 2021 @ 09:48:
Lekker wakker worden zo op de zondagochtend.
Dag 5 in Python
Deel 1 had ik zo, maar deel 2 was even puzzelen. Uiteindelijk toch wel blij met mijn code.
spoiler:Door het voorbeeld in deel 2 werd ik op het verkeerde been gezet. Had 1x een fout antwoord nodig voordat ik bedacht dat een diagonaal niet perse met dezelfde indices is. [0,0]->[8,8], maar ook [6,4]->[2,0].
https://sigyn.dataghost.com/aoc/2021/aoc-2021-day5.txt
Oeps, er zat een typo in, dus als je deze binnen een minuut had binnengehaald even opnieuw downloaden
Antwoorden:
Deel 2: 13
[ Voor 6% gewijzigd door DataGhost op 05-12-2021 10:03 ]
Dit heb ik nu toegevoegd, helaas is het in C# niet zo elegant te doen als in Kotlin, dus heb ik tot 6 groups geimplementeerd met wat code duplication, voor een Utility function wel te overzien.Woy schreef op zondag 5 december 2021 @ 09:31:
[...]
Jouw util functie voor regex parsing is wel elegant, dat moet ik ook maar eens toevoegen, maakt het parsen een stuk duidelijker.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
DataGhost schreef op zondag 5 december 2021 @ 10:01:
[...]
Sorry, ik maak graag code van anderen kapot. Daarom vandaag ook weer een heel simpele "upping the ante":
https://sigyn.dataghost.com/aoc/2021/aoc-2021-day5.txt
edit:
Oeps, er zat een typo in, dus als je deze binnen een minuut had binnengehaald even opnieuw downloaden
Antwoorden:
spoiler:Deel 1: 5
Deel 2: 13
Ik moest even mijn datatype aanpassen van int->long, maar verder geen issue. Dat is meestal wel het eerste wat ik bij een opdracht doe, checken welke range de input ( en verwachte output ) ligt om het juiste datatype te kiezen.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ja dat vond ik een beetje overkillWoy schreef op zondag 5 december 2021 @ 10:14:
[...]
spoiler:Zet er dan minstens ook een negatief getal in
Ik moest even mijn datatype aanpassen van int->long, maar verder geen issue. Dat is meestal wel het eerste wat ik bij een opdracht doe, checken welke range de input ( en verwachte output ) ligt om het juiste datatype te kiezen.
https://sigyn.dataghost.com/aoc/2021/aoc-2021-day5-woy.txt
Antwoorden:
Deel 2: 15
Ja, die is ook al best oud. Was er wel klaar me om honderd verschillende splits te hebben in het "lees de input" stukje, en dan is dit toch wel een stuk duidelijkerWoy schreef op zondag 5 december 2021 @ 09:31:
Jouw util functie voor regex parsing is wel elegant, dat moet ik ook maar eens toevoegen, maakt het parsen een stuk duidelijker.
https://niels.nu
Woy schreef op zondag 5 december 2021 @ 10:10:
helaas is het in C# niet zo elegant te doen als in Kotlin
Join the dark side Komrad!
[ Voor 8% gewijzigd door Hydra op 05-12-2021 10:59 ]
https://niels.nu
Had eigenlijk verwacht dat we met de onderzeeër door een pad met minste weerstand moesten sturen naar een andere plek, maar die puzzels zullen later wel komen
[ Voor 37% gewijzigd door Diderikdm op 05-12-2021 11:48 ]
Geen array gebruikt, maar kan slimmer mbt direction
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Grappig dat je voor elke dag een aparte module maakt
https://niels.nu
Okee. Ik heb het zelf nog niet gebouwd dus ik heb de uitkomsten met de hand berekend, hopelijk kloppen zeMrHaas schreef op zondag 5 december 2021 @ 10:53:
Als je echt the ante wil uppen, voeg dan lijnen toe met lengte van > 10**9 zodat je ook heel andere oplossing moet bouwen
https://sigyn.dataghost.c...oc-2021-day5-realshit.txt
Antwoorden (denk ik):
Deel 2: 456789012345678901234568052
Dat ik de opdracht ook nog in andere talen uit wil proberen en zo alles een beetje per dag bij elkaar staat. Buiten dat niet echt een reden.Hydra schreef op zondag 5 december 2021 @ 11:58:
[...]
Grappig dat je voor elke dag een aparte module maaktWat is de reden daarvoor?
DataGhost schreef op zondag 5 december 2021 @ 12:23:
[...]
Okee. Ik heb het zelf nog niet gebouwd dus ik heb de uitkomsten met de hand berekend, hopelijk kloppen ze
Er is een O(n^2) oplossing mogelijk als je er vanuit gaat dat er geen collineaire lijnen zijn waarbij je van elke 2 lijnen de intersectie bepaalt (in closed-form). Helaas zitten er al collineaire in de sample input dus daar kan je niet vanuit gaan. Je zou iets kunnen verzinnen om die collineaire segmenten apart te behandelen denk ik?
Misschien als ik straks nog tijd heb
Ik heb al een idee en al werkend voor deel 1, maar inderdaad niet sneller dan O(n^2).MrHaas schreef op zondag 5 december 2021 @ 12:36:
[...]
spoiler:Deze werkt idd niet op de standaard O(m*n) oplossing waar n het aantal lijnen is en m de maximale lengte.
Er is een O(n^2) oplossing mogelijk als je er vanuit gaat dat er geen collineaire lijnen zijn waarbij je van elke 2 lijnen de intersectie bepaalt (in closed-form). Helaas zitten er al collineaire in de sample input dus daar kan je niet vanuit gaan. Je zou iets kunnen verzinnen om die collineaire segmenten apart te behandelen denk ik?
Misschien als ik straks nog tijd heb
Deze opdracht was weer erg fijn om te doen in een functionele taal (ik vrees de latere opdrachten).Woy schreef op zondag 5 december 2021 @ 10:10:
[...]
... helaas is het in C# niet zo elegant te doen als in Kotlin ...
Vast subjectief, maar ik vind dit eindresultaat ook best elegant.
How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.
https://github.com/CodeEn...eer/aoc/aoc2021/Day4.java
Vanmiddag nog dag 5 doen.
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
MrHaas schreef op zondag 5 december 2021 @ 12:36:
[...]
spoiler:Deze werkt idd niet op de standaard O(m*n) oplossing waar n het aantal lijnen is en m de maximale lengte.
Er is een O(n^2) oplossing mogelijk als je er vanuit gaat dat er geen collineaire lijnen zijn waarbij je van elke 2 lijnen de intersectie bepaalt (in closed-form). Helaas zitten er al collineaire in de sample input dus daar kan je niet vanuit gaan. Je zou iets kunnen verzinnen om die collineaire segmenten apart te behandelen denk ik?
Misschien als ik straks nog tijd heb
Je vergeet een case die de boel heel erg lelijk maakt en ook al in de testset op AoC zelf voorkomt.Diderikdm schreef op zondag 5 december 2021 @ 13:42:
[...]
spoiler:Dit heb ik niet gebruikt in mijn oplossing, maar je zou idd per lijn kunnen checken of de vector gelijk is aan een andere lijn, en de waarde van x (of y) op het nulpunt van de y (of x)-as gelijk is aan elkaar. Vervolgens een check of de hooste/laagste waarde van de een groter/kleiner is dan de kleinste/grootste waarde van de ander voor beide lijnen en vervolgens een min-max berekening van de start-eind coordinaten van beide lijnen (als ze overlap hebben), als je hier voor de andere lijnen de intersectie-coordinaten (als die er zijn) aan toevoegt, hoef je inderdaad vermoedelijk niet de gehele range te computen en werkt dit voor grote getallen voor (x,y) naar waarschijnlijkheid ongeveer even snel als voor kleinere getallen.
Welke case bedoel je hierin? Ik zie m zo snel nietDataGhost schreef op zondag 5 december 2021 @ 13:50:
[...]
Je vergeet een case die de boel heel erg lelijk maakt en ook al in de testset op AoC zelf voorkomt.
Diderikdm schreef op zondag 5 december 2021 @ 13:56:
[...]
Welke case bedoel je hierin? Ik zie m zo snel niet
Diderikdm schreef op zondag 5 december 2021 @ 14:02:
[...]
spoiler:Ah True.. Al zou je dat wel kunnen afvangen door het gebruik van een set
Ik zal het later vandaag/morgen proberen, heb nu geen tijd meer om het te schrijven. Is wel een leuke testcaseDataGhost schreef op zondag 5 december 2021 @ 14:04:
[...]
spoiler:Probeer dat maar eens op de laatste testinvoer die ik gemaakt heb, ik denk dat je geheugen te klein is
Mijn code deed er eerst 60+ seconden over om een antwoord uit te spugen. Daar mijn sterretjes voor vandaag mee verdiend.
Tijd is nu 56 ms.
Eerste input van DataGhost in 1 keer overleefd.
de Sh!t input is nog bezig, zal die er ooit komen? zal het vanavond wel zien.
github dag5 p2
Me think, why waste time say lot word, when few word do trick.
Oh boy... Ik had ooit een oplossing geschreven die perfect werkte, maar toen we die in productie hadden gezet had die niet de verwachte performance. De hoeveelheid RAM was niet voldoende waar door het OS geheugen ging pagen. En dat realiseerde ik me pas toen we de interne cache op grote 0 zetten. Zonder paging deed het systeem het binnen 45 seconden ipv 900 seconden. Zelfs bij het testen van kleinere oplossing (zonder paging) was het systeem sneller. Les toen was: RAM (en paging) vermijden als je het met de CPU-cache ook kan zelfs al kost het meer CPU cycles.DataGhost schreef op zaterdag 4 december 2021 @ 14:39:
[...]
Als het gaat om grote O-notatie van looptijden maakt de omgeving bijna niks meer uitIk heb een andere oplossing uit dit topic getest op mijn nieuwe input en dat duurde ruim 33 minuten
Die van Kazu heb ik moeten aanpassen en die gaf na 25 seconden het verkeerde antwoord, dus dat ligt of aan mij of niet. Met de "verkeerde aanpak" ben je in ieder geval een orde van grootte (of twee) langer bezig en dan gaat geen snelle CPU je helpen. Ook staat in about van AoC dat alle oplossingen maximaal 15 seconden nodig hebben op 10 jaar oude hardware. Bij in ieder geval de wedstrijden waaraan ik heb meegedaan (BAPC en NWERC) was algoritmische complexiteit van zeer groot belang en moest je oplossing eigenlijk binnen een paar seconden eruit komen rollen anders werd 'ie niet goedgerekend.
En recentelijk had ik een algorithme geschreven waarbij ik er van uit ging dat er meerdere cores aanwezig waren. Dat had die wel op acceptatie, maar niet op productie. Dus daarbij laat ik de cache resultaten opslaan in de database. Toen ging de response tijd van 30 seconden terug naar 0.1 seconde.
Wat ik probeer te zeggen is dat de omgeving wel degelijk een grote invloed heeft op wat je schrijft.
Gezien de huidige datasets zeer klein zijn is naiefe oplossing in mijn ogen vaak ook de meest pragmatisch.
No offense taken. Het netjes maken en optimaliseren doe ik wanneer nodig is. Mijn grootste ergernis is telkens de parser. Daar jeuken mijn handen elke keer.Als ik jouw code zo zie (nofi, qua code prima maar qua tijdscomplexiteit ziet het er niet heel snel uit) wil ik je daarom uitdagen om het binnen 15 seconden te laten lopen op welke hardware dan ookMisschien dat je daar wel meer zin van krijgt om het "netjes te maken"
Absoluut, maar zoals een beroemde schrijfer ooit zei: Sorry voor deze lange brief, ik had weinig tijd.Edit: hoewel snelle code meestal niet heel netjes/duidelijk is voor een lezer. Maar het kan wel.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
1
2
3
4
5
6
7
8
9
10
| .......1.. ..1....1.. ..1....1.. .......1.. .112111211 .......... .......... .......... .......... 222111.... |
1
2
3
4
5
6
7
8
9
10
| .........2 ....1....2 .11.1....2 ....2....1 ....1....1 ....1....1 ....1..... 11112..... ....1..... ....1..... |
Je grid is 90 graden gedraaid en dat komt omdat je eerst over X loopt en dan over Y loopt. Draai die twee for-loops om en je hebt het goeie resultaat.ShitHappens schreef op zondag 5 december 2021 @ 14:59:
Lekker dit.... Part 1 goede oplossing gevonden, maar loop klem op Part 2.
spoiler:Kom ik er nu net achter, dat volgens het voorbeeld van part 1 het grid er zo uit zou moeten zien:
code:
1 2 3 4 5 6 7 8 9 10 .......1.. ..1....1.. ..1....1.. .......1.. .112111211 .......... .......... .......... .......... 222111....
spoiler:Echter ziet dan mijn grid eruit als:
code:
1 2 3 4 5 6 7 8 9 10 .........2 ....1....2 .11.1....2 ....2....1 ....1....1 ....1....1 ....1..... 11112..... ....1..... ....1.....
spoiler:Wat dus alsnog een correct antwoord geeft voor Part 1, maar met de diagnoalen van Part 2 er dusdanig iets fout gaat dat het antwoord niet klopt
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Ja, mijnes gaat kapot op jouw upping-the-ante input. Maarja, dat was ook te verwachtenDataGhost schreef op zondag 5 december 2021 @ 12:38:
[...]
Ik heb al een idee en al werkend voor deel 1, maar inderdaad niet sneller dan O(n^2).
Engineering is like Tetris. Succes disappears and errors accumulate.
Is het normaal dat de input voor part 1 en 2 altijd hetzelfde blijft? Ik had eigenlijk verwacht dat part 2 met een veel moeilijkere input zou komen precies om de simpele "doe maar gewoon bruteforce loop" oplossingen vast te laten lopen. Misschien komt dit later nog? Ik probeer nu in part 1 altijd al iets te doen wat redelijk efficient is maar het blijkt tot nu toe nooit nodig.
Caching telt niet. In ieder geval niet bij het redeneren over algoritmische looptijden dmv grote-O notatie. Wat was je oplossing geweest als het uitrekenen van de response bij lege cache 2 jaar had geduurd? Gewoon 2 jaar laten rammelen en het resultaat cachen zodat het er daarna binnen 0.1 seconden eruit komt rollen? Dat verandert verder helemaal niks aan de grote-O performance van het algoritme zelf, en bij een andere input kan je weer opnieuw gaan rekenen. Daarom maakt de omgeving voor het redeneren daarmee helemaal niet uit. Het is geen exacte tijdsduur die ermee wordt aangegeven, maar een verwachting voor hoe de looptijd verhoudingsgewijs toeneemt bij toenemde grootte van input. Maar als je toch graag met absolute tijden werkt, kan je grofweg zeggen dat een O(n2)-algoritme wat 1ms per stap nodig heeft een input van 5x5 in 625ms verwerken, voor een input van 100x100 al 27 uur nodig heeft en 1000x1000 kost 31 jaar. Een O(n)-algoritme is voor 5x5 in 25ms klaar, voor 100x100 in 10 seconden en voor 1000x1000 in iets meer dan een kwartiertje. Cache gaat je hier op geen enkele manier mee helpen. Ook cores niet. O(n2) op 1 core "is O(n2/4)" wat gewoon weer neerkomt op O(n2) want de functie groeit alsnog verhoudingsgewijs even hard. "Dezelfde looptijd" dus.DevWouter schreef op zondag 5 december 2021 @ 14:58:
[...]
Oh boy... Ik had ooit een oplossing geschreven die perfect werkte, maar toen we die in productie hadden gezet had die niet de verwachte performance. De hoeveelheid RAM was niet voldoende waar door het OS geheugen ging pagen. En dat realiseerde ik me pas toen we de interne cache op grote 0 zetten. Zonder paging deed het systeem het binnen 45 seconden ipv 900 seconden. Zelfs bij het testen van kleinere oplossing (zonder paging) was het systeem sneller. Les toen was: RAM (en paging) vermijden als je het met de CPU-cache ook kan zelfs al kost het meer CPU cycles.
En recentelijk had ik een algorithme geschreven waarbij ik er van uit ging dat er meerdere cores aanwezig waren. Dat had die wel op acceptatie, maar niet op productie. Dus daarbij laat ik de cache resultaten opslaan in de database. Toen ging de response tijd van 30 seconden terug naar 0.1 seconde.
Wat ik probeer te zeggen is dat de omgeving wel degelijk een grote invloed heeft op wat je schrijft.
Gezien de huidige datasets zeer klein zijn is naiefe oplossing in mijn ogen vaak ook de meest pragmatisch.
[ Voor 4% gewijzigd door DataGhost op 05-12-2021 15:37 ]
https://github.com/CodeEn...eer/aoc/aoc2021/Day5.java
Ook hier was part 2 redelijk meer van hetzelfde
[ Voor 7% gewijzigd door Creepy op 05-12-2021 15:39 ]
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Ja, de input is voor beide delen altijd hetzelfde.NickThissen schreef op zondag 5 december 2021 @ 15:15:
Is het normaal dat de input voor part 1 en 2 altijd hetzelfde blijft?
https://niels.nu
Het is nog maar de eerste week. Komende week zal het al wat moeilijker worden en vanaf ongeveer de 10e verwacht ik wel echt opdrachten die algoritmisch pittiger en pittiger worden. Delen 1 en 2 staan dan meestal haaks op elkaar qua oplossingsrichting, terwijl de input hetzelfde blijft. Dat is ook gedaan om het wat laagdrempeliger te houden voor mensen die dit nog nooit gedaan hebben, zo kan je langzaam aan complexere dingen maken en uitzoeken in plaats van dat je in het diepe gegooid wordt met geen flauw idee waar te beginnen.NickThissen schreef op zondag 5 december 2021 @ 15:15:
Ik doe voor het eerst mee, gekozen voor Julia omdat ik die taal graag wil leren. Bij de eerste paar opdrachten was ik voornamelijk bezig met basis Julia dingen (90% van de tijd in de input lezen, 10% in de oplossing schrijven) maar op dag 5 ging het al een stuk sneller.
Is het normaal dat de input voor part 1 en 2 altijd hetzelfde blijft? Ik had eigenlijk verwacht dat part 2 met een veel moeilijkere input zou komen precies om de simpele "doe maar gewoon bruteforce loop" oplossingen vast te laten lopen. Misschien komt dit later nog? Ik probeer nu in part 1 altijd al iets te doen wat redelijk efficient is maar het blijkt tot nu toe nooit nodig.
Ik heb wel wat input gemaakt voor vandaag als je daar zin in hebt, waarbij bruteforcen inderdaad niet gaat lukken.
DataGhost in "Advent of Code 2021"
DataGhost in "Advent of Code 2021"
DataGhost in "Advent of Code 2021"
[ Voor 3% gewijzigd door DataGhost op 05-12-2021 15:46 ]
Ik zit nu elke ochtend met de laptop op schoot de puzzel op te lossen
Ik ben wel benieuwd hoe lang ik dat vol kan houden, zodra het langer dan 30 minuten gaat kosten moet ik waarschijnlijk later op de dag ruimte gaan reserveren ervoor.
Dat is wel een hele elegante oplossing idd.Janoz schreef op zaterdag 4 december 2021 @ 13:48:
spoiler:Ik heb helemaal niks gemarkt. Zodra ik de trekkingen inlees maak ik ook een lookup tabel zodat ik van elk nummer weet in welke beurt hij getrokken wordt. Tijdens het inlezen schrijf ik vervolgens de posities in een tabel. Door dan het maximum van een rij of kolom te nemen weet ik in welke beurt deze vol is. Neem ik vervolgens het minimum van alle rijen en kolommen dan weet ik in welke beurt dat bord gewonnen heeft.
Score berekening is vervolgens heel simpel. Weer over dat tabelletje heen en overal waar de score hoger is dan de beurt telt hij wel mee.
Zo kan ik elk bord behandelen en kan ik alle borden negeren die niet de eerste of laatste zijn.
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Dagje 5 ook af.
Anyone who gets in between me and my morning coffee should be insecure.
Wat ga je dan in de ochtend doen samen en waarom ergert je vriendin zich eraan? Anders investeer je ‘s ochtends eerst even wat tijd (meer dan 5 minuten niet nodig denk ik) in dingen samen doen met haar en als je het goed aanpakt heb je daarna wat tijd voor jezelf.Remcoder schreef op zondag 5 december 2021 @ 15:52:
Mijn vriendin begint zich wel alweer te ergeren aan advent of code
Ik zit nu elke ochtend met de laptop op schoot de puzzel op te lossen
Ik ben wel benieuwd hoe lang ik dat vol kan houden, zodra het langer dan 30 minuten gaat kosten moet ik waarschijnlijk later op de dag ruimte gaan reserveren ervoor.
Engineering is like Tetris. Succes disappears and errors accumulate.
PS5 PSN: UnrealKazu
Oké, je mist volgens mij mijn punt: Qua theorie heb je gelijk, maar in de praktijk werkt het niet altijd zo mooi.DataGhost schreef op zondag 5 december 2021 @ 15:16:
[...]
Caching telt niet. In ieder geval niet bij het redeneren over algoritmische looptijden dmv grote-O notatie. Wat was je oplossing geweest als het uitrekenen van de response bij lege cache 2 jaar had geduurd? Gewoon 2 jaar laten rammelen en het resultaat cachen zodat het er daarna binnen 0.1 seconden eruit komt rollen? Dat verandert verder helemaal niks aan de grote-O performance van het algoritme zelf, en bij een andere input kan je weer opnieuw gaan rekenen. Daarom maakt de omgeving voor het redeneren daarmee helemaal niet uit. Het is geen exacte tijdsduur die ermee wordt aangegeven, maar een verwachting voor hoe de looptijd verhoudingsgewijs toeneemt bij toenemde grootte van input. Maar als je toch graag met absolute tijden werkt, kan je grofweg zeggen dat een O(n2)-algoritme wat 1ms per stap nodig heeft een input van 5x5 in 625ms verwerken, voor een input van 100x100 al 27 uur nodig heeft en 1000x1000 kost 31 jaar. Een O(n)-algoritme is voor 5x5 in 25ms klaar, voor 100x100 in 10 seconden en voor 1000x1000 in iets meer dan een kwartiertje. Cache gaat je hier op geen enkele manier mee helpen. Ook cores niet. O(n2) op 1 core "is O(n2/4)" wat gewoon weer neerkomt op O(n2) want de functie groeit alsnog verhoudingsgewijs even hard. "Dezelfde looptijd" dus.
In beide voorbeelden was er een praktisch limiet (IO-bound en CPU-bound) waardoor bij een N boven X er sprake was van een andere big-O (in de praktijk). Dus moest ik in beide gevallen een andere algoritme schrijven die minder efficiënt was bij een kleine N maar efficiënter bij een grote N. Oh en de eerste was een NP probleem en consumeerde zijn eigen output als input.
In andere woorden de Big-O voor memory was dusdanig ongunstig dat ik er goed aan deed om de Big-O voor computational complexity in te leveren zodat ik in de praktijk een betere performance heb.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Counter(pt for tips in parse(file) for pt in points(*tips, diagonals))
https://github.com/Cranza.../2021/day5/python/day5.py
Heel bewust met een dictionary gewerkt zodat ik geen loze data elementen heb zoals in een pre-defined array bijvoorbeeld.
[ Voor 35% gewijzigd door Cranzai op 05-12-2021 19:24 ]
Het eerste probleem waar ik tegenaan liep is dat het ook een lijn teruggeeft als je 2 lijnen hebt die deels over elkaar heen liggen. Dus daar moest ik alsnog los punten van gaan berekenen. Logisch vanuit het perspectief van de library, maar irritant voor deze puzzel.
Daarnaast was de output voor deel 2 niet correct met de intersect. Wel met de testdata, maar niet met de volledige set. Dus dat heb ik maar weer uitgecomment, en dan gaat het wel goed.
Effectief wordt die library dus niet meer gebruikt en is het nu gewoon dom lijntjes interpoleren en in een dict zetten. Afijn, de output klopt in ieder geval
armageddon_2k1 schreef op zondag 5 december 2021 @ 16:07:
Anders investeer je ‘s ochtends eerst even wat tijd (meer dan 5 minuten niet nodig denk ik) in dingen samen doen met haar
Oei, niet meer dan 5 minuten
Hier een inhaalslag moeten doen nadat ik vrijdag niet de tijd had gevonden om ermee bezig te zijn. Zodus dag 3, dag 4 en dag 5 in Rust.
Het is echt terug wennen voor mij om met een taal bezig te zijn waar woorden zoals "heap", "stack", aantal bits voor een getal, unsigned en dergelijke meer weer relevant worden, in mijn dagdagelijkse job als frontender met TypeScript/JavaScript moet ik daar nooit meer bij nadenken
Without nipples, boobs are pointless - 365 project - In mijn hoofd is het alle dagen Kerstmis - What type of bees make milk? Boobies! - What type of bees are scary? BoooOOOOOooobeees! - Cactusliefhebster
Vooralsnog kom ik op https://github.com/martyw/AOC2021/blob/main/day5.py (deel 1 doet er 62 ms over, deel 2 kost 172 ms op m'n i5-11500). Omdat ik wel gestructureerd bezig was/veel boilerplate heb was vandaag deel 2 snel gepiept.
[ Voor 17% gewijzigd door martyw op 05-12-2021 22:17 ]
Mijn oplossing is dezelfde als die van @dcm360.
https://github.com/varien...tofcode2021/Puzzle06.java
Siditamentis astuentis pactum.
Leuk inkomertje voor de maandagochtend
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
dcm360 schreef op maandag 6 december 2021 @ 06:40:
Ah, vandaag toch wel weer 2 'klassieke' problemen, en ik was alsog bij deel 1 eigenwijs genoeg om een oplossing te bouwen die niet werkte voor deel 2
spoiler:Alle vissen los bijhouden loopt ruim te snel uit de klauwen, en aangezien je eigenlijk toch geen interesse hebt in individuele vissen kan je prima alleen de hoeveelheid vissen per dag opslaan. En voor deel 2 worden dat er uiteraard meer dan er in een Int past, maarja, ik was eigenwijs en mocht alsnog even de Int's vervangen door Long's.
Mijn oplossing in java:
Arrays.stream(input.split(",")).mapToInt(Integer::parseInt).forEach(i -> histogram[i]++);
for (int i=0; i<80; i++) {
long laboring = histogram[0];
System.arraycopy(histogram, 1, histogram, 0, 8);
histogram[6] += laboring;
histogram[8] = laboring;
}
return Arrays.stream(histogram).sum();
[/code]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
https://github.com/rverst.../blob/main/Y2021/Day06.cs
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Yup
https://niels.nu
En dan deel 2....
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ik weet wel hoe ik het moet doen, maar ik ben niet scherp genoeg op het moment.
Engineering is like Tetris. Succes disappears and errors accumulate.
[ Voor 5% gewijzigd door coop op 06-12-2021 13:45 ]