いつもやってるatcoderの問題シリーズ。

今回は最新のabc041を解いてきた。

問題はこちら。
[blogcard url=http://abc041.contest.atcoder.jp/assignments]

A問題の回答

[code]
s, i = STDIN.read.split(?\n)
i = i.to_i – 1
puts s[i]
[/code]

改行コード区切りで縦に並んだ文字列をそれぞれ変数に入れる。
iという数字を整数の型にセットして、1引く。
文字列sのi番目を表示させる。

B問題の回答

[code]
A, B, C = STDIN.gets.split(" ").map(&:to_i)
X = A * B * C
Y = (10**9) + 7
puts X % Y
[/code]

スペース区切りで変数にセットし、整数の型にセットする。
AとBとCを積算する。
Yは指定された数字10の9乗足す7を計算している。
そして最後にX割るYの余りを出している。

C問題の回答

[code]
N = STDIN.read.split("\n").map(&:to_s)
hash = {}
i = 1.to_i
N[1].split(/ /).each do | val |
hash[i] = val.to_i
i = i + 1
end

A = Hash[ hash.sort_by { | _, v | -v } ]

A.map { | key, value | puts key }
[/code]

改行区切りで縦に変数に文字列としてセットする。
hashを宣言する。
iに1を整数としてセットする。
変数Nの2行目の値をスペース区切りで、hashにセットする。その際にkeyは整数で1から足していく。
hash.sort_byを使って、valueをsortする。※配列をソートすると、順番が変わるのでkeyを並べることはできない。結果は123のようになってしまう。
最後にhashのkeyだけを取り出している。

いつもこの手の文字列の変数セットに悩む。

[code]
S
A1,A2,A3… An
[/code]

このような標準入力があって、Anを配列に入れたい場合はみなさんどうしているのだろうか。
上記方法以外になにかあるのだろうか。なんかこう1行目だけを無視して、2行目をいきなりhashに入れるみたいなことができないのだろうか。
私は分からずに、いつも一旦変数に入れて、string関数で抽出するようにしている。最近はこれが定着しつつあるけど正しいのかわからない。

来週のRubyの勉強会で聞いてみよう。
もし教えたくてムズムズした人がいたら是非教えてほしいです。

カテゴリー: RubyTech