Advent of Code 2023

Alle Themen rund um die Erstellung von Programmen
Antworten
FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Advent of Code 2023

Beitrag von FDominicus »

Ich denke, es gehört mehr hierhin.
Also mache ich mal hier weiter:
Vorher war es hier: https://windevforum.de/viewtopic.php?f=7&p=1653#p1653

Und weil ich durchaus mehr Erfahrungen sammeln möchte, habe ich einen Server für die Revisionsverwaltung aufgesetzt.
Wer das - vielleicht - verfolgen möchte:
Adresse: wdserver.fam-dominicus.de
Login AoCAccount
Password: AoC-2023Gu

Rückmeldungen darüber, ob man interessiert wäre, warum ich was / wie gelöst habe, wären nett
Wenn jemand mit in das Repository committen möchte, kann ich sicherlich die Rechte verändern.


Ich weiß nicht, wie viel ich davonmachen werde, mein Ziel ist es verschiedene Ansätze auszuprobieren und
auch relativ viel mit SQL zu erledigen.

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023

Beitrag von FDominicus »

Hier eine andere (brute-force Lösung) für Tag 01
Idee hier: Ich sammele alle Zahlen in einem Feld -> erste und letzte Element ist leicht zu haben
ich benutze Zahlen als Zeichenkette,
die Kombination ist dann nur string1 + String2

Und das kann man dann in eine Zahl verwandeln.

Code: Alles auswählen

PROCEDURE otherSolutionDay01()
	arrNum is array of string
	arrNumberinEnglish is array of string
	arrOfChar is array of string
	sResult is string
	sActChar is string
	nI is int
	sTest is string
	iAsString is string
	
	sTest = "1one2twothree3three"
	FOR i = 1 TO 9 
		arrNum.Add(NumToString(i))		
	END
	FOR EACH item  OF ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine" ]
		arrNum.Add(item)
	END 
	
	sTestLen is int = sTest.Length()
	sCompTo is string
	sTmp is string
	FOR i = 1 TO sTestLen
		let found = False 
		FOR el = 1 TO arrNum.Count
			sCompTo = arrNum[el]
			sTmp = sTest[[i TO i-1+sCompTo.Length()]]
			// Trace("sTmP = "+ sTmp)
			IF sCompTo = sTmp  THEN
				IF el > 0 THEN
					IF el >= 10 THEN
						arrOfChar.Add(NumToString(el-10+1))
						BREAK(1)
					ELSE
						arrOfChar.Add(NumToString(el))
						BREAK (1)
					END 	
				END
			END
		END
	END
	
	let s1 = arrOfChar[1]
	let s2 = arrOfChar[arrOfChar.Count()]
	let combined = StringToNum(s1 + s2)
	sResult = "s1 = %1, s2 = %2, combined = %3"
	sResult = StringBuild(sResult,  s1,s2,combined)
	Trace(sResult)

Ist es besser / schlechter? Frei nach Radio Eriwan oder neumodisch Faktencheckern - kommt d'rauf an.

Der Grundalgorithmus zum Lösen ist hier bei Teil 1 und Teil 2 gleich
Wir suchen linear durch ein Feld und versuchen den Rest einer Zeichenkette dagegen zu testen

Das arbeitet für "1" ... "9" genauso so wie für "one" ... "nine"
Man rechnet halt nur ein wenig mit den Indizes herum.

Was mich "gebissen" hat, die Dokumentation scheint falsch zu sein, was das BREAK angeht
Erste falsche Annahme von mir in den mir bekannten PS bedeutet break man bricht aus dem "innersten" loop aus nicht
Aus allen Schleifen, woanders benutzte man dafür "return" . Nach meinen Versuchen bedeutet BREAK(1), aus dem inneren Loop auszubrechen,
nach der Doku werden die Schleifen von außen nach innen gezählt, also wäre BREAK(2) richtig. Aber das tut halt nicht ...

Meine Meinung zu dieser Lösung - funktioniert, ist aber richtig hässlich. So sollte Code IMHO nicht aussehen. Die Schachtelung von Schleifen und Bedingungen... Da fällt mir nur hässlich zu ein ...

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Advent of Code 2023

Beitrag von Herbert »

