38
新しくプログラミング言語を覚えたいときに 行うべき 10 の練習問題 を Ruby でやってみた うえっち (@uh_tomo )

新しくプログラミング言語・・・Rubyでやってみた

Embed Size (px)

Citation preview

Page 1: 新しくプログラミング言語・・・Rubyでやってみた

新しくプログラミング言語を覚えたいときに行うべき 10 の練習問題 を Ruby でやってみた

うえっち (@uh_tomo )

Page 2: 新しくプログラミング言語・・・Rubyでやってみた

自己紹介

●名前: 上田智昭(通称 うえっち)

●工学部 情報系 3年

●今回のLT会の企画者

Page 3: 新しくプログラミング言語・・・Rubyでやってみた

元ネタ

http://www.ideaxidea.com/archives/2008/02/10_7.html

新しくプログラミング言語を覚えたいときに行うべき10の練習問題

※ ちょっと変えたものを解きました

Page 4: 新しくプログラミング言語・・・Rubyでやってみた

課題 01

● FizzBuzz問題を解け

FizzBuzz問題を知らない人 いますか?

Page 5: 新しくプログラミング言語・・・Rubyでやってみた

※ FizzBuzz 問題 とは?

1から順に数字を出力していく

ただし、3で割切れる場合はFizz5で割切れる場合はBuzz両方で割切れる場合はFizzBuzz を数字の代わりに表示

例:1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 ...

Page 6: 新しくプログラミング言語・・・Rubyでやってみた

課題 01

● FizzBuzz問題を解け

コード例:

1 (1..100).each do |t|2 str = ""3 str += "Fizz" if t % 3 == 0 # 3で割切れる場合4 str += "Buzz" if t % 5 == 0 # 5で割切れる場合5 str = t.to_s if str == "" # 3でも5でも割り切れない場合6 puts str # 出力7 end

(1..100).each do |t| ~ end は、for構文みたいな感じ反復変数tに1から100までの数値を代入しながら、繰り返す

2-5行目では、tを判定し、出力する文字列を決定する6行目で文字列を出力する

解説:

Page 7: 新しくプログラミング言語・・・Rubyでやってみた

課題 01

● FizzBuzz問題を解け

(1..100).each{|t| puts t%15==0 ? "FizzBuzz" : t%3==0 ? "Fizz" : t%5==0 ? "Buzz": t }

※ おまけ○ワンライナー編

○ Rubyでの最短(56文字)

1.upto(?d){|i|i%3<1&&x=:Fizz;puts i%5<1?"#{x}Buzz":x||i}

dの ASCIIコード

短絡評価・最小評価

Page 8: 新しくプログラミング言語・・・Rubyでやってみた

課題 02

●現在時刻に合わせて、やる気のでる文字列を表示

Page 9: 新しくプログラミング言語・・・Rubyでやってみた

課題 02

●現在時刻に合わせて、やる気のでる文字列を表示

◎方針:

Time.nowを使って、現在時刻を取得適当に条件分岐させて、メッセージを表示させる

この問題は、時刻を利用することが目的

Page 10: 新しくプログラミング言語・・・Rubyでやってみた

課題 02

●現在時刻に合わせて、やる気のでる文字列を表示

1 case Time.now.hour 2 when 6..9 3 puts "おはようございます。良い朝ですね" …19 when 23..520 puts "そろそろ寝る時間だよー"21 end

コード例:

解説:

case 式 when 値 ~ end は、switch構文みたいな感じ式==値の場合、実行する( breakとか必要なし )

Page 11: 新しくプログラミング言語・・・Rubyでやってみた

課題 03

●数値を複数入力後、昇順に並び替える。 それらの最大値と最小値を出力する。

Page 12: 新しくプログラミング言語・・・Rubyでやってみた

課題 03

●数値を複数入力後、昇順に並び替える。 それらの最大値と最小値を出力する。

◎方針:

1.不定個数の入力を受け取り、配列に格納2.配列を昇順に並び替え、出力3.最大値と最小値も出力

この問題は、配列操作が目的

Page 13: 新しくプログラミング言語・・・Rubyでやってみた

課題 03

●数値を複数入力後、昇順に並び替える。 それらの最大値と最小値を出力する。

1 arr = Array.new # 入力を格納する配列を定義 2 catch(:exit) { 3 loop do # 無限ループ 4 STDIN.gets() # 1行の標準入力 5 $_.split(" ").each do |t| # 入力を<空白スペース>で分ける 6 throw :exit if t == "00" # 00が入力された場合は、入力終了 7 arr << t.to_i # 数値に変換して配列に格納 8 end 9 end10 }11 p arr.sort! # 配列をソートし出力12 puts "max: #{arr.max}\nmin: #{arr.min}" # 最大値と最小値を出力

コード例:

解説:

コメントのとおり

Page 14: 新しくプログラミング言語・・・Rubyでやってみた

課題 04

