C# :: Aufgabe #391

1 Lösung Lösung öffentlich

Bingo-Lotterie (Spielerweiterung)

Fortgeschrittener - C# von JKooP - 19.04.2021 um 20:17 Uhr
Ich habe die bereits bestehende Aufgabe
"Klassisches Bingo mit verzögert gezogenen Nummern (C# 243, C++ 220, PY 208, …) von maxi72501"
noch einmal aufgegriffen.

Das Spiel soll dahingehend erweitert werden, dass 22 Zahlen gezogen werden und
der vorab erstelle Spielschein (Aufgabe besteht bereits) damit verglichen wird.

Finden sich fünf Treffer in waagerechter, senkrechter oder diagonaler Reihe heißt das BINGO (siehe Bilder).

Als Ergebnis soll die Anzahl der Gewinne (Einfach-, Zweifach- bzw. Dreifach-Bingo) ausgegeben werden.

Viel Spaß

Lösungen:

vote_ok
von JKooP (18070 Punkte) - 22.05.2021 um 08:49 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

namespace CS_TYP_Aufgabe_391_Bingo_Erweitert
{
    enum BingoRange
    {
        B = 15, I = 30, N = 45, G = 60, O = 75
    }

    enum Bingos
    {
        Kein_Gewinn = 0, Einfach_Bingo = 1, Doppel_Bingo = 2, Dreifach_Bingo = 3
    }

    class Program
    {
        private static List<List<int>> _lotteryTicket;
        private static List<int> _lotteryNumbers;

        static void Main(string[] args)
        {
            _lotteryTicket = LotteryTicket;
            _lotteryNumbers = LotteryNumbers;
            Console.WriteLine("Spielschein:\n");
            PrintLotteryTicket();
            Console.WriteLine("\nGezogene Zahlen:\n");
            PrintLotteryNumbers();
            CompareResults();
            Console.WriteLine("\nGewinnübersicht:\n");
            PrintLotteryTicket(true);
            Console.WriteLine(NumberOfBingos);
        }

        private static List<List<int>> LotteryTicket
        {
            get
            {
                var lst = new List<List<int>>(Enumerable.Range(0, 5)
                    .Select(i => Enumerable.Range(i * 15 + 1, 15)
                    .OrderBy(x => Guid.NewGuid())
                    .Take(5).ToList()))
                    .SelectMany(inner => inner.Select((item, index) => new { item, index })).GroupBy(i => i.index, i => i.item).Select(x => x.ToList()).ToList();
                return lst;
            }
        }

        private static List<int> LotteryNumbers => Enumerable.Range(1, 75).OrderBy(x => Guid.NewGuid()).Take(22).ToList();

        private static void CompareResults()
        {
            for (int i = 0; i < 5; i++)
                for (int k = 0; k < 5; k++)
                    if (_lotteryNumbers.Contains(_lotteryTicket[i][k]))
                        _lotteryTicket[i][k] = 0;
        }

        private static Bingos NumberOfBingos
        {
            get
            {
                var row = _lotteryTicket.Where(x => x.Sum() == 0).Count();
                var col = _lotteryTicket.SelectMany(inner => inner.Select((item, index) => new { item, index })).GroupBy(i => i.index, i => i.item).Select(x => x.ToList()).Where(x => x.Sum() == 0).Count();
                var dia = Enumerable.Range(0, _lotteryTicket.Count).Select(x => new { first = _lotteryTicket[x][x], second = _lotteryTicket[x][^(x + 1)] }).ToList();
                var d1 = dia.Select(x => x.first).Sum() == 0 ? 1 : 0;
                var d2 = dia.Select(x => x.second).Sum() == 0 ? 1 : 0;
                return (Bingos)(row + col + d1 + d2);
            }
        }

        private static void PrintLotteryNumbers()
        {
            _lotteryNumbers = _lotteryNumbers.OrderBy(x => x).ToList();
            List<string> lst2 = new();

            _lotteryNumbers.ForEach(l => lst2.Add(l switch
            {
                var b when b is <= (int)BingoRange.B => BingoRange.B,
                var i when i is <= (int)BingoRange.I => BingoRange.I,
                var n when n is <= (int)BingoRange.N => BingoRange.N,
                var g when g is <= (int)BingoRange.G => BingoRange.G,
                _ => BingoRange.O
            } + l.ToString("00")));

            var lst3 = lst2.GroupBy(x => x[0]).Select(x => x.ToList()).ToList();
            lst3.ForEach(x => Console.WriteLine(string.Join(", ", x)));
            Console.WriteLine();
        }

        private static void PrintLotteryTicket(bool result = false)
        {
            List<string> lst = new();

            Console.WriteLine(" B  | I  | N  | G  | O  |");
            Console.WriteLine(new string('-', 25));

            foreach (var b in _lotteryTicket)
                if (result)
                    lst.Add(string.Join(" | ", b.Select(x => x == 0 ? "XX" : "  ")));
                else
                    lst.Add(string.Join(" | ", b.Select(x => x.ToString("00"))));

            foreach (var b in lst)
            {
                Console.WriteLine($" {b} |");
                Console.WriteLine(new string('-', 25));
            }
            Console.WriteLine();
        }
    }
}