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

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

24.01.2020, 06:38. Показов 3793. Ответов 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
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,856
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
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,079
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
4220 / 2683 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 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
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,856
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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru