с ДНЕМ ПРОГРАММИСТА
Да пребудет с тобой сила кода!
С днем программиста
Оцени свои навыки
С праздником дорогие программисты, мы решили вас порадовать небольшим шутливым тестом, кто первым ответит правильно на все вопросы и пришлет скриншот на почту o.dresvyannikova@cognitive.ru, тот выиграет фирменную толстовку Cognitive Pilot. 5 следующих победителей также ждут призы. Присылайте ваши скриншоты и пребудет с вами сила кода.
Поехали
В вашем распоряжении пятьдесят мотоциклов с полным баком топлива на сто км. Как далеко можно уехать с помощью этих пятидесяти мотоциклов? Все они отправляются из одной точки.
Да, но есть три варианта. Первый: заведите мотоциклы одновременно и преодолейте сто км. Второй: передвиньте мотоциклы на пятьдесят км, перелейте топливо из половины транспортных средств в оставшуюся часть. Так вы получите двадцать пять мотоциклов с полным баком. Повторяйте действие через каждые пятьдесят км езды. Так можно проехать 350 км. 3 вариант: сначала все 50 проезжают 2 (100/50) км, из одного мотоцикла переливают бензин в остальные 49, затем эти 49 проезжают 2, 04 (100/49) км, снова один бак разливают в оставшиеся 48 и так далее. всего: сумма (100/i) по i от 1 до 50 = 449
Ну почти. Есть три варианта. Первый: заведите мотоциклы одновременно и преодолейте сто км. Второй: передвиньте мотоциклы на пятьдесят км, перелейте топливо из половины транспортных средств в оставшуюся часть. Так вы получите двадцать пять мотоциклов с полным баком. Повторяйте действие через каждые пятьдесят км езды. Так можно проехать 350 км. 3 вариант: сначала все 50 проезжают 2 (100/50) км, из одного мотоцикла переливают бензин в остальные 49, затем эти 49 проезжают 2, 04 (100/49) км, снова один бак разливают в оставшиеся 48 и так далее. всего: сумма (100/i) по i от 1 до 50 = 449
Правильно. Можно конечно уехать на 100 км, но 350 дальше. Но еще дальше уехать на 449 км. Спасибо за решение Марине Воропаевой.
Ну так далеко мы не уедем. Есть три варианта. Первый: заведите мотоциклы одновременно и преодолейте сто км. Второй: передвиньте мотоциклы на пятьдесят км, перелейте топливо из половины транспортных средств в оставшуюся часть. Так вы получите двадцать пять мотоциклов с полным баком. Повторяйте действие через каждые пятьдесят км езды. Так можно проехать 350 км. 3 вариант от Марины Воропаевой: сначала все 50 проезжают 2 (100/50) км, из одного мотоцикла переливают бензин в остальные 49, затем эти 49 проезжают 2, 04 (100/49) км, снова один бак разливают в оставшиеся 48 и так далее. всего: сумма (100/i) по i от 1 до 50 = 449
Первый: заведите мотоциклы одновременно и преодолейте сто км. Второй: передвиньте мотоциклы на пятьдесят км, перелейте топливо из половины транспортных средств в оставшуюся часть. Так вы получите двадцать пять мотоциклов с полным баком. Повторяйте действие через каждые пятьдесят км езды. Так можно проехать 350 км. 3 вариант: сначала все 50 проезжают 2 (100/50) км, из одного мотоцикла переливают бензин в остальные 49, затем эти 49 проезжают 2, 04 (100/49) км, снова один бак разливают в оставшиеся 48 и так далее. всего: сумма (100/i) по i от 1 до 50 = 449
Дальше
Проверить
Узнать результат
1,5 белки за 1,5 минуты съедают 1,5 ореха. Сколько орехов съедят 9 белок за 9 минут?
не угадал, 54
не угадал, 54
Отлично, двигаемся дальше.
не угадал, 54
Дальше
Проверить
Узнать результат
Бейсбольный мяч с битой вместе стоят $13. Но мяч дешевле бейсбольной биты на $3. Рассчитайте стоимость каждого предмета.
мяч = $5, бита = $8
мяч = $5, бита = $8
Правильно
мяч = $5, бита = $8
Дальше
Проверить
Узнать результат
Дано 12 монет, из которых 11 – настоящие, и только 1 – фальшивая. Фальшивая монета отличается от настоящих по массе. Какое минимальное количество взвешиваний необходимо, чтобы обнаружить фальшивую монету? Для взвешивания используются чашечные весы.
Нет, 3
Нет, 3
Молодец!
Нет, 3
Дальше
Проверить
Узнать результат
12 часов ночи. Идет дождь. Можно ли ожидать, что по истечении 72 часов будет солнечная погода?
нет, так как через 72 часа также будет ночь.
Отлично, через 72 часа также будет ночь.
Дальше
Проверить
Узнать результат
Задача на перегрузку функций в C++, которая может оказаться сложнее, чем выглядит.

