Created
August 1, 2012 22:27
-
-
Save thojaw/3231258 to your computer and use it in GitHub Desktop.
Lösung des Lotto-Rätsels mit nur einem LINQ Query
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.Linq; | |
namespace ThomasJaworski.Experiments | |
{ | |
// Lösung des Lotto-Rätsels (siehe z.B. http://www.onlinewahn.de/mega-r.htm) mit nur einem LINQ-Query, | |
// bewußt nicht auf Performance ausgelegt sondern auf leicht lesbaren Code | |
class LottoRechner | |
{ | |
static void Main(string[] args) | |
{ | |
// Zeit messen | |
Stopwatch watch = new Stopwatch(); | |
Console.WriteLine("Starte Lotto Rätsel Kalkulation..."); | |
watch.Start(); | |
// Lotto-Abfrage definieren (LINQ) | |
var lotto = | |
from alle in // Alle Treffer | |
from reihe in // Eine Zahlenreihe | |
from p1 // 1. Stelle, Zahlenreihe 1 bis 44 | |
in Enumerable.Range(1, 44) | |
from p2 // 2. Stelle, Zahlenreihe 2 bis 45 | |
in Enumerable.Range(p1 + 1, 45 - p1) | |
from p3 // 3. Stelle, Zahlenreihe 3 bis 46 | |
in Enumerable.Range(p2 + 1, 46 - p2) | |
from p4 // 4. Stelle, Zahlenreihe 4 bis 47 | |
in Enumerable.Range(p3 + 1, 47 - p3) | |
from p5 // 5. Stelle, Zahlenreihe 5 bis 48 | |
in Enumerable.Range(p4 + 1, 48 - p4) | |
from p6 // 6. Stelle, Zahlenreihe 6 bis 49 | |
in Enumerable.Range(p5 + 1, 49 - p5) | |
select | |
new int[] { p1, p2, p3, p4, p5, p6 } // Zahlenreihe in einem Array ablegen | |
group reihe // Reihe gruppieren... | |
by reihe.Sum() // nach der Summe... | |
into gruppe // in eine neue Gruppe | |
select new | |
{ // Neue Ergebnisreihe bilden, mit... | |
Summe = gruppe.Key, // der Summe als Schlüssel... | |
Treffer = from reihe // und einer weiteren Sammlung einer neuen Reihe | |
in gruppe // aus der bestehenden Gruppe | |
where reihe.Aggregate((x, y) => x * y) == gruppe.Key * gruppe.Count() | |
select reihe // Alle Reihen, deren Produkt über alle 6 Stellen | |
// dem Produkt aus Summe und Anzahl der... | |
// Möglichkeiten entspricht | |
} | |
where alle.Treffer.Any(z => z.Aggregate((x, y) => x * y) > 9999999) | |
// Nur Treffer mit einem Produkt von mind. 10 Mio. | |
select new | |
{ | |
GeheimeZahl = alle.Summe, // Erneut Summe wählen - sie is die Geheimzahl | |
LottoZiehung = string.Join(", ", alle.Treffer.Single()) | |
// Zahlenreihe formatieren (komma-getrennt) | |
}; | |
// Alle Treffer ausgeben - erwartet wir genau ein Treffer. | |
// Ohne der where-Einschränkung "Nur Treffer mit einem Produkt von mind. 10 Mio" gibt es vier Treffer. | |
foreach (var treffer in lotto) | |
{ | |
Console.WriteLine("Treffer gefunden: Geheime Zahl {0} ergibt Ziehung {1}.", treffer.GeheimeZahl, treffer.LottoZiehung); | |
} | |
// Zeitmessung Ende | |
Console.WriteLine("Lotto Rätsel Kalkulation beendet in {0} ms.", watch.ElapsedMilliseconds); | |
watch.Stop(); | |
// Konsolenprogramm Abschließen | |
Console.WriteLine(); | |
Console.WriteLine("Drücken Sie eine beliebige Taste zum Beenden"); | |
Console.ReadKey(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Gute Arbeit! Und ich frage mich, ob Sie etwas Ähnliches tun können, um ernstere Rätsel zu lösen, wie das Gewinnen in echten Online-Casinos, die hier beschrieben sind. Ich denke es ist ziemlich schwierig, aber wer weiß...