From 76461f7b62c615281d2821ea0445e5bd6e316de8 Mon Sep 17 00:00:00 2001 From: Kimiyuki Onaka Date: Sun, 22 Aug 2021 23:41:20 +0900 Subject: [PATCH 1/3] fix(core): Fix a bug of mod reported by @uta8a --- examples/data/loop_mod_uta8a.1.in | 1 + examples/data/loop_mod_uta8a.1.out | 1 + examples/data/loop_mod_uta8a.2.in | 1 + examples/data/loop_mod_uta8a.2.out | 1 + examples/loop_mod_uta8a.py | 14 ++++++++++++++ src/Jikka/Core/Language/ArithmeticExpr.hs | 11 +++++++---- test/Jikka/Core/Language/ArithmeticExprSpec.hs | 5 +++++ 7 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 examples/data/loop_mod_uta8a.1.in create mode 100644 examples/data/loop_mod_uta8a.1.out create mode 100644 examples/data/loop_mod_uta8a.2.in create mode 100644 examples/data/loop_mod_uta8a.2.out create mode 100644 examples/loop_mod_uta8a.py diff --git a/examples/data/loop_mod_uta8a.1.in b/examples/data/loop_mod_uta8a.1.in new file mode 100644 index 00000000..a59b3bae --- /dev/null +++ b/examples/data/loop_mod_uta8a.1.in @@ -0,0 +1 @@ +100 3 diff --git a/examples/data/loop_mod_uta8a.1.out b/examples/data/loop_mod_uta8a.1.out new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/examples/data/loop_mod_uta8a.1.out @@ -0,0 +1 @@ +1 diff --git a/examples/data/loop_mod_uta8a.2.in b/examples/data/loop_mod_uta8a.2.in new file mode 100644 index 00000000..9856e935 --- /dev/null +++ b/examples/data/loop_mod_uta8a.2.in @@ -0,0 +1 @@ +15 0 diff --git a/examples/data/loop_mod_uta8a.2.out b/examples/data/loop_mod_uta8a.2.out new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/examples/data/loop_mod_uta8a.2.out @@ -0,0 +1 @@ +15 diff --git a/examples/loop_mod_uta8a.py b/examples/loop_mod_uta8a.py new file mode 100644 index 00000000..370d8c67 --- /dev/null +++ b/examples/loop_mod_uta8a.py @@ -0,0 +1,14 @@ +# See https://github.com/kmyk/Jikka/issues/173 + +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() diff --git a/src/Jikka/Core/Language/ArithmeticExpr.hs b/src/Jikka/Core/Language/ArithmeticExpr.hs index 5c22f7c6..8848aab6 100644 --- a/src/Jikka/Core/Language/ArithmeticExpr.hs +++ b/src/Jikka/Core/Language/ArithmeticExpr.hs @@ -225,10 +225,13 @@ makeVectorFromArithmeticExpr xs es = runST $ do let indices = V.imap (\i x -> map (i,) (findIndices (x `isFreeVar`) (productExprList e))) xs case concat (V.toList indices) of [] -> lift $ modifySTRef c (plusArithmeticExpr (arithmeticalExprFromProductExpr e)) - [(i, j)] -> do - let e' = e {productExprList = take j (productExprList e) ++ drop (j + 1) (productExprList e)} - lift $ MV.modify f (plusArithmeticExpr (arithmeticalExprFromProductExpr e')) i - _ -> MaybeT $ return Nothing + [(i, j)] -> + if productExprList e !! j == Var (xs V.! i) + then do + let e' = e {productExprList = take j (productExprList e) ++ drop (j + 1) (productExprList e)} + lift $ MV.modify f (plusArithmeticExpr (arithmeticalExprFromProductExpr e')) i -- k x_i + else MaybeT $ return Nothing -- e.g. f(x_i) + _ -> MaybeT $ return Nothing -- e.g. x_1 x_2 f <- V.freeze f c <- lift $ readSTRef c return (V.map normalizeArithmeticExpr f, normalizeArithmeticExpr c) diff --git a/test/Jikka/Core/Language/ArithmeticExprSpec.hs b/test/Jikka/Core/Language/ArithmeticExprSpec.hs index 5d2055d3..cf42df63 100644 --- a/test/Jikka/Core/Language/ArithmeticExprSpec.hs +++ b/test/Jikka/Core/Language/ArithmeticExprSpec.hs @@ -22,6 +22,11 @@ spec = do let f = V.fromList [parseArithmeticExpr (LitInt' 2), parseArithmeticExpr (LitInt' 3)] let c = parseArithmeticExpr (LitInt' (-10)) makeVectorFromArithmeticExpr xs e `shouldBe` Just (f, c) + it "fails with modulo" $ do + -- See https://github.com/kmyk/Jikka/issues/173 + let xs = V.singleton "x" + let e = parseArithmeticExpr (FloorMod' (Var "x") (LitInt' 3)) + makeVectorFromArithmeticExpr xs e `shouldBe` Nothing describe "normalizeArithmeticExpr" $ do it "works" $ do let e = Plus' (LitInt' 2) (Plus' (Var "a") (LitInt' (-2))) From 47a442d700be9183f9620a042f85f6f75aacf1f4 Mon Sep 17 00:00:00 2001 From: Kimiyuki Onaka Date: Sun, 22 Aug 2021 23:49:17 +0900 Subject: [PATCH 2/3] test: Use abc200_b --- examples/README.md | 4 ++++ examples/{wip => }/abc200_b.py | 0 examples/data/abc200_b.random.generator.py | 15 +++++++++++++++ examples/data/abc200_b.sample-1.in | 1 + examples/data/abc200_b.sample-1.out | 1 + examples/data/abc200_b.sample-2.in | 1 + examples/data/abc200_b.sample-2.out | 1 + examples/data/abc200_b.sample-3.in | 1 + examples/data/abc200_b.sample-3.out | 1 + examples/data/abc200_b.solver.py | 22 ++++++++++++++++++++++ 10 files changed, 47 insertions(+) rename examples/{wip => }/abc200_b.py (100%) create mode 100644 examples/data/abc200_b.random.generator.py create mode 100644 examples/data/abc200_b.sample-1.in create mode 100644 examples/data/abc200_b.sample-1.out create mode 100644 examples/data/abc200_b.sample-2.in create mode 100644 examples/data/abc200_b.sample-2.out create mode 100644 examples/data/abc200_b.sample-3.in create mode 100644 examples/data/abc200_b.sample-3.out create mode 100644 examples/data/abc200_b.solver.py diff --git a/examples/README.md b/examples/README.md index b6feacde..455be404 100644 --- a/examples/README.md +++ b/examples/README.md @@ -31,6 +31,10 @@ Please check also the [gallery](https://kmyk.github.io/Jikka/gallery). - :heavy_check_mark: AC `dp_z-kubaru.py` - The Kubaru DP version of `dp_z-morau.py`. - submission at v5.1.0.0: +- :heavy_check_mark: AC `abc200_b.py` + - AtCoder Beginner Contest 200 [B - 200th ABC-200](https://atcoder.jp/contests/abc200/tasks/abc200_b) + - AC with a naive solution / 愚直解が AC + - submission at 76461f7b62c615281d2821ea0445e5bd6e316de8: - :heavy_check_mark: AC `abc203_b.py` - AtCoder Beginner Contest 203 [B - AtCoder Condominium](https://atcoder.jp/contests/abc203/tasks/abc203_b) - AC with a naive solution using `sum(List[int])` / 愚直解が AC `sum(List[int])`を使用 diff --git a/examples/wip/abc200_b.py b/examples/abc200_b.py similarity index 100% rename from examples/wip/abc200_b.py rename to examples/abc200_b.py diff --git a/examples/data/abc200_b.random.generator.py b/examples/data/abc200_b.random.generator.py new file mode 100644 index 00000000..48b043c8 --- /dev/null +++ b/examples/data/abc200_b.random.generator.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# usage: $ oj generate-input 'python3 generate.py' +# usage: $ oj generate-input --hack-actual=./a.out --hack-expected=./naive 'python3 generate.py' +import random + + +# generated by oj-template v4.8.0 (https://github.com/online-judge-tools/template-generator) +def main(): + N = random.randint(1, 10**5) + K = random.randint(1, 20) + print(N, K) + + +if __name__ == "__main__": + main() diff --git a/examples/data/abc200_b.sample-1.in b/examples/data/abc200_b.sample-1.in new file mode 100644 index 00000000..2e3e9ef3 --- /dev/null +++ b/examples/data/abc200_b.sample-1.in @@ -0,0 +1 @@ +2021 4 diff --git a/examples/data/abc200_b.sample-1.out b/examples/data/abc200_b.sample-1.out new file mode 100644 index 00000000..1bf1491e --- /dev/null +++ b/examples/data/abc200_b.sample-1.out @@ -0,0 +1 @@ +50531 diff --git a/examples/data/abc200_b.sample-2.in b/examples/data/abc200_b.sample-2.in new file mode 100644 index 00000000..66f96057 --- /dev/null +++ b/examples/data/abc200_b.sample-2.in @@ -0,0 +1 @@ +40000 2 diff --git a/examples/data/abc200_b.sample-2.out b/examples/data/abc200_b.sample-2.out new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/examples/data/abc200_b.sample-2.out @@ -0,0 +1 @@ +1 diff --git a/examples/data/abc200_b.sample-3.in b/examples/data/abc200_b.sample-3.in new file mode 100644 index 00000000..adc56206 --- /dev/null +++ b/examples/data/abc200_b.sample-3.in @@ -0,0 +1 @@ +8691 20 diff --git a/examples/data/abc200_b.sample-3.out b/examples/data/abc200_b.sample-3.out new file mode 100644 index 00000000..02a46ba1 --- /dev/null +++ b/examples/data/abc200_b.sample-3.out @@ -0,0 +1 @@ +84875488281 diff --git a/examples/data/abc200_b.solver.py b/examples/data/abc200_b.solver.py new file mode 100644 index 00000000..a49f4938 --- /dev/null +++ b/examples/data/abc200_b.solver.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# https://atcoder.jp/contests/abc200/submissions/22401491 + + +def solve(n: int, k: int) -> int: + for _ in range(k): + if n % 200 == 0: + n //= 200 + else: + n = n * 1000 + 200 + return n + + +# generated by oj-template v4.7.2 (https://github.com/online-judge-tools/template-generator) +def main(): + N, K = map(int, input().split()) + a = solve(N, K) + print(a) + + +if __name__ == '__main__': + main() From 7e57482f33a52e0b577710482fee9966ad572c6d Mon Sep 17 00:00:00 2001 From: Kimiyuki Onaka Date: Sun, 22 Aug 2021 23:50:18 +0900 Subject: [PATCH 3/3] chore: Add a '$' sign in scripts/pre-commit --- scripts/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pre-commit b/scripts/pre-commit index e2be9173..632e2794 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -22,7 +22,7 @@ isort --check-only --diff scripts/*.py examples/data/*.py \ yapf --version \ || { echo HINT: Please install yapf with running '$ pip3 install -r scripts/requirements.txt'; false; } yapf --diff '--style={ COLUMN_LIMIT: 9999 }' scripts/*.py examples/data/*.py \ - || { echo HINT: Please run 'yapf --in-place '\''--style={ COLUMN_LIMIT: 9999 }'\'' scripts/*.py examples/data/*.py'; false; } + || { echo HINT: Please run '$ yapf --in-place '\''--style={ COLUMN_LIMIT: 9999 }'\'' scripts/*.py examples/data/*.py'; false; } mypy scripts/*.py examples/data/*.py # YAML