Προς το περιεχόμενο

Αλγόριθμος για πρόγραμμα Τζόκερ (αριθμοσειρές)


Επισκέπτης

Προτεινόμενες αναρτήσεις

Επισκέπτης

Στην σελίδα μου θα βρείτε ένα πρόγραμμα Τζόκερ. Θέλω να προσθέσω μία λειτουργία αρκετά χρήσιμη, αλλά δεν μπορώ να φτιάξω έναν αλγόριθμο για όλες τις περιπτώσεις. Θα προσπαθίσω να είμαι κατανοητός...

 

Καταρχάς μιλάμε για Visual Basic

 

Όπως ξέρετε το πρώτο πεδίο αριθμών του Τζόκερ περιέχει 45 αριθμούς από τους οποίους ζητάμε τους 5. Φυσικά υπάρχουν συστήματα τυποποιημένα, που σου επιτρέπουν να επιλέξεις παραπάνω από 5 αριθμούς -με μεγαλύτερο κόστος και ποσοστό επιτυχίας. Αυτούς τους αριθμούς τους ονομάζω αριθμοσειρές.

Για παράδειγμα:

1,2,3,4,5,6,7,8,9,10

1,2,3,4,5,6,7,8,9,11

1,2,3,4,5,6,7,8,9,12

..................

1,2,3,4,5,6,7,8,9,45

 

Αυτές είναι οι πρώτες αριθμοσειρές των δέκα αριθμών.

 

Τι θέλω να κάνω εγώ. Να επιλέγει ο χρήστης τον επιθυμητό μέγεθος επιλεγμένων αριθμών (πχ. αριθμοσειρές των 5 αριθμών), ώστε να του εμφανίζει όλες τις πιθανές αριθμοσειρές, αρχίζοντας από την αρχή (πχ. 1,2,3,4,5) και να φτάνει στο τέλος (πχ. 41,42,43,44,45)

 

Το μόνο στοιχείο που είναι μεταβλητο είναι το μέγεθος των αριθμοσειρών (πχ αριθμοσειρές των χ)

 

Η λογικη είναι:

Για παράδειγμα οι αριθμοσειρές των 10

Πρώτη : 1,2,3,4,5,6,7,8,9,10

Μετά αυξάνουμε τον τελευταίο αριθμό μέχρι να φτάσει στο 45

1,2,3,4,5,6,7,8,9,10.....1,2,3,4,5,6,7,8,9,45

Μόλις φτάσει το 45, αυξάνουμε τον προ τελευταίο +1, και κάνουμε τον τελευταίο ίσο με προτελευταίο+1

1,2,3,4,5,6,7,8,10,11.....1,2,3,4,5,6,7,8,10,45

 

Μπορεί να είναι πανεύκολη η λύση, αλλά έχει κολλήσει το μυαλό μου. Έχει περάσει από το μυαλό μου να χρησιμοποιώ έναν πίνακα με 44 θέσεις, και να πειράζω αυτόν, και να τυπώνω την τελική αριθμοσειρά μόλις αλλάζει ο τελευταίος αριθμός της αριθμοσειράς. Να βάλω 45 for..next και 44 if..then ώστε να τσεκάρω τι μέγεθος αριθμών έχει επιλέξει ο χρήστης.

 

Ελπίζω να μην σας μπέρδεψα με το πρόβλημά μου και να βρεθεί καμία καλή υλοποίηση.

 

<small>[ 15-07-2002, 16:18: Το μήνυμα επεξεργάστηκε από: timiman ]</small>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν είμαι σίγουρος αν κατάλαβα 100% τι ζητάς αλλά ελπίζω τουλάχιστον να πάρεις ιδέες (γραμμένο σε Java). Μπορείς να αλλάξεις τη σύνταξη πιστεύω. Αν έχεις την εικονική μηχανή εγκαταστημένη μπορείς να το τρέξεις με java Numbers <αριθμός>

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">public class Numbers

