LINUX.ORG.RU

Задача на сравнение 3х чисел

 , , ,


0

2

Чтобы попрактиковаться в питоне, друг предложил сделать «простую задачку». Простой она оказалась только на его словах… Он говорит, что в 5-6 строк делается. Можно использовать только if, сравнения и арифметические операторы, все остальное нельзя. Нельзя использовать готовые функции.

Задача такая. Вводим 3 числа, далее программа выводит их на экран в порядке возрастания. Плюс учитываем возможность того, что какие-то из них (или даже все) равны.

Сначала я потратил целый день, и получилось больше 100 строк. Все это время меня не покидало неприятное ощущение, что такого бреда быть не может. Я навелосипедил все возможные варианты и проверки, и получилась неприлично громадная программа. Но вроде кое-как работало… На следующий день я переделал, но получилось все-равно строк на 50. Потом я представил, а что если мне придется сравнивать 4 числа? А если 5? Это же тогда моя программа вообще разростется до миллиона строк. Но ведь друг сказал «всего 5 строк».

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

Перемещено leave из general


Ответ на: комментарий от peregrine

Я же не прошу код написать. Может есть какой-то супер-изи стандартный алгоритм из математики, а я про него не слышал?

utrack
() автор топика
Ответ на: комментарий от fernandos

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

peregrine ★★★★★
()
Ответ на: комментарий от fernandos

Ну в 5 строк не дёргая внешний алгоритм с приличной скоростью если чисел много, то уже надо чуток подумать, скорее даже в 5 строк не выйдет...

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

А вот чтобы задача была интереснее предлагаю её на ассемблере с минимальным количеством операций сделать.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Ты лучше вот что скажи. Нужны ли дополнительные переменные (кроме 3х основных) для решения этой задачи? У меня 6 переменных, т.е. 3 дополнительных, которые отображают статус числа. Но в инете прочитал, что такая задача решается всего в 3 переменных. Что же это за кунг-фу такое…

utrack
() автор топика

Чел, ну слишком жирно. Хотя местные регистранты на такое ведутся только так…

anonymous
()
Ответ на: комментарий от utrack

С циклом не нужны (хотя итерироваться по циклу надо и переменная там за сахарком спрятана), без цикла нужна одна, но это не точно, я спать уже очень сильно хочу.

peregrine ★★★★★
()
Ответ на: комментарий от utrack

Нет там жести. Для трёх чисел вообще всё очень просто.

def sort(a, b, c):
    a, c = min(a, c), max(a, c)
    a, b = min(a, b), max(a, b)
    b, c = min(b, c), max(b, c)
    return a, b, c

min и max можно написать без if’ов, воспользовавшись тем, что булево выражение в питоне можно преобразовать к 1 или 0.

i-rinat ★★★★★
()
function f(a, b, c) {
    if (a > c) [a, c] = [c, a]
    if (a > b) [a, b] = [b, a]
    if (b > c) [b, c] = [c, b]
    return [a, b, c]
}
anonymous
()

Чтобы попрактиковаться в питоне, друг предложил сделать сортировку, запретив пользоваться питоном как языком в принципе. Хороший у тебя «друг» и практики у него хорошие.

system-root ★★★★★
()
Ответ на: комментарий от system-root

Ага. И на собеседах вот такие вывороченые наизнанку вопросы часто бывают. Как опция: «что выведет этот код?». Сук, откуда мне знать? Я таким извратом не занимаюсь.

deep-purple ★★★★★
()

Как 100 строк получилось? Вот решаю совсем в лоб перебором:

def comp_func(a, b, c):
    if a <= b <= c: return a, b, c
    elif a <= c <= b: return a, c, b
    elif b <= a <= c: return b, a, c
    elif b <= c <= a: return b, c, a
    elif c <= a <= b: return c, a, b
    else: return c, b, a

Питон позволяет так писать операторы сравнения, без дополнительной логики.

Kogrom
()
Последнее исправление: Kogrom (всего исправлений: 1)

Тебе не в питоне практиковаться нужно.

ya-betmen ★★★★★
()
Ответ на: комментарий от utrack

И опозориться на весь ЛОР?

причём здесь «опозориться»? ты же учишься, а это — форум, который и призван помогать тому, кто чего-то не знает. не знать не позорно. позорно не спрашивать, когда не знаешь.

детей своих тоже стыдить за незнание будешь? и к чему это приведёт?

anonymous
()

