Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)?

berndoa

Top Contributor
Hallo,
vor sehr geraumer Zeit beschäftigte ich mich theoretisch und praktisch damit, wie man beim Lotto 6aus49 welche Tippreihen man mindestens gleichzeitig spielen um in der Ziehung garantiert 3 Richtige zu haben.
Es gibt ja bekanntlich solche fertigen "Lottosysteme", hätte mir nur gerne ein Eigenes gebastelt.

Zur Erklärung: Beim Lotto 6 aus 49 wählt man 6 unterschiedliche Zahlen aus dem zahlenraum 1-49.
Le Lottoverein zieht dann in einer Sitzung ebenso 6 Zahlen und je nachdem wie viele zahlen übereinstimmen, hat man eben x Richtige.

Nun kann man halt, indem man diverse ganz bestimmte Tippreihen mit ganz bestimmten 6 Zahlen jeweils spielt, sicher sein dass man garantiert 3 Richtige hat weil eben eins der dutzenden gleichzeitig gespielten 6Tupel eben 3 Zahlen gleich hat mit der im Fernsehen gezogenen zahl.


Nun will ich hingehen, eine Lsite an 6erTupeln gegeben, die garantiert 3 Richtige bringt und aber noch nicht zwingend perfekt ist,
und will das optimieren.

Ich will also bei meiner hübschen 6tupel-Liste gucken, ob es darin ein 6Tupel gibt, das unnötig ist und es entfernen.

Unnötig ist es dann wenn alle in dem 6Tupel enthaltenen 3Tupel (Beispiel: das 6Tupel (1,2,3,4,5,6) gegeben, dann sind die enthaltenen 3Tupel
(1,2,3),(1,2,4),(1,2,5),(1,2,6)
(1,3,4),(1,3,5),(1,3,6),
(1,4,5),(1,4,6),
(1,5,6),
(2,3,4),(2,3,5),(2,3,6),
(2,4,5),(2,4,6),
(2,5,6),
(3,4,5),(3,4,6),
(3,5,6)
(4,5,6)

Nun müsste man die alte 6Tupelliste nehmen, das Tupel (1,2,3,4,5,6) hiebrei (temporär) rausnehmen und nun gucken:
Findet sich ein 3Tupel von oben, welches nicht in der (um eins kleineren) 6Tupelliste drin ist?

In dem Fall ist das 6Tupel (1,2,3,4,5,6) nicht überflüssig denn mind. eins seiner 3Tupel kommt sonst nirgends vor.

Entweder findet man also dass (1,2,3,4,5,6) überflüssig ist, wirft es raus und dieser "Optimierungsschritt" ist zu Ende.

Ist dem nicht so, macht man mit dem nächsten 6 Tupel weiter, betrachtet alle seine 3Tupel und checkt es mit allen anderen 6Tupeln ab.

Rinse und repeat, notfalls bis wir am Ende der Lsite angekommen sind und gar nichts löschen konnten weil alle 6Tupel essentiell sind.

Das wäre so der primitiv ausgedrückte Optimierungsalgorithmus der mit jeder Anwendung bei einer 6Tupel Liste entweder ein überflüssiges 6Tupel findet und rauswirft. oder eben feststellt dass nichts überflüssig ist.

Nun müsse man nur noch den Algorithmus so oft anwenden bis die verbleibende Lsite nicht mehr verbessert werden kann.


Nun ist nur die Frage:
Wie macht man diesen Algorithmus am besten als Code damit es nciht performance mässig und zeitlich den Computer in die Knie zwingt?

Weil, wie man sich errehcnen kann, gibt es laut Kombinatorik 49*48*47*46*45*44= ca. 10^10 verschiedene 6Tupel.

Mit etwas klugem Vorgehen beim Erstellen der initialen liste sind es ein paar Stellen weniger aber immer noch sehr viel.
Selbst wenn die 6Tupelliste nur aus 10^5 einträgen bestünde:

Dann müsste man bei einem einzigen Optimierungsschritt im Worst Case alle 10^5 6Tupel durchgehen, jedes davon in seine ca. 20 (?) 3Tupel zerlegen, für jedes dieser 3Tupel dann mit jedem der verbleibenden 10^5-1 6Tupel prüfen ob es darin enthalten ist.

Also, ja , sehr viele Sachen zu tun.


Ich würde mangels besseren plans da mit Arrays hin und her hantieren aber gibts da was von Fielmann... ich meine , etwas Intelligenteres wie man das machen kann?
Arraylist ist klar, wobei die im Prinzip ja auch nur verkleidete Arrays intern sind.

Gibts da vll. einen Datentypen oder ein Vorgehen was schneller besser weiter ist als simples Kreuz und Quer Vergleichen? :)
 

Staarfightaar

Bekanntes Mitglied
Ich würde mangels besseren plans da mit Arrays hin und her hantieren aber gibts da was von Fielmann... ich meine , etwas Intelligenteres wie man das machen kann?
Arraylist ist klar, wobei die im Prinzip ja auch nur verkleidete Arrays intern sind.

Gibts da vll. einen Datentypen oder ein Vorgehen was schneller besser weiter ist als simples Kreuz und Quer Vergleichen? :)
ja der Datentyp heißt "public class ..."

die jvm wird seit über 20 jahren verbessert ... warum denknst du dass es durch arrays einfacher wird?


das ist fast gleich zu setzen wie wenn du versuchst ein loch mit einem besen zu graben ... und du dann feststellst... hmm eig wäre der staubsauger für das loch viel schneller

während neben dir eine schaufel liegt... dein bottle neck sind die unnötigen kombinationen ( oder sonst was ) und sicsher nicht das erstellen von Objekten und ich erinner mich noch wie man dir damals auf die finger geklopft hat als dir die menge an array plätzen ausgegangen sind
 

fhoffmann

Top Contributor
Ich denke nicht, dass du hier mit weiteren Datentypen und schnelleren Vergleichen weiter kommst. Möglicherweise kannst du dadurch die Laufzeit um einen Faktor von 1.000 verkürzen. Aber ob du 10^17 oder 10^14 Jahre warten musst, bis du ein Ergebnis hast, kann dir relativ egal sein.

Deshalb würde ich versuchen, den Algorithmus zu verbessern. Nur hier hast du Potential zu ernsthafter Verbesserung.
 

Neumi5694

Top Contributor
An "garantiert" wirst du eh scheitern, egal, ob du eine Array oder eine Liste verwendest.
Irgendwan tendiert die Wahrscheinlichkeit, jedesmal daneben zu liegen, zwar gegen 0, aber sie wird nie 0 sein.

Edit: Ok, falls du alle möglichen Kombinationen gleichzeitig spielst, hast du natürlich eine hundertprozentige Erfolgschance.
 

Oneixee5

