kmyk-jikka / Jikka

an automated solver for problems of competitive programming
https://kmyk-jikka.github.io/Jikka/playground
Apache License 2.0
151 stars 11 forks source link

fix(cxx): Use temporary variables when unpacking tuples #165

Closed riantkb closed 3 years ago

riantkb commented 3 years ago

153

Summary

Comment

Tests

$ cat fib.py

def f(n: int) -> int:
    a = 0
    b = 1
    for _ in range(n):
        c = (a + b) % 1000000007
        a = b
        b = c
    return a

def solve(n: int) -> int:
    return f(n)

$ stack run convert fib.py > fib.cpp $ cat fib.cpp

// ...
int64_t solve(int64_t n_0) {
    int64_t x1_4 = 1;
    int64_t x1_5 = 0;
    for (int32_t i2 = 0; i2 < int32_t(n_0); ++ i2) {
        int64_t x6 = jikka::mod::plus(jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[1], jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[0], 1000000007);
        x1_4 = x6;
        x1_5 = x1_4;
    }
    return x1_5;
}
// ...

下をコメントアウトした状態で生成した fib.cpp https://github.com/kmyk/Jikka/blob/cae51d2d847c340e0c81f3aa64f49e3d995b67be/src/Jikka/CPlusPlus/Convert.hs#L25

// ...
int64_t solve(int64_t n_0) {
    int64_t x1_4 = 1;
    int64_t x1_5 = 0;
    for (int32_t i2 = 0; i2 < int32_t(n_0); ++ i2) {
        int64_t x6 = jikka::mod::plus(jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[1], jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[0], 1000000007);
        int64_t x7 = x1_4;
        x1_4 = x6;
        x1_5 = x7;
    }
    return x1_5;
}
// ...