Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 05.11.2018
Сообщений: 22

задача на логику

24.01.2020, 06:38. Показов 4004. Ответов 47

Студворк — интернет-сервис помощи студентам
Здравствуйте, в универе подкинули задачку, как выразился препод на логику. Хотел сам по честному решить, но даже идей нет.
Может, кто нибудь решал уже такое?

Вот сама задача:

Кто старше? Пользователь вводит день, месяц и год рождения двух человек. Программа выводит номер того, кто старше. Если они ровесники, то 0.
Запрещено использовать сравнения (<, >, <>, =, >=, <=, min, max, compare) и условия (if, switch, try…catch).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2020, 06:38
Ответы с готовыми решениями:

Задача на логику
На лесном озерце начали цвести лилии. В первый день расцвела одна лилия, а потом каждый день количество цветущих лилий удваивалось. На n-ый...

Задача на С++ ( нужно обьяснить логику и алгортим)
Вот собсна ТЗ: С клавиатуры вводится натуральное число N // нужна блок схема а) необходимо вывести на экран все простые числа, меньшие...

Задача на нахождения вектора градиента, не подскажите логику решения?
Вот задача, не пойму, что надо сделать, смысл задачи не ясен. Ну мне естественно надо программу написать, но хоть смысл подскажите) ...

47
Злостный нарушитель
 Аватар для Verevkin
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
24.01.2020, 14:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Да, пардон:
Месье знает толк в извращениях!
Чикатила, блэт!
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
24.01.2020, 23:07
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main()
{
   int a=130,b=136; //дата в днях
 
   while(a^b) {
     cout<<(a+b+abs(a-b))/2;
     system("pause");
     return 0;
   }
   cout<<"0";
   system("pause");
   return 0;
}
Добавлено через 2 часа 0 минут
C++
1
2
3
 int a=130,b=136;
 
   a^b ? cout<<(a+b+abs(a-b))/2 : cout<<"0";
Добавлено через 3 минуты
C++
1
2
3
int a=130,b=136;
 
   a-b ? cout<<(a+b+abs(a-b))/2 : cout<<"0";
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 00:59
del тема успела убежать)
0
11 / 1 / 0
Регистрация: 07.01.2020
Сообщений: 8
25.01.2020, 11:45
По-моему, если нельзя операции сравнения, то и циклы тоже становятся невалидным решением, потому что тогда только "формально" нет сравнений, а внутри реализации они имеются. Тогда у меня получается костыльное, но основанное только на вычислениях и подстановках решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template<typename T>
auto index(T a, T b=0)
{
    auto shift = sizeof(T) * 8 - 1;
    return (a - b != 0) | (a - b) >> shift;
}
 
int main()
{
    int y1 {1980}, m1 {1}, d1 {4};
    int y2 {1980}, m2 {1}, d2 {4};
    short data[3] {1, 0, 2};
 
    auto year = index(y1, y2) * 100;
    auto month = index(m1, m2) * 10;
    auto day = index(d1, d2);
    std::cout << data[index(year + month + day) + 1];
    return 0;
}
Понятно, что y1..d2 переменные можно (и нужно) вводить. Коэффициенты 100, 10 - подобраны, их, в принципе, тоже можно рассчитывать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 12:02
Цитата Сообщение от xoxlov Посмотреть сообщение
По-моему, если нельзя операции сравнения, то и циклы тоже становятся не
валидным решением
Это почему?
Цитата Сообщение от xoxlov Посмотреть сообщение
потому что тогда только "формально" нет сравнений
Без сравнений эта задача не решаема в принципе. Другой вопрос, что сравнения могут делаться неявно. В задаче запрещено явное применение операций сравнения. Причём на больше меньше. В вашем случае есть операция на нервенство которую можно было бы задать неявно прямым отрицанием .
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
25.01.2020, 14:57
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это почему?
Потому что цикл содержит условие, а они в задаче запрещены.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Без сравнений эта задача не решаема в принципе.
А вас не смущает, что несколько решений уже приведены? Причем без применения условных операций и сравнений.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 15:12
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Потому что цикл содержит условие
Переход по индексу массива тоже содержит условие. В общем смысле. А запрещены в задаче операторы ветвления и выбора из списка:
Цитата Сообщение от Сергей_ужедавно Посмотреть сообщение
условия (if, switch, try…catch).
Причём тернарный оператор не перечислен и используется в хвост и в гриву. И правильно используется.
Я привел саму идею но в "деревянном" виде, а потом удалил:
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
#include <iostream>
using namespace std;
 