Top Contributor
Der durchschnittliche Gewinn für 3 Richtige ist 11€. Die Gewinnchance ist 1:63. Ein Tipp ohne Gebühren kostet 1,20€ (kurze Internetrecherche). Also muss man für dein System theoretisch 75,60€ aufwenden um 11€ zu gewinnen. Dabei sind Gebühren und Kosten für Betrieb und Erstellung der Software nicht berücksichtigt. In der Realität dürfte der Gewinn noch schlechter ausfallen. Dein Lottosystem eignet sich also nur für Leute, die nicht rechnen können. Über Optimierung muss ich da gar nicht nachdenken. Lotto gibt es seit 1953 in DE und die sind noch nicht Pleite. Ich würde sagen, dass ist ein starkes Indiz dafür, dass solche Systeme einfach nicht gewinnbringend funktionieren, denn versucht habe das bestimmt schon viele.
 

berndoa

Top Contributor
ja der Datentyp heißt "public class ..."

die jvm wird seit über 20 jahren verbessert ... warum denknst du dass es durch arrays einfacher wird?


das ist fast gleich zu setzen wie wenn du versuchst ein loch mit einem besen zu graben ... und du dann feststellst... hmm eig wäre der staubsauger für das loch viel schneller

während neben dir eine schaufel liegt... dein bottle neck sind die unnötigen kombinationen ( oder sonst was ) und sicsher nicht das erstellen von Objekten und ich erinner mich noch wie man dir damals auf die finger geklopft hat als dir die menge an array plätzen ausgegangen sind
Nicht nur damals, hier im Forum soll man doch eh für jeden Kleinmist gleich zig Klassen, interfaces, Enums und Co. definieren.

OOP to the Max halt :)

Geshcmackssache halt, vielleicht nur mein Geschmack.
Aber ich habe lieber ein Array, wo ich Alles verfügbar habe, als bspw. eine Linkedlist wo es eine Listenklasse hat, die aus Node Objekten bestheen, die als Attribute wieder auf Node objekte verweisen.
Natürlich zum Hinzufügen und Entfernen von Sachen praktisch, keine Frage. Müssen ja nur ein paar Referenzen geändert werden.

Aber ob das Erzeugen und Initialisiren von zig Klassen und Objekten so viel effizienter ist...

Sieht man ja shcon auf github, wenn es da heißt "Yo, hier mein kleines Skript um 2 Zahlen a und b zu addieren" und dann kommt da ein gewust aus Klassen, Ordnern mmit Unterordnern und die ordner haben meist so Nichtssagende Name wie "args" "uwuw" und Co.

Nur eine Dokumentation sucht man da vergebens, welches der tausend Sachen denn nun die Klasse/Skript mit der methode ist, die 1+1 errechnet.

Undurchsichtiger Mist, wenn man mich fragt. Wobei ich auch nix Besseres anzubieten habe.



Bin beim Googeln übrigens über "sortedset" gestolpert was das Meiste recht chillig machen würde.
Nur fand ich noch ncihts Gutes wie man bei einem gegebenen Sortedset die Menge der Subsets der Länge 3 kriegt.
Also eine fertige Methode der Klasse meine ich, nichts Selbstgebasteltes.

klar könnte ich was selbstbauen, aber das wäre vemrutlich recht ineffizient und , wie man es von mir gewohnt ist, "ein griff ins Klo" wo sich Einer mehr als der Andere dran aufgeilen könnte als Negativbeispiel :)



Aber ja, damals überlegte ich sogar hinsichtlich manueller Garbage Collection.

Am Ende vom lied hat das Programm aber doch funktioniert, brauchte halt nur ne Minute oder so um Alles durchzugehen :)

@All: Dass es sich nicht rentiert im Sinne des Erwartungswerts oder so, wissen wir Alle.
Diese (schwachsinnige und themenfremde) Diskussion gabs auch damals schon bzw. kommt sprichwörtlich IMMER wenn ich die Frage irgendwo stelle.
Der Staat und die Lotterie gewinnen immer, das wissen wir Alle :)

Heißt aber nicht dass ich trotzdem nicht das probieren kann.
Ich meine, leute zahlen geld für solche "Systeme" ;-)

Zum Vergleich:
um 6 Richtige zu haben, müsst man (in der selben Sitzung, selbstredend) alle 49*48*47*46*45*44 möglichen Kombinationen tippen.

um allerdings garantiert 3 Richtige zu haben (heißt eine der Unmengen an getippten Reihen hat mind. 3 Richtige), braucht es nicht so viele.
Wie viele (oder wenige) genau herauszufinden, ist eine der Ziele des Ganzen. Neben dem FInden der konkreten Tippreihen :)
 

Staarfightaar

Bekanntes Mitglied
Aber ob das Erzeugen und Initialisiren von zig Klassen und Objekten so viel effizienter ist...
ist es nicht
OOP ist nicht schneller als DoD und auch nicht immer die universal lösung die immer super ist

OOP ist ( wahrschienlich ) aus der Software Krise entstanden wo man damals einfach keine Designs und Sprachen hatte um guten Code zu schreiben


es gibt ja einige sprachen die eher einen anderen weg gehen als oop
du musst halt auch verstehen wenn du das "flaggschiff" der oop benutzt zum coden dass dich jeder mit dem vollquatscht...

java ohne klassen ... ist halt wie ne umarmung im puff
 

m1234

Mitglied
Ich versuch das mal gerade auseinanderzudröseln... Du suchst die Tipps, die du abgeben müsstest, um bei egal welcher Ziehung mindestens drei Richtige zu haben...

Das ginge in etwa so:
Java:
    public static boolean check(BigInteger x, int min) {
        int c = 0;
        for (char ch : x.toString(2).toCharArray()) {
            if (ch == '1') {
                c++;
                if (c > min) {
                    return false;
                }
            }
        }
        return c == min;
    }

    public static BigInteger trim(BigInteger x, int min) {
        int n = x.bitLength();
        for (int i = 0; i < n; i++) {
            if (x.testBit(i)) {
                x = x.clearBit(i);
                if (check(x, min)) {
                    return x;
                }
            }
        }
        return null;
    }

    public static int[][] tipps(int min, int max, int maxRichtige, int minRichtige) {
        HashSet<BigInteger> set = new HashSet<>();
        BigInteger n = BigInteger.ONE.shiftLeft(max - min);
        BigInteger x = BigInteger.ZERO;
        while (x.compareTo(n) < 0) {
            while (!check(x, maxRichtige)) {
                x = x.add(BigInteger.ONE);
            }
            set.add(x);
            x = x.add(BigInteger.ONE);
        }

        HashSet<BigInteger> set2 = new HashSet<>();
        for (BigInteger a : set) {
            set2.add(trim(a, minRichtige));
        }

        int[][] a = new int[set2.size()][];
        int i = 0;
        for (BigInteger c : set2) {
            int[] b = new int[minRichtige];
            int k = 0;
            for (int j = 0; j < max - min + 1; j++) {
                if (c.testBit(j)) {
                    b[k++] = j + min;
                }
            }
            a[i++] = b;
        }

        return a;
    }

    public static int[][] tipps2(int min, int max, int maxRichtige) {
        HashSet<BigInteger> set = new HashSet<>();
        BigInteger n = BigInteger.ONE.shiftLeft(max - min);
        BigInteger x = BigInteger.ZERO;
        while (x.compareTo(n) < 0) {
            while (!check(x, maxRichtige)) {
                x = x.add(BigInteger.ONE);
            }
            set.add(x);
            x = x.add(BigInteger.ONE);
        }
        int[][] a = new int[set.size()][];
        int i = 0;
        for (BigInteger c : set) {
            int[] b = new int[maxRichtige];
            int k = 0;
            for (int j = 0; j < max - min + 1; j++) {
                if (c.testBit(j)) {
                    b[k++] = j + min;
                }
            }
            a[i++] = b;
        }
        return a;
    }

    public static void main(String[] args) {
        int[][] t1 = tipps(1, 7, 4, 3);
        for (int[] a : t1) {
            System.out.println("Tippe: " + Arrays.toString(a));
        }

        int[][] t2 = tipps2(1, 7, 4);
        for (int[] a : t2) {
            int treffer = 0;
            al:
            for (int[] b : t1) {
                for (int i : b) {
                    if (Arrays.binarySearch(a, i) < 0) {
                        continue al;
                    }
                }
                treffer++;
            }
            System.out.println("Ziehung: " + Arrays.toString(a) + " Treffer: " + treffer);
        }
    }

