Хотите немного размяться, вспомнил задачку одну, которую летом в твиттере кто-то подкинул:
Нужно написать функцию проверки числа 7, которая будет возвращать true если это семерка и false если нет. Нельзя использовать константы, только операции над числом и само число.
Сложно о простом!
Я решил, Без баров и пива. Вчера было лень, а сегодня, ехал в маршрутке и решил... Задача для пятиклассника.
Пятиклассник вспомнил, что все целые числа являются ассоциативным кольцом. Одно из свойств кольца – наличие единицы или, существует такое e, что для любого a из множества целых чисел, выполняется a x e = e x a = a, иначе a / a = e, в нашем случае 1.
У нас есть единица – ура!
Пятиклассник, воспользовавшись теорией лямбда исчислений выяснил, что семь следует за шестью, шесть следует за пять, пять следует за четырьмя, четыре следует за тремя, три следует за двумя, два следуют за одним. Ура! Задача решена.
Но пятиклассник был пятиклассником, а не четвероклассником, и он вспомнил, что одним из свойств кольца, является наличие нейтрального элемента, относительно операции сложения. Слабое место решения задачи – целые числа нельзя делить на нейтральный элемент, на 0.
Тк еще одно свойство кольца – для каждого элемента a существует противоположенный –a, по операции сложения , то есть сумма a и -a дает 0.
Отсюда полное решение на си шарпее
public static bool IsSeven(int value)
{
var ZERO = value - value;
if (ZERO == value)
return false;
var ONE = value / value;
var TWO = ONE + ONE;
var THREE = TWO + ONE;
var FOUR = THREE + ONE;
var FIVE = FOUR + ONE;
var SIX = FIVE + ONE;
var SEVEN = SIX + ONE;
return SEVEN == value;
}