113
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

paizaの問題を解くときに使えるテクニック1(Ruby編)

Paizaの問題を解いていて、使えそうなテクニック1(入力編)

自分用アウトプットメモです。
覚えておくと便利なものであり、解法ではありません。
ちなみに趣味でしかRubyを使ったことがありません。

ようやく第2回のようなものを自分のブログに書きました。

最近競技プログラミングしていてよく使う書き方とかメソッドとか - ボトムズ日記

ファイルからの標準入力

Paizaのページ内にエディタがあるが、大半の人は自分のPCで開発すると思います。
標準入力は、使用頻度は高くないと思うので、忘れがちです。
下記のコマンドで実行すると簡単です。

hoge.rb
p gets
hoge.txt
1 2 3
$ ruby hoge.rb < hoge.txt
"1 2 3"

改行マークの除去

Paizaの問題には、標準入力に改行マークがある。
除去するにはchompメソッドを使用する。

chomp, chomp! (String) - Rubyリファレンス

chomp.rb
p gets
p gets.chomp
hoge.txt
1 2 3
1 2 3
$ ruby chomp.rb < hoge.txt
"1 2 3\n"
"1 2 3"

標準入力を整数型にして、配列に格納する。

整数型にしないと、計算処理でエラーになります。

split.rb
hoge = gets.split.map(&:to_i)
p hoge
p hoge[0] + 1

fuga = gets.split
p fuga
p fuga[0] + 1
hoge.txt
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行目以降の読み込みには、よく下記のコードを書きます。

read_data.rb
#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
hoge.txt
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を作って、インスタンス変数に格納して、インスタンスの中で呼び出せる様にしましょう。

hoge.rb
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
hoge.txt
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ヶ月ぐらいなので、間違ってること、知らないことも多いと思うので、
もっと良い方法がありましたら、コメント欄で指摘いただけると嬉しいです。

本当は出力も一緒の記事にしようと思ったのですが、眠かったので
別の機会に書きます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
113
Help us understand the problem. What are the problem?