Das liest man folgendermaßen... Aus den Zahlen 1 bis einschließlich 7 werden bei jeder Ziehung 4 Zahlen gezogen und davon sollen mindestens 3 Richtige dabei sein:
Code:
Tippe: [2, 5, 6]
Tippe: [3, 5, 6]
Tippe: [2, 3, 6]
Tippe: [2, 3, 7]
Tippe: [2, 3, 5]
Tippe: [4, 5, 6]
Tippe: [2, 4, 6]
Tippe: [2, 4, 5]
Tippe: [3, 4, 6]
Tippe: [3, 4, 5]
Tippe: [2, 3, 4]
Ziehung: [1, 2, 3, 6] Treffer: 1
Ziehung: [1, 2, 3, 7] Treffer: 1
Ziehung: [1, 2, 4, 6] Treffer: 1
Ziehung: [1, 3, 4, 6] Treffer: 1
Ziehung: [2, 3, 4, 6] Treffer: 4
Ziehung: [1, 2, 3, 4] Treffer: 1
Ziehung: [1, 2, 5, 6] Treffer: 1
Ziehung: [1, 3, 5, 6] Treffer: 1
Ziehung: [2, 3, 5, 6] Treffer: 4
Ziehung: [1, 2, 3, 5] Treffer: 1
Ziehung: [1, 4, 5, 6] Treffer: 1
Ziehung: [2, 4, 5, 6] Treffer: 4
Ziehung: [1, 2, 4, 5] Treffer: 1
Ziehung: [3, 4, 5, 6] Treffer: 4
Ziehung: [1, 3, 4, 5] Treffer: 1
Ziehung: [2, 3, 4, 5] Treffer: 4

Das für 6aus49 zu berechnen, erscheint mir jetzt aber doch etwas Overkill...

... Und wahrscheinlich lässt sich noch einiges geschickter lösen. :)
 

berndoa

Top Contributor
Wenn dir OOP so auf den Sack geht, warum willst du dann unbedingt in einer objektorientierten Sprache programmieren?

Nimm C und lass den ganzen OOP-Scheiß hinter dir.
Och nö, da müsste man ja mit so einem msit wie Zeigern hantieren, das muss nicht sein :)
java per se ist ja gut, nur die meisten nutzer nerven weil sie für jeden Furz extra Klassen, interfaces, Enums, und whatnot (irgendwas von "moments" las ich kürzlich, gibts shceinbar auch in java) implementieren.

Da wird aus "Hallo Welt" gleich ein 40 Klassen Projekt mit Vererbung, Überladung von methoden, Interfaces, und wa weiß ich.

Wems gefällt :)


Meine simplen probleme lassen sich meist relativ easy mit Arrays und im grenzfall auch mal noch einem Arraylist lösen.
Brauche ich keine zig custom Klassen dafür.
 

httpdigest

Top Contributor

Staarfightaar

Bekanntes Mitglied
Och nö, da müsste man ja mit so einem msit wie Zeigern hantieren, das muss nicht sein :)
java per se ist ja gut, nur die meisten nutzer nerven weil sie für jeden Furz extra Klassen, interfaces, Enums, und whatnot (irgendwas von "moments" las ich kürzlich, gibts shceinbar auch in java) implementieren.

Da wird aus "Hallo Welt" gleich ein 40 Klassen Projekt mit Vererbung, Überladung von methoden, Interfaces, und wa weiß ich.

Wems gefällt :)


Meine simplen probleme lassen sich meist relativ easy mit Arrays und im grenzfall auch mal noch einem Arraylist lösen.
Brauche ich keine zig custom Klassen dafür.
powershell?
 

Hansen_07

Bekanntes Mitglied
Wenn dir OOP so auf den Sack geht, warum willst du dann unbedingt in einer objektorientierten Sprache programmieren?

Nimm C und lass den ganzen OOP-Scheiß hinter dir.
Irgendwie verstehe ich das ständige auf dem Boden stampfen bei dir auch nicht @berndoa. Wenn mir ein Paradigma, eine Sprache so auf den Sender gehen würde, würde ich diese doch überhaupt nicht nutzen. Dich zwingt doch keiner zu Java!

Vielleicht schaust du dir einfach mal JS, PHP oder so etwas an? Da ist die Breite der Community auch nicht so "streng" und "anspruchsvoll" wie die Javianer. Ganz schnell hast du da irgendwas zusammen geklopft das irgendwie läuft. Und wenn du dann doch mal etwas stabiles bauen willst/musst, dann kannst du das auch in diesen Sprachen.
 

berndoa

Top Contributor
40 ist auch ein bisschen sehr wenig für ein komplexes Projekt wie "Hallo Welt", mit seinen vielen Fassaden, Anforderungen und Qualitätsansprüchen. Man sollte sich da eher an sowas wie https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition orientieren.
jep, passt.

zig Dateien für etwas, was man sprichwörtlich in ein paar zeilen in der Main methode einer Klasse machen kann.
github as usual :)
Auch wenn es Satire ist, 99% von github ist augenscheinlich so aufgebaut.

20 Dateien und fragwürdig bezeichnete ordner für eine Sache, für die man 1-max 2 Klassen erwarten würde.

Wie ich schrieb, gegen java habe ich nix, nur gegen die Konventionalisten und anonymen OOPler.
Weil die Welt halt untergeht, wenn man nicht jede Kleinigkeit und jeden Klein/Großbuchstaben nach Konvention macht und es in einbe extra Klasse oder Methode auslagert.

Aber egal.

Wie sind wir eigentlich vom lottospielen auf dieses Thema abgedriftet? :O

Bin ja immer noch am Hoffen dass die Sortedset klasse irgendwas anbietet um die "Subsets" der Länge 3 zu finden :)
 

Staarfightaar

Bekanntes Mitglied
du kannst halt ein großes projekt auch ordnen in dem du klassen "weg sperrst" also package visibility machst somit der user der lib diese niemals zu gesicht bekommt... damit kriegst du halt wieder bei erweiterung der bibliothek probleme usw usw..und genau deswegen gibts kürbisse
 

KonradN