{

public static void main(String [] arguments)

{

int length = Integer.parseInt(arguments[0]);

 

for (int i=length; i<46; i++)

{

for (int j=0; j<length; j++)

{

if ((j+1) == length)

System.out.print(i);

else

System.out.print((j+1) + " ");

}

System.out.println();

}

}

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν χ είναι το μέγεθος της αριθμοσειράς τότε όλοι οι πιθανοί συνδυασμοί είναι

 

( 45 ) 45!

( )= -----

( χ ) χ! (45-χ)!

 

Ενδεικτικά για χ=5 ο αριθμός των συνδυασμών είναι 1.221.759 και ο αριθμός αυξάνει πάρα πολύ όσο αυξάνει το χ. (για χ=10 3.190.187.286)

Αν έχεις τρόπο να απεικονίσεις όλους αυτούς τους συνδυασμούς, θα ήθελα να τον μάθω και εγώ. (για χ=10 χρειάζεται 30GB αρχείο).

 

Ένας πρόχειρος αλγόριθμος που σκέφτηκα είναι ο παρακάτω:

 

Έστω οτι χρειάζεσαι τον παρακάτω συνδυασμό

 

( χ )

( )

( y )

 

Δηλαδή χ είναι όλοι οι δυνατοί αριθμοί και y το μέγεθος κάθε αριθμο σειράς. Ξεκινάς κατασκευάζοντας τις ακολουθίες απο κ=1 εώς κ=y.

 

Για να το καταλάβεις ένα παράδειγμα.

 

( 5 )

( )=10

( 3 )

 

για y=1

a[5]={1,2,3,4,5}

 

Κοιτάς το πρωτο ψηφιο της αριθμοσειρας και το συνδυάζεις με τα μικροτερα του

1,2 1,3 2,3

1,4 2,4 3,4

1,5 2,5 3,5 4,5

 

(φροντιζεις να είναι αποθηκευμένα διατεταγμένα)

 

τωρα το πρωτο ψηφιο της αριθμοσειράς και τα συνδυάζεις με τα μικροτερα του

 

1,2,3 1,2,4 1,2,5

1,3,4 2,3,4

1,3,5 2,3,5

1,4,5 2,4,5 3,4,5

 

τώρα πάλι το πρωτο με τα μικρότερα

για y=4

1,2,3,4

1,2,3,5

1,2,4,5

1,3,4,5

2,3,4,5

 

και το ίδιο για y=5

 

1,2,3,4,5

 

<small>[ 15-07-2002, 18:58: Το μήνυμα επεξεργάστηκε από: bandito ]</small>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης

Χμ..

 

Για την ακρίβεια ο τύπος είναι έτσι ( απλοποιημένος)-(όπως σωστά λες):

 

Για να βρούμε πόσες 6άδες υπάρχουν που να έχουν σαν μέγιστο αριθμό το 45 τότε: 45*44*43*42*41*40 / 1*2*3*4*5*6 = 5864443200 / 720 = 8145060 πιθανοί συνδιασμοί

 

Λογικό είναι να μεγαλώνει το πλήθος των συνδιασμών. Λογικά θα το στενέψω το όριο (6-15)

 

Σκέφτηκα να βάλω σε ένα αρχείο του πιθανούς συνδιασμούς, αν είναι να μειώσω τα όρια... <img border="0" title="" alt="[Frown]" src="images/icons/frown.gif" />

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και πάλι δεν έχει νόημα.

 

Για να γράψεις ένα συνδυασμό 6 χαρακτήρων χρειάζεται 9 bytes μέσο όρο για τους χαρακτήρες, 5 για τα κομματα και 2 για το new line.

 

Για έξι όπως σωστά είπες χρειάζεται 8.145.060*16=130.320.960 bytes=130MB περίπου.

 

Για πλάκα μόνο σου λέω οτι για 15 χρειάζεσαι 13.104.962.172.192=13,1 ΤerraBytes!!!!!!!!!!!!

 

Επίσης ακόμα και αν τα είχες, θα ήθελες τουλάχιστον μια εβδομάδα για να τελειώσει ο αλγόριθμος ακόμα και αν ειναι τάξης 0(n).

 

<small>[ 16-07-2002, 00:34: Το μήνυμα επεξεργάστηκε από: bandito ]</small>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 9 χρόνια αργότερα...

Στην σελίδα μου θα βρείτε ένα πρόγραμμα Τζόκερ. Θέλω να προσθέσω μία λειτουργία αρκετά χρήσιμη, αλλά δεν μπορώ να φτιάξω έναν αλγόριθμο για όλες τις περιπτώσεις. Θα προσπαθίσω να είμαι κατανοητός...

 

Καταρχάς μιλάμε για Visual Basic

 

Όπως ξέρετε το πρώτο πεδίο αριθμών του Τζόκερ περιέχει 45 αριθμούς από τους οποίους ζητάμε τους 5. Φυσικά υπάρχουν συστήματα τυποποιημένα, που σου επιτρέπουν να επιλέξεις παραπάνω από 5 αριθμούς -με μεγαλύτερο κόστος και ποσοστό επιτυχίας. Αυτούς τους αριθμούς τους ονομάζω αριθμοσειρές.

Για παράδειγμα:

1,2,3,4,5,6,7,8,9,10

1,2,3,4,5,6,7,8,9,11

1,2,3,4,5,6,7,8,9,12

..................

1,2,3,4,5,6,7,8,9,45

 

Αυτές είναι οι πρώτες αριθμοσειρές των δέκα αριθμών.

 

Τι θέλω να κάνω εγώ. Να επιλέγει ο χρήστης τον επιθυμητό μέγεθος επιλεγμένων αριθμών (πχ. αριθμοσειρές των 5 αριθμών), ώστε να του εμφανίζει όλες τις πιθανές αριθμοσειρές, αρχίζοντας από την αρχή (πχ. 1,2,3,4,5) και να φτάνει στο τέλος (πχ. 41,42,43,44,45)

 

Το μόνο στοιχείο που είναι μεταβλητο είναι το μέγεθος των αριθμοσειρών (πχ αριθμοσειρές των χ)

 

Η λογικη είναι:

Για παράδειγμα οι αριθμοσειρές των 10

Πρώτη : 1,2,3,4,5,6,7,8,9,10

Μετά αυξάνουμε τον τελευταίο αριθμό μέχρι να φτάσει στο 45

1,2,3,4,5,6,7,8,9,10.....1,2,3,4,5,6,7,8,9,45

Μόλις φτάσει το 45, αυξάνουμε τον προ τελευταίο +1, και κάνουμε τον τελευταίο ίσο με προτελευταίο+1

1,2,3,4,5,6,7,8,10,11.....1,2,3,4,5,6,7,8,10,45

 

Μπορεί να είναι πανεύκολη η λύση, αλλά έχει κολλήσει το μυαλό μου. Έχει περάσει από το μυαλό μου να χρησιμοποιώ έναν πίνακα με 44 θέσεις, και να πειράζω αυτόν, και να τυπώνω την τελική αριθμοσειρά μόλις αλλάζει ο τελευταίος αριθμός της αριθμοσειράς. Να βάλω 45 for..next και 44 if..then ώστε να τσεκάρω τι μέγεθος αριθμών έχει επιλέξει ο χρήστης.

 

Ελπίζω να μην σας μπέρδεψα με το πρόβλημά μου και να βρεθεί καμία καλή υλοποίηση.

 

<small>[ 15-07-2002, 16:18: Το μήνυμα επεξεργάστηκε από: timiman ]</small>

 

Φίλε μου μπορώ να σου απαντήσω έστω και καθυστερήμενα σε sql

 

τα [1Η],[2Η],[3Η],[4Η],[5Η] Ειναι τα πεδία ενός πινακα που εχουμε φτιάξει τον JOKER_INSERT_GENERATED για 5 αριθμούς και η παράμετρος " & CInt(TextBox1.Text) & " ειναι η παράμετρος απο πόσους αριθμούς.

 

προφανώς αυτό ειναι για joker

για λοττο προσαρμόζουμε τον πίνακα για 6 πεδία

και στον παρακάτω κώδικα sql κάνουμε αλλο ένα join για τον 6ο αριθμό

 

 

WITH cte_Numbers(number) AS (SELECT 1 AS number UNION ALL " & _

"SELECT number + 1 AS Expr1 FROM cte_Numbers AS cte_Numbers_1 " & _

"WHERE (number < " & CInt(TextBox1.Text) & ")) INSERT INTO JOKER_INSERT_GENERATED ([1H],[2H],[3H],[4H],[5H]) " & _

"SELECT CAST(a.number AS VARCHAR(2)) AS [1H], CAST(b.number AS VARCHAR(2)) AS [2H], CAST(c.number AS VARCHAR(2)) AS [3H], CAST(d.number AS VARCHAR(2)) AS [4H], " & _

" CAST(e.number AS VARCHAR(2)) AS [5H] FROM cte_Numbers AS a INNER JOIN cte_Numbers AS b ON a.number < b.number INNER JOIN " & _

"cte_Numbers AS c ON b.number < c.number INNER JOIN cte_Numbers AS d ON c.number < d.number INNER JOIN cte_Numbers AS e ON d.number < e.number

 

 

Ελπίζω να σε βοηθήσει

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 μήνες μετά...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...