Break alleine wird ohne Variable gesetzt. Nicht BREAK(1), sondern einfach BREAK. BREAK(2) springt aus 2 Loops raus (For... oder LOOP oder WHILE usw.). Bei Day02 Part 1 bei meinem Code gut und funktionierend sichtbar.

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023

Beitrag von FDominicus »

Dachte ich auch aber IIRC ging es aus beiden Schleifen raus. Probier das noch mal aus.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Advent of Code 2023

Beitrag von Herbert »

Keinen Abstand verwenden.
BREAK(1) nicht BREAK (1)

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023 Day 02 Part 01

Beitrag von FDominicus »

Ich habe ein bisschen Zeit gefunden und weitergebaut:
Ich möchte im Grund alles aus einer GUI heraus steuern, der Aufbau ist bisher immer gleich:
Daten oder Datei einlesen
Die einzelnen Zeilen bearbeiten,
Ergebnis summieren

für Day02-Part01 sieht meine Lösung so aus:

Code: Alles auswählen

PROCEDURE calcPart01(): int
	gameNumber is int
	sumIDsOfPossibleGames is int
	bRetVAl is boolean
	doubleDotPos is int
	arrSplitColon is array of strings

	FOR EACH item OF arrOfStrings
			(doubleDotPos, gameNumber)  = getDoubleDotPosAndGameNumber (item )
			StringToArray(item[[(doubleDotPos+1) TO ]], arrSplitColon, ";") 
			// Trace("gameNumber = "+gameNumber)
		bRetVAl = isGameSetPossible(arrSplitColon)
		IF bRetVAl THEN 
			sumIDsOfPossibleGames += gameNumber
			arrResult.Add(gameNumber) 
			// Trace("sumIDsPossibleGames = "+ sumIDsOfPossibleGames)
		END 
	END
	RETURN sumIDsOfPossibleGames
Obwohl es mehrere Schleifen gibt, sind die alle "in Methoden ausgelagert" und selbst hier könnte ich das IF noch mit einem
Methodenaufruf wegbekommen:

Eingecheckt im SCM (falls jemand einen Blick darauf werfen möchte)
Muß nun noch den Code für Day 01 umschreiben und weiter Beispiele lösen - mal schauen ...

Was ich auch verwendete, sind reguläre Ausdrücke (ich bin mir nicht sicher, ob das hier wirklich eine gute Idee ist
wir haben als Trenner :, ; und , und man kann die alle mit StringToArray auseinandernehmen ...

Code: Alles auswählen

let bRetVAl = pair.RegexMatch(" *([0-9]+) *(blue|red|green)?", matchNumber, matchColor)
Worauf matche ich hier - auf eine oder keine Leerzeichen, gefolgt von mindestens einer Zahl zwischen 0 und 9 einer beliebigen Anzahl
von Whitespace und dann einem Element aus den Alternativen red, green, blue und das muß genau 1 sein.

Klever, nicht klever, dürfte Geschmackssache sein.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Advent of Code 2023

Beitrag von Herbert »

Ich bin bei Tag 7 angelangt. Allerdings ist mir der Zeitaufwand doch recht hoch (auch Verschiedene Input-Formate). Spannende Problemstellungen aber zu aufwändig für mich momentan.
Daher lasse ich mal die Sache liegen.

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023 Day 02

Beitrag von FDominicus »

Ich habe mir einige Videos zu Lösungen auf youtube angeschaut, nachdem ich meine fertig hatte.
Den Kram kann man so finden: https://www.youtube.com/results?search_ ... +2023+day2
Interessant insgesamt:
- die "Skript"programmierer (Python wird dazu gerne benutzt) , nehmen die Zeichenketten so lange auseinander, bis es Ihnen paßt und verketten Aufrufe ungemein
die Lösungen benutzen alle Schleifen - keine Rekursion
für Day 02 haben wir
1 Schleife um die Nummer des Spiels zu finden
2 Schleife um die einzelnen Spiele zu extrahieren
3) Schleife um eine Ziehung zu extrahieren
4) Schleife um ein paar von Farbe Zahl zu extrahieren

