Seite 1 von 1

Eigene Programmlogik (Algorithmus?) schreiben

Verfasst: Freitag 28. November 2008, 13:44
von theliquidwave
Hi.
In der Schule beschäftigen wir uns zur Zeit wenn uns langweilig ist mit einem genial einfachem Zahlenspiel.

Erstmal der Aufbau: (es dürfen maximal 9 Zahlen pro Zeile sein)
1. Man schreibt die Zahlen von 1-19 außer der 10 in 3 Zeilen (gleichmäßig)

Code: Alles auswählen

123456789
111213141
516171819
2. Man streicht alle Paare weg, die neben- oder übereinander liegen:

Code: Alles auswählen

#23456789
###213141
516171819
3. Man streicht alle Paare weg, die zusammen 10 ergeben und neben- oder übereinander liegen:

Code: Alles auswählen

#2345678#
###21314#
5161718##
4. Man überprüft, ob sich noch Paare und 10er-Paare auch durch übergreifen neben- oder übereinander grauer Kästchen gibt: (in diesem Fall die 8 und die 2 = 10)

Code: Alles auswählen

#234567##
####1314#
5161718##
5. Sobald es nicht mehr weitergeht, schreibt man alle Zahlen, die noch übrig sind, wieder auf:

Code: Alles auswählen

#234567##
####1314#
5161718##
234567131
415161718
6. Weiter wieder bei Punkt 1


Zum Thema: Mein Wunsch ist es, eine eigene Programmlogik (ob das nun schon ein Algorithmus ist, wage ich zu bezweifeln, weiß es aber nicht) zu schreiben, die diese Aufgabe vollständig selbst löst.
Ich habe auch schon angefangen, jedoch finde ich, dass mein Code "crap" ist. In ihm funktioniert das ganze nur mit dem 1. Durchlauf wo noch alle Zahlen offen sind, auch wie man das ganze mit dem überlappen der weggestrichenen Zahlen hinkriegt versuche ich schon länger rauszukriegen.

Wo kann ich da anfangen? Gibt es logische Vorgänge die ich beachten kann oder etwas in der Richtung?

Wichtig: Bitte keine Lösungen oder so etwas posten, ich möchte es größten Teils mal selber probieren, ich brauche nur einen Ansatz :)

Danke für alle die mir helfen ;)
Gruß, Chris

Verfasst: Freitag 28. November 2008, 13:52
von Hyperion
1.) Ich kapiere den Sinn dahinter noch nicht? Terminiert das Teil denn auch wirklich?

2.) Du meinst sicher Zahlen von 1 - 9?

Also einige deiner Schritte erscheinen mir sinnlos, da einige Regeln andere überdecken, was erstere damit sinnlos macht. (Zumindest denke ich das gerade)

Als Modell empfehlen sich hier doch wohl ganz klar Listen. Ob man Listen von Listen nimmt, um die Zeilen abzubilden oder eben mit festen offsets arbeitet, müßte man mal gucken. Ich nehme an, dass die Anzahl Zeilen beliebig groß werden kann?

Als Werte eben die Zahlen von 1 - 9 und dann noch ein None oder auch eine 0 als Kennung für gestrichene Zellen.

Naja, dann musst Du doch nur noch die Regeln einbauen. Je nach Komplexität in mehreren Funktionen. Davor eine Endlosschleife, die terminiert, wenn das Teil gelöst ist (dazu braucht es vermutlich auch eine Funktion, die das nach einem Durchlauf prüft).

Mehr kann ich dazu mal nicht sagen, ohne das Problem besser verstanden zu haben.

Verfasst: Freitag 28. November 2008, 14:08
von theliquidwave
Hi.
Der Sinn dieses Spiels existier schlichtweg nicht, es ist einfach nur zum Zeitvertreib gedacht :P
Die Zahlen werden ja nie größer als 9, man "tut" zwar so als schreibt man die Zahlen von 1-19 auf, in Wirklichkeit schreibt man aber nur 1x von 1-9, dann jeweils von 1-n auf. Also sind es in der Liste keine Zahlen die größer als 9 sind.