Дело не в задаче, а в твоём мыслении, нечего стесняться, а нужно выложить свой код, для того что-бы мы могли глядя на него прочитать твои мысли и увидеть какой логикой ты руководствовался, благодаря этому у нас будет возможность дать тебе векторы в нужном направлении. Ты учишься этого не надо стесняться, в программировании самое важное думать в правильном ключе, а не знать языки. Показывай игнорируй тех кто будет хихи-хаха делать. Да и в целом никто в душе не чаит кто ты такой так что какая разница? В текущей постановке вопроса, можно только дать готовое или готовый алгоритм, но какой от это прок это лишь одна из миллионов задач которую ты встретишь и важнее знать как придти к решению чем знать просто само решение. Выкладывай код давай и всё тут.

anonymous
()

Чтобы попрактиковаться в питоне… нельзя использовать готовые функции.

Еще сходи поплавай, чтоб летать научиться.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Более того, в нормальных (компилируемых или jit) языках это соптимизируется в что-то вроде movcc (и какие там аналоги на других архитектурах, они везде есть) и наступит полное и неконтролируемое счастье для ЦПУ.

anonymous
()
Ответ на: комментарий от anonymous

счастье для ЦПУ.

И пузырек начинает обгонять qsort на мелких (до 30 элементов) массивах.

anonymous
()

А свои собственные функции можно вызывать?

>>> f = lambda a,b,c: (a,b,c) if a<=b<=c else f(b,c,a) if c<=a else f(b,a,c)
>>> f(3,1,2)
(1, 2, 3)
anonymous
()
Ответ на: комментарий от deep-purple

Зато сразу понимаешь, чем придется заниматься, хорошо же.

anonymous
()

Ловите лопату говнокода в лицо :)

def compare(a):
   data1 = [a[1], a[0]] if a[0] > a[1] else [a[0], a[1]]
   return [a[2], data1[0], data1[1]] if a[2] <= data1[0] else ([data1[0], a[2], data1[1]] if a[2] <= data1[1] else [data1[0], data1[1], a[2]])
evgeny_aa ★★☆
()
Последнее исправление: evgeny_aa (всего исправлений: 2)
Ответ на: комментарий от t184256

поплавай, чтоб летать научиться.

Космонавты так и делают, мань.

anonymous
()

Если не использовать:

сортировку,
встроенные и кастомные функции,
явные и динамические переменные, логические операторы, побитовые операторы, циклы

Только if и операторы сравнения больше-меньше-равно, то решение будет длинным, можно заблудиться в трех числах.

anonymous
()

Вот есть более итересная задача на СИ. Даны три переменные с значениями int. Без циклов, без фукций(кроме printf), без if(и иных ветвителей) вывести на экран большее значение из трех имеющихся. Эту задачку решили наура 1курс колледжа хотя и СИ у них не проподавался.

anonymous
()
Ответ на: комментарий от anonymous

Только с помощью арифметческих действий

anonymous
()
Ответ на: комментарий от anonymous

Вот есть более итересная задача на СИ. Даны три переменные с значениями int. Без циклов, без фукций(кроме printf), без if(и иных ветвителей) вывести на экран большее значение из трех имеющихся.

Если все числа разные и больше нуля, то можно. Мне 27 арифметических знаков потребовалось.

Kogrom
()
Ответ на: комментарий от vitruss

Ну я строю формулу на том, что остаток сохраняет меньшее число, а деление меньшего на большее даёт ноль. Вот от этих двух особенностей можно играть. Но так как деление есть, то нулей быть не должно, а этого в условии анонимуса не было.

Kogrom
()
Ответ на: комментарий от anonymous

Даны три переменные с значениями int. Без циклов, без фукций(кроме printf), без if(и иных ветвителей) вывести на экран большее значение из трех имеющихся.

с интами лишь немногим проще:

#include <stdio.h>
#include <stdlib.h>
#include <sys/auxv.h>

int main() {
    float a,b,c;
    float max;
    union {
        float f;
        unsigned int u;
    } diff;
    
    srandom(*(unsigned int*)getauxval(AT_RANDOM));
    #define frand() ((float)random() / 0x3fffffff - 1)
    
    /* frand() returns a float from -1..1 range. */
    
    a = frand();
    b = frand();
    c = frand();

    diff.f = a - b;
    diff.u &= 0x7fffffff;
    /* diff.f = abs(a - b) */
    max = (a + b + diff.f) / 2;
    
    diff.f = max - c;
    diff.u &= 0x7fffffff;
    /* diff.f = abs(max - c) */
    max = (max + c + diff.f) / 2;
    
    printf("a = %f\n", a);
    printf("b = %f\n", b);
    printf("c = %f\n", c);
    printf("max = %f\n", max);
    
    return 0;
}

можно мне зачёт?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.