Показываем числа всего на несколько секунд, стираем экран и спрашиваем одно из них, превращая обычный запуск программы в маленький тренажёр памяти.
В этой задаче:
• Соберёшь короткую игру, которая проверяет внимательность и память;
• Почувствуешь, как несколько секунд ожидания создают лёгкое напряжение;
• Увидишь, как привычное окно превращается в маленький полигон.
А если добавить несколько раундов, игра постепенно становится привычным вечерним зарядом для мозга на каждый день.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26❤12🤝6
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🤝15👍10❤4
🔥12🤝6👍5😁3
Расширенный подход к поиску общего делителя одновременно открывает коэффициенты, позволяющие решать уравнения и находить обратные значения без лишних вычислений и сложных обходных манёвров.
Этот алгоритм:
• Находит скрытые связи между числами всего парой шагов;
• Дарит обратное число, даже когда кажется невозможным;
• Помогает решать линейные задачи буквально на коленке
Освоив приём, можно легко превращать трудные числовые загадки в элегантные ответы всего двумя строчками кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤6👍5🤝3👎2
Концепты вместо страшного SFINAE в C++ 20!
Раньше для ограничения шаблонов по типу приходилось писать SFINAE через
Сначала посмотрим на «старый» подход с
Здесь логика «только для целочисленных типов» зашита в возвращаемый тип, сигнатура читается тяжело, а сообщение компилятора при ошибке — длинное и мало что объясняет.
Теперь опишем концепт
Используем этот концепт в сигнатуре функции через
И напишем простой
🔥 Компилятор теперь выдаёт понятное сообщение: «ограничение
📣 C++ Ready | #практика
Раньше для ограничения шаблонов по типу приходилось писать SFINAE через
std::enable_if и читать страшные сообщения компилятора. В C++20 появились concept и requires, которые позволяют описать те же ограничения гораздо проще и понятнее.Сначала посмотрим на «старый» подход с
std::enable_if, где функция должна работать только для целочисленных типов:template<typename T>
std::enable_if_t<std::is_integral_v<T>, T>
sum(T a, T b) {
return a + b;
}
int main() {
auto x = sum(1, 2); // ок
auto y = sum(1.0, 2.0); // ошибка компиляции с SFINAE
}
Здесь логика «только для целочисленных типов» зашита в возвращаемый тип, сигнатура читается тяжело, а сообщение компилятора при ошибке — длинное и мало что объясняет.
Теперь опишем концепт
Integral, который явно говорит: тип должен быть целочисленным:template<typename T>
concept Integral = std::is_integral_v<T>;
Используем этот концепт в сигнатуре функции через
requires — ограничим шаблон только такими типами:template<Integral T>
T sum(T a, T b) {
return a + b;
}
И напишем простой
main, где одна строка корректна, а другая ломает ограничение концепта:int main() {
auto x = sum(1, 2); // ок, int — целочисленный тип
auto y = sum(1.0, 2.0); // ошибка: double не удовлетворяет Integral
return 0;
}Integral не выполняется для double», а сама сигнатура функции читается почти как обычный текст: шаблон sum работает только для целочисленных типов.Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍9🔥5
Как перестать писать first и second везде?
Классический код с
С C++17 можно «распаковать» пару в говорящие имена с помощью structured bindings:
🔥 То же самое работает для
📣 C++ Ready | #совет
Классический код с
std::pair и std::map обычно выглядит так:for (const auto& p : scores) {
std::cout << p.first << ": " << p.second << '\n';
}first/second ничего не говорят о смысле данных, а при чтении кода приходится всё время держать в голове, где имя, а где значение.С C++17 можно «распаковать» пару в говорящие имена с помощью structured bindings:
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}std::pair, std::tuple и многих стандартных типов: можно аккуратно разобрать результат функции на несколько переменных с понятными именами.Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥9❤7👎1
Иногда функция ничего не находит, но вынуждена возвращать ноль или пустую строку; удобно дать этому состоянию отдельное, явно оформленное место.
В этом гайде:
• Как аккуратно выражать отсутствие результата в коде;
• Простой способ избежать магических значений ошибок;
• Научимся читать вызовы функций, не догадываясь по комментариям
Честно обозначенное «нет значения» делает интерфейсы проще, а ошибки поиска заметнее и предсказуемее.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤10🤝5👍4