Skip to content

Instantly share code, notes, and snippets.

@thojaw
Created August 1, 2012 22:27
Show Gist options
  • Save thojaw/3231258 to your computer and use it in GitHub Desktop.
Save thojaw/3231258 to your computer and use it in GitHub Desktop.
Lösung des Lotto-Rätsels mit nur einem LINQ Query
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();
}
}
}
@jannwach
Copy link

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ß...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment