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:
- version: d2be385
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' << ' ';
}