Задачки, загадки, головоломки Диалога

Форум Web-Dialog.com работает только в режиме чтения!

Для тех, кто устал от политики, политических баталий и сопутствующего негатива, я открываю ресурс нового формата.
Наш новый, мирный, комфортный, домашний, интересный, творческий


Форум БЕЗ ПОЛИТИКИ.


Гостям форум недоступен, но после регистрации вас ждёт уютная душевная атмосфера и интересное дружелюбное общение.
Наша закрытость - наша свобода. Стучите - и вам откроют.

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол
Однако, теперь у нас на очереди следующая задачка, которая, на первый взгляд, не совсем проста... но, надеюсь, не окажется таким звиздецом, как задачка с квадратиками )) где блин, @Talamasca, ты находишь такие замечательные (для меня) задачки? )))

iYTYM7nKKEM.jpg
 

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол

Не, то был совсем простой код, для школоты - он за 2 секунды находит 3 решения в числах от 0 до 9. А суперский код делает полный перебор всех решений в целых положительных числах ( включая 0) ещё быстрее!

Как это получается:

У нас в среднем столбце все числа суммируются и дают в сумме 8. Значит, каждое из них перебираем в диапазоне от 0 до 8 - это простая прикидка, но этого достаточно. То же самое со средним столбцом. А число в левом нижнем углу прибавляется к положительному значению, в сумме с которым даёт 9 - тогда будем перебирать его в диапазоне от 0 до 9.

Остаются два верхних угла. И что мы делаем - выражаем эти числа через другие, на которые мы уже поставили ограничения выше. То есть, берём по столбцам - значение в левом верхнем углу всегда будет равно 9 минус значение в левом нижнем углу и умножить на значение левого среднего квадратика. А значение в правом верхнем углу всегда будет равно 6 плюс значение в правом нижнем углу минус значение правого среднего квадратика.

Короче, вот эта программа:
C++:
#include <iostream>

int main()
{
    for (int i1 = 0; i1 <= 8; i1++)
        for (int i3 = 1; i3 <= 8; i3++)
            for (int i4 = 0; i4 <= 8; i4++)
                for (int i5 = 0; i5 <= 8; i5++)
                    for (int i6 = 0; i6 <= 9; i6++)
                        for (int i7 = 1; i7 <= 8; i7++)
                            for (int i8 = 0; i8 <= 8; i8++)
                            {
                                int i0 = (9 - i6) * i3;
                                int i2 = 6 + i8 - i5;
                                if ((i0 * i1 - i2) == 4)
                                    if ((i3 + i4 + i5) == 8)
                                        if ((i1 + i4 + i7) == 8)
                                            if ((i2 + i5 - i8) == 6)
                                                if ((i6 % i7) == 0 && (i6 / i7 + i8) == 8)
                                                    if ((i0 % i3) == 0 && (i0 / i3 + i6) == 9)
                                                        std::cout << i0 << " * " << i1 << " - " << i2 << " = 4\n"
                                                        << "/   +   +\n"
                                                        << i3 << " + " << i4 << " + " << i5 << " = 8\n"
                                                        << "+   +   -\n"
                                                        << i6 << " / " << i7 << " + " << i8 << " = 8\n"
                                                        << "=   =   =\n"
                                                        << "9   8   6\n" << std::endl;
                            }

    return 0;
}

- она очень быстро находит всего восемь разных решений. И, что интересно - это все решения в целых положительных числах (включая ноль).
 
Последнее редактирование:

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол
Ну и ещё, чтобы увеличить скорость работы, я убрал проверки на ноль: просто перебираю числа, на которые что-нибудь делим, в диапазоне от 1, а не от 0 - то есть, просто выбрасываю из рассмотрения варианты, где что-то делится на 0.

А "страшная концовка" после std::cout - просто формирует красивый вывод, вот такой:
Код:
18 * 1 - 14 = 4
/   +   +
2 + 6 + 0 = 8
+   +   -
0 / 1 + 8 = 8
=   =   =
9   8   6
- то есть, появляется экран консоли и в него прям так это всё и выводится, по строкам( символ \n означает перевод строки).
 

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол

С фруктами должно прокатить рутинное решение - выразить вишни через яблоки, исключив бананы и персики. Если и есть какой-то подвох, то пока не вижу, что бы это могло быть.

Но, может быть, есть какое-то необычное очень простое решение? Ну, не знаю. Вряд ли.
 

Talamasca

Talamasca

Cherish your life.
Заслуженный
18:23
6 Фев 2017
126,533
1,210
3
15
Пол

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол
@Talamasca, блин, не могу выкинуть из головы твою задачу с квадратами. Теперь думаю над поиском решений в целых значениях (включая отрицательные).

Кстати, если интересно, есть запускалки программ онлайн. Мои проги можно засовывать сюда и нажимать кнопку Run, вывод появится в окошке под программой.
 

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол
@Talamasca, супер! Правда, вопрос на последней (с шарами) поставлен так, что ни фига не ясно. Тем не менее, разгадать не сложно (главное помнить, что последняя картинка НЕ означает равенства синих и жёлтых шаров, а там весь смысл в вопросе)
 

Стержень

Стержень

Привет!
Заслуженный
18:23
13 Май 2019
14,784
724
1
1
vk.com
Пол
Ещё задачки:

1) Пара лошадей пробежала 20 километров.
Сколько километров пробежала каждая лошадь в отдельности?

2) На столе лежат две монеты, в сумме они дают 3 рубля. Одна из них — не 1 рубль.
Какие это монеты?

3) Вы вели автобус с 42 пассажирами из Бостона в Вашингтон. На каждой из шести остановок из него выходило по 3 человека, а на каждой второй — по четыре. Как звали водителя, когда автобус через 10 часов прибыл в Вашингтон?
 
Верх Низ