Надо сказать, что последнее "правильное" решение не совсем честное. Ведь в условии чётко говорится, что переменная может быть
либо 1,
либо 2. А тут вдруг такое:
"если вдруг окажется, что i первоначально не было равно ни единице ни двойке". Нечестно это, господа!
Лично я предложил такое решение:
i=i^3;
Оно близко к решению #7 - Математик. Не знаю как для других, но мне такие решения по душе. И непонятного в них ничего не вижу.
Добавлю к своей реализации, что нужно заранее знать, с каким компилятором работаешь. Что i объявлена правильно. Кстати, это же решение на asm выглядит как одна команда. Без переходов и проч.
На ARM и RISC я бы сделал XOR (тот код, который указал). На DSP, скорее всего, сделал бы вычитание. А на i86 - подумал и поэкспериментировал бы (скорость выполнения зависит от контекста программы - команд, которые идут до и после данной).
Это моё решение, как
инженера.
А решение #6 (Самое умное) вызывает у меня лёгкую усмешку. Оно заставит машину делать выборки из памяти, сравнения и переходы. Впрочем, всё зависит от "умности" компилятора.
Но настоящий инженер, думаю, должен предолжить такое решение, которое в самой меньшей степени будет зависеть от особенностей компилятора, и на различных платформах выполняться быстро и однозначно.