Предположим, у нас есть два класса:
class Parent {
public:
virtual void print() {
std::cout << "Родительский класс" << std::endl;
}
};
class Derived : public Parent {
public:
virtual void print(int x) {
std::cout << "Производный класс" << std::endl;
}
};

Что выведут два следующих куска кода и почему?
int main() {
Derived *derived = new Derived;
derived -> print();
return 0;
}

int main() {
Parent *derived = new Derived;
derived -> print();
return 0;
}
В первом случае программа завершится с ошибкой.
Во втором случае выведется «Родительский класс».

Мы имеем дело с механизмом перегрузки функций и скрытия имен. В первом случае функция внутри производного класса переопределит родительские функции вне зависимости от их сигнатуры. Поэтому, несмотря на то, что в родительском классе имеется функция, соответствующая вызываемой внутри main(), компилятор об этом не узнает и выдаст ошибку

error: no matching function for call to 'Derived::print()'

Почему же во втором случае мы не получаем ошибку, хотя также используем объект Derived для вызова print()?

Ключевым моментом здесь является то, что поиск имени начинается с класса, указанного в типе переменной, а не фактического типа объекта. Переменная derived типа Parent указывает на объект типа Derived, поэтому изначально поиск функции print() будет производиться внутри класса Parent. Вследствие этого компиляция завершается успешно и мы получаем соответствующий вывод.
Отлично, но не все так просто, как кажется на первый взгляд. Если для вас эта задача показалась легкой, то проверьте свои навыки в C++, прочитав решение.

В первом случае программа завершится с ошибкой.
Во втором случае выведется «Родительский класс».

Мы имеем дело с механизмом перегрузки функций и скрытия имен. В первом случае функция внутри производного класса переопределит родительские функции вне зависимости от их сигнатуры. Поэтому, несмотря на то, что в родительском классе имеется функция, соответствующая вызываемой внутри main(), компилятор об этом не узнает и выдаст ошибку

error: no matching function for call to 'Derived::print()'

Почему же во втором случае мы не получаем ошибку, хотя также используем объект Derived для вызова print()?

Ключевым моментом здесь является то, что поиск имени начинается с класса, указанного в типе переменной, а не фактического типа объекта. Переменная derived типа Parent указывает на объект типа Derived, поэтому изначально поиск функции print() будет производиться внутри класса Parent. Вследствие этого компиляция завершается успешно и мы получаем соответствующий вывод.
В первом случае программа завершится с ошибкой.
Во втором случае выведется «Родительский класс».

Мы имеем дело с механизмом перегрузки функций и скрытия имен. В первом случае функция внутри производного класса переопределит родительские функции вне зависимости от их сигнатуры. Поэтому, несмотря на то, что в родительском классе имеется функция, соответствующая вызываемой внутри main(), компилятор об этом не узнает и выдаст ошибку

error: no matching function for call to 'Derived::print()'

