✏️

JuliaでAtcoderをやってる人のつぶやき

2022/05/22に公開

もうちょい参加者増えるといいな

Julia言語Atcoderやってる人、多数派ではないですね。

そもそもプログラムやる人で更にJulia率×Atcoder率は相当少ないでしょうが

使用感どうなのって躊躇してる人もいると思うので
使ってる人の感想とかやってることだらだら書き連ねます。

書いてる人

ただのJuliaでコーダーのおっさん、プログラミングは仕事0.3:趣味9.7。
CとかVBとかPythonとかモロモロ適当に噛じって読めん事はないが
読み易く書き易いJulia推し

どうなの

↑の紹介の様に推しで、使ってるわけですが
JITコンパイラ型のJuliaはコンパイル時間もジャッジに含まれ
不利な意見があって、確かに不用意な関数で100msec位食われたりします。

しかし、おおよそ計算量の見積もりが行けるアルゴリズム(解説的回答)ならほぼ通るので
ほとんど、気になっていません
(定数倍気にするランクは分かりません)

本当は2回目から実行の早いJuliaの美味しいところが活かせてないのは残念ですが
書き易いと言う点、試行錯誤しやすいというのが大きなメリットと感じているので
Juliaでやってます。

環境

最初はもともとよく使っていたJupyter notebookでしたが
テストにコピペを繰り返すのが面倒で、さぼってWA喰らうので「 ojacc 」を導入したVScode(Julia拡張)で運用に変更しました。

環境補足 (windows10で)

  • juliaup(MSstoreから入れるJuliaに付く)でatcoder採用verのv1.4.0を追加
    (julia +1.4.0でver1.4.0起動)
  • JuliaREPL実行できるように、s="accコマンドとか"Cmd(`cmd /c $s`)|>runを色々作ってモジュール化
  • 使ってる感じ

1-index

Juliaの配列は基本1-index開始で、お気持ちは私はこっちの方がしっくるので基本は気になりませんが、累積和とか、マス目の外境界とか問題によって0-indexが欲しいときがあります。
atcoderでなければOffsetArrays.jl使うのですが、追加Pkg扱いで使えません。
よって

  1. get関数で範囲外処理(get(A,j,0)jがA配列の範囲外なら0)
  2. Dict型で0から作る(Dict(Pair.(0:10,0))とか)
  3. 範囲をずらす

で対処しますが、ほぼ 1. のget関数で事足ります
2. はコストが小さそうな時使う(for順注意) 、3. はよくミスるのであんまやりたくない

Pkg ちょっと使える

追加Pkgは基本的に使えませんがPrimes.jl DataStructures.jlは使えます。
Primes.jlは素数問題で場合によって1撃です。
DataStructures.jlSortedDict,SortedSet関数なんか常にソートされて欲しい時に使うと便利です。
あと標準で使えるLinearAlgebra.jlとか使えますが、これはatcoder上、活用した事ないです。

( Combinatorics.jlがあるとcombinations,permutations関数で組み合わせ配列簡単に作れるので欲しいけど、これは使えないので自分で実装)

スニペット

VScodeの機能ですが、よく使う関数・構文はスニペット登録しておくと便利です。
parse(Int, readline())/parse.(Int, readline() |> split) (文字列読み込んでInt/Int配列に)
root(A, x) =( x == A[x] ? x : root(A,A[x])),unite(A, x, y) = minmax(root(A, x), root(A, y)) |> x -> ((lo, hi) = x; A[hi] = lo; lo == hi)(2分木作成)
とか気になったときに登録します。

勉強法

  • 茶まで:取り敢えず毎週参加し慣れる、3完できれば良し。
  • 茶~緑:取り敢えず毎週参加し慣れる、素早く3完、たまに4完。
  • 緑~ :取り敢えず過去問題を解きまくり慣れる、素早く4完目指す。Eまではムズい

過去問ムズいと割りかし早めに諦めて、解説見る派ですが
過去のJuliaのACコードが為になるので、超見ます。
(読み易いが生きる)

んで

最初に戻って、Julia参加者増えるといいなと思います。

Discussion