Pythonの文法エラー箇所(行番号、何文字目)を取得するには
Pycon JPでPythonをサポートしてないIDEを紹介したトークがあったらしい()
さて、競プロIDEのPython対応を進めていますが、Pythonのシンタックスエラー箇所取得に少しつまづいたのでメモ。 IDEで文法エラー箇所をハイライトするには何行目、何文字目で文法エラーが起きているかを調べる必要があります。
結論
動的インポートしてシンタックスエラーをキャッチしてやればよい。
import importlib.machinery loader = importlib.machinery.SourceFileLoader("<py_compile>", "test.py") source_bytes = loader.get_data("test.py") try: code = loader.source_to_code(source_bytes, "test.py") except SyntaxError as e: print(":".join(("error", str(e.lineno), str(e.offset))))続きを読む
Pycon JP 2019 登壇の感想
Rustで文字列を数字に、あるいは数字を文字列にする方法
毎回ググってるのでまとめ。 10進数だけでなく、2進数など、基数変更に対応。
文字と数字の相互変換
charと数値型を行き来したい場合は、to_digit()あるいはfrom_digit()を使う。こっちは覚えやすい。
>> '5'.to_digit(10).unwrap() // 10進数 5 >> std::char::from_digit(10, 36) // 2番目の引数は基数、この場合は36進数 'a'
文字列の場合
文字列と数値を行き来したい場合は以下のようにする。
>> format!("{:b}", 10) // 2進数 "1010" >> format!("{}", 10) // 10進数 "10" >> 10.to_string() // to_stringは覚えやすいが、10進数固定のようだ。 "10" >> format!("{:x}", 10) // 16進数 "a" >> i64::from_str_radix("1010", 2).unwrap() // 2番目の引数は基数、この場合は2進数 10
to_str_radixだと覚えやすいのだが。
AtCoderで青になるまでにやったこと
一年一ヶ月ほどの苦心の末、ようやく青コーダーになりました。感慨深いです。
全く独自性のないブログタイトルですが、なるべく他の人が書いてないことを書くようにします。胡散臭い箇所はスキップしてみてください。
続きを読むAtCoder Beginner Contest 128 E Roadwork 別解
問題
N個の工事が行われ、それぞれの工事はS_i-0.5, t_i-0.5に座標X_iで行われる。
Q人の歩行者が存在し、それぞれ時刻D_iに座標0を出発する。
歩行者は一度工事に遭遇するとそこで停止する。
各歩行者が座標いくつまで歩けるか出力せよ。
解法
想定解法全然違うけど、座標圧縮と遅延評価セグメント木(Range Minimum Query)知っていればそれを使う方が思いつきやすい気がする。
S, T, Xの工事はS - X <= D < T - X
なる時刻Dの歩行者を足止めをすることになる。
複数存在しうるそれらの工事のうち、もっとも小さいXを持つ工事が、その歩行者が歩ける距離である。
そこで、遅延評価セグメント木を用意して、全ての工事について、[S - X, T - X)の最小値をX以下に更新する。
ただし、S - X, T - Xの存在範囲は大きいので、座標圧縮を行う。
この際、クエリを全て先読みして、Dもすべて座標圧縮の対象とする。
セグメント木を全ての工事について更新したら、クエリDに対して[D, D + 1)の最小値を出力すればよい。
ここで、座標圧縮の際に辞書を作って、クエリに対して圧縮後の座標を入手できるようにしておく。 (二分探索してもよい。)
続きを読む