|
Рубрика 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-мегабайтный файл? Примечание: Считается, что канал качает в полную силу. Ответ нужно указать до долей секунды. |