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

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


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

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

14   голосов , оценка 4.071 из 5
Похожие ответы