【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
万能ってなったので使っている。
Rubyにはそんな便利なメソッドは無いらしい。調べると正規表現でやっているのをよく見かけるので真似した。
こちらのをパクらせていただきました。ありがとうございます。
今回は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"]