Рубрика X-Puzzle

Иван Скляров

Xakep, номер #050, стр. 050-110-1


Sklyarov@real.xakep.ru

Не стесняйся присылать мне свои ответы, даже если ты смог ответить всего на один пазл, я с интересом почитаю твои оригинальные решения. Ну, а имена героев, которые первыми правильно ответят на все вопросы, конечно же, будут опубликованы в журнале, чем прославятся на всю Россию (и не только) и навечно войдут в историю Х. Приз за нами не заржавеет. ;)

Но помни: в большинстве случаев вариант ответа засчитывается как правильный, только если к нему приложено подробное и ВЕРНОЕ объяснение, почему выбран именно этот вариант, а не какой-либо другой.

ОТВЕТЫ К ПРЕДЫДУЩЕМУ ВЫПУСКУ X-PUZZLE

Ответ на пазл #1 «Кривая Клава»

В данном пазле, в общем случае, нужно решить две проблемы:

1. Обойтись при написании кода без цифр (1-8).

2. Обойтись без операции умножения (*) и без знака «#», т. е. без библиотеки математических функций (<math.h>), а значит, и без функции возведения в степень pow().

Первая проблема легко решается с помощью замечательного свойства языка C/C++, когда перед применением арифметических операций с символьными переменными все они преобразуются к типу int. Т.е., например, в результате выражения int Ten = 'K' - 'A'; мы получим число 10, т.к. десятичный ASCII-код буквы K=75, а буквы A=65.

Во втором случае все операции умножения и функцию возведения в степень нужно заменить сложением, это легко проделать с помощью обычных циклов.

Ниже показана реализация кода с учетом решения вышеназванных проблем:

#include <iostream.h>

main ()

{

int n;

int Ten = 'K' - 'A';

int Seven = 'H' - 'A';

int Four = 'E' - 'A';

int NewX;

cout << "Введите предел:\n";

cin >> n;

cout << "Результаты расчета уравнения:\n";

for (int x = -n; x <= n; x++) {

int TenOnPow = 0;

for (int CountTen = 0; CountTen < Ten; CountTen++) {

int Pow = 0;

x < 0 ? NewX = -x : NewX=x;

for (int CountPow = 0; CountPow < NewX; CountPow++)

Pow = Pow + NewX;

TenOnPow = TenOnPow + Pow; }

int SevenOnX = 0;

for (int CountSeven = 0; CountSeven < Seven; CountSeven++)

SevenOnX = SevenOnX + x;

int y = TenOnPow + SevenOnX - Four;

cout << y << endl; }

return 0;

}

Ответ на пазл #2 «Голубая кровь»

Логика в данном послании простая, каждое двоичное число представляет собой букву (символ) в кодировке Unicode. Т. е. если прочитать расшифрованную фразу слева направо и сверху вниз, то получится: «Следуй за белым кроликом» (Matrix). Соответственно, по смыслу несложно догадаться, что заляпанные Даниной кровью числа являются (по порядку): буквой «е» (10000110101), символом пробела (00000100000), буквой «ы» (10001001011) и буквой «м» (10000111100).

Ответ на пазл #3 «Unreal’ные шахматы»

Ни одна из приведенных позиций не может возникнуть в реальной шахматной партии по существующим шахматным правилам! Ниже приведены объяснения по порядку, начиная с первой позиции:

1. На доске присутствуют девять черных пешек, что в реальной шахматной игре невозможно.

2. Черный чернопольный слон не может находиться вне первоначального положения, т. к. черные пешки e7 и g7 не сделали еще ни одного хода! Конечно, можно было бы предположить, что слон был взят белым конем, а затем получен проведенной пешкой (напомню, что пешка, достигшая последней горизонтали, называется проведенной и может быть заменена любой фигурой своего цвета, кроме короля), но все восемь черных пешек присутствуют на доске.

Содержание  Вперед на стр. 050-110-2