Hier ist ein Teil meiner Klasse zum verdeutlichen:

Code: Alles auswählen

class zAlgo:
	def __init__(self):
		self.base = [
			[1, 2, 3, 4, 5, 6, 7, 8, 9],
			[1, 1, 1, 2, 1, 3, 1, 4, 1],
			[5, 1, 6, 1, 7, 1, 8, 1, 9]
		]
Mir ist gerade aufgefallen, dass ich eigentlich nur eine Prüfung waagerecht und eine Prüfung senkrecht durchlaufen muss, um alle Paare zu finden. So kann ich das Problem mit weggestrichenen Zahlen praktisch umgehen (soweit ich mir das jetzt gedacht habe...).

Gruß, Chris

Verfasst: Freitag 28. November 2008, 14:31
von numerix
Um es in einen Algorithmus umzusetzen, müssen die Regeln eindeutig sein und das sind sie - so wie du sie formuliert hast - (noch) nicht.

An deinem Beispiel aufgezeigt:

Nach dem Streichen aller Paare ergibt sich:

Code: Alles auswählen

#23456789
###213141
516171819

Jetzt werden die Zahlenpaare mit Summe 10 gestrichen. Ich streiche zuerst das Paar, das aus den letzten Ziffern der 2. und 3. Reihe besteht:

Code: Alles auswählen

#23456789
###21314#
51617181#
Weitere Zahlenpaare gibt es dann nicht mehr und auch der folgende Schritt ("Übergreifen gestrichener Positionen") liefert keine Streichung mehr ...

Verfasst: Freitag 28. November 2008, 14:45
von theliquidwave
Ok da hast du recht ^^
Angenommen wir achten nicht auf sowas sondern nehmen dass, was das Script als "erstes" sieht und streicht es dann so...

Würde es dann gehen?

~ Chris

Verfasst: Freitag 28. November 2008, 14:56
von Hyperion
Wie lange soll der Algo denn laufen? Wenn das Teil nicht terminiert, so frage ich mich einfach, was Du damit überhaupt bezweckst, außer auf eine bestimmte Art wahnsinnig viel Output zu erzeugen?

Verfasst: Freitag 28. November 2008, 15:22
von numerix
Chrisber hat geschrieben:Würde es dann gehen?
Warum sollte es nicht "gehen"? Wenn du einen eindeutigen Regelsatz formulieren kannst, dann lässt es sich auch in einen Algorithmus umsetzen.

@Hyperion: Der "Zweck" ist vermutlich schlicht der, diesen Ablauf einfach mal zu simulieren und zu sehen, wie sich das Verfahren weiter entwickelt. Sicher kann man glücklich werden, ohne das zu wissen, aber ganz uninteressant finde ich es nicht.

Verfasst: Freitag 28. November 2008, 15:57
von Hyperion
numerix hat geschrieben: @Hyperion: Der "Zweck" ist vermutlich schlicht der, diesen Ablauf einfach mal zu simulieren und zu sehen, wie sich das Verfahren weiter entwickelt. Sicher kann man glücklich werden, ohne das zu wissen, aber ganz uninteressant finde ich es nicht.
Ja ok, so wirds sein. Klar kann so was interessant sein :-)

Wobei ich das Ausgangsmuster immer noch nicht kapiert habe. Vermutlich kapiere ich deshalb auch nicht, wieso immer genau ein Vielfaches von 9 Zahlen über bleibt.

Verfasst: Freitag 28. November 2008, 16:14
von numerix
Hyperion hat geschrieben:Wobei ich das Ausgangsmuster immer noch nicht kapiert habe.
Einfach die Zahlen von 1 bis 19 hintereinander schreiben, dabei die 10 weglassen. Danach diese eine Zahlenreihe in drei 9er Reihen teilen ...

Oder, anders gesagt:

Code: Alles auswählen

In [10]: from textwrap import fill

In [11]: print fill("".join([str(k) for k in range(1,20) if k != 10]),9)
123456789
111213141
516171819

