Рубрика X-Puzzle

Ведущий: Иван Скляров

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


Sklyarov@real.xakep.ru

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

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

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

Ответ на пазл №1 «gcc vs g++»

По умолчанию компилятор gcc не подключает стандартную библиотеку языка C++ libstdc++, поэтому при компилировании программы на языке С++ ее нужно указывать явно с помощью ключа -l, т.е. следующая командная строка откомпилирует программу: gcc hello.cpp –o hello –lstdc++.

Ответ на пазл №2 «Исправь баги»

В первом листинге кода содержится ошибка Integer Overflow, заключающаяся в том, что если ввести число >= 2147483648, то программа вместо прибавления денег к бюджету будет их вычитать :). Для устранения этого бага достаточно добавить ограничение на максимальный размер вводимых чисел, т.е. нужно переписать строку c условием, например, так: if (rub<0 || rub>214748364).

Второй кусок кода подвержен ошибке Buffer Overflow. Для устранения достаточно добавить ограничение на количество вводимых чисел:

for (i=0; (buff[i] = getchar())!=EOF && i<100; ++i)

В третьем куске возможна ошибка Heap Overflow. Чтобы избавиться от этого бага, надо заменить функцию strcpy на strncpy:

strncpy(one, argv[1], 100)

Четвертая программа подвержена ошибке Format String. Чтобы устранить эту ошибку, необходимо добавить спецификатор формата:

fprintf(stderr, “%s”, argv[i]);

Ответ на пазл №3 «CRYPTFUCK v2.1»

CryptFuck v2.1 мог зашифровать слово «Ash» так: 310113163131501. Алгоритм шифрования работает по следующему принципу. Каждое значение ASCII-кода символа переводится в восьмеричное значение, а затем справа и слева к полученному значению подставляются случайные числа в диапазоне от 0 до 9.

Процедура, реализующая данный алгоритм на языке C++, имеет следующий вид:

void printChar(char *nPtr)

{

for (; *nPtr != '\0'; nPtr++) {

srand(time(NULL));

cout << rand()%9;

cout << oct << int(*nPtr);

cout << dec << rand()%9; }

}

Ответ на пазл №4 «Пропускная система»

Если наложить все экраны друг на друга, то останется незаполненным одно поле, его и нужно нажать.

ПЕРВЫЙ ПАЗЛ «Шесть задач с изюминкой»

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

Первая изюминка

Какое расстояние для фидошника меньше: от 5020 до 5045 или от 5020 до 5080?

Вторая изюминка

С каким известным языком программирования может ассоциироваться «мертвый страус»?

Третья изюминка

Если пропускная способность канала 64 Мбит/с, за какое время по нему будет скачан 64-мегабайтный файл?

Примечание: Считается, что канал качает в полную силу. Ответ нужно указать до долей секунды.

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