電波ビーチ

☆(ゝω・)v

【AOJ】Rubyで2次元配列を連番で初期化 && Rubyでpythonのisdigitっぽいやつ

AOJ ITP1_6_B

タイトルのやつでおいしい書き方ができずに少しハマった。

2次元配列を連番で初期化

map内での宣言で要素を初期化できる。範囲オブジェクトをto_aで配列にしてぶちこんだ。

cards = Array.new(4).map { Array.new((1..13).to_a) }
=> [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]]

isdigitっぽいやつ

pythonだとよくある感じの書き方で、文字列のリストの要素の中で数値に変換できるやつは変換してしまう、というやつはisnumericを使う。

target = list(map(lambda a: int(a) if a.isnumeric() else a, input().split()))

べつにisdigitでもいいんだけど、なんかのやつでなぜか漢数字を変換しなくちゃいけない場面があって以来isnumeric万能ってなったので使っている。

kk6.hateblo.jp

Rubyにはそんな便利なメソッドは無いらしい。調べると正規表現でやっているのをよく見かけるので真似した。

konbu13.hatenablog.com

こちらのをパクらせていただきました。ありがとうございます。

今回はfloatにも対応するようにしてみた。三項演算子入れ子にしたのだが、いちいちmatchを判断しているところが冗長で遅そう。正規表現力が圧倒的に足りない。

arr = ["unk0", "321", "0.00220", "y00011", "321.32xx334" "127.0.0.1"]
arr.map { |t| t.match? (/^\d+\.?\d+$/) ? (t.match? (/\./) ? t.to_f : t.to_i) : t }
=> ["unk0", 321, 0.0022, "y00011", "321.32xx334", "127.0.0.1"]