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)の最小値を出力すればよい。
ここで、座標圧縮の際に辞書を作って、クエリに対して圧縮後の座標を入手できるようにしておく。 (二分探索してもよい。)
続きを読むAtCoder Beginner Contest 126 XOR Matching 別解
問題: 非負整数 M (≤17) と非負整数 K (≤109) が与えられる。以下の条件を満たす0 ~ 2M の数列が存在するか判定し、存在するなら一例を示せ。
続きを読むUbuntu 18.04でGDBビルドチャレンジ
GDBはUbuntuならばsudo apt-get install build-essential
でインストールすることができるが最新版を使いたい場合は自分でビルドする必要がある。
さて、GDBビルドチャレンジだが基本的にはこの記事が正確なのでその通りやればよい。
特にflexをインストールせずにmakeすると、syslex.c not found
というメッセージが出る。
慌ててsudo apt-get install flex
しても、やはり同じメッセージが出る。
この場合、もう一度ダウンロードしなおして、./configureからやり直すのが手っ取り早い。
一応手順
sudo apt-get install flex libgmp-dev libmpfr-dev libmpc-dev libisl-dev
cd gdb-8.2
./configure --disable-multilib
make -j2 # if you want to use 2 cpu
make install