●簡易電卓の作成 (0除算の場合を作り込む )

Page 15: 新しくプログラミング言語・・・Rubyでやってみた

課題 04

●簡易電卓の作成 (0除算の場合を作り込む )

◎方針:

1.[数字 演算子 数字 ]のような入力を受け取る2. 0除算の判定と処理3.計算結果の出力

この問題は、条件分岐が目的?

Page 16: 新しくプログラミング言語・・・Rubyでやってみた

課題 04

●簡易電卓の作成 (0除算の場合を作り込む )

コード例:

解説:

1,2行目で、入力を受取り、数字と演算子に分ける4-6行目で、不正入力の判定8-10行目で、0除算判定12行目で、計算し、結果表示

1 STDIN.gets # 標準入力 2 tmp = $_.split(" ") # 入力を<半角スペース>で分け、配列化 3 # 不正な入力を防ぐ 4 unless tmp[0] =~ /^\d+$/ and tmp[1] =~ /^[\+\-\*\/]$/ and tmp[2] =~ /^\d+$/ 5 puts "Num Ope Num の形で入力してください" 6 end 7 # 0除算を防ぐ 8 if tmp[1] == "/" and tmp[2].to_i == 0 9 puts "0除算とか迷惑です"10 end11 # 計算結果を出力12 puts eval(tmp[0]+tmp[1]+tmp[2]) #できればいいんです

Page 17: 新しくプログラミング言語・・・Rubyでやってみた

課題 05

●キーワードを入力して、 Yahooの検索結果を表示

Page 18: 新しくプログラミング言語・・・Rubyでやってみた

課題 05

●キーワードを入力して、 Yahooの検索結果を表示

◎方針:

1.キーワード入力2. Yahooで検索 (XMLが返ってくる)3. XMLから必要なものを取り出し、出力

この問題は、APIの使用、 HTTP通信、 XML処理 が目的

Page 19: 新しくプログラミング言語・・・Rubyでやってみた

課題 05

●キーワードを入力して、 Yahooの検索結果を表示

コード例(通信部): 1 uri = "http://search.yahooapis.jp/WebSearchService/V2/webSearch" 2 appid = "iYknF3yxg67vgAWX01ygpiCbcdCpiBJCQx6G8j.OtP289nVkQDLBmMR.aTT7rLDDg4y0" 3 results = "5" 4 search_result = "" 5 6 puts "検索ワードを入力してください" 7 STDIN.gets() 8 url = "#{uri}?appid=#{appid}&query=#{URI.escape($_.chomp)}&results=#{results}" 910 loop do # 無限ループ11 begin # 例外処理12 search_result = open(url).read # 検索結果の受け取り13 rescue14 next # エラーが発生したら、もう一回実行15 end16 break # エラーが発生しなければ、ループを抜ける17 end

解説:

コメントのとおり

Page 20: 新しくプログラミング言語・・・Rubyでやってみた

課題 05

●キーワードを入力して、 Yahooの検索結果を表示

コード例(XML処理部):18 count = 1 # カウンターの初期化19 xml = REXML::Document.new(search_result) # 検索結果を XMLオブジェクトに20 xml.elements.each("ResultSet/Result") do |elem| # ResultSetタグのResultタグ21 puts "● #{count}番目の検索結果 " # 検索順位を出力22 count += 123 puts "Title: "+elem.elements["Title"].text # ページのタイトルを出力24 puts elem.elements["Summary"].text # ページの概要を出力25 puts # 空行26 end

解説:

20行目では、 XMLの ResultSetタグの要素 Resultタグの要素を取り出し、反復変数elemに代入している。その後、23行目でタイトル、24行目で概要を出力している。

Page 21: 新しくプログラミング言語・・・Rubyでやってみた

課題 06

●テキストを入力すると、語尾を変えて出力

Page 22: 新しくプログラミング言語・・・Rubyでやってみた

課題 06

●テキストを入力すると、語尾を変えて出力

◎方針:

1.テキスト入力2.語尾を置換し、出力

この問題は、正規表現と文字列置換 が目的

Page 23: 新しくプログラミング言語・・・Rubyでやってみた

課題 06

●テキストを入力すると、語尾を変えて出力