- die Benutzer von funktionalen Sprachen benutzen nur in speziellen Fällen schleifen, bauen
aber ansonsten auf List Funktionen und dem Typ System auf (die Lösung sollte man sich vielleicht eher
aneignen, siehe dazu: Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F# (English Edition) 1. Auflage, Kindle Ausgabe
Ich persönlich finde die F# Lösungen recht gut und auch gut lesbar
- bei Haskell wird es für mich oft unbefriedigend und monadisch (mir scheint gerade das Problem keine Zustandsdaten zu haben eher als problematisch) und ja es ist uns Datenbankbenutzern ja eher fremd. Die Lösung mit der Kombination von Parsern ist aber m.E. wirklich tl..

Was ich mir noch anschauen möchte. Wie lösen es die Leute in C# und Java
Randbemerkung, aber für mich auffällig, bei den Farben benutzen alle die Reihenfolge RGB und das finde ich nun bemerkenswert lustig ..
Ich bilde da keine Ausnahme:

Code: Alles auswählen

resultHashTable =  [ ["red", 0 ],["green",0],["blue",0] ]
Man ist es so gewöhnt ... Und Ich habe überhaupt nicht darüber nachgedacht.


Reguläre Ausdrücke werden nicht verwendet, was ich verstehe, denn die Zeilen kann man locker anders auseinandernehmen und
Man erlebt keine Überraschungen, es ist also eher untypisch, der Input ist sehr restriktive und hat keine "Geräusche".

Was aber keiner macht und daher überarbeite ich es noch mal, keiner benutzt eine Datenbank, nun das werde ich für Day 02 mal angehen
Lösung wird sich dann auch im SCM finden.

Insgesamt ist es für mich wirklich interessant und kurzweilig.

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023 Day02 Part01

Beitrag von FDominicus »

Auch eine Beobachtung, keiner der anderen Teilnehmer hat einfach aufgehört weiter zu zählen, wenn das Ergebnis schon klar war.
Das habe ich getan, aber es beißt mich im 2. Teil ...

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Advent of Code 2023

Beitrag von FDominicus »

Herbert hat geschrieben:
11. Dezember 2023, 18:10
Ich bin bei Tag 7 angelangt. Allerdings ist mir der Zeitaufwand doch recht hoch (auch Verschiedene Input-Formate). Spannende Problemstellungen aber zu aufwändig für mich momentan.
Daher lasse ich mal die Sache liegen.
Ich arbeite immer wieder durch das gleiche Problem, aber anderen Ansätzen:
im Endeffekt möchte ich tabellenbasierte Lösungen haben, mit Speicherung von Daten wie wir es halt als DB-ler machen
Auch möchte ich eine brauchbare UI haben und ich möchte temporäre Zwischenergebnisse abspeichern können und dann
kann ich mich noch im MVC in Windev bemühen

Ich habe zwar andere praktische Probleme, aber für die Übung und Übersichtlichkeit, ist das eine gute Sache
Und genau so wird es aufwendiger. Ich denke, ich habe die Basisstruktur fertig und das ganze auch mit Objekten und Methoden-Vorlagen gelöst.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Advent of Code 2023 Day02 Part01

Beitrag von Herbert »

FDominicus hat geschrieben:
12. Dezember 2023, 09:11
Auch eine Beobachtung, keiner der anderen Teilnehmer hat einfach aufgehört weiter zu zählen, wenn das Ergebnis schon klar war.
Das habe ich getan, aber es beißt mich im 2. Teil ...
Ja, und optimiert wird auch nicht. Gerade beim Problem mit den Samen. Dort kann man von hinten her sehr viele Konstellationen gleich ausschliessen, da die Distanz zu weit weg liegt.
Aber wie gesagt, das braucht für mein Hirm etwas Zeit.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Advent of Code 2023

Beitrag von Herbert »

Die regnerischen Tage zu Weihnachten und leider eine Krankheitszeit meiner Partnerin haben mir Zeit gegeben, noch ein Paar Tage der Adventcodes nachzuholen.
Recht interessant, mal wieder in der Textorientierten Welt zu basteln und auch einige alten Dinge hervorzuholen (z.B. wie schneidet man zwei Geraden?). Ein paar Sternchen habe ich noch gesammelt.
Auf 2024!

Antworten