Super-Moderator
Mitarbeiter
du kannst halt ein großes projekt auch ordnen in dem du klassen "weg sperrst" also package visibility machst somit der user der lib diese niemals zu gesicht bekommt... damit kriegst du halt wieder bei erweiterung der bibliothek probleme usw usw..und genau deswegen gibts kürbisse
Ich denke, dass man da keine Argumente bringen muss. Da fehlen die Grundlagen und selbst kleinste Basics werden abgelehnt...

Also einfach die Zeit sparen und gar nicht erst drauf ein gehen.
 

KonradN

Super-Moderator
Mitarbeiter
Der Hinweis, dass so Erläuterungen bezogen sich auf Dich, das "Da fehlen die Grundlagen und selbst kleinste Basics werden abgelehnt..." natürlich auf den TE, für den ja selbst die Konventionen mit Gross-/Kleinschreibung Unsinn sind. Was soll man da noch bringen ... für seine Projekte braucht er das nicht und damit können wir gut leben denke ich mal :)
 

mihe7

Top Contributor
nur die meisten nutzer nerven weil sie für jeden Furz extra Klassen, interfaces, Enums, und whatnot (irgendwas von "moments" las ich kürzlich, gibts shceinbar auch in java) implementieren.
Du kannst von einem Java-Forum schlecht erwarten, dass den Leuten gezeigt wird, wie man C programmiert. Gerade wenn Anfänger fragen stellen, dann weil sie Java bzw. OO lernen wollen. Natürlich sind die Antworten im Verhältnis zu den Problemstellungen z. T. Overkill, aber im echten Leben geht es auch nicht um irgendwelche Popelprogramme, die man nach zwei Wochen sowieso wieder in die Tonne tritt.
 

Neumi5694

Top Contributor
Zur Effizienz: Instanzen erstellen ist nicht schneller als die Objekte im Array zu casten, aber auch nicht langsamer und es lässt sich deutlich besser lesen.
Abhängig von der Länge der verwendeten Prozessorpipeline ist bis zu einer gewissen Anzahl von Befehlen in einer Sequenz alles ca. gleich schnell. Bei vielen Operationen ist es meist sogar effizienter, mehrere einfache Befehle hintereinander in einem Schritt der Schleife erledigen zu lassen, anstatt mehrere kurze Schleifen zu verwenden, so werden Prefetch und Pipeline besser genutzt. Inwiefern die JVM hier irgendwas optimiert oder überhaupt optimieren kann, ist mir nicht bekannt.
 

m1234

Mitglied
Es sind nur 49*48*47*46*45*44/6! Kombinationen, da die Reihenfolge keine Rolle spielt.
Ok, meine Überlegung schien aber richtig zu sein:

Java:
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashSet;

public class LottoTipps {
    public static boolean check(BigInteger x, int min) {
        int c = 0;
        int n = x.bitLength();
        for (int i = 0; i < n; i++) {
            if (x.testBit(i)) {
                c++;
                if (c > min) {
                    return false;
                }
            }
        }
        return c == min;
    }

    public static BigInteger trim(BigInteger x, int min) {
        int n = x.bitLength();
        for (int i = 0; i < n; i++) {
            if (x.testBit(i)) {
                x = x.clearBit(i);
                if (check(x, min)) {
                    return x;
                }
            }
        }
        return null;
    }

    public static int[][] tipps(int min, int max, int maxRichtige, int minRichtige) {
        HashSet<BigInteger> set = new HashSet<>();
        BigInteger n = BigInteger.ONE.shiftLeft(max - min);
        BigInteger x = BigInteger.ZERO;
        while (x.compareTo(n) < 0) {
            while (!check(x, maxRichtige)) {
                x = x.add(BigInteger.ONE);
            }
            set.add(x);
            x = x.add(BigInteger.ONE);
        }

        HashSet<BigInteger> set2 = new HashSet<>();
        for (BigInteger a : set) {
            set2.add(trim(a, minRichtige));
        }

        int[][] a = new int[set2.size()][];
        int i = 0;
        for (BigInteger c : set2) {
            int[] b = new int[minRichtige];
            int k = 0;
            for (int j = 0; j < max - min + 1; j++) {
                if (c.testBit(j)) {
                    b[k++] = j + min;
                }
            }
            a[i++] = b;
        }

        return a;
    }

    public static int[][] tipps2(int min, int max, int maxRichtige) {
        HashSet<BigInteger> set = new HashSet<>();
        BigInteger n = BigInteger.ONE.shiftLeft(max - min);
        BigInteger x = BigInteger.ZERO;
        while (x.compareTo(n) < 0) {
            while (!check(x, maxRichtige)) {
                x = x.add(BigInteger.ONE);
            }
            set.add(x);
            x = x.add(BigInteger.ONE);
        }
        int[][] a = new int[set.size()][];
        int i = 0;
        for (BigInteger c : set) {
            int[] b = new int[maxRichtige];
            int k = 0;
            for (int j = 0; j < max - min + 1; j++) {
                if (c.testBit(j)) {
                    b[k++] = j + min;
                }
            }
            a[i++] = b;
        }
        return a;
    }

    public static void main(String[] args) {
        /*
        Bei einem Lottospiel werden 4 Zahlen aus dem Bereich 2 bis 10 gezogen.
        Der Spieler möchte so viele Tipps abgeben, dass mindestens immer 2 Richtige dabei sind.
        Folgende Tipps muss er also abgeben:
        */
        int[][] t1 = tipps(2, 10, 4, 2);
        for (int[] a : t1) {
            System.out.println("Tippe: " + Arrays.toString(a));
        }

        int[][] t2 = tipps2(2, 10, 4);
        for (int[] a : t2) {
            int treffer = 0;
            al:
            for (int[] b : t1) {
                for (int i : b) {
                    if (Arrays.binarySearch(a, i) < 0) {
                        continue al;
                    }
                }
                treffer++;
            }
            System.out.println("Ziehung: " + Arrays.toString(a) + " Treffer: " + treffer);
        }
    }
}

