Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ikimura
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
#1

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

17.10.2013, 14:18. Просмотров 1273. Ответов 3

Доброго всем дня. Требуется ваша помощь.
В общем поставлена задача: решить логическую задачу "Волк коза капуста"(для тех кто не знаком с условиеем ссылка внизу) с использованием лямбда выражений и предикатов. И что-то я в полном ступоре с чего начать и как описать набор предикатов...
Спасибо.
Условие:http://www.smekalka.pp.ru/old/answer_old_05.html
http://www.cyberforum.ru/csharp-beginners/thread521058.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2013, 14:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Лямба выражения и предикаты (решение логической задачи) (C#):

решение задачи
Пожалуста решите задачку, заранее спасибо это мой код там много...

Решение задачи М. Э. Абрамяна
Помогите решить несколько задач в СиШарп Даны стороны прямоугольника a и b....

Решение задачи коммивояжера
Всем привет. Есть вот такая вот задачка, я решил её в лоб. Но, я уверен есть...

Решение геодезической задачи
Дано два значения в формате градусы:минуты:секунды. Нужно что бы результатом...

Решение математического выражения
Ребят, приближается сессия и нужна помощь :) дело в том, что не могу...

3
tezaurismosis
Администратор
Эксперт .NET
8260 / 3764 / 721
Регистрация: 17.04.2012
Сообщений: 8,442
Записей в блоге: 14
22.10.2013, 21:29 #2
Ikimura, задача частично решена. Не написана только возможность возвращать персонажей обратно, но каркас готов. Я уже устал и спать хочу, поэтому сегодня не доделаю, но задача меня зацепила!
Код очень сложный, читайте внимательно. По всем вопросам обращайтесь
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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);
        }
    }
}
0
Ikimura
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
24.10.2013, 21:57  [ТС] #3
tezaurismosis
Спасибо большое, за то, что откликнулись. К тому времени у меня уже удалось своими силами реализовать данную задачу. Но ваш код я обязательно разберу, и если хотите могу поделиться своим, хоть он пожалуй не так интересен.
Теперь же задача стоит новая: при тех же участниках нужно предусмотреть возможность добавления произвольного кол-ва коз, волков, лодок и т.д. и определить есть ли решение и если есть, то выполнить. Сам я этим займусь на выходных скорее всего, но любые советы приветствуются. Еще раз спасибо!
0
Ikimura
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
31.10.2013, 22:25  [ТС] #4
Получилось реализовать для произвольного кол-ва участников, с произвольным кол-вом лодок придется еще повозиться.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 22:25
Привет! Вот еще темы с решениями:

Решение задачи по управлению запасами
Помогите, очень нужна програмка по задачам управления запасами. может кто-то...

Решение задачи с помощью полиморфизма
В окне приложения первоначально появляются 4 поля ввода, относящиеся к двум...

Решение задачи через foreach
По условию задачи мне надо найти среднее значение всех нечетных элементов...

Решение специфической задачи инициализации
Привет всем. Помогите написать элегантный код. Поясню на примере. Что есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru