2014年7月24日木曜日

140724

Ruby


条件演算子(式が複雑な場合)

「VisualC++2013パーフェクトマスター」で次のコードと出会う。

#include <iostream>
using namespace std;

struct dt1 {
int a;
double b;
};

int main()
{
int a = 1, b;

if (a < 5)
b = 10;
else
b = 50;

b = a<5 ? 10 : 50;

if (a < 10)
b = 1;
else if (a < 100)
b = 2;
else if (a < 500)
b = 3;
else
b = 4;

b = (a < 10) ? 1 : (a < 100) ? 2 : (a < 500) ? 1 : 4;

getchar();
return 0;

}

要するに、赤の部分が条件演算子を使って青の部分のように
1行で書けるということなのだが、
Rubyでも同じようにしてみる。

a = 3
if a < 10
  b = 1
elsif a < 100
  b = 2
elsif a < 500
  b = 3
else
  b = 4
end
puts b

a = 33
if a < 10
  b = 1
elsif a < 100
  b = 2
elsif a < 500
  b = 3
else
  b = 4
end
puts b

a = 333
if a < 10
  b = 1
elsif a < 100
  b = 2
elsif a < 500
  b = 3
else
  b = 4
end
puts b

a = 3333
if a < 10
  b = 1
elsif a < 100
  b = 2
elsif a < 500
  b = 3
else
  b = 4
end
puts b

a = 3
puts b = (a < 10)? 1 : (a < 100)? 2 :(a < 500)? 3 : 4

a = 33
puts b = (a < 10)? 1 : (a < 100)? 2 :(a < 500)? 3 : 4

a = 333
puts b = (a < 10)? 1 : (a < 100)? 2 :(a < 500)? 3 : 4

a = 3333
puts b = (a < 10)? 1 : (a < 100)? 2 :(a < 500)? 3 : 4

出力結果
1
2
3
4
1
2
3
4

2014年7月20日日曜日

140720

Ruby


Hashクラスのsortメソッド?

Ruby 1.9では、Hashクラスのsortメソッドは廃止され、
Hashのキーと値をソートした配列を作成して返す。

i_ary = [4, 1, 3, 2] 
w_ary = ["GABLES", "ANNE", "GREEN", "OF"]
hash = Hash[i_ary.zip(w_ary)]
p hash
p hash.sort
p hash.sort.map{|i| i[1]}.join(" ")

出力結果
{4=>"GABLES", 1=>"ANNE", 3=>"GREEN", 2=>"OF"}
[[1, "ANNE"], [2, "OF"], [3, "GREEN"], [4, "GABLES"]]   ←配列
"ANNE OF GREEN GABLES"

2014年7月13日日曜日

140713(2)

Ruby


Hashのキーや値をまとめて取り出す。

w = 'a1bxkk3k'
h = w.scan(/[a-z]/).join.chars.group_by(&:to_sym)
p h
p h.keys
p h.map{|f| f.first}                 ←これでもOK
p h.values
p h.map{|f| f.last}                 ←これでもOK

出力結果
{:a=>["a"], :b=>["b"], :x=>["x"], :k=>["k", "k", "k"]}
[:a, :b, :x, :k]
[:a, :b, :x, :k]
[["a"], ["b"], ["x"], ["k", "k", "k"]]
[["a"], ["b"], ["x"], ["k", "k", "k"]]

140713

Ruby


each_charメソッドは、charsメソッドと同じだが、今のところ後者の方が好きだ。

w = 'a1bxkk3k'
p w.scan(/[a-z]/).join.chars.group_by(&:to_sym)
p w.scan(/[a-z]/).join.each_char.group_by(&:to_sym)
# 途中で切ると…
p w.scan(/[a-z]/).join.chars
p w.scan(/[a-z]/).join.each_char

出力結果
{:a=>["a"], :b=>["b"], :x=>["x"], :k=>["k", "k", "k"]}
{:a=>["a"], :b=>["b"], :x=>["x"], :k=>["k", "k", "k"]}
["a", "b", "x", "k", "k", "k"]
#<Enumerator: "abxkkk":each_char>           ←何か汚い。