Лямба выражения и предикаты (решение логической задачи) - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д