Code:
Tippe: [7, 9]
Tippe: [8, 9]
Tippe: [7, 8]
Tippe: [4, 9]
Tippe: [4, 10]
Tippe: [4, 7]
Tippe: [4, 8]
Tippe: [5, 9]
Tippe: [5, 7]
Tippe: [5, 8]
Tippe: [4, 5]
Tippe: [6, 9]
Tippe: [6, 7]
Tippe: [6, 8]
Tippe: [4, 6]
Tippe: [5, 6]
Ziehung: [2, 3, 4, 9] Treffer: 1
Ziehung: [2, 3, 4, 10] Treffer: 1
Ziehung: [2, 3, 5, 9] Treffer: 1
Ziehung: [2, 4, 5, 9] Treffer: 3
Ziehung: [3, 4, 5, 9] Treffer: 3
Ziehung: [2, 3, 4, 5] Treffer: 1
Ziehung: [2, 3, 6, 9] Treffer: 1
Ziehung: [2, 4, 6, 9] Treffer: 3
Ziehung: [3, 4, 6, 9] Treffer: 3
Ziehung: [2, 3, 4, 6] Treffer: 1
Ziehung: [2, 5, 6, 9] Treffer: 3
Ziehung: [3, 5, 6, 9] Treffer: 3
Ziehung: [2, 3, 5, 6] Treffer: 1
Ziehung: [4, 5, 6, 9] Treffer: 6
Ziehung: [2, 4, 5, 6] Treffer: 3
Ziehung: [3, 4, 5, 6] Treffer: 3
Ziehung: [2, 3, 7, 9] Treffer: 1
Ziehung: [2, 4, 7, 9] Treffer: 3
Ziehung: [3, 4, 7, 9] Treffer: 3
Ziehung: [2, 3, 4, 7] Treffer: 1
Ziehung: [2, 5, 7, 9] Treffer: 3
Ziehung: [3, 5, 7, 9] Treffer: 3
Ziehung: [2, 3, 5, 7] Treffer: 1
Ziehung: [4, 5, 7, 9] Treffer: 6
Ziehung: [2, 4, 5, 7] Treffer: 3
Ziehung: [3, 4, 5, 7] Treffer: 3
Ziehung: [2, 6, 7, 9] Treffer: 3
Ziehung: [3, 6, 7, 9] Treffer: 3
Ziehung: [2, 3, 6, 7] Treffer: 1
Ziehung: [4, 6, 7, 9] Treffer: 6
Ziehung: [2, 4, 6, 7] Treffer: 3
Ziehung: [3, 4, 6, 7] Treffer: 3
Ziehung: [5, 6, 7, 9] Treffer: 6
Ziehung: [2, 5, 6, 7] Treffer: 3
Ziehung: [3, 5, 6, 7] Treffer: 3
Ziehung: [4, 5, 6, 7] Treffer: 6
Ziehung: [2, 3, 8, 9] Treffer: 1
Ziehung: [2, 4, 8, 9] Treffer: 3
Ziehung: [3, 4, 8, 9] Treffer: 3
Ziehung: [2, 3, 4, 8] Treffer: 1
Ziehung: [2, 5, 8, 9] Treffer: 3
Ziehung: [3, 5, 8, 9] Treffer: 3
Ziehung: [2, 3, 5, 8] Treffer: 1
Ziehung: [4, 5, 8, 9] Treffer: 6
Ziehung: [2, 4, 5, 8] Treffer: 3
Ziehung: [3, 4, 5, 8] Treffer: 3
Ziehung: [2, 6, 8, 9] Treffer: 3
Ziehung: [3, 6, 8, 9] Treffer: 3
Ziehung: [2, 3, 6, 8] Treffer: 1
Ziehung: [4, 6, 8, 9] Treffer: 6
Ziehung: [2, 4, 6, 8] Treffer: 3
Ziehung: [3, 4, 6, 8] Treffer: 3
Ziehung: [5, 6, 8, 9] Treffer: 6
Ziehung: [2, 5, 6, 8] Treffer: 3
Ziehung: [3, 5, 6, 8] Treffer: 3
Ziehung: [4, 5, 6, 8] Treffer: 6
Ziehung: [2, 7, 8, 9] Treffer: 3
Ziehung: [3, 7, 8, 9] Treffer: 3
Ziehung: [2, 3, 7, 8] Treffer: 1
Ziehung: [4, 7, 8, 9] Treffer: 6
Ziehung: [2, 4, 7, 8] Treffer: 3
Ziehung: [3, 4, 7, 8] Treffer: 3
Ziehung: [5, 7, 8, 9] Treffer: 6
Ziehung: [2, 5, 7, 8] Treffer: 3
Ziehung: [3, 5, 7, 8] Treffer: 3
Ziehung: [4, 5, 7, 8] Treffer: 6
Ziehung: [6, 7, 8, 9] Treffer: 6
Ziehung: [2, 6, 7, 8] Treffer: 3
Ziehung: [3, 6, 7, 8] Treffer: 3
Ziehung: [4, 6, 7, 8] Treffer: 6
Ziehung: [5, 6, 7, 8] Treffer: 6

Ihr wundert euch vielleicht warum es manchmal 6 Treffer gibt, weil sich das nicht ausschließen lässt...

Ich denke aber beim echten 6aus49 wird das nicht möglich sein, weil eine Person nicht so viele Tipps abgeben darf ODER weil der Einsatz höher wäre als der mögliche Gewinn... Aber ich finde diese Überlegungen bemerkenswert.

@berndoa Lass dich von den anderen nicht bashen oder entmutigen, viele wissen einfach nicht besser bescheid...
 

httpdigest

Top Contributor
@berndoa Lass dich von den anderen nicht bashen oder entmutigen, viele wissen einfach nicht besser bescheid...
Und wovon genau soll er sich von den anderen nicht entmutigen lassen?
- weiterhin in jedem einzelnen seiner Posts lautstark und mit allen Vieren seine persönliche Meinung zum Einsatz von OOP zum Ausdruck zu bringen, die hier niemanden interessiert?
- weiterhin auf alles zu schimpfen, wie Konventionen und allgemeine Methoden des Software Engineering wie Kapselung?
- weiterhin auf alle anderen Projekte (99% von GitHub?) zu schimpfen, die seiner Meinung nach alle unnötig komplex aufgebaut sind?
 

Neumi5694

Top Contributor
@berndoa Lass dich von den anderen nicht bashen oder entmutigen, viele wissen einfach nicht besser bescheid...
Wenn sich ein Gewinn ausschließen oder garantieren ließe, dann bräuchte man nicht spielen :)
Niemand hat behauptet, es wäre ausgeschlossen, dass er jemals 3 richtige zieht, es ist nur unmöglich, dies zu garantieren, sofern man nicht alle möglichen Kombinationen zieht.

Hierzulande spielt man übrigens 6 aus 90. Rechne dir mal die Wahrscheinlichkeiten dafür aus :)

1647863743660.png
 

KonradN

Super-Moderator
Mitarbeiter
Und wovon genau soll er sich von den anderen nicht entmutigen lassen?
- weiterhin in jedem einzelnen seiner Posts lautstark und mit allen Vieren seine persönliche Meinung zum Einsatz von OOP zum Ausdruck zu bringen, die hier niemanden interessiert?
- weiterhin auf alles zu schimpfen, wie Konventionen und allgemeine Methoden des Software Engineering wie Kapselung?
- weiterhin auf alle anderen Projekte (99% von GitHub?) zu schimpfen, die seiner Meinung nach alle unnötig komplex aufgebaut sind?
Ich finde es ja schon erstaunlich, dass wir hier im kleine Java Forum das sehen können, was sich ja im Social Media im Großen abspielt.

Da finden sich die Richtigen um sich dann gegenseitig zu verstärken. Psychologen haben da ihre Freude dran. Dunning Kruger Effekt vom Feinsten selbst hier.

Aber das sind halt Fachleute. Die haben beide schon ein Hello World (ab)geschrieben und das klappte auch ohne OOP, Konventionen, Clean Code, .... Und dieses Hello World brauchte auch nichts von dem, was so 99% der GitHub Projekte hat (wobei mich erstaunt: 1% der Projekte ist Hello World Niveau? ok, die beiden haben da vielleicht beide hanz viele Repositories :) )

Wer sind wir schon, als dass wir da irgendwie mitreden können. Wir sollten froh sein, dass so Experten versuchen, und fehlgeleitete Schaafe auf den rechten Weg zurück zu führen :)

