[C++] Задачка в стиле "на собеседование"

Serpent555

Как бы вы написали тело функции

unsigned round_up_to_multiple_of_4(unsigned x);

которая округляет вверх целое число до наименьшего целого кратного четырём?
Чтобы было понятнее:

round_up_to_multiple_of_4(0) == 0;
round_up_to_multiple_of_4(1) == 4;
round_up_to_multiple_of_4(2) == 4;
round_up_to_multiple_of_4(3) == 4;
round_up_to_multiple_of_4(4) == 4;
round_up_to_multiple_of_4(5) == 8;
...

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

oliver11

производительность не имеет значения
unsigned round_up_to_multiple_of_4(unsigned x) {
return *std::find_if(
boost::counting_iterator<unsigned>(0
boost::counting_iterator<unsigned>(UINT_MAX
[=](unsigned y) { return x <= y && y % 4 == 0; });
}

evgen5555

(x + 3) & 0xFFFFFFFC ?

Serpent555

unsigned round_up_to_multiple_of_4(unsigned x) {
return *std::find_if(
boost::counting_iterator<unsigned>(0
boost::counting_iterator<unsigned>(UINT_MAX
[=](unsigned y) { return x <= y && y % 4 == 0; });
}
код должен быть как можно короче

Serab

(a + 3) >> 2 << 2 ня?
хотя (a + 3) / 4 * 4 — это вообще "в лоб" без выебонов и короче даже

Serab

блин, с третьего раза написал :)

Serab

круто, но у меня короче и теоретически портабельнее :)

Serpent555

(x + 3) & 0xFFFFFFFC
вообще да, но тогда уж не 0xFFFFFFFC, а ~3 - намного короче. а так да, это пока фаворит. причём оказывается, что даже скобки можно убрать. но это неочевидно.

Serab

о да, с ~3 идеально (оставим в стороне читабельность)

Serpent555

x + 3 & ~3
сложение имеет больший приоритет
вот это неочевидно

Marinavo_0507

(x + 3) & 0xFFFFFFFC ? 

шаблоны не используются, тебе ядро хакать, а не на C++ писать

yroslavasako

шаблоны не используются, тебе ядро хакать, а не на C++ писать
это вообще общая проблема российского образования. Понабирают всяких по олимпиадам, а те шаблонов писать не умеют :)

Marinavo_0507

о да, с ~3 идеально (оставим в стороне читабельность)
ну как бы не зависит от sizeof(unsigned)
но 0xFFFFFFFC лучше, если __u32, а не unsigned

Marinavo_0507

unsigned round_up_to_multiple_of_4(unsigned x)
{
unsigned y;
y = x;
while (y%4 != 0) { y++; }
return y;
}

VitMix

x+3&~3
Выдаёт:
-10 -> -8
-9 -> -8
-8 -> -8
-7 -> -4
-6 -> -4
-5 -> -4
-4 -> -4
-3 -> 0
-2 -> 0
-1 -> 0
0 -> 0
1 -> 4
2 -> 4
3 -> 4
4 -> 4
5 -> 8
6 -> 8
7 -> 8
8 -> 8
9 -> 12

Serab

так это круто, даже для отрицательных работает

apl13

сложение имеет больший приоритет
вот это неочевидно
Давно?

Serpent555

Давно?
Пробовал в VS2010.

Serab

она говорит "неочевидно"?

Serab

на самом деле неочевидно, что у & меньше приоритет, чем у ==, но это такая вещь, на которую столько раз наступишь, что уже запомнишь, а дальше остальное все очевидно :)

apl13

Судя по тому, что "пробовал", а не "слушал", не говорит, а оставляет ощущение.

alekc34

у вас в разделе так интересно!

apl13

Это только кажется!

valodyr

Это очень неудачная задачка "на собеседование", как по мне.

evgen5555

Неудачная мб окей, но почему очень?

Serab

она очень удачная на самом деле, просто удачнее некуда :) если не заострять внимания на короткости, а просто попросить: "как бы вы написали в коде?".

valodyr

Еврейский ответ: какие знания или навыки она проверяет? Плюс метрика решения (длина кода).

Serab

навык реализовать простое в общем-то математическое действие так, чтобы минимизировать wtf/min

valodyr

Для минимизации WPM достаточно либо писать не ~3, а / 4 * 4, либо добавить комментарий. Оба варианта противоречат требованию минимальности кода. Впрочем, если речь идёт о наборе быдлокодеров для сайтов, то тогда ок задачка.

Serab

если не заострять внимания на короткости, а просто попросить: "как бы вы написали в коде?".
это ты пропустил, видимо.
Оставить комментарий
Имя или ник:
Комментарий: