Привет, сообщество CodeForces!
Недавно вспомнил одну интересную задачу на C++. Если кратко: можно ли написать такие функции action
и cond
так, чтобы следующие куски кода работали по-разному:
// Snippet #1:
action();
while (cond()) {
action();
}
// Snippet #2:
do {
action();
} while (cond());
Более формально: у вас есть следующие три файла:
common.h
main_while.cpp
main_do_while.cpp
Вам разрешено менять лишь common.h
. Сделайте это так, чтобы слово Action
напечаталось разное количество раз для запусков main_while.cpp
и main_do_while.cpp
.
Одно из возможных решений (настоятельно рекомендуется сначала подумать самостоятельно!):
Dirty hack
Скидывайте свои решения в комментариях, не забывайте прятать под спойлеры! Было бы интересно посмотреть на более умные решения (например на такие, которые будут применимы в любом языке, где есть аналоги while
и do-while
).
Solution without macros:
It uses this magic, which is legal as of C++ 14. The link also contains workarounds if your compiler doesn't support this code.
An alternative solution (which doesn't pollute the namespace with the
do
replacement):A different idea:
A shorter solution (the two snippets "work" differently: the second one compiles, whereas the first one doesn't):