*scnr*
 

httpdigest

Top Contributor
Jepp. Ich persönlich denke, es ist immer sinnvoll, "open-minded" zu sein und andere Sichtweisen zumindest anzuhören und dann versuchen zu verstehen, wo die Beweggründe/Motivationen sind, eine bestimmte Herangehensweise (so sie denn von _außen_ als komplex oder einfach angesehen werden kann) zur Lösung eines Problems zu wählen.
Der Punkt ist aber: Man kann _von außen_ niemals bewerten, ob eine gewählte Lösung sinnvoll oder nicht ist, weil man die vielen Treiber bzw. Gründe für die gewählte Lösung einfach in den wenigsten der Fällen kennt.
Ja, ein "Hello World" Programm hat als einzigen Treiber bzw. einzige Anforderung, dass auf der Konsole "Hello, World!" ausgegeben wird.
Das sieht KOMPLETT anders aus bei realen Projekten.
Und das scheint eben das zu sein, was meist nicht gesehen wird, weil man (Vermutung) vielleicht leider noch niemals reale Projekte mit realen Anforderungen kennengelernt hat.
Dort gibt es soooo viele verschiedene Treiber, die letztlich zu einem Lösungsdesign führen. Das ist nicht _nur_ der Treiber, Dinge möglichst "einfach" zu haben.
Ich rege mich persönlich z.B. auch häufig darüber auf, dass in den meisten Kundenprojekten, die ich bisher gesehen habe, einfach immer _jedes_ Problem mit Spring Boot gelöst werden möchte. Sei es noch so einfach wie ein static file hosting bzw. Webserver -> Spring Boot.
Dass dahinter aber z.B. ganz einfache Motivationen stehen wie: Wir wollen einen einheitlichen Technologie-Stack haben, damit möglichst viele potenzielle Leute in unserem Projekt arbeiten können. Oder: Wir wollen einfache/einheitliche Build-/Deployment Pipelines.

Letztlich: Es gibt es für _jede_ Lösung Motivationen bzw. Gründe. Im besten Fall sind diese Gründe _bewusst_ gewählt worden. Häufig aber unbewusst: "weil man es eben schon immer so gemacht hat und es sich bewährt hat - denn niemand weiß, was die Zukunft noch bringt."
In gar keinem Fall sollte man aber Lösungen _von vornherein_ als unsinnig oder zu komplex abtun, ohne, dass man zumindest versucht hat, die Motivation dahinter verstehen zu wollen.

Sorry, could not resist either. Das nur dazu. :D
 

mihe7

Top Contributor
Die haben beide schon ein Hello World (ab)geschrieben und das klappte auch ohne OOP, Konventionen, Clean Code, ....
Das geht natürlich als Einzeiler, inkl. effizienter Objekterstellungsvermeidung bzgl. selbstdefinierter Klassen und obligatorischem Array:
Java:
public class H { public static void main(String[] a){a();}  static void a(){ System.out.println(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'}); } }
 

LimDul

Top Contributor
Was aber wichtig ist - und den Fehler sehe ich auch hier. Man sollt zuerst versuchen das Problem abstrakt zu verstehen und zu lösen und dann in die technischen Details gehen. Und dann - wenn man da Performance-Problem misst, optimieren. Nicht von vornherein auf Performance optimieren im Kleinen. Das ist eigentlich nie sinnvoll.

Zum Problem hier - der Algorithmus ist meines Erachtens eine Katastrophe. Denn 6-Tupel entfernen und um dann alle 3-Tupel zu prüfen ob sie noch vorhanden sind hört sich nach einem absoluten Performance Killer an.

Wenn man es machen will, sollte man sich als erste geeignete Datenstrukturen überlegen. Und damit meine ich nicht "Arrays" sondern fachlich Datenstrukturen. So wäre für den Algorithmus folgende Datenstrukturen sinnvoll:

* Will zu jedem 3-Tupel wissen in welchen 6-Tupel es vorkommt
* Ich will zu jedem 6-Tupel wissen, welche 3-Tupel darin vorkommen.

Denn dann kostet mich die Fragestellung, kann ich das 6-Tupel entfernen nur noch wenige Millisekunden (Prüfen jedes der 20 enthaltenen 3-Tupel ob es in mindestens 2 6-Tupeln enthalten ist)

Und - oh Wunder - damit kommen dann schnell Klassen ins Spiel mit einem Datenmodell :)

Auch wenn der Speicherbedarf was größer wird - der Algorithmus dürfte deutlich schneller sein.
 

KonradN

Super-Moderator
Mitarbeiter
Das geht natürlich als Einzeiler
Ja, was alles geht habe ich auch schon erleben dürfen:
- Ein Entwickler, der wirklich slles sehr optimiert hat. Wa noch zu C Zeiten und man ist mit Speicher sehr sorgfälltig umgegangen. So ein char Array für Strings wurde dann mehrfach verwendet. Ist nur blöd, wenn da erst ein Connection String drin steckt und dann - bei einem fehlgeschlagenen Verbindungaufbau dieser verwendet wurde um eine Fehlermeldung ins Log zu schreiben. Irgendwie klappten dann nachfolgende Verbindungsversuche auch nicht mehr....
- Ein Entwickler, der mit perl Dinge automatisiert hat, war ein Experte bezüglich möglichst viel in eine Zeile zu packen. Die Scripte waren also von der Zeilenanzahl extrem kurz :)

Das waren also wirkliche Experten.

Und das mit der Bubble muss man dann ja auch nur sehen: Wir sind ja auch nur in eine Bubble und bestätigen uns gegenseitig. Nur weil zu unserer Bubble noch Andere gehören wir Robert C Martin (Uncle Bob), Kent Beck, Ward Cunningham, .... hat das ja nichts zu sagen. Andere Sichtweisen gibt es durchaus öfters - man muss ja nur an Diskussionen in der Vergangenheit denken z.B. zu Unit Tests....
 

Staarfightaar

Bekanntes Mitglied
Ja, was alles geht habe ich auch schon erleben dürfen:
- Ein Entwickler, der wirklich slles sehr optimiert hat. Wa noch zu C Zeiten und man ist mit Speicher sehr sorgfälltig umgegangen. So ein char Array für Strings wurde dann mehrfach verwendet. Ist nur blöd, wenn da erst ein Connection String drin steckt und dann - bei einem fehlgeschlagenen Verbindungaufbau dieser verwendet wurde um eine Fehlermeldung ins Log zu schreiben. Irgendwie klappten dann nachfolgende Verbindungsversuche auch nicht mehr....
- Ein Entwickler, der mit perl Dinge automatisiert hat, war ein Experte bezüglich möglichst viel in eine Zeile zu packen. Die Scripte waren also von der Zeilenanzahl extrem kurz :)

Das waren also wirkliche Experten.

Und das mit der Bubble muss man dann ja auch nur sehen: Wir sind ja auch nur in eine Bubble und bestätigen uns gegenseitig. Nur weil zu unserer Bubble noch Andere gehören wir Robert C Martin (Uncle Bob), Kent Beck, Ward Cunningham, .... hat das ja nichts zu sagen. Andere Sichtweisen gibt es durchaus öfters - man muss ja nur an Diskussionen in der Vergangenheit denken z.B. zu Unit Tests....
von meinem prof in c++ wurden mir auch tolle sachen an den kopf geworfen

