Лямба выражения и предикаты (решение логической задачи) - C#

Узнай цену своей работы

Формулировка задачи:

Доброго всем дня. Требуется ваша помощь. В общем поставлена задача: решить логическую задачу "Волк коза капуста"(для тех кто не знаком с условиеем ссылка внизу) с использованием лямбда выражений и предикатов. И что-то я в полном ступоре с чего начать и как описать набор предикатов... Спасибо. Условие:http://www.smekalka.pp.ru/old/answer_old_05.html

Решение задачи: «Лямба выражения и предикаты (решение логической задачи)»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace ConsoleAppTest
  5. {
  6.     public enum Swimmer
  7.     {
  8.         Wolf,    // Волк
  9.         Coat,    // Коза
  10.         Cabbage  // Капуста
  11.     }
  12.  
  13.     class Program
  14.     {
  15.         // Это предикат C : M x M x M -> { true, false }, где M = { Wolf, Coat, Cabbage }
  16.         // Определяет, можно ли оставить двух выбранных персонажей на берегу
  17.         public static Func<Swimmer, Swimmer, bool> CanStay = (first, second) =>
  18.             !IsFirstOrSecond(first, second, Swimmer.Cabbage, Swimmer.Coat) &&
  19.             !IsFirstOrSecond(first, second, Swimmer.Wolf, Swimmer.Coat);
  20.  
  21.         /// <summary>
  22.         /// Возвращает true, когда first или second есть compFirst или compSecond
  23.         /// </summary>
  24.         public static bool IsFirstOrSecond<T>(
  25.             T first, T second, T compFirst, T compSecond)
  26.             where T : IComparable {
  27.             return (first.CompareTo(compFirst) == 0 && second.CompareTo(compSecond) == 0) ||
  28.                    (first.CompareTo(compSecond) == 0 && second.CompareTo(compFirst) == 0);
  29.         }
  30.  
  31.         /// <summary>
  32.         /// Перемещает элемент одного списка в другой
  33.         /// </summary>
  34.         public static Tuple<List<T>, List<T>> ReplaceBetweenLists<T>(List<T> left, List<T> right, T item) {
  35.             if (left.Contains(item) == false)
  36.                 throw new ArgumentException("Элемента нет в списке.");
  37.             left.Remove(item);
  38.             right.Add(item);
  39.  
  40.             return new Tuple<List<T>, List<T>>(left, right);
  41.         }
  42.  
  43.         // Начинаем плыть. Аргументы определяют последовательность перевозки
  44.         public static void LetsSwim(Swimmer first, Swimmer second, Swimmer third) {
  45.             // Начальный берег
  46.             List<Swimmer> inCoast = new List<Swimmer> { Swimmer.Cabbage, Swimmer.Coat, Swimmer.Wolf };
  47.             // Берег назначения
  48.             List<Swimmer> outCoast = new List<Swimmer>(3);
  49.             List<Swimmer> swimmers = new List<Swimmer> { first, second, third };
  50.  
  51.             // Проверяем берега на правильность положения персонажей
  52.             Action CheckCoasts = () => {
  53.                 if (inCoast.Count == 2) {
  54.                     if (CanStay(inCoast[0], inCoast[1]) == false) {
  55.                         Console.WriteLine("У нас проблема! На исходном берегу: {0} и {1}", inCoast[0], inCoast[1]);
  56.                         Environment.Exit(0);
  57.                     }
  58.                 }
  59.  
  60.                 if (outCoast.Count == 2) {
  61.                     if (CanStay(outCoast[0], outCoast[1]) == false) {
  62.                         Console.WriteLine("У нас проблема! На конечном берегу: {0} и {1}", outCoast[0], outCoast[1]);
  63.                         Environment.Exit(0);
  64.                     }
  65.                 }
  66.             };
  67.  
  68.             for (int i = 0; i < inCoast.Count; i++) {
  69.                 Console.WriteLine("Везём {0}", swimmers[i]);
  70.                 ReplaceBetweenLists(inCoast, outCoast, swimmers[i]);
  71.                 CheckCoasts();
  72.             }
  73.             Console.WriteLine("Все переплыли!");
  74.         }
  75.  
  76.         internal static void Main() {
  77.             // LetsSwim(Swimmer.Cabbage, Swimmer.Coat, Swimmer.Wolf);
  78.             LetsSwim(Swimmer.Coat, Swimmer.Wolf, Swimmer.Cabbage);
  79.         }
  80.     }
  81. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы