Hallo,im Prinzip geht es immer noch um mein baccaratspiel, aber ich habe dabei mehr ein allgemeines kombinatorisches Problem:
Vereinfacht gesprochen läuft ein Spiel wie folgt:
Wir haben zu Beginn ein leeres 6 Tupel.
Bei index 0,1,3 und 4 soll jeweils eine Zahl aus 0-9 eingefügt werden.
Abhängig von index 0 und 1 wird entweder indexstelle 2 leer gelassen oder es wird auch dort eine Zahl aus 0-9 eingefügt.
Nun wird bei index=5 abhängig von den indexstellen 0-4 und noch komischeren Regeln ebenso entweder frei gelassen oder eine zahl 0-9 reingeschrieben.
Das heißt wiederum, es gibt 6 tupel wo alle 6 stellen befüllt sind, es gibt manche wo index=2 leer ist, index=5 leer ist oder Beides.
Und ich will mir nun eine Liste aller möglichen 6Tupel aufschreiben.
Klar könnte ich nun hingehen und alle 6tupel aufschreiben, bei denen alle 6 stellen mit zahlen 0-9 belegt sind.
Und dann durchgehen und wieder die 6-tupel löschen, die "unmöglich" sind (wo bspw. eine zahl bei index=2 drin steht obwohl die regeln sagen dass für dieses tupel die stelle freizulassen wäre)
Aber, das wird mir vermutlich jeder sagen, ist das aus Informatikersicht eine höchst ineffiziente Vorgehensweise, gerade weil ich ja da erst 10^6 6Tupel in eine Lsite packe nur um dann unzählige davon wieder rauszulöschen.
Ich kriegs aber irgendwie auch gerade nicht auf die Reihe wie ich systematisch nur alle real auch möglichen 6Tupel baue.
Mein Grundvorgehen wäre wie folgt:
Erst mal alle Kombinationen für die Stelle 0,1,3,4 durchgehen;
weil die 4 stellen ja in allen Fällen eine zahl bekommen.
Aber wie dann weiter?
ich müsste sowohl die 6tupel ohne 2. stelle aufschreiben als auch dann für zutreffende kombinationen je 10 6tupel aufschreiben, wo eben die 2. stelle die zahl 0-9 ist.
habe ich das, müsste ich wieder für jedes davon für zutreffende kombis wiederum je 10 6tupel aufschreiben wo die 5. stelle eine der zahlen 0-9 ist.
Ich könnte entweder eine Liste bauen, die immer wieder verändert und erweitert wird.
wo anfangs nur tupel mit den 4 belegten stellen drin sind.
dann wird je nachdem für jedes passende listenelement eine menge an tupeln mit aufgefülltem 2. element reingepackt.
dann wieder über die lsite iteriert und entsprechend für die 5. stelle ebenso tupeln hinzugefügt sowie unvollständige tupels rausgelöscht.
Aber auch da muss man x mal über die liste gehen, tupel löschen und einfügen.
Andere Variante, die ich zwar für gewöhnlich "quick and dirty" machen würde (und die jedem hier einen Herzinfarkt und Wutanfall einjagen würde), wäre, da 6 stellen, ebenm mit einem intelligenten Geflecht aus 6 for-schleifen zu arbeiten, mit if bedinungen dazwischen die gucken ob die für die 2. und 5. indexstelle zugehörige for shcleife überhaupt aufgerufen wird.
Das ist aber natürlich ganz ganz böser schlechter stil und gar nicht flexibel, würde also nicht funktionieren wenn plötzlich die arrays alle 7 stellen lang wären oder so.
Darum die Frage, wie ginge ich da am Besten alle Möglichkeiten durch?
Selbst die hochgefeirtte objektorientierung scheint mir da nur wenig hilreich zu sein weil es mehr um ein strategisches Problem und keine Schöhnheitsvergleiche
geht :-/
PS: wen die Bedingungen interessiert:
die index=2 stelle wird dann mit einer zahl belegt wenn die zahlen bei index=0 und index=1 zusammen einen wert <=5 ergibt.
nur dann wird die index=2. stelle belegt mit einer zahl.
die bedingungen für die index=5. stelle sind komplizierter, aber in einer if bedingung auch formulierbar und hängt halt auch von allen anderen Stellen ab (will sagen, müsste ich erst nachgucken und ist für das grundproblem hier im Detail unwichtig).
Vereinfacht gesprochen läuft ein Spiel wie folgt:
Wir haben zu Beginn ein leeres 6 Tupel.
Bei index 0,1,3 und 4 soll jeweils eine Zahl aus 0-9 eingefügt werden.
Abhängig von index 0 und 1 wird entweder indexstelle 2 leer gelassen oder es wird auch dort eine Zahl aus 0-9 eingefügt.
Nun wird bei index=5 abhängig von den indexstellen 0-4 und noch komischeren Regeln ebenso entweder frei gelassen oder eine zahl 0-9 reingeschrieben.
Das heißt wiederum, es gibt 6 tupel wo alle 6 stellen befüllt sind, es gibt manche wo index=2 leer ist, index=5 leer ist oder Beides.
Und ich will mir nun eine Liste aller möglichen 6Tupel aufschreiben.
Klar könnte ich nun hingehen und alle 6tupel aufschreiben, bei denen alle 6 stellen mit zahlen 0-9 belegt sind.
Und dann durchgehen und wieder die 6-tupel löschen, die "unmöglich" sind (wo bspw. eine zahl bei index=2 drin steht obwohl die regeln sagen dass für dieses tupel die stelle freizulassen wäre)
Aber, das wird mir vermutlich jeder sagen, ist das aus Informatikersicht eine höchst ineffiziente Vorgehensweise, gerade weil ich ja da erst 10^6 6Tupel in eine Lsite packe nur um dann unzählige davon wieder rauszulöschen.
Ich kriegs aber irgendwie auch gerade nicht auf die Reihe wie ich systematisch nur alle real auch möglichen 6Tupel baue.
Mein Grundvorgehen wäre wie folgt:
Erst mal alle Kombinationen für die Stelle 0,1,3,4 durchgehen;
weil die 4 stellen ja in allen Fällen eine zahl bekommen.
Aber wie dann weiter?
ich müsste sowohl die 6tupel ohne 2. stelle aufschreiben als auch dann für zutreffende kombinationen je 10 6tupel aufschreiben, wo eben die 2. stelle die zahl 0-9 ist.
habe ich das, müsste ich wieder für jedes davon für zutreffende kombis wiederum je 10 6tupel aufschreiben wo die 5. stelle eine der zahlen 0-9 ist.
Ich könnte entweder eine Liste bauen, die immer wieder verändert und erweitert wird.
wo anfangs nur tupel mit den 4 belegten stellen drin sind.
dann wird je nachdem für jedes passende listenelement eine menge an tupeln mit aufgefülltem 2. element reingepackt.
dann wieder über die lsite iteriert und entsprechend für die 5. stelle ebenso tupeln hinzugefügt sowie unvollständige tupels rausgelöscht.
Aber auch da muss man x mal über die liste gehen, tupel löschen und einfügen.
Andere Variante, die ich zwar für gewöhnlich "quick and dirty" machen würde (und die jedem hier einen Herzinfarkt und Wutanfall einjagen würde), wäre, da 6 stellen, ebenm mit einem intelligenten Geflecht aus 6 for-schleifen zu arbeiten, mit if bedinungen dazwischen die gucken ob die für die 2. und 5. indexstelle zugehörige for shcleife überhaupt aufgerufen wird.
Das ist aber natürlich ganz ganz böser schlechter stil und gar nicht flexibel, würde also nicht funktionieren wenn plötzlich die arrays alle 7 stellen lang wären oder so.
Darum die Frage, wie ginge ich da am Besten alle Möglichkeiten durch?
Selbst die hochgefeirtte objektorientierung scheint mir da nur wenig hilreich zu sein weil es mehr um ein strategisches Problem und keine Schöhnheitsvergleiche
geht :-/
PS: wen die Bedingungen interessiert:
die index=2 stelle wird dann mit einer zahl belegt wenn die zahlen bei index=0 und index=1 zusammen einen wert <=5 ergibt.
nur dann wird die index=2. stelle belegt mit einer zahl.
die bedingungen für die index=5. stelle sind komplizierter, aber in einer if bedingung auch formulierbar und hängt halt auch von allen anderen Stellen ab (will sagen, müsste ich erst nachgucken und ist für das grundproblem hier im Detail unwichtig).