1. Dass c++ eine kontextsensitive sprache ist, während er eig case sensitiv gemeint hatte
2. Präkrement erhöht den wert und postkrement reduziert den wert
3. In der klasusur war dann der code und man solle beurteilen was raus kommt
Java:
int main {
    const int x = <???>;
    List list();
    list.allocate(x);
    ausgabe(list);
    list.sort()
    ausgabe(list);
}
meine antwort war dass das programm gar nix ausgibt weil erstens der ausdruck <???> so nicht existiert und zweitens die ausgabe funktion nicht definiert worden ist ( bin in die einsicht gegangen und er hat gesagt "also so war die aufgabe ja nicht gedacht")
3. dann noch eine ankreuz aufgabe wo 1e aufgabe schon angekreuzt war

ist schon toll... wenn der prof a la "ich chef du nix" sich präsentiert weil er die Allmacht hat die klausur zu stellen aber WEHE man kritisiert bei der Evaluation ... die "profis" können immer müll brabbeln weil die die es besser könnten zum schweigen gezwungen werden aus diesem und jenem grund

das war unter anderem auch ein grund warum ich dein kommentar mit "NRW Abitur dieses jenes" dämlich fand, ich musste die schule wechseln um in allen noten um 2 noten besser zu werden...hat NIX mit meinem wissen zu tun , hat NIX mit dem bundesland zu tun... es ist nur wichtig ob du dem mit der Allmacht in den arsch kriechst oder nicht.. und so zieht sich das durch das "noten" leben hindurch und wie du schon selbst gesagt hast hört es nach der schule / uni / ausbildung nicht auf
 

KonradN

Super-Moderator
Mitarbeiter
warum ich dein kommentar mit "NRW Abitur dieses jenes" dämlich fand,
Da evtl. zur Erläuterung: Als ich mein Abitur 1992 gemacht habe, war es in NRW möglich, in der Oberstufe so weit Fremdsprache / Deutsch /... abzuwählen, so dass das Resultat war, dass man z.B. in Bayern nicht hätte studieren können.

Und das alles ist auch nur getriggert durch eine Person, die ich für unfehlbar hält oder hielt und in NRW Abitur gemacht hat.

Und natürlich steht und fällt alles mit den Lehrern und das Schulsyste ist alles andere als gerecht. Aber darum ging es nie.

Mir selbst ist sowas relativ bis ganz egal. Ob jemand Abitur hat oder studiert oder .... Das trägt nicht zu meiner Beurteilung einer Person bei. Daher spiet es auch für mich keine Rolle ob und wo jemand sein Abitur gemacht hat.
 

Staarfightaar

Bekanntes Mitglied
Aber darum ging es nie.
es hat halt auswirkungen auf den Menschen

als kind kopiert man immer Erwachsene... bis man älter wird und sich selber gedanken macht aber die "persönlichkeits biegungen" die durch den Schul und Noten müll kommen können manche nicht verarbeiten

ist so toll wenn man immer in der öffentlichkeit hört "die jugend von heute ist so schlimm" ... in bayern gibts ein tolles sprichwort "von wem häd ers denn" also "von wem hätte er es denn" ( meistens wenn der junge irgendwas blödes macht was er von seinem vater hat :D )
und mich nervt es wenn dann weiter auf die jugend eingeprügelt wird...
wieso kommt er denn immer zurück ins java forum ?
vllt weil ihm mal jemand zuhört und seine sachen durchliest? ... das kann für manche schon genug sein, auch wenn gewisse gleich mit dem vorschlaghammer kontern ;) ... erinnert mich immer an die szene in spongebob wo poseidon 1000 Krabben burger hat und spongebob über den 1en den er hat glücklich ist

PS:
external-content.duckduckgo.com.gif
 

berndoa

Top Contributor
Das geht natürlich als Einzeiler, inkl. effizienter Objekterstellungsvermeidung bzgl. selbstdefinierter Klassen und obligatorischem Array:
Java:
public class H { public static void main(String[] a){a();}  static void a(){ System.out.println(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'}); } }
Pff, wozu ne extra Methode definieren?
Kann man doch direkt in der Main Methode machen :-D
 

berndoa

Top Contributor
Was aber wichtig ist - und den Fehler sehe ich auch hier. Man sollt zuerst versuchen das Problem abstrakt zu verstehen und zu lösen und dann in die technischen Details gehen. Und dann - wenn man da Performance-Problem misst, optimieren. Nicht von vornherein auf Performance optimieren im Kleinen. Das ist eigentlich nie sinnvoll.

Zum Problem hier - der Algorithmus ist meines Erachtens eine Katastrophe. Denn 6-Tupel entfernen und um dann alle 3-Tupel zu prüfen ob sie noch vorhanden sind hört sich nach einem absoluten Performance Killer an.

Wenn man es machen will, sollte man sich als erste geeignete Datenstrukturen überlegen. Und damit meine ich nicht "Arrays" sondern fachlich Datenstrukturen. So wäre für den Algorithmus folgende Datenstrukturen sinnvoll:

* Will zu jedem 3-Tupel wissen in welchen 6-Tupel es vorkommt
* Ich will zu jedem 6-Tupel wissen, welche 3-Tupel darin vorkommen.

Denn dann kostet mich die Fragestellung, kann ich das 6-Tupel entfernen nur noch wenige Millisekunden (Prüfen jedes der 20 enthaltenen 3-Tupel ob es in mindestens 2 6-Tupeln enthalten ist)

Und - oh Wunder - damit kommen dann schnell Klassen ins Spiel mit einem Datenmodell :)

Auch wenn der Speicherbedarf was größer wird - der Algorithmus dürfte deutlich schneller sein.
Naja, die Variante mache ich eben weil es die logische Variante ist.

Dass da teilweise die selben Probleme wieder benutzt werden , ist klar.
Was für ein Datnemodell du meisnt, steigt mir gerade über den Kopf.

Dass man gucken kann ob ein 3-Tupel in mind. 2 6-Tupeln enthalten ist, hat was.
Vermutlich einfacher als eine verkürzte Liste (temporär) zu erstellen und die querzuvergleichen.

Gut, sind dann halt auch (Anzahl 3-Tupel) mehr Tupel x Tupel Vergleiche zu machen.
Pro 6-Tupel, wohlgemerkt.

Aber am Ende macht das performance technisch vermutlich keinen unterschied, die Performance des Ganzen ist vermutlich so oder so shclecht.

Und nein, ich wieß nicht wie es einfacher geht diesen Algorithmus umzusetzen, sonst hätte ich es schon getan :)
 

berndoa

Top Contributor
Ist seine Baccarasimulation etwa schon fertiggerechnet?

Meine Fresse, hätte ich gewußt das einen Tag später das hier kommt, hätte ich mir die langen Posts am Sonntag gespart.
Kommt noch, ich muss erst mal richtig kapieren wie das Spiel funktioniert (also wie die Regeln in der üblichsten Variante sind) 🙃

Aber ich sehe es trotzdem kommen, dass ich einfach mit Doppelarrays arbeite um eingangs vom Doppelarray {{}{}} am Spielstart zum Endzustand Schritt für Schritt zu gelangen.


Wobei ich vermutlich im Sinne einer Strichliste einfach tracken werde wie viele Spiele zugunsten des Spielers, zugunsten der bank und wie viele unentschieden ausgingen und damit dann die relative Wahrscheinlichkeit berechnen.

man muss sich ja das Leben nicht schwerer mahcen als es ist :)