1 STDIN.gets 2 print $_.sub(/です $/, "でちゅわ“ )

コード例:

解説:

1行目で入力2行目で置換したものを出力している

色々な組み合わせで遊べる感じ

Page 24: 新しくプログラミング言語・・・Rubyでやってみた

課題 07

●メールを送る

Page 25: 新しくプログラミング言語・・・Rubyでやってみた

課題 07

●メールを送る

◎方針:

1.メールを送る

この問題は、メールを送ること が目的

Page 26: 新しくプログラミング言語・・・Rubyでやってみた

課題 07

●メールを送る

1 require 'net/smtp' 2 3 server_addr = "smtp.example.co.jp" 4 port = 25 5 from_addr = "[email protected]" 6 to_addr = "[email protected]" 7 account = "" 8 pass = "" 910 message = <<EOF11 From: queue <[email protected]>12 To: iguiter <[email protected]>13 Subject: Test Mail14 Date: Sat, 23 Jan 2012 00:00:00 +09001516 This is a test mail.17 EOF1819 Net::SMTP.start(server_addr, port, from_addr, account, pass) do |smtp|20 smtp.send_message(message, from_addr, to_addr) # メール送信21 end

コード例:

Page 27: 新しくプログラミング言語・・・Rubyでやってみた

課題 08

●「 <誰>が<どこ >で<何を >した」を表示する

Page 28: 新しくプログラミング言語・・・Rubyでやってみた

課題 08

●「 <誰>が<どこ >で<何を >した」を表示する

◎方針:

1.各要素を配列に格納2.乱数を発生させ、適当に表示させる

この問題は、文字列処理と乱数 が目的

Page 29: 新しくプログラミング言語・・・Rubyでやってみた

課題 08

●「 <誰>が<どこ >で<何を >した」を表示する

1 who = ["たろー","じろー","さぶろー","しろー","ごろー"] 2 where = ["家 ","海上","ノートPCの上","うどん屋 ","玄関 "] 3 doing = ["踊った","女装した","寝てた","「えっ」 ","にゃー"] 4 5 puts who[i]+" が "+where[rand(5)]+" で "+doing[rand(5)]

コード例:

解説:

1,2,3行目で、各要素を定義5行目で乱数を発生させて、出力

Page 30: 新しくプログラミング言語・・・Rubyでやってみた

課題 09

●入力された URLのはてブ数を出力

Page 31: 新しくプログラミング言語・・・Rubyでやってみた

課題 09

●入力された URLのはてブ数を出力

◎方針:

1. URL入力2.はてブ APIを利用し、結果を取得する

この問題は、APIの使用、エスケープ、xmlrpcの利用? が目的

Page 32: 新しくプログラミング言語・・・Rubyでやってみた

課題 09

●入力された URLのはてブ数を出力

1 require 'xmlrpc/client' 2 client = XMLRPC::Client.new("b.hatena.ne.jp", "/xmlrpc") 3 4 puts "URLを入力してください (例 : http://www.google.com)" 5 print "検索URL: " 6 STDIN.gets 7 8 search_result = client.call("bookmark.getCount",URI.escape($_.chomp)) 910 print "#{$_.chomp} のはてブ数は #{search_result[$_.chomp]} です "

コード例:

解説:

2行目で、APIを使用する準備 6行目で、 URL入力 8行目で、はてブ数を取得10行目で、結果出力

Page 33: 新しくプログラミング言語・・・Rubyでやってみた

課題 10

● 2つの名前を入力して、10段階の相性診断を行う

Page 34: 新しくプログラミング言語・・・Rubyでやってみた

課題 10

● 2つの名前を入力して、10段階の相性診断を行う

◎方針:

1.名前の入力2.名前の数値化3.適当に条件分岐

この問題は、アルゴリズム考察? と 文字列処理 が目的

Page 35: 新しくプログラミング言語・・・Rubyでやってみた

課題 10

● 2つの名前を入力して、10段階の相性診断を行う

1 print "名前1: " 2 name1 = STDIN.gets().chomp 3 4 arr1 = name1.unpack('U*') 5 6 sum1 = arr1.inject(0) do |sum1, i| 7 sum1 + i 8 end

コード例:

解説:

ある1つの文字列を数値化するコードである2行目で、name1に入力を行う4行目で、name1の各文字を UTF-8の文字コードに変換6行目で、各数値の合計 sum1を計算

Page 36: 新しくプログラミング言語・・・Rubyでやってみた

課題 10

● 2つの名前を入力して、10段階の相性診断を行う

1 match_table = [[1,2,3,4],[0,5,6,7,],[0,0,8,9],[0,0,0,10]] 2 arr = [sum1%4, sum2%4] 3 4 result = match_table[arr.min][arr.max] 5 result = 10 if sum1 == sum2 6 7 unless result == 0 8 puts "二人の相性は #{result} です" 9 end

コード例:

解説:

10段階に判定する必要があるため、各名前を数値化したものの4の除数を計算し、その組み合わせから相性判定を行う

0-0,0-1,0-2,0-3,1-1,1-2,1-3,2-2,2-3,3-3の 10パターン

Page 37: 新しくプログラミング言語・・・Rubyでやってみた

おわり

長々と失礼しました

最後に、ちょっと宣伝を・・・

Page 38: 新しくプログラミング言語・・・Rubyでやってみた

宣伝

Kadai.rbKadai.rb ハッカソン やります。

たぶん、 1,2 月あたりに・・・

色々と決まったら、 ATND 立てます。ぜひ、参加してください。

GoogleSite のページ↓

https://sites.google.com/site/kagawarb/kadai-rb/hackathon02