Verfasst: Freitag 28. November 2008, 16:27
von Hyperion
*patsch* jetzt ist's mir klar ... zu viel WSGI grad gemacht :-D

Verfasst: Freitag 28. November 2008, 18:46
von theliquidwave
Hi.
Sorry dass ich das nicht so gut erklären konnte :P

Hier ist mal mein Code: http://code.eventscripts.com/85941
Ich hoffe ihr versteht den Sinn - es ist zwar noch lange nicht fertig.

In meinen Augen ist das schon wieder vermurkst. Mir kommt das alles so "undynamisch" vor.

Achja, bitte achtet nicht auf die Funktions- und Variablenamen, ich kenne die PEP8-Richtlinien, halte mich aber nicht daran, nur damit ihr mir keine Ratschläge gebt :oops:

~ Chris

Verfasst: Freitag 28. November 2008, 18:58
von audax
Wenn du dich nicht an PEP 8 hälst, dann lese ich den Code nicht einmal...und das geht vielen hier so.
Die Namen sind doof und die Einrückung machts unlesbar, den Rest konnte ich nicht mehr sehen, bevor ich den Tab geschlossen hab.

Verfasst: Freitag 28. November 2008, 19:27
von numerix
Chrisber hat geschrieben:Achja, bitte achtet nicht auf die Funktions- und Variablenamen, ich kenne die PEP8-Richtlinien, halte mich aber nicht daran, nur damit ihr mir keine Ratschläge gebt
Damit machst du dir sicher nicht viele Freunde im Forum. Solange du der einzige bist, der den Code lesen muss: Mach es wie du willst. Wenn du möchtest, dass andere sich mit deinem Code beschäftigen: Halte dich an die Konventionen.

Ich habe dein "Spiel" einmal in einen Algorithmus umgesetzt. Damit das eindeutig ist, müssen die Regeln präzisiert werden. "Meine" Regeln lauten:

Erst alle Paare prüfen, dabei von links oben nach rechts unten Zeile für Zeile durchgehen und dabei zunächst den horizontalen Nachbarn und danach den vertikalen Nachbarn überprüfen (das muss festgelegt werden, sonst ist das Ergebnis nicht mehr eindeutig). - Das gleiche dann für die 10er Summe.
Danach den Durchgang mit Überspringen der schon weggestrichenen Ziffern. Dabei wieder von links oben nach rechts unten zeilenweise und wiederum den horizontalen Nachbarn vor dem vertikalen Nachbarn. Danach der Durchgang mit Überspringen und 10er Summe.

Bei der abschließenden Sammlung der verbleibenden Ziffern ergibt sich nicht immer eine Anzahl, die ein Vielfaches von 9 ist. In deinem Beispiel ist an der Stelle ein Fehler - du hast eine 1 hineingemogel, die nicht mehr da war.
Ich habe dann festgelegt, dass die letzte Reihe, falls sie unvollständig ist, mit "#" aufgefüllt wird.

Das Ergebnis ist dann - leider - wenig spektakulär. Keine zahlentheoretischen Überraschungen. Die Anzahl der Zeilen steigt von Durchgang zu Durchgang, ein Bildegesetz kann ich nicht erkennen:

Code: Alles auswählen

Durchgänge | Zeilen
     10        91
     20       594
     30      4059
     40     32672
     50    257411

Verfasst: Freitag 28. November 2008, 19:39
von Leonidas
Chrisber hat geschrieben:Achja, bitte achtet nicht auf die Funktions- und Variablenamen, ich kenne die PEP8-Richtlinien, halte mich aber nicht daran, nur damit ihr mir keine Ratschläge gebt :oops:
Keine Sorge, wenn du schon Ankündigst dass du den Code mit Absicht nicht PEP8-konform hast, eben damit du keine Ratschläge bekommst, dann werde ich deine Entscheidung akzeptieren und auch keine Ratschläge geben. Muss also nicht den Code ansehen. Andererseits ist die Frage, warum du den Code hier reinstellst, wenn du keine Ratschläge erwartest; aber die Logik ist definitiv nicht mehr mein Problem.