bool f(int a, int b, int i)
{
    bool b_less_a=false;
    while(a-i)
    {
        !(b-i++)    ?  b_less_a=true,
                       a=i//для выхода из цикла тут ни break ни return неприменимы)
                    :  b_less_a=false
                                        ;
    }
return b_less_a ;
}
 
int main()
{
int a(1998), b(2000);
//int a(2000), b(1998);
//int a(2000), b(2000);
 
int i(0);
enum what_is {equal_as=0, less_than, more_than };
 
what_is whis =
(!(a-b))? equal_as
        : f(a, b, i)
                    ? less_than
                    : more_than
                                ;
////////////////
!whis   ? cout<<"b is equal to a\n"
        :
            whis==less_than ? cout<<"b is less than a"
                            : cout<<"b is more than a"
                                                        ;
return 0;
}
хотя проще конечно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
int
a=101,b=30
//a=10,b=30
//a=101,b=101
;
 
!(a-b) ? bool(cout<< "equal\n") :
!a ?
bool(cout << "b is greater\n") :
(b/a) ?
bool(cout << "b is greater\n") :
    bool(cout << "a is greater\n")
                ;
return 0;
}
имея ввиду тот факт, что дата представима неотрицательным целым числом.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 20:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Без сравнений эта задача не решаема в принципе
С фига ли?

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <numeric>
int foo(int x, int y)
{
    return (-1 * bool((y - x) & std::numeric_limits<int>::min()) + 2) * bool(x - y);
}
int main()
{
    std::cout << foo(42, 42) << " " << foo(100, 42) << " " << foo(42, 100) << std::endl;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 20:30
Цитата Сообщение от avgoor Посмотреть сообщение
С фига ли?
avgoor,
Цитата Сообщение от IGPIGP Посмотреть сообщение
Без сравнений эта задача не решаема в принципе. Другой вопрос, что сравнения могут делаться неявно.
avgoor, ваша функция производит сравнение. Это не зависит от того желает ли она или вы. Посмотрите о чём вообще шла речь.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.01.2020, 20:31
Цитата Сообщение от avgoor Посмотреть сообщение
С фига ли?
Дык каст int->bool это тоже неявное сравнение с нулем. О том и речь что уйти от операторов сравнения здесь можно, но вот чтоб даже без неявных сравнений, это уже вряд ли.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 20:51
IGPIGP, Renji, Пришлось заложиться на то, что сдвиг знаковых типов - арифметический
C++
1
2
3
4
5
6
7
8
9
10
int32_t foo(int32_t x, int32_t y)
{
    int32_t notequal = -1 * (((x - y) & std::numeric_limits<int32_t>::min() | (y - x) & std::numeric_limits<int32_t>::min()) >> 31);
 
    return ((((y-x)&std::numeric_limits<int32_t>::min())>>31)+2)*notequal;
}
int main()
{
    std::cout << foo(42, 42) << " " << foo(100, 42) << " " << foo(42, 100) << std::endl;
}
2
Just Do It!
 Аватар для XLAT
4221 / 2687 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
25.01.2020, 20:52
Renji,
а тут:
C++
1
return ((unsigned)(-x) / (1+(unsigned)INT_MAX)) - ((unsigned)(x) / (1+(unsigned)INT_MAX));
вы видите где-нибудь неявное сравнение???

Если нет,
то предлагаю этот ответ COKPOWEHEU признать лучшим.

Если же вы видите здесь сравнение, то ...
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 21:09
Цитата Сообщение от avgoor Посмотреть сообщение
Пришлось заложиться на то, что сдвиг знаковых типов - арифметический
Renji, IGPIGP, Ну и еще, конечно, на дополнительный код.

С самого начала было понятно, что это возможно. Функция, возвращающая номер - без побочных эффектов. Следовательно, она обязательно раскладывается на базис "И, ИЛИ, НЕ" (ну или например на базис Пирса (И-НЕ)).
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
25.01.2020, 21:18
Вроде работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int normalize(int i) {
    return (i+i)/(1+abs(i));
}
 
int main() {
    int p1[] = {2, 12, 1979};
    int p2[] = {1, 12, 1979};
 
    int d[] = { p1[0]-p2[0], p1[1]-p2[1], p1[2]-p2[2] };
    d[0] = 1*normalize(d[0]);
    d[1] = 2*normalize(d[1]);
    d[2] = 4*normalize(d[2]);
 
    int idx = 1+normalize(d[0]+d[1]+d[2]);
    const char* res[] = {"The first person is older then the second one.",
                         "Both of them are of the same age.",
                         "The second person is older then the first one."
    };
    std::cout << res[idx] << std::endl;
    return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 21:21
avgoor, мы же пониманем что знак вопроса не виноват? Легко можно написать функцию вида:
C++
1
bool my_ternary(bool firstOrSecjnd, bool (*variantOne)(), bool (*variantTwo)());
или свич функцию, принимающую индекс и массив указателей...
Мне данное задание представляется как упражнение на воображение)
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 21:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
мы же пониманем что знак вопроса не виноват?
Блин, я ж привел решение где ответ получается только побитовыми, арифметическими операциями и операциями сдвига. Хотите, могу то же самое на ассемблере написать, без единой операции сравнения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.01.2020, 21:34
Цитата Сообщение от avgoor Посмотреть сообщение
Блин, я ж привел решение где ответ получается только побитовыми, арифметическими операциями и операциями сдвига. Хотите, могу то же самое на ассемблере написать, без единой операции сравнения.
Вы ввели в условие дополнительное ограничение. Можно и без компьютера сравнить 2 числа. Но в принципе, - честь и хвала, но это не значит, что речь идёт о операциях сравнения. Я привёл пример того как обойти операции сравнения с помощью перехода по индексу. Но "блин" и "с фига ли", это вообще не о том.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 21:44
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы ввели в условие дополнительное ограничение
Ну, судя по последним тенденциям, это скоро будет в стандарте. В компьютере (про квантовые пока не говорим) представимые числа могут быть сколь угодно большими, но мощность их множества все равно конечна. А значит все они подчиняются законам дискретной математики. Вангую, ее-то ТС сейчас и проходит (пусть и совмещенную с программированием).

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы ввели в условие дополнительное ограничение
Кроме того, могу и без него. Просто кода будет на порядок больше.
0
Злостный нарушитель
 Аватар для Verevkin
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
25.01.2020, 23:16
Лять, да вы маньяки.

Пойду пивка с попкорном возьму, пока вы тут пиписьками меряетесь.
Альфачи программирования за гранью здравого смысла...
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.01.2020, 23:22
Verevkin, В Спарте тебя бы с обрыва сбросили.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 23:22

Задача на логику
Рассмотрим 4 положения. 1. Постулат равноправия, все процессы в инерциальный системах одинаковы. 2. Постоянство скорости света, а...

Задача на логику
Вычислить выражение,которое дано на картинке. Помогите пожалуйста,заранее спасибо

Задача на логику
Не могу понять почему не правильно, переделывала 3 раза и всё безуспешно! Напоминаю. На нашем сайте есть Научный форум. На этом форуме...

Задача на логику
(Ссылка на сторонний ресурс удалена)

Задача на логику
Фамилия великого математика содержит пять букв. если буквы алфавита А, Б, В, …, Ю, Я (без Ё) перенумеровать по порядку идущими подряд...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru