Пришло время офигительных классического гольфа!
Итак, у нас есть функция на C# или аналогичном языке:
void Print(int min, int max)
{
if (min > max)
throw new ArgumentException();
checked // бросаем исключение при переполнении
{
for (int i = min /*----------------*/)
Console.WriteLine(i);
}
}
Необходимо заменить комментарий /*----------------*/ на однострочный код так, чтобы в результате выполнения этой функции на консоль выдавались все числа от min до max включительно. Больше ничего менять нельзя!
Выигрывает самое короткое решение по количеству добавленных символов. Разрешается использовать не только C#, но в языке должен присутствовать цикл for (в этом случае заменить код на такой же по смыслу). Функция должна отработать без ошибок.
Да, решения, основанные на переполнениях запрещены (при помощи checked), чтобы не было большой разницы между C# и C++.
Обратите внимание на особые случаи наподобие min == int.Min, max == int.Max, min == max и тому подобные. Можно считать, что min <= max при вызове.
Финальный результат:
Решения @kmv, @pavel и @Zealint правильные, и реализуют по сути одну идею. Минимальный размер 17 символов.
Второе решение @kmv длиннее (около 50 символов), но с совершенно сумасшедшей (в положительном смысле) идеей.
Отличное нестандартное первое решения @kodv заняло 38 символов, второе решение того же автора аналогично решению @Qwertiy, минимум 30 символов.
Ещё одно решение @Qwertiy более традиционное тоже необычное, на текущий момент 26 символов.
Решения остальные участников пока, кажется, не подходят к условию.
К сожалению, из-за недостаточно однозначной формулировки условия решение @jfs на Питоне вызвало дискуссию, и в конечном итоге было снято автором. Ошибка в условии полностью на моей совести, приношу свои извинения.
Ответ
for (int i=min,d=~i&1;(i^d)&1; i+=i
посмотрел ответ @kmv
for (int i = min,d=1;d;i+=d=i
C++, 17 символов.
Вариант для извращенцев, но может кто-то сумеет оформить в более компактный.
for (int i=min;;i
Комментариев нет:
Отправить комментарий