Лямба выражения и предикаты (решение логической задачи) - C#
Формулировка задачи:
Доброго всем дня. Требуется ваша помощь.
В общем поставлена задача: решить логическую задачу "Волк коза капуста"(для тех кто не знаком с условиеем ссылка внизу) с использованием лямбда выражений и предикатов. И что-то я в полном ступоре с чего начать и как описать набор предикатов...
Спасибо.
Условие:http://www.smekalka.pp.ru/old/answer_old_05.html
Решение задачи: «Лямба выражения и предикаты (решение логической задачи)»
textual
Листинг программы
using System; using System.Collections.Generic; namespace ConsoleAppTest { public enum Swimmer { Wolf, // Волк Coat, // Коза Cabbage // Капуста } class Program { // Это предикат C : M x M x M -> { true, false }, где M = { Wolf, Coat, Cabbage } // Определяет, можно ли оставить двух выбранных персонажей на берегу public static Func<Swimmer, Swimmer, bool> CanStay = (first, second) => !IsFirstOrSecond(first, second, Swimmer.Cabbage, Swimmer.Coat) && !IsFirstOrSecond(first, second, Swimmer.Wolf, Swimmer.Coat); /// <summary> /// Возвращает true, когда first или second есть compFirst или compSecond /// </summary> public static bool IsFirstOrSecond<T>( T first, T second, T compFirst, T compSecond) where T : IComparable { return (first.CompareTo(compFirst) == 0 && second.CompareTo(compSecond) == 0) || (first.CompareTo(compSecond) == 0 && second.CompareTo(compFirst) == 0); } /// <summary> /// Перемещает элемент одного списка в другой /// </summary> public static Tuple<List<T>, List<T>> ReplaceBetweenLists<T>(List<T> left, List<T> right, T item) { if (left.Contains(item) == false) throw new ArgumentException("Элемента нет в списке."); left.Remove(item); right.Add(item); return new Tuple<List<T>, List<T>>(left, right); } // Начинаем плыть. Аргументы определяют последовательность перевозки public static void LetsSwim(Swimmer first, Swimmer second, Swimmer third) { // Начальный берег List<Swimmer> inCoast = new List<Swimmer> { Swimmer.Cabbage, Swimmer.Coat, Swimmer.Wolf }; // Берег назначения List<Swimmer> outCoast = new List<Swimmer>(3); List<Swimmer> swimmers = new List<Swimmer> { first, second, third }; // Проверяем берега на правильность положения персонажей Action CheckCoasts = () => { if (inCoast.Count == 2) { if (CanStay(inCoast[0], inCoast[1]) == false) { Console.WriteLine("У нас проблема! На исходном берегу: {0} и {1}", inCoast[0], inCoast[1]); Environment.Exit(0); } } if (outCoast.Count == 2) { if (CanStay(outCoast[0], outCoast[1]) == false) { Console.WriteLine("У нас проблема! На конечном берегу: {0} и {1}", outCoast[0], outCoast[1]); Environment.Exit(0); } } }; for (int i = 0; i < inCoast.Count; i++) { Console.WriteLine("Везём {0}", swimmers[i]); ReplaceBetweenLists(inCoast, outCoast, swimmers[i]); CheckCoasts(); } Console.WriteLine("Все переплыли!"); } internal static void Main() { // LetsSwim(Swimmer.Cabbage, Swimmer.Coat, Swimmer.Wolf); LetsSwim(Swimmer.Coat, Swimmer.Wolf, Swimmer.Cabbage); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д