Entweder mit Arrays oder Arraylist, da bin ich mir noch unklar.

Wobei ich ja auch mit einem 2x3 Array arbeiten könnte (also annehmen dass beide Parteien 3 Karten kriegen) und wo nötig die 3. Stelle eben auf 0 setzen.

Mal schauen, es eilt ja nicht, kann ich ja noch in aller Ruhe zusammenbasteln.

Und sich die Leute suchen lassen, wer die meisten Konventionsbrüche und Ähnliches findet.
Welche, im gegensatz zu Konrads Unsinn, keine basics sind sondern freiwilliger unsinn. Kann man, muss man aber nicht.

Passende Einrückungen und so okay,

Aber ob jetzt die Variable GurkenGlas,gurkenGlas, Gurkenglas oder sonstwie heißt (wobei letzteres sehr viel Sinn macht da deutsche Rechtschreibung, duh -.- Rehtschreibung>Konventionsmist) ist weitestgehend unwichtig, solange überall konsequent geschrieben.
 

KonradN

Super-Moderator
Mitarbeiter
Welche, im gegensatz zu Konrads Unsinn, keine basics sind sondern freiwilliger unsinn. Kann man, muss man aber nicht.
Ja, ist alles Unsinn. Aber das ist nichts, das ich als "meinen Unsinn" deklarieren kann. Ich bin nur ein Depp, der in einer komischen Blase ist in der man halt von so idiotischen Dingen überzeugt ist.

Uncle Bob (Robert C. Martin) hat da einen sehr großen Anteil dran. Aber da gibt es viele Deppen wie ihn. Kent Beck, Ward Cunningham, Grady Booch, .... Also das sind absolute Deppen und schlimm wird es, wenn davon zu viele auf einmal zusammen kommen ... Dann verfassen die irgendwelche "Manifestos" - das sind sowas wie "die 10 Gebote" der Blase, in der sie sind (wenn man das Agile Manifesto betrachtet). Und das hat massive Auswirkungen. Dich mag das hier ja nerven, aber hier ist ja nur ein kleines Forum. Wir Deppen haben sogar schon große Konzerne gekappert, die dann solche "Gebote" aufnehmen und umsetzen....

Also ich finde deine Wachsamkeit sehr gut. Du hast bestimmt schon erkannt, dass dies eigentlich schon den Namen Sekte verdient und dass wir (nicht nur ich - auch andere!) hier ständig versuchen, Leute für unsere Sekte zu gewinnen. Teilweise ganz subtil ... so mit TDD Einführungen und so.

Also ja: Wehr Dich bloss weiter dagegen. Die Idee mit dem 2d Array ist eine super Idee! Lass Dir diese nicht ausreden! Auch so Dinge wie Konstanten oder so solltest Du NIE verwenden! "Magic Numbers" sind ein wichtiger Grundpfeiler des Widerstands!
(Das sage ich nur als Kriegslist. Dadurch, dass ich das sage habe ich die Hoffnung, dass Du diesen Widerstand nicht aufrecht erhältst ... )
 

LimDul

Top Contributor
Um auf das eigentliche Problem einzugehen - ich würde es eh anders lösen.

Ich würde mit einem 6-Tupel anfangen und dann überlegen, welches 6-Tupel ich hinzufügen kann, dass kein 3-Tupel gemeinsam hat.

Den von einer Menge von 6-Tupeln ausgehen und die zu reduzieren ist eine Garantie keine optimale oder auch nur annährend optimale Lösung zu finden.

PS: Ich hoffe das Ziel ist nicht, das in Echt zu tippen und damit was zu gewinnen, da zeigt simple Mathematik das sich das nicht rechnet.
 

berndoa

Top Contributor
Um auf das eigentliche Problem einzugehen - ich würde es eh anders lösen.

Ich würde mit einem 6-Tupel anfangen und dann überlegen, welches 6-Tupel ich hinzufügen kann, dass kein 3-Tupel gemeinsam hat.

Den von einer Menge von 6-Tupeln ausgehen und die zu reduzieren ist eine Garantie keine optimale oder auch nur annährend optimale Lösung zu finden.

PS: Ich hoffe das Ziel ist nicht, das in Echt zu tippen und damit was zu gewinnen, da zeigt simple Mathematik das sich das nicht rechnet.
Ja, vemrutlich wäre es am Sinnvollsten, zu Beginn alle möglichen 3-Tupel zu kreieren und die so "kompakt" wie möglich in so wenige 6Tupel wie möglich reinzupacken :)
Wobei es da natürlich viele Wahlmöglichkeiten geben wird (füge ich das 3-Tupel in 6-Tupel A oder B ein? passen würds in beide),
wodurch am Ende eine mehr oder minder gute (aka kurze) Lsite rauskommt.

Wäre aber vemrutlich mal schon ein Weg, mit dem man eine erste abdeckende Lsite an 6-Tupeln erhält, die gut ist.

Nur wie die 3-Tupel in die 6-Tupel "mergen"?

Arrays werden vermutlich nicht das Mittel der Wahl sein, schätze ich :)


PS: ne, real gezockt wird das nicht.
Selbst ich weiß dsss das einen sehr negativen Erwartungswert hat.


Ist eh mehr so "just for fun" , wie eige ntlich Alles was mir so in den Sinn kommt, was man sich mal kurz ein Programm dazu bauen könnte.

Wäre höchstens für sowas wie eine Tippgemeinschaft interessant, die eh Geld für Lotto hinaus schmeissen wollen und können es mit nicht ganz so hohem Verlust tun :-D


PS PS:
Was mir gerade zur ursprünglichen Vorgehensweise so auffällt:
Gedacht war ja dass mit jedem Optimierungsschritt die 6-Tupel-Liste (was für ein Wort) so weit durchgegangen wird bis ein 6-Tupel gefunden wird das nicht unique ist bzgl seiner 3-Tupels.
Sich die bisher schon als unique festgestellten 6 Tupels zu vermerken damit die in zukünftigen Schritten nicht immer wieder unnötig überprüft werden, würde vermutlich das Ganze auf Dauer schneller machen :)

ABer, wie ich mich nun wieder erinnere, ist das Ganze eh nicht optimal weil es ja eigentlich reicht wenn von jeder möglichen Gewinn-6-tupel nur ein einziges 3-Tupel vorkommt.
Ich muss also bei Weitem gar nicht alle möglichen 3-Tupel abdecken.

Vermutlich sollte ich mich besser um die Baccaratgeschichte kümmern, da gibts weniger stochastische Tricksereien auf die ich nicht von selbst käme :)
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben