Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Игра 24 / 23 сообщений из 23, страница 1 из 1
09.03.2011, 19:32
    #37156273
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Условия игры — даны 4 произвольных цифры
Цель игры — с помощью арифметических операций получить из них число 24
Например: даны 1,2,3,4: 1*2*3*4=24

Как реализовать?
...
Рейтинг: 0 / 0
09.03.2011, 21:56
    #37156419
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
А при чём здесь дотнет?
Перенесём.

Модератор: Тема перенесена из форума "WinForms, .Net Framework".
...
Рейтинг: 0 / 0
09.03.2011, 22:00
    #37156428
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
LjAPbУсловия игры — даны 4 произвольных цифры
Цель игры — с помощью арифметических операций получить из них число 24
Например: даны 1,2,3,4: 1*2*3*4=24корованы можно будет грабить?
...
Рейтинг: 0 / 0
09.03.2011, 22:20
    #37156450
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Какие караваны?
...
Рейтинг: 0 / 0
09.03.2011, 22:41
    #37156462
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
...
Рейтинг: 0 / 0
09.03.2011, 23:28
    #37156504
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Я понял.
...
Рейтинг: 0 / 0
09.03.2011, 23:39
    #37156512
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
LjAPbКак реализовать?В смысле, программно искать решение?

Неплохо бы уточнить условия - какие операции допустимы, можно ли использовать скобки, фиксирован ли порядок цифр, можно ли из 2х цифр создать 2-значное число и т.д.
...
Рейтинг: 0 / 0
09.03.2011, 23:49
    #37156518
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Яростный Меч,

Вообще-то я размышляю над алгоритмом следующей программы:
Вводится 6-значное число (номер троллейбусного билета), затем программа расставляет между цифрами знаки "+", "-", "*", "/", "(", ")", и "", чтобы получилось число 100, показывая все возможные варианты. Числа могут быть и двухзначные и трехзначные и, может быть, четырехзначные.
...
Рейтинг: 0 / 0
09.03.2011, 23:50
    #37156520
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Порядок цифр фиксирован.
...
Рейтинг: 0 / 0
10.03.2011, 08:28
    #37156655
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Для такой задачи, мне кажется, подошло бы использование генетических алгоритмов.

Сначала случайным образом генерируется популяция, например из 30 особей.
Т.е. вы случайным образом расставляете операции между числами.
Потом в цикле пока не найдем решение:
{
- оценивается живучесть или близость к правильному решению каждой особи (рассчитывается значение фитнес-функции).
- используется метод отбора особей для дальнейшей работы, например элитный метод, т.е. выбираете штук 15 наиболее приспособленных особей.
- производится кроссовер (скажем, 2-х точечный) и скрещивание особей
- с некоторой вероятностью (пусть будет 10%) какие-то особи могут мутировать,
т.е. одна из арифметических операций изменяется случайным образом.
}

В целом, ГА - универсальный метод, в интернете много информации по нему. Попробуйте, если интересно.
...
Рейтинг: 0 / 0
10.03.2011, 09:56
    #37156765
tempestadept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Дональдак,

Зачем стрелять из пушки по воробьям? Для 6 цифр можно просто выполнить перебор. Грубо: 5 промежутков, в каждом или арифметическое действие, или "действие" склейки цифр (да, его можно использовать только до арифметики, но для оценки сверху забудем об этом), 5! вариантов выбора порядка этих действий. Итого 5:5*5!=375000 вариантов. Реально ещё меньше
...
Рейтинг: 0 / 0
10.03.2011, 09:57
    #37156766
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
tempestadept,

