kmyk-jikka/Jikka

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

Closed this issue · 0 comments

uta8a commented

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;
}
コード全体
// 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 <algorithm>
#include <array>
#include <cassert>
#include <cstdint>
#include <functional>
#include <iostream>
#include <numeric>
#include <string>
#include <tuple>
#include <vector>
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;
}
コード全体
// 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 <algorithm>
#include <array>
#include <cassert>
#include <cstdint>
#include <functional>
#include <iostream>
#include <numeric>
#include <string>
#include <tuple>
#include <vector>
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' << ' ';
}