// Joris Dauphin
#include <iostream>
#include <functional>
#include <vector>
#include <cmath>
bool increment(std::vector<int>& v, int maxSize)
{
for (auto it = v.rbegin(); it != v.rend(); ++it) {
++*it;
if (*it != maxSize) {
return true;
}
*it = 0;
}
return false;
}
void display(const std::vector<double>& operands, const std::vector<int>& operators, double total)
{
const char operators_string[] = "+-*/^%";
std::cout << operands[0];
for (std::size_t i = 0; i != operators.size(); ++i) {
std::cout << " " << operators_string[operators[i]] << " " << operands[i + 1];
}
std::cout << " = " << total << std::endl;
}
double compute(const std::vector<double>& operands, const std::vector<int>& operators)
{
std::function<double(double, double)> fs[] = {
[](double a, double b) { return a + b; },
[](double a, double b) { return a - b; },
[](double a, double b) { return a * b; },
[](double a, double b) { return a / b; },
[](double a, double b) { return pow(a, b); },
[](double a, double b) { return fmod(a, b); },
};
double res = operands[0];
for (std::size_t i = 0; i != operators.size(); ++i) {
res = fs[operators[i]](res, operands[i + 1]);
}
return res;
}
void display_combinaison(const std::vector<double>& operands, double total)
{
std::vector<int> operators(operands.size() - 1);
do {
if (compute(operands, operators) == total) {
display(operands, operators, total);
}
} while (increment(operators, 6));
}
int main()
{
display_combinaison({1, 2, 3, 4}, 4);
display_combinaison({3, 5}, 15);
}
Ly8gSm9yaXMgRGF1cGhpbgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNtYXRoPgoKYm9vbCBpbmNyZW1lbnQoc3RkOjp2ZWN0b3I8aW50PiYgdiwgaW50IG1heFNpemUpCnsKICAgIGZvciAoYXV0byBpdCA9IHYucmJlZ2luKCk7IGl0ICE9IHYucmVuZCgpOyArK2l0KSB7CiAgICAgICAgKysqaXQ7CiAgICAgICAgaWYgKCppdCAhPSBtYXhTaXplKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAqaXQgPSAwOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgp2b2lkIGRpc3BsYXkoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgb3BlcmFuZHMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIG9wZXJhdG9ycywgZG91YmxlIHRvdGFsKQp7CiAgICBjb25zdCBjaGFyIG9wZXJhdG9yc19zdHJpbmdbXSA9ICIrLSovXiUiOwoKICAgIHN0ZDo6Y291dCA8PCBvcGVyYW5kc1swXTsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gb3BlcmF0b3JzLnNpemUoKTsgKytpKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBvcGVyYXRvcnNfc3RyaW5nW29wZXJhdG9yc1tpXV0gPDwgIiAiIDw8IG9wZXJhbmRzW2kgKyAxXTsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCAiID0gIiA8PCB0b3RhbCA8PCBzdGQ6OmVuZGw7Cn0KCmRvdWJsZSBjb21wdXRlKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIG9wZXJhbmRzLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBvcGVyYXRvcnMpCnsKICAgIHN0ZDo6ZnVuY3Rpb248ZG91YmxlKGRvdWJsZSwgZG91YmxlKT4gZnNbXSA9IHsKICAgICAgICBbXShkb3VibGUgYSwgZG91YmxlIGIpIHsgcmV0dXJuIGEgKyBiOyB9LAogICAgICAgIFtdKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYSAtIGI7IH0sCiAgICAgICAgW10oZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhICogYjsgfSwKICAgICAgICBbXShkb3VibGUgYSwgZG91YmxlIGIpIHsgcmV0dXJuIGEgLyBiOyB9LAogICAgICAgIFtdKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gcG93KGEsIGIpOyB9LAogICAgICAgIFtdKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gZm1vZChhLCBiKTsgfSwKICAgIH07CgogICAgZG91YmxlIHJlcyA9IG9wZXJhbmRzWzBdOwogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBvcGVyYXRvcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICByZXMgPSBmc1tvcGVyYXRvcnNbaV1dKHJlcywgb3BlcmFuZHNbaSArIDFdKTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCnZvaWQgZGlzcGxheV9jb21iaW5haXNvbihjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiBvcGVyYW5kcywgZG91YmxlIHRvdGFsKQp7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9wZXJhdG9ycyhvcGVyYW5kcy5zaXplKCkgLSAxKTsKCiAgICBkbyB7CiAgICAgICAgaWYgKGNvbXB1dGUob3BlcmFuZHMsIG9wZXJhdG9ycykgPT0gdG90YWwpIHsKICAgICAgICAgICAgZGlzcGxheShvcGVyYW5kcywgb3BlcmF0b3JzLCB0b3RhbCk7CiAgICAgICAgfQogICAgfSB3aGlsZSAoaW5jcmVtZW50KG9wZXJhdG9ycywgNikpOwp9CgppbnQgbWFpbigpCnsKICAgIGRpc3BsYXlfY29tYmluYWlzb24oezEsIDIsIDMsIDR9LCA0KTsKICAgIGRpc3BsYXlfY29tYmluYWlzb24oezMsIDV9LCAxNSk7Cn0KCg==