kmyk-jikka / Jikka

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

forループの最適化の結果、`%` `//` が単に除去されることがある #173

Closed uta8a closed 2 years ago

uta8a commented 2 years ago

Summary / 概要

150 に関連

forループ内の % // が単に除去されてしまう場合がある。

(おそらく ABC200 B のWAの原因はこれだと思われる: 提出コード https://atcoder.jp/contests/abc200/submissions/24820809 )

Steps to reproduce / 再現方法

以下のコードを $ stack run convert example.py でトランスパイルする。

example.py

def solve(n: int, k: int) -> int:
    for _ in range(k):
        n = n % 3
    return n

def main() -> None:
    n, k = map(int, input().split())
    ans = solve(n, k)
    print(ans)

if __name__ == '__main__':
    main()

environments:

Expected behavior / 期待される挙動

nを3で割った余りがnに代入される

Actual behavior / 実際の挙動

生成されたC++コードでは、単に演算が消える

int64_t solve(int64_t n_0, int64_t k_1) {
    return n_0;
}
コード全体 ```cpp // This C++ code is transpiled using Jikka transpiler v5.1.0.0 https://github.com/kmyk/Jikka // The original Python code: // def solve(n: int, k: int) -> int: // for _ in range(k): // n = n % 3 // return n // // def main() -> None: // n, k = map(int, input().split()) // ans = solve(n, k) // print(ans) // // if __name__ == '__main__': // main() #include #include #include #include #include #include #include #include #include #include int64_t solve(int64_t n_0, int64_t k_1) { return n_0; } int main() { int64_t n_2 = -1; int64_t k_3 = -1; std::cin >> n_2; std::cin >> k_3; auto ans_4 = solve(n_2, k_3); std::cout << ans_4 << ' '; std::cout << '\n' << ' '; } ```

Additional Information / 追加事項

以下のように // 演算も消える。

example.py

def solve(n: int, k: int) -> int:
    for _ in range(k):
        n = n // 3
        n += 100
    return n

def main() -> None:
    n, k = map(int, input().split())
    ans = solve(n, k)
    print(ans)

if __name__ == '__main__':
    main()

生成されたC++コードでは、n += 100 のみ反映されている

int64_t solve(int64_t n_0, int64_t k_1) {
    return k_1 * 100 + n_0;
}
コード全体 ```cpp // This C++ code is transpiled using Jikka transpiler v5.1.0.0 https://github.com/kmyk/Jikka // The original Python code: // def solve(n: int, k: int) -> int: // for _ in range(k): // n = n // 3 // n += 100 // return n // // def main() -> None: // n, k = map(int, input().split()) // ans = solve(n, k) // print(ans) // // if __name__ == '__main__': // main() #include #include #include #include #include #include #include #include #include #include int64_t solve(int64_t n_0, int64_t k_1) { return k_1 * 100 + n_0; } int main() { int64_t n_2 = -1; int64_t k_3 = -1; std::cin >> n_2; std::cin >> k_3; auto ans_4 = solve(n_2, k_3); std::cout << ans_4 << ' '; std::cout << '\n' << ' '; } ```