#Paizaの問題を解いていて、使えそうなテクニック1(入力編)
自分用アウトプットメモです。
覚えておくと便利なものであり、解法ではありません。
ちなみに趣味でしかRubyを使ったことがありません。
ようやく第2回のようなものを自分のブログに書きました。
最近競技プログラミングしていてよく使う書き方とかメソッドとか - ボトムズ日記
#ファイルからの標準入力
Paizaのページ内にエディタがあるが、大半の人は自分のPCで開発すると思います。
標準入力は、使用頻度は高くないと思うので、忘れがちです。
下記のコマンドで実行すると簡単です。
p gets
1 2 3
$ ruby hoge.rb < hoge.txt
"1 2 3"
#改行マークの除去
Paizaの問題には、標準入力に改行マークがある。
除去するにはchompメソッドを使用する。
chomp, chomp! (String) - Rubyリファレンス
p gets
p gets.chomp
1 2 3
1 2 3
$ ruby chomp.rb < hoge.txt
"1 2 3\n"
"1 2 3"
#標準入力を整数型にして、配列に格納する。
整数型にしないと、計算処理でエラーになります。
hoge = gets.split.map(&:to_i)
p hoge
p hoge[0] + 1
fuga = gets.split
p fuga
p fuga[0] + 1
1 2 3
1 2 3
$ ruby split.rb < hoge.txt
[1, 2, 3]
2
["1", "2", "3"]
split.rb:7:in `+': no implicit conversion of Fixnum into String (TypeError)
fromsplit.rb:7:in `<main>'
文字列型だとエラーになります。
#データ部分の読み込み
Paizaの問題で標準入力で、よくあるのは最初の1行と、2行目以降だとデータの構造が違うことがあります。
自分が2行目以降の読み込みには、よく下記のコードを書きます。
#1行目
p gets.split.map(&:to_i)
#2行目以降読み込み
array_of_input = []
while s = gets
array_of_input.push(s.split.map(&:to_i))
end
p array_of_input
1 2 3
2 3 4 5 6
3 4 5 6 7
$ ruby read_data.rb < hoge.txt
[1, 2, 3]
[[2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]
while s = gets
で、標準入力の最後まで読み込むまで、1行を変数s
に代入しています。
#ヘッダー部分(最初の1行目)をインスタンス変数に格納して、その後の処理で使いやすくする。
ヘッダー部分は、仕様の根幹に関わる数値で、何回も参照する必要がでてくると思います。
なので、classを作って、インスタンス変数に格納して、インスタンスの中で呼び出せる様にしましょう。
class Hoge
def initialize(x, y, z)
@x = x
@y = y
@z = z
end
def display
p "x: " + @x.to_s
p "y: " + @y.to_s
p "z: " + @z.to_s
end
end
x, y, z = gets.split.map(&:to_i)
hoge = Hoge.new(x, y, z)
hoge.display
1 2 3
2 3 4 5 6
3 4 5 6 7
$ ruby hoge.rb < hoge.txt
"x: 1"
"y: 2"
"z: 3"
#最後に
Ruby歴3ヶ月ぐらいなので、間違ってること、知らないことも多いと思うので、
もっと良い方法がありましたら、コメント欄で指摘いただけると嬉しいです。
本当は出力も一緒の記事にしようと思ったのですが、眠かったので
別の機会に書きます。