2008-08-21
練習問題 TimeとDate
たのしいRuby |
(1) 「"2006年12月23日午後8時17分50秒"」といったように、
「年・月・日・分・秒」を使った時刻の文字列をTimeオブジェクトに
変換して返すメソッドjparsedateを定義してください。
def jparsedate(s) s=~/(\d+)年(\d+)月(\d+)日(午前|午後)(\d+)時(\d+)分(\d+)秒/ Time.mktime($1,$2,$3,($4 == "午後")?$5.to_i + 12 : $5,$6,$7) end
irb(main):005:0> jparsedate "2006年12月23日午後8時17分50秒" => Sat Dec 23 20:17:50 +0900 2006
# (2) Unixの「ls -t」コマンドのように、ディレクトリを指定するとそのディレクトリの下にある
# ファイルを時刻の順に並べるメソッドls_tを定義してください。
# このメソッドは引数を1つだけ取ります。
# ls_t(調べるディレクトリ名)
def ls_t(dirname) Dir.new(dirname).entries.sort do |a, b| File.new("#{dirname}/#{a}").mtime <=> File.new("#{dirname}/#{b}").mtime end.reverse.each do |e| puts e end return nil end
ドットファイルは抜いたほうがよさそうだ。
# (3) Dateクラスを使って今月の1日と月末の日付と曜日を求め、
# カレンダーを表示してください。
require 'date' today = Date.today month_first = Date.new(today.year, today.month, 1) month_last = Date.new(today.year, today.month + 1, 1) -1 obj = month_first i = 0 month_first.wday.times {printf(" ")} printf("%3d", month_first.day) while(true) do obj = obj.next printf("%3d", obj.day) printf("\n") if obj.wday == 6 break if obj == month_last end
# ruby cal.rb
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
2008年8月の可憐だー。
練習問題 ファイルとディレクトリ
たのしいRuby |
# (1) $:には、Rubyが利用できるライブラリが置かれているディレクトリの
# 名前が、配列の形で格納されています。この変数を使って、Rubyが利用できる
# ライブラリのファイル名を、順に出力するメソッドprint_librariesメソッドを
# 定義してください。
print_libraries.rb
def traverse(dirname) Dir.entries(dirname).reject{|d| d =~ /^\.+$/}.each{|e| if File.directory?(dirname + '/' + e) traverse(dirname + '/' + e) else puts e end } return nil end def print_libraries $:.reject{|d| d =~ /^\.+$/}.each{|e| traverse(e)} return nil end if __FILE__ == $0 print_libraries end
# (2) Unixコマンドのduコマンドのように、ファイルとディレクトリに保存
# されているデータの大きさを再帰的に掘り下げて表示するメソッドduを定義
# してください。
# このメソッドは引数を1つだけ取ります。
# du(調べるディレクトリ名)
def du(dirname, sum=0) entries = Dir.entries(dirname).reject{|d| d =~ /^\.+$/} entries.each{|e| if File.directory?(dirname + '/' + e) sum += du(dirname + '/' + e) else #printf("%10d %s\n", (File.stat(dirname + '/' + e).size)/1024, dirname + '/' + e) sum += File.stat(dirname + '/' + e).size end } sum += File.stat(dirname).size printf("%10d %s\n", sum/1024, dirname) return sum end
Unixコマンドのduコマンドとデータの大きさが合わない・・
rochefort2008/10/26 10:42linuxのduはブロック単位だからでしょうかねー
2008-07-06
練習問題 IOクラス
たのしいRuby |
(1)あるファイルの内容を別のファイルにそのままコピーするメソッドcopyを定義してください。。
copyメソッドは2つの引数を取ります。
copy(コピー元ファイル名、コピー先ファイル名)
コピー元ファイル名のファイルの中身をコピー先ファイル名にコピーします。
def copy(src, dest) df = File.open(dest, "w") File.open(src, "r") do |f| while line = f.gets df.puts line end end end
(2)Unixで使われるtailコマンドと似たことができるメソッドtailを定義してください。
tailメソッドは2つの引数を取ります。
tail(行数、ファイル名)
ファイルの最後の行から数えて指定された行数分だけ、そのファイルの中身を出力するものとしまます。つまり、ファイルsome_file.txtテキストを
def tail(linesize, src) File.open(src, "r") do |f| ary = f.to_a if ary.size > linesize ary[linesize*-1..-1].each do |line| puts line end else ary.each do |line| puts line end end end return nil end
練習問題 正規表現(Regexp)クラス
たのしいRuby |
(1)電子メールのアドレスは「ローカルパート@ドメイン名」という形になっています。このような文字列から、ローカルパートを$1として、またドメイン名を$2として取得する正規表現を作ってください。
これじゃ端折りすぎですか・・
irb(main):027:0> "yaruo-yaranaio@hoge.jp" =~ /(.+?)@(.+)$/ => 0 irb(main):028:0> $1 => "yaruo-yaranaio" irb(main):029:0> $2 => "hoge.jp"
(2)「"オブジェクト指向は難しい!なんて難しいんだ!"」という文字列を、gsubメソッドを使って「"オブジェクト指向は簡単だ!なんて簡単なんだ!"」という文字列に直してください。
irb(main):033:0> puts "オブジェクト指向は難しい!なんて難しいんだ!".gsub(/難しいんだ/, "簡単なんだ").gsub(/難しい/,"簡単だ") オブジェクト指向は簡単だ!なんて簡単なんだ! => nil
(3)アルファベットとハイフンからなる文字列を与えられると、ハイフンで区切られた部分をCapitalizeするようなメソッドword_capitalizeを定義してください。
irb(main):040:0> def word_capitalize(str)
irb(main):041:1> str.split('-').each do |e| e.capitalize! end.join('-')
irb(main):042:1> end
=> nil
irb(main):043:0> word_capitalize("in-reply-to")
=> "In-Reply-To"
irb(main):044:0> word_capitalize("X-MAILER")
=> "X-Mailer"
あれ正規表現つかってないや。
2008-06-30
練習問題 ハッシュ(後半)
たのしいRuby |
(5) 順番を保存するハッシュ、OrderdHashクラスを定義してください。
こんなんでいいでしょうか。
1 class OrderdHash 2 include Enumerable 3 4 def initialize 5 @hash_ary = [] 6 end 7 8 def []=(key, val) 9 @hash_ary.each do |e| 10 e[key]=val if e.key?(key) 11 end 12 @hash_ary << Hash[key, val] 13 end 14 15 def [](key) 16 @hash_ary.each do |e| 17 return e[key] if e.key?(key) 18 end 19 return nil 20 end 21 22 def each 23 @hash_ary.each do |e| 24 ary = e.to_a.flatten 25 yield(ary[0], ary[1]) 26 end 27 end 28 end
irb(main):096:0> load 'orderd_hash.rb'
=> true
irb(main):097:0> h = OrderdHash.new
=> #<OrderdHash:0xb7f72544 @hash_ary=[]>
irb(main):098:0> h["one"] = 1
=> 1
irb(main):099:0> h["two"] = 2
=> 2
irb(main):100:0> h["three"] = 3
=> 3
irb(main):101:0> h["four"] = 4
=> 4
irb(main):102:0> h["five"] = 5
=> 5
irb(main):103:0> h.each do |k,v|
irb(main):104:1* puts "key is #{k} and value is #{v}"
irb(main):105:1> end
key is one and value is 1
key is two and value is 2
key is three and value is 3
key is four and value is 4
key is five and value is 5
=> [{"one"=>1}, {"two"=>2}, {"three"=>3}, {"four"=>4}, {"five"=>5}]
練習問題 文字列(後半)
たのしいRuby |
(2) "七千百二十三"といった、漢数字による数の表現を、「7123」のような
数値に変換するメソッドkan2numを定義してください。
lock
irb(main):001:0> load "kan2num.rb"
=> true
irb(main):002:0> kan2num("七千百二十三")
=> 7123
(3) "12"といった数値による文字列を、"**********"というように、その数だけ
「*」が並ぶ文字列に変換するメソッドnum2astriskを、Numericクラス(またはその
サブクラス)のオブジェクトやメソッドを使わずに定義してください。
1 def num2astrisk(num) 2 print_astrisk = "" 3 keta = 1 4 num.scan(/./).reverse.each do |e| 5 if e == "0" 6 elsif e == "1" 7 astrisk = "*" 8 elsif e == "2" 9 astrisk = "**" 10 elsif e == "3" 11 astrisk = "***" 12 elsif e == "4" 13 astrisk = "****" 14 elsif e == "5" 15 astrisk = "*****" 16 elsif e == "6" 17 astrisk = "******" 18 elsif e == "7" 19 astrisk = "*******" 20 elsif e == "8" 21 astrisk = "********" 22 elsif e == "9" 23 astrisk = "*********" 24 end 25 print_astrisk += astrisk * keta if astrisk 26 keta = keta*10 27 end 28 29 puts print_astrisk 30 end
irb(main):001:0> load "num2astrisk.rb"
=> true
irb(main):002:0> num2astrisk("12")
************
=> nil
irb(main):003:0> num2astrisk("100")
****************************************************************************************************
=> nil
練習問題 文字列(前半)
たのしいRuby |
(1) "ruby is an object oriented programming language"という
文字列があります。この文字列を使って次の処理を行ってください
(a) 文字列に含まれる各単語を要素とする配列を作ってください。
irb(main):041:0> "ruby is an object oriented programming language".split => ["ruby", "is", "an", "object", "oriented", "programming", "language"]
(b) (a)の配列をアルファベット順にソートしてください。
irb(main):042:0> "ruby is an object oriented programming language".split.sort => ["an", "is", "language", "object", "oriented", "programming", "ruby"]
(c) (a)の配列を大文字と小文字の区別をせずにアルファベット順に
ソートしてください。
irb(main):046:0> "ruby is an object oriented programming language".split.sort_by{|e| e.upcase}
=> ["an", "is", "language", "object", "oriented", "programming", "ruby"]
(d) すべての単語の先頭を大文字にして
"Ruby Is An Object Oriented Programming Language"
にしてください。
irb(main):050:0> "ruby is an object oriented programming language".split.map{|e| e.capitalize}.join(' ')
=> "Ruby Is An Object Oriented Programming Language"
(e) 文字列に含まれる文字とその数を次のような形式で表示させてください
(空白文字が6つ、'R'が1つ、'a'が4つ、'b'が……という意味です)
'R': *
'c': *
...
irb(main):148:0> h = Hash.new
=> {}
irb(main):149:0>
irb(main):150:0* "ruby is an object oriented programming language".scan(/./).sort.each do |e|
irb(main):151:1* unless h[e]
irb(main):152:2> h[e] = 1
irb(main):153:2> else
irb(main):154:2* h[e]+=1
irb(main):155:2> end
irb(main):156:1> end
=> [" ", " ", " ", " ", " ", " ", "a", "a", "a", "a", "b", "b", "c", "d", "e", "e", "e", "e", "g", "g", "g", "g", "i", "i", "i", "j", "l", "m", "m", "n", "n", "n", "n", "o", "o", "o", "p", "r", "r", "r", "r", "s", "t", "t", "u", "u", "y"]
irb(main):157:0>
irb(main):158:0* h.each do |k,v|
irb(main):159:1* puts("'#{k}': #{'*'*v}")
irb(main):160:1> end
' ': ******
'l': *
'a': ****
'm': **
'b': **
'y': *
'n': ****
'c': *
'o': ***
'd': *
'p': *
'e': ****
'r': ****
'g': ****
's': *
't': **
'i': ***
'u': **
'j': *
=> {" "=>6, "l"=>1, "a"=>4, "m"=>2, "b"=>2, "y"=>1, "n"=>4, "c"=>1, "o"=>3, "d"=>1, "p"=>1, "e"=>4, "r"=>4, "g"=>4, "s"=>1, "t"=>2, "i"=>3, "u"=>2, "j"=>1}
練習問題 数値
たのしいRuby |
(3) randメソッドを用いて、1~6までの数字をランダムに返すメソッドdiceを
定義してください。
irb(main):050:0> def dice irb(main):051:1> rand(6)+1 irb(main):052:1> end => nil irb(main):053:0> dice => 5 irb(main):054:0> dice => 3 irb(main):055:0> dice => 5 irb(main):056:0> dice => 4
(4) 整数numが素数であるかどうかを調べるメソッドprime?を定義してください。
def prime?(num) prime = true 2.upto(num - 1) do |n| if num % n == 0 prime = false end end prime end
練習問題 配列(後半)
たのしいRuby |
(7) 1から100までの要素を含む配列aryから、1~10、11~20、21~30と
いうように10個の要素を含む配列を10個取り出します。取り出した
すべての配列を、順に別の配列resultに格納するとき、以下の???の
部分に当てはまる式を考えてください。
ary = [1~100の要素を含む配列]
}
irb(main):174:0> ary = Array(1..100)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
irb(main):175:0> result = Array.new
=> []
irb(main):176:0> 10.times{|i| result << ary[i*10, 10]}
=> 10
irb(main):177:0> result
=> [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45, 46, 47, 48, 49, 50], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70], [71, 72, 73, 74, 75, 76, 77, 78, 79, 80], [81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]]
(8) 数値からなる配列nums1とnums2に対して、それらの個々の要素を足し合わせた
要素からなる配列を返すメソッドsum_arrayを定義してください。
irb(main):190:0> def sum_array(nums1, nums2)
irb(main):191:1> nums1.each_index{|k| nums1[k] += nums2[k] }
irb(main):192:1> end
=> nil
irb(main):193:0> nums1 = Array(1..100)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
irb(main):194:0> nums2 = Array(1..100)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
irb(main):195:0> sum_array(nums1,nums2)
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200]
Array#zipに足し算するブロックを渡して配列に詰める方がいい
irb(main):339:0> num1 = [1,2,3,4,5] => [1, 2, 3, 4, 5] irb(main):340:0> num2 = [1,2,3] => [1, 2, 3] irb(main):341:0> num1.zip(num2) => [[1, 1], [2, 2], [3, 3], [4, nil], [5, nil]] irb(main):342:0> num1.zip(num2) do |a, b| irb(main):343:1* a ||= 0 irb(main):344:1> b ||= 0 irb(main):345:1> result << a + b irb(main):346:1> end => nil irb(main):347:0> result => [2, 4, 6, 4, 5]
(9) (、)、{、}という4つの文字を要素とした配列があります。この配列に
対して、カッコが正しく対応していうかどうかを調べるメソッド、
balanced?を定義してください。なお、「カッコが正しく対応している」とは
・(と)の数が同じ
・{と}の数が同じ
・「()」の対応と「{}」の対応が交差することがない
といった状態のことです。
def balanced?(ary) return false if ary.select{|e| e == '('}.size != ary.select{|e| e == ')'}.size return false if ary.select{|e| e == '{'}.size != ary.select{|e| e == '}'}.size chk_ary = [] ary_reverse = ary.reverse ary.each_index do |idx| chk_ary << ary[idx] if ary[idx] == '(' && ary_reverse[idx] == ')' chk_ary << ary[idx] if ary[idx] == '{' && ary_reverse[idx] == '}' chk_ary << ary[idx] if ary[idx] == ')' && ary_reverse[idx] == '(' chk_ary << ary[idx] if ary[idx] == '}' && ary_reverse[idx] == '{' end return false if chk_ary.size != ary.size true end
irb(main):308:0> balanced?("{((({()})))}".scan(/./))
=> true
irb(main):311:0> balanced?(["(", "{", "}", ")"])
=> true
irb(main):312:0> balanced?(["(", ")", "{"])
=> false
irb(main):313:0> balanced?(["{", "}", "("])
=> false
irb(main):314:0> balanced?(["(", "{", ")", "}"])
=> false
ほんとはこういう対応モノ(HTMLのタグとか)はスタックでやるものですね
2008-06-27[たのしいRuby] たのしいRuby 練習問題 ハッシュ(前半)
たのしいRuby 練習問題 ハッシュ(前半)
たのしいRuby |
(1) 曜日を表す英語と日本語との対応を表すハッシュwdayを定義
してください。
wday = {"Sunday" => "日曜日",
"Monday" => "月曜日",
"Thuesday" => "火曜日",
"Wendsday" => "水曜日",
"Thursday" => "木曜日",
"Friday" => "金曜日",
"Satuday" => "土曜日"
}
irb(main):020:0> $KCODE='u'
=> "u"
irb(main):021:0> wday = {"Sunday" => "日曜日",
irb(main):022:1* "Monday" => "月曜日",
irb(main):023:1* "Thuesday" => "火曜日",
irb(main):024:1* "Wendsday" => "水曜日",
irb(main):025:1* "Thursday" => "木曜日",
irb(main):026:1* "Friday" => "金曜日",
irb(main):027:1* "Satuday" => "土曜日"
irb(main):028:1> }
=> {"Satuday"=>"土曜日", "Friday"=>"金曜日", "Wendsday"=>"水曜日", "Monday"=>"月曜日", "Sunday"=>"日曜日", "Thuesday"=>"火曜日", "Thursday"=>"木曜日"}
(2) ハッシュのメソッドを使って、(1)のハッシュwdayのペアの数を
数えてください。
=> {"Satuday"=>"土曜日", "Friday"=>"金曜日", "Wendsday"=>"水曜日", "Monday"=>"月曜日", "Sunday"=>"日曜日", "Thuesday"=>"火曜日", "Thursday"=>"木曜日"}
irb(main):029:0> wday.keys
=> ["Satuday", "Friday", "Wendsday", "Monday", "Sunday", "Thuesday", "Thursday"]
irb(main):030:0> wday.key.size
NoMethodError: undefined method `key' for #<Hash:0xb7f851f8>
from (irb):30
from :0
irb(main):031:0> wday.keys.size
=> 7
(3) eachメソッドと(1)のハッシュwdayを使って、
「sunday」は日曜日のことです。
「monday」は月曜日のことです。
...
という文字列を出力してください。
irb(main):042:0> wday.each do |e|
irb(main):043:1* ary = e.to_a
irb(main):044:1> puts "「#{ary.first}」は#{ary.last}のことです。"
irb(main):045:1> end
「Satuday」は土曜日のことです。
「Friday」は金曜日のことです。
「Wendsday」は水曜日のことです。
「Monday」は月曜日のことです。
「Sunday」は日曜日のことです。
「Thuesday」は火曜日のことです。
「Thursday」は木曜日のことです。
=> {"Satuday"=>"土曜日", "Friday"=>"金曜日", "Wendsday"=>"水曜日", "Monday"=>"月曜日", "Sunday"=>"日曜日", "Thuesday"=>"火曜日", "Thursday"=>"木曜日"}
(4) ハッシュには、配列の%wのようなものがありません。
そこで、空白とタブと改行で区切られた文字列をハッシュに
変換するメソッドstr2hashを定義してください。
irb(main):001:0> def str2hash(str)
irb(main):002:1> require 'enumerator'
irb(main):003:1> h = Hash.new
irb(main):004:1> str.split(/\s/).each_slice(2) do |e|
irb(main):005:2* h[e.first] = e.last
irb(main):006:2> end
irb(main):007:1> return h
irb(main):008:1> end
=> nil
irb(main):009:0> str2hash("hoge bar fuga")
=> {"fuga"=>"fuga", "hoge"=>"bar"}
できてない!!TT
irb(main):013:0> def str2hash(str)
irb(main):014:1> ary = str.split(/\s/)
irb(main):015:1> ary << nil if ary.size % 2 != 0
irb(main):016:1> require 'enumerator'
irb(main):017:1> h = Hash.new
irb(main):018:1> ary.each_slice(2) do |e|
irb(main):019:2* h[e.first] = e.last
irb(main):020:2> end
irb(main):021:1> return h
irb(main):022:1> end
=> nil
irb(main):023:0>
irb(main):024:0* str2hash("hoge bar fuga")
=> {"fuga"=>nil, "hoge"=>"bar"}
むりやり感。
2008-06-26[たのしいRuby] 練習問題 配列(前半)
(1) 1から100までの整数を含む配列を作ってください
Array(1..100)
irb(main):118:0> Array(1..100) => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
(2) (1)の配列の要素をすべて100倍した要素を含む、新しい配列を作って
ください。また、新しい配列を作成せずに、すべての要素を100倍した
ものに置き換えてください。
irb(main):120:0> ary.map do |elem| irb(main):121:1* elem * 100 irb(main):122:1> end => [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000]
irb(main):123:0> ary.map! do |elem| irb(main):124:1* elem * 100 irb(main):125:1> end => [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000]
(3) (1)の配列から3の倍数だけを取り出して、新しい配列を作ってください。
また、新しい配列を作成せずに、3の倍数以外の数を削除してください。
irb(main):149:0> ary.reject do |e| irb(main):150:1* e % 3 == 0 irb(main):151:1> end => [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100]
irb(main):152:0> ary.reject! do |e| irb(main):153:1* e % 3 == 0 irb(main):154:1> end => [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100]
(4) (1)の配列を次の3つの方法で逆順に並べ換えてください。
irb(main):163:0> ary.reverse => [100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
irb(main):181:0> ary.sort => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
irb(main):173:0> ary = ary.reverse => [100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] irb(main):177:0> ary.sort_by do |e| irb(main):178:1* e irb(main):179:1> end => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
(5) (1)の配列に含まれる整数の和を次の2つの方法で求めてください。
irb(main):182:0> sum = 0 => 0 irb(main):183:0> ary.each do |e| irb(main):184:1* sum += e irb(main):185:1> end => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] irb(main):186:0> sum => 5050
irb(main):188:0> ary.inject(0) do |r, e| irb(main):189:1* r + e irb(main):190:1> end => 5050
(6) randメソッドを利用して(1)の配列をでたらめな順番に並べ換えてください。
irb(main):001:0> def detarame
irb(main):002:1> from_ary = Array(1..100)
irb(main):003:1> to_ary = Array(1..100)
irb(main):004:1> to_ary.each{|e| e = nil}
irb(main):005:1>
irb(main):006:1* from_ary.each do |e|
irb(main):007:2* begin
irb(main):008:3* index = rand(to_ary.size + 1)
irb(main):009:3> end while(!to_ary[index])
irb(main):010:2> to_ary[index] = e
irb(main):011:2> end
irb(main):012:1>
irb(main):013:1* to_ary
irb(main):014:1> end
=> nil
irb(main):015:0> detarame
=> [1, 93, 94, 41, 5, 52, 7, 36, 9, 87, 11, 50, 13, 14, 60, 85, 80, 70, 19, 56, 72, 22, 23, 24, 25, 1, 27, 89, 68, 2, 31, 32, 77, 73, 29, 36, 37, 38, 39, 40, 57, 55, 43, 17, 86, 58, 47, 71, 22, 96, 51, 47, 25, 44, 55, 56, 97, 43, 59, 60, 61, 34, 48, 64, 90, 69, 99, 68, 21, 27, 75, 35, 95, 74, 75, 88, 91, 83, 79, 80, 59, 37, 83, 84, 85, 86, 92, 84, 63, 98, 74, 49, 67, 94, 28, 82, 39, 98, 99, 100]
irb(main):016:0> detarame
=> [99, 2, 59, 22, 16, 6, 26, 94, 9, 10, 11, 60, 23, 14, 62, 21, 93, 29, 45, 69, 43, 22, 23, 77, 52, 26, 27, 92, 29, 17, 91, 100, 33, 73, 87, 86, 48, 66, 76, 40, 41, 42, 85, 65, 33, 70, 2, 28, 54, 3, 96, 42, 53, 54, 64, 56, 57, 81, 59, 60, 13, 68, 63, 64, 83, 67, 63, 68, 69, 97, 71, 56, 73, 74, 75, 98, 77, 51, 79, 32, 41, 82, 25, 95, 79, 38, 87, 88, 84, 88, 78, 92, 93, 90, 95, 96, 97, 40, 99, 100]
irb(main):017:0> detarame.size
=> 100
irb(main):018:0> detarame
=> [93, 2, 3, 4, 5, 45, 7, 8, 9, 71, 44, 66, 13, 57, 96, 75, 97, 18, 22, 20, 13, 86, 80, 72, 25, 19, 27, 28, 29, 30, 31, 58, 46, 34, 33, 87, 85, 62, 92, 79, 20, 50, 43, 44, 4, 30, 47, 99, 51, 8, 51, 52, 74, 25, 23, 59, 90, 91, 60, 60, 61, 62, 43, 53, 65, 2, 67, 68, 69, 84, 39, 72, 73, 74, 95, 94, 88, 52, 81, 98, 70, 67, 89, 47, 77, 86, 78, 73, 89, 76, 91, 100, 29, 1, 64, 68, 97, 98, 37, 36]
お手本はこれ
puts array.sort_by{|i| rand }
これはちょっと自力で書けない。。
(3) randメソッドを用いて、1~6までの数字をランダムに返すメソッドdiceを
定義してください。
irb(main):050:0> def dice irb(main):051:1> rand(6)+1 irb(main):052:1> end => nil irb(main):053:0> dice => 5 irb(main):054:0> dice => 3 irb(main):055:0> dice => 5 irb(main):056:0> dice => 4
(4) 整数numが素数であるかどうかを調べるメソッドprime?を定義してください。
def prime?(num) prime = true 2.upto(num - 1) do |n| if num % n == 0 prime = false end end prime end