Эта запись будет интересна в основном программистам.
Красивая задачка, которую подкинули во внутренней рассылке:
Отсортируйте пять чисел, используя не более семи сравнений.
(комментарии оставлю скрытыми до завтра)
Update: уточнение условий: складывать/умножать числа не разрешается. Вообще разрешается только сравнивать их друг с другом, а больше никакой информации о них не дано. "Сравнивать", определенности ради, означает применять операцию "<" или ">", на выбор.
Update: открываю все комментарии. Довольно много правильных ответов, найденных с помощью "перебора" в определенном смысле. В этом нет ничего зазорного (и я тоже так решил), но если вы нашли решение таким способом, могу порекомендовать в качестве дополнительного упражнения - найти способ "объяснить" это уже найденное решение более кратким и понятным образом. Такие "простые" решения в комментах тоже есть, но всего два-три.
Красивая задачка, которую подкинули во внутренней рассылке:
Отсортируйте пять чисел, используя не более семи сравнений.
(комментарии оставлю скрытыми до завтра)
Update: уточнение условий: складывать/умножать числа не разрешается. Вообще разрешается только сравнивать их друг с другом, а больше никакой информации о них не дано. "Сравнивать", определенности ради, означает применять операцию "<" или ">", на выбор.
Update: открываю все комментарии. Довольно много правильных ответов, найденных с помощью "перебора" в определенном смысле. В этом нет ничего зазорного (и я тоже так решил), но если вы нашли решение таким способом, могу порекомендовать в качестве дополнительного упражнения - найти способ "объяснить" это уже найденное решение более кратким и понятным образом. Такие "простые" решения в комментах тоже есть, но всего два-три.
no subject
Date: 2008-07-16 06:23 pm (UTC)no subject
Date: 2008-07-16 06:23 pm (UTC)no subject
Date: 2008-07-16 06:28 pm (UTC)no subject
Date: 2008-07-16 06:46 pm (UTC)Сортируем четыре числа, за три сравнения вставляем между ними пятое.
no subject
Date: 2008-07-16 07:03 pm (UTC)Скажем, процессорная команда cmp позволяет получить больше информации, чем простая операция "<".
no subject
Date: 2008-07-16 07:12 pm (UTC)Пусть есть массив a[5] одного из числовых типов и переменная b того же типа. тогда:
{
if ( a[0] > a[1] )
{
b = a[0];
a[0] = a[1];
a[1] = b;
}
if ( a[2] > a[3] )
{
b = a[2];
a[2] = a[3];
a[3] = b;
}
if ( a[1] > a[3] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[3];
a[3] = b;
}
if ( a[1] > a[4] )
{
if ( a[0] > a[4] )
{
if ( a[0] > a[2] )
{
if ( a[4] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = a[1];
a[1] = b;
}
}
}
else
{
if ( a[4] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = b;
}
}
}
}
else
{
if ( a[3] > a[4] )
{
if ( a[1] > a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[4] >= a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
}
else
{
b = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
}
else
{
if ( a[1] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
}
}
}
Проверить легко, если есть любой компилятор :)
no subject
Date: 2008-07-16 07:21 pm (UTC)no subject
Date: 2008-07-16 07:21 pm (UTC)(Кстати, я одно время задавал эту задачку на интервью; знание источников также приветствовалось, но, к сожалению, ни один интервьюируемый его не проявил.)
no subject
Date: 2008-07-16 07:23 pm (UTC)no subject
Date: 2008-07-16 07:38 pm (UTC)числа: а, б, в, г, д
а = о
а + б < в
б + в = г
г < д
no subject
Date: 2008-07-16 07:40 pm (UTC)no subject
Date: 2008-07-16 07:40 pm (UTC)no subject
Date: 2008-07-16 07:41 pm (UTC)no subject
Date: 2008-07-16 07:42 pm (UTC)no subject
Date: 2008-07-16 07:43 pm (UTC)Пять цифр - A, B, C, D, E
1.Если A>B - меняем значения местами (A=B, B=A)
2.Если B>C - меняем значения местами
3.Если C>D - меняем значения местами
4.Если D>E - меняем значения местами
5.Если C>D - меняем значения местами
6.Если B>C - меняем значения местами
7.Если A>B - меняем значения местами
Т.е. пробегаем снизу вверх и обратно. Уверен, что есть и другие способы.
no subject
Date: 2008-07-16 07:49 pm (UTC)no subject
Date: 2008-07-16 08:13 pm (UTC)no subject
Date: 2008-07-16 08:18 pm (UTC)Но задачка интересная, да. Очень спасибо. :)
no subject
Date: 2008-07-16 08:22 pm (UTC)А потом я прикинул и понял, что простой merge sort тоже подойдет.
Делишь числа на группу из двух и группу из трех. Сортируешь их по отдельности. (3 числа сортируется за 1 сравнение, 3 числа - за 3). Потом обе группы сливаются в одну. Это еще максимум 3 сравнения. Итого как раз 7.
no subject
Date: 2008-07-16 08:23 pm (UTC)no subject
Date: 2008-07-16 08:23 pm (UTC)no subject
Date: 2008-07-16 08:26 pm (UTC)no subject
Date: 2008-07-16 08:27 pm (UTC)no subject
Date: 2008-07-16 08:28 pm (UTC)no subject
Date: 2008-07-16 08:28 pm (UTC)