Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

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

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

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

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

Решение логической последовательности - C#
Здравствуйте. На Входе у меня есть строка "NOT((A OR NOT B) AND (A OR B)) OR NOT (A AND NOT B OR TRUE)" Где A и B могут принимать либо ...

решение задачи - C#
Пожалуста решите задачку, заранее спасибо это мой код там много синтаксических ошибок using System; using...

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

Решение задачи М. Э. Абрамяна - C#
Помогите решить несколько задач в СиШарп Даны стороны прямоугольника a и b. Найти его площадь S=a∗b и периметр P=2∗(a+b) Даны целые...

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

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

3
tezaurismosis
Администратор
Эксперт .NET
8142 / 3552 / 503
Регистрация: 17.04.2012
Сообщений: 8,184
Записей в блоге: 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
31.10.2013, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 22:25
Привет! Вот еще темы с ответами:

Решение специфической задачи инициализации - C#
Привет всем. Помогите написать элегантный код. Поясню на примере. Что есть сейчас: private Type1 A_value; private Type2 B_value; ...

Решение задачи различными циклами - C#
Решить задачу тремя способами- используя операторы цикла while, do while и for: целые числа 10,12,14,...60 в обратном порядке в столбик.

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

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


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

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

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