Домашняя страница Илон vs Марк
Публикация
Отменить

Илон vs Марк

👋 Всем Привет !

На курсе "Введение в платформу .NET" ребята из True Engineering предложили интересную задачу:

1
2
3
4
5
Илон Маск и Марк Цукерберг решили сразиться в поединке в римском Колизее. Боги разгневались на них, схватили и заперли в двух разных комнатах. Они согласны освободить Марка и Илона, если они решат одну задачку.

Есть колода из 36 карт. Боги перемешивают колоду, делят её напополам и отдают одну стопку Илону Маску, а вторую стопку Марку Цукербергу. Затем оба смотрят на свои карты не перемешивая их. Каждый из них должны назвать номер карты в стопке у партнера. Если цвета выбранных карт совпадают, им разрешают сразится иначе, не разрешают.

Илон и Марк, как придвинутые парни, заранее предвидели все эти обстоятельства и имели возможность договориться о стратегиях своего поведения (они могут быть как одинаковы, так и различны для Илона и Марка).

💪 Моя реализация

Solution IlonMarkFight состоит из 7 Projects:

ProjectsТип сборкиОписание
ConsoleAppConsole ApplicationТочка входа в приложение, работа песочницы
CoreClass LibraryРеализация библиотечных абстракций для задачи
DataLibClass LibraryАбстракции библиотеки
DbStorageClass LibraryОписание контекста для Entity Framework и Entity для сохранения контекста игр
ModelsClass LibraryМодели библиотеки
OpponentsWebAppASP.NET Core ApplicationWeb-приложения оппонентов
TestUnit Test ProjectUnit-тестирование программы

Абстракции

Объединяющая часть сервиса это песочница ISandBox. Единственный метод интерфейса возвращает выжили ли участники или нет.

1
2
3
4
public interface ISandBox
{
    bool Round(IShuffleableDesk desk);
}

Метод Round принимает на вход колоду, которая реализует IShuffleableDesk

1
2
3
4
5
6
7
8
public interface IShuffleableDesk : IDesk
{
    void SwapCards(int i, int j)
    {
        if (i >= Cards.Count || j >= Cards.Count) return;
        (Cards[i], Cards[j]) = (Cards[j], Cards[i]);
    }
}

Методе Round колода перемешивается методом Shuffle из IDeskShuffler

1
2
3
4
public interface IDeskShuffler
{
    void Shuffle(IShuffleableDesk desk);
}

Далее колода методом IDesk.Split разделяется на два листа и передается оппонентам для получения выбранных карт, которые реализуют IChooseCard

1
2
3
4
public interface IChooseCard
{
    Card Choose(IEnumerable<Card> cards);
}

И последний этап боя это оценка результата богами, которые реализуют IDistributor

1
2
3
4
public interface IDistributor
{
    bool Judge(Card cardFirstOpponent, Card cardSecondOpponent);
}

Реализации

В модуле Core содержаться реализации приведенных абстракций.

🚀 Как использовать

  1. Посетите мой репозиторий на GitHub.
  2. Инструкция по эксплуатации.
  3. Поделитесь своим опытом и предложениями в разделе Issues.

⚔️ Скоро выйдет пост, в котором я расскажу о самой выгодной стратегии для Илона и Марка

Публикация защищена лицензией CC BY 4.0 .
Содержание