目次
1、n行1列の整数を配列として受け取る
2、n行複数列の整数を2次元配列で受け取る
3、ゼロ判定
4、正負判定
5、偶奇判定
6、tallyメソッド
7、配列と配列の比較
8、trメソッド
9、combinationメソッド
10、permutationメソッド
11、素数 primeライブラリ
12、select
13、find
14、sum
15、&とシンボル(&:)
「配列の要素取得」
1、countメソッド
2、all?メソッド
3、charsメソッド
4、each_with_indexメソッド
5、each.with_indexメソッド
「おまけ」
メソッドのテスト実行「Minitest」検証メソッド
「その他」
1、可変長引数(アスタリスク)
2、countメソッド
3、each_consメソッド
4、yieldメソッド
n行1列の整数を配列として受け取る
a = Array.new(n){ gets.to_s.to_i } # n行1列の改行区切りの整数を配列として受け取る
#例
a = Array.new(n){ gets.to_s.to_i }
3
4
5
#入力
結果=>
3
4
5
n行複数列の整数を2次元配列で受け取る
m = Array.new(n){ gets.to_s.split.map{ |e| e.to_i } } # n行m列の整数を2次元配列で受け取る
#例
m = Array.new(3){ gets.to_s.split.map{ |e| e.to_i } }
1 2 3
4 5 6
7 8 9
#入力
結果=>[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
a,b = gets.to_s.split.map{|p| p.to_i}
ゼロ判定
i == o
i.zero?
正負判定
i > o
i.positive?
i < 0
i.negative?
偶奇判定
i % 2 == 0
i.even?
i % 2 == 1
i & 1 == 1
i.odd?
tallyメソッド
配列の要素を計算してhashで返してくれます
i = [1,2,2,34,5,5,5,6,6,7,7].tally
puts i
結果=> {1=>1, 2=>2, 34=>1, 5=>3, 6=>2, 7=>2}
配列と配列の比較
Comparableモジュールをインクルードして比較できます
class Array
include Comparable
end
p [2,2,2] <= [3,3,3]
結果=> true
==,!=,<=>は最初から使えます
trメソッド
trは1文字を別の1文字に置き換え、交換、削除してくれます。
第一引数に置き換えたい文字、第二引数に置き換え後の文字
p "49".tr("4","5")
p "nu".tr("n","")
結果=>
"59"
"u"
combinationメソッド
全探索といえばこのメソッド
順列と組み合わせを簡単に求めることができます。
a = [1,2,3,4]
p a.combination(2).to_a
結果=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
combinationは要素の重複をしない
permutationメソッド
permutationは要素の並び替えて一致するものも含まれる
a = [1,2,3,4]
p a.permutation(2).to_a
結果=> [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]
例えば4通りのケースの場合、
「Aはする、Bはする、Cはする、しない」のような4択の場合
repeated_permutationを使います
["a","b","c",nil].repeated_permutation(2) do |r|
p r
end
結果=>
["a", "a"]
["a", "b"]
["a", "c"]
["a", nil]
["b", "a"]
["b", "b"]
["b", "c"]
["b", nil]
["c", "a"]
["c", "b"]
["c", "c"]
["c", nil]
[nil, "a"]
[nil, "b"]
[nil, "c"]
[nil, nil]
素数 primeライブラリ
primeライブラリを使います
require "prime"
p 1.prime?
p 2.prime?
結果=>
false
true
#素因数分解
require "prime"
p 4.prime_division
結果=> [[2, 2]]
selectメソッド
各要素のなかで真になった要素を配列にして返すメソッドです
n = [1,2,2,3,4,5]
p n.select{|o|o.even?}
結果=> [2, 2, 4]
findメソッド
真になった戻り値の一番最初の要素をかえします
n = [1,2,2,3,4,5]
p n.find{|o|o.even?}
結果=> 2
sumメソッド
各要素を足し上げるメソッドです。
ブロックを与えるとそのの中で戻り値が合計されます。
n = [1,2,2,3,4,5]
p n.sum{|o|o*10}
結果=> 170
初期値を指定する
n = [1,2,2,3,4,5]
#初期値に10を入れることもできます
p n.sum(10)
文字列を連結させる
n = %w(a b c d) #%wは、["a","b","c","d"]と同じ意味
p n.sum("")
結果=> "abcd"
&とシンボル(&:)
n = ["ruby","python","javascript"]
#↓はどちらも同じ結果
n.map{|o|o.upcase}
n.map(&:upcase) #($:〜)とすることで簡単に書けます
#=> ["RUBY", "PYTHON", "JAVASCRIPT"]
「配列の要素取得」
countメソッド
配列の要素を条件付きで数える場合使用します。
また、引数を指定しない場合はlengthやsizeと同じように要素数を返します。
配列の中の要素数を調べる場合
array = ["red","blue","yellow","red"]
p array.count("red")
結果=> 2
引数にブロックを渡し複雑な条件を指定した場合
array = [1,2,2,2,3,3,4,5,]
p array.count{ |num| num % 2 == 0}
結果 => 4
nilを除いた要素数を数える場合
array = ["red","blue",nil,"yellow","red"]
p array.count{ |num| !num.nil? }
結果=> 4
all?メソッド
ブロックにall?の配列の要素がすべて「真」の場合「true」を返します。
a = [1,2,3,3,4,5,6,6]
if a.all?{|p| p > 0 }
puts "ok"
end
結果=> ok
配列の中身が全部偶数か確認する場合
a = [1,2,3,3,4,5,6,6]
if a.all?{|p| p.even?}
puts "ok"
else
puts "no"
end
結果=> no
charsメソッド
文字列に対して1文字ずつ分割してくれるメソッドです。
a = "12345"
p a.chars
結果=> ["1", "2", "3", "4", "5"]
文字列を数字に変える場合
a = "12345"
p a.chars.map(&:to_i)
結果=> [1, 2, 3, 4, 5]
数字に変換することによって
a = "12345"
p a.chars.map(&:to_i).sum
結果=> 15
このように合計値など操作することもできるので便利です。
each_with_indexメソッド
配列のインデックスも表示させたい場合便利なメソッドです。
n = ["a","b","c","d"]
n.eachwithindex{|p,i| puts "#{i}番目の#{p}です"}
結果=>
0番目のaです
1番目のbです
2番目のcです
3番目のdです
each.with_indexメソッド
任意のインデックスから始めたい場合に便利です
n = ["a","b","c","d"]
n.each.with_index(99){|p,i| puts "#{i}番目の#{p}です"}
結果=>
99番目のaです
100番目のbです
101番目のcです
102番目のdです
Rubyでのメソッドのテスト確認するやり方
バージョン確認
ruby -r minitest -e "puts Minitest::VERSION"
結果=>5.15.0
メソッド名には「test_〜〜」としなければならない。
「test_〜〜」の分だけ検証してくれる。
require "minitest/autorun"
class SumpleTest < Minitest::Test
def test_sumple
assert_equal "RUBY","ruby".upcase #[assert_equal a,b](bがaの値と同じならばパスが通ります。)
end
end
結果=>
Run options: --seed 18548
# Running:
.
Finished in 0.000394s, 2538.0705 runs/s, 2538.0705 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
可変長引数(アスタリスク)
引数に「*」をつけると可変長になります。
また、引数「**」をつけるとキーワード引数をハッシュで受け取ることができます。
def any(sam,*array,**hash)
p sam
p array
p hash
end
any(1,2,3,4,5)
結果=>
1
[2, 3, 4, 5]
{}
引数にハッシュを渡すとこのように受け取ることができます。
def any(sam,*array,**hash)
p sam
p array
p hash
end
any(1,2,3,4,5,name: "taro",age: 30)
結果=>
1
[2, 3, 4, 5]
{:name=>"taro", :age=>30}
変数呼び出し時、引数に「*」を付けると配列を渡すことができる。
sum = [1,2,3,4,5]
def any(a,b,*sum)
p a
p b
p sum
end
any(*sum)
結果=>
1
2
[3, 4, 5]
countメソッド
レシーバの要素を返す
n = [1,2,5,6,7,8]
p n.count
結果=>6
countメソッドを使って配列の中の数字の差を取る場合
n = [1,2,5,6,7,8]
count = n.count-1
count.times do |pn|
puts n[pn+1] - n[pn]
end
結果 =>
1
3
1
1
1
each_cons
要素を重複ありで(引数)要素ずつに区切り、ブロックに渡して繰り返します。
n = [1,2,5,6,7,8]
n.each_cons(3){|pn| p pn }
結果=>
[1, 2, 5]
[2, 5, 6]
[5, 6, 7]
[6, 7, 8]
each_consを使って先ほどのcountメソッドの時と同じように差を取る場合
n = [1,2,5,6,7,8]
num = n.each_cons(2).to_a
num.each do |p|
puts p[1] - p[0]
end
結果=>
1
3
1
1
1
yieldメソッド
ブロックを引数として受け取り、受け取ったブロックを実行するメソッド
def say
yield #ブロックを引数に取る
end
say do
puts "Yes" #yieldで実行される
end
結果=> Yes
yieldに引数を持たせた場合
def arry(list)
for item in list
yield item
end
end
data = [1,2,3,4,5]
arry(data) do |item|
p "#{item}"
end warn
結果=>
"1"
"2"
"3"
"4"
"5"