а скобки?
...
Рейтинг: 0 / 0
10.03.2011, 10:00
    #37156775
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Т.е. между двумя цифрами может быть два "оператора", например 5*(6 или даже три, а то и четыре!
А открывающая скобка должна иметь закрывающую. Вложенность скобок допустима
Например, 1+((2+3)*(4+5)+6)

Т.е. перебор тут не совсем тривиален
...
Рейтинг: 0 / 0
10.03.2011, 10:09
    #37156792
tempestadept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Edd.Dragon,

Перебираем порядок выполнения этих 5 операций (те самые 5! в формуле), потом уже ставим в выражении скобки, чтобы они реально выполнялись в этом порядке. То есть при самом переборе никакие скобки не ставятся.
...
Рейтинг: 0 / 0
10.03.2011, 10:26
    #37156836
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
tempestadeptEdd.Dragon,

Перебираем порядок выполнения этих 5 операций (те самые 5! в формуле), потом уже ставим в выражении скобки, чтобы они реально выполнялись в этом порядке. То есть при самом переборе никакие скобки не ставятся.
Нет, скобки могут быть как для обеспечения порядка так и для его изменения.
Написал же пример:
1+((2+3)*(4+5)+6)

никакого "попорядку" тут нет
Т.е. перебираем расстановку операций
А потом для каждой перестановки еще перебираем различные конфигурации скобок, проще говоря, перебираем все варианты последовательности применения операций.
...
Рейтинг: 0 / 0
10.03.2011, 11:06
    #37156963
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Код: plaintext
1.
//C#
string st="1+2+3+4+5+6";

Как посчитать ответ?
...
Рейтинг: 0 / 0
10.03.2011, 11:20
    #37157009
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
LjAPb
Код: plaintext
1.
//C#
string st="1+2+3+4+5+6";

Как посчитать ответ?

Если от строкового представления нельзя уйти, то придется парсить исходную строку.
Читайте про обратную польскую нотацию, если вы будете использовать скобки, или найдите что-нибудь готовое.
На всякий случай, если вы не используете скобок, тригонометрических функций и прочего, то легко можно посчитать за 1 проход по строке.
В свое время сталкивался с такой задачей, но для C++, примеров было куча.
...
Рейтинг: 0 / 0
10.03.2011, 11:42
    #37157081
tempestadept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Edd.DragonТ.е. перебираем расстановку операций
А потом для каждой перестановки еще перебираем различные конфигурации скобок, проще говоря, перебираем все варианты последовательности применения операций.

Я сказал ровно то же самое. Под "потом ставим скобки" я имею в виду их расстановку перед выводом выражения. Считать скобки его элементами при переборе неразумно.
...
Рейтинг: 0 / 0
10.03.2011, 12:01
    #37157146
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
ДональдакLjAPb
Код: plaintext
1.
//C#
string st="1+2+3+4+5+6";

Как посчитать ответ?

Если от строкового представления нельзя уйти, то придется парсить исходную строку.
Читайте про обратную польскую нотацию, если вы будете использовать скобки, или найдите что-нибудь готовое.
На всякий случай, если вы не используете скобок, тригонометрических функций и прочего, то легко можно посчитать за 1 проход по строке.
В свое время сталкивался с такой задачей, но для C++, примеров было куча.

Спасибо!
...
Рейтинг: 0 / 0
10.03.2011, 12:05
    #37157157
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
LjAPb
Код: plaintext
1.
//C#
string st="1+2+3+4+5+6";

Как посчитать ответ?
У тебя изначально строки не было. Были цифры 123456, между которыми ты добавил те или иные операции. Т.е. без парсинга строки ты знаешь, какие операции добавил - их и выполняй.
...
Рейтинг: 0 / 0
10.03.2011, 15:18
    #37157755
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
tempestadeptДональдак,

Зачем стрелять из пушки по воробьям? Для 6 цифр можно просто выполнить перебор. Грубо: 5 промежутков, в каждом или арифметическое действие, или "действие" склейки цифр (да, его можно использовать только до арифметики, но для оценки сверху забудем об этом), 5! вариантов выбора порядка этих действий. Итого 5:5*5!=375000 вариантов. Реально ещё меньше

Если без скобок, то 5^5=3125 вариантов
...
Рейтинг: 0 / 0
10.03.2011, 17:27
    #37158102
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
Все возможные комбинации без скобок нашел. Как расставить скобки?

Код: plaintext
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.
class Program
    {
        static string input;

        static void Main(string[] args)
        {
            input = "123456";
            foreach (string s in Permutate(input.Length - 1))
                Console.WriteLine(s);
            Console.ReadKey();
        }

        static IEnumerable<string> Permutate(int length)
        {
            string[] operators = { "", "+", "-", "*", "/" };
            if (length <= 1)
                foreach (string c in operators)
                {
                    string frs = input.Substring(0, 1);
                    string dig = input.Substring(length, 1);
                    yield return frs + c + dig;
                }
            else
                foreach (string p in Permutate(length - 1))
                    foreach (string c in operators)
                    {
                        string dig = input.Substring(length, 1);
                        yield return p + c + dig;
                    }
        }

    }
...
Рейтинг: 0 / 0
10.03.2011, 23:28
    #37158677
LjAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игра 24
И расчет, исключая деление на 0

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static object Calc(string formula)
        {            
            string s1 = "/0";            
            bool b = formula.Contains(s1);
            if (b==false)
            {
                DataTable table = new DataTable();
                table.Columns.Add("sum", typeof(decimal)).Expression = formula;
                DataRow row = table.NewRow();
                table.Rows.Add(row);
                return table.Rows[0]["sum"];
            }
            else return "Division by zero";
        }
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Игра 24 / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]