Почему же во втором случае мы не получаем ошибку, хотя также используем объект Derived для вызова print()?

Ключевым моментом здесь является то, что поиск имени начинается с класса, указанного в типе переменной, а не фактического типа объекта. Переменная derived типа Parent указывает на объект типа Derived, поэтому изначально поиск функции print() будет производиться внутри класса Parent. Вследствие этого компиляция завершается успешно и мы получаем соответствующий вывод.
Дальше
Проверить
Узнать результат
Сколько раз будет выполняться этот цикл?

unsigned char half_limit = 150; for (unsigned char i = 0; i < 2 * half_limit; ++i)
{
//что-то происходит;
}
Ну почти, поскольку i объявлен как unsigned char, правильный ответ – зацикливание (бесконечный цикл).

Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i – это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.
Еще один вопрос с подвохом с IT-собеседований. Если бы вы сказали 300, а i был объявлен как int, вы были бы правы. Но поскольку i объявлен как unsigned char, правильный ответ – зацикливание (бесконечный цикл).

Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i – это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.
Дальше
Проверить
Узнать результат
Что мы получим на выходе?

#include <iostream>
int main(int argc, const char * argv[]) {
int a[] = {1, 2, 3, 4, 5, 6}; std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];
}
не угадал, 8
не угадал, 8
Правильно, продолжай
не угадал, 8
Дальше
Проверить
Узнать результат
Задачка, которую нужно решать без калькулятора и компьютера, имея под рукой только карандаш и бумагу. Сколько нулей в конце факториала 100?
В диапазоне от 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Обратите внимание, что 25 дает 2 множителя, равные 5 (25 = 5 х 5), и к тому же в этой группе есть еще три числа, в состав которых входит 25: 50, 75 и 100. В совокупности это добавляет еще четыре пятерки, а всего их 24. 24 множителя на пять дают 24 пары с равным числом двоек, в результате чего получается 24 множителя на 10 (оставляя слева еще множество двоек, для которых не оказалось пары). Таким образом, в конце 100! будет 24 нуля.
В диапазоне от 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Обратите внимание, что 25 дает 2 множителя, равные 5 (25 = 5 х 5), и к тому же в этой группе есть еще три числа, в состав которых входит 25: 50, 75 и 100. В совокупности это добавляет еще четыре пятерки, а всего их 24. 24 множителя на пять дают 24 пары с равным числом двоек, в результате чего получается 24 множителя на 10 (оставляя слева еще множество двоек, для которых не оказалось пары). Таким образом, в конце 100! будет 24 нуля.
Отлично! 100! = 93 326 215 443 944 152 681 699 238 856 266 700 490 715 968 264 381 621 468 592 963 895 217 599 993 229 915 608 941 463 976 156 518 286 253 697 920 827 223 758 251 185 210 916 864 000 000 000 000 000 000 000 000
В диапазоне от 1 до 100 есть 20 чисел, которые делятся на пятерку: 5, 10, 15, …, 95, 100. Обратите внимание, что 25 дает 2 множителя, равные 5 (25 = 5 х 5), и к тому же в этой группе есть еще три числа, в состав которых входит 25: 50, 75 и 100. В совокупности это добавляет еще четыре пятерки, а всего их 24. 24 множителя на пять дают 24 пары с равным числом двоек, в результате чего получается 24 множителя на 10 (оставляя слева еще множество двоек, для которых не оказалось пары). Таким образом, в конце 100! будет 24 нуля.
Дальше
Проверить
Узнать результат
Ученик
Спасибо, что прошли тест до конца, но вам еще надо много учиться, чтобы достичь уровня магистра.
Попробовать еще раз
Юный падаван
Неплохо, подтяните свои знания и в следующий раз сможете пройти наш тест.
Попробовать еще раз
Великий магистр
Поздравляем, успейте отправить первым скриншот с результатом теста на почту o.dresvyannikova@cognitive.ru и получите приз.
Попробовать еще раз