Ruby技術者認定試験のSilver

(クリックしてね→)


ルビー(さっきのはガーネット)
 

クラス別deleteメソッド

String
Array
Hash
File
.delete( ) 【引数】文字
【返値】元の文字列
【備考】非破壊的
【引数】値
【返値】削除した値またはnil
【引数】キー
【返値】削除したキーの値またはnil
【引数】ファイルパス
【返値】1またはエラー
【備考】.unlink
.delete_if{
| | }
【変数】item
【返値】元の配列
【備考】.reject!
【変数】key,value
【返値】元のハッシュ
【備考】.reject!
.delete_at( )
【引数】index
【返値】削除した値またはnil

 

 

経緯

 当方JSを見よう見まねでどうにか動かすレベルのWeb屋だったのですが、人生の大半だいたい引きこもっており体系的に勉強していないのもあり、知識や作業速度や出来ることに頭打ち感があり、なにか勉強して身に着けたいと思ったのが今年の冬でした。

 それから紆余曲折あり、この数か月間Ruby(プログラミング言語)を勉強しています。動機は以下の通り。

  • 住んでいる県で講座をやっていた
  • がんばRubyって言えるのでおいしいと思った


 正直それを覚えたらなにが作れるのかすらまったくわからない状態で150kmくらい引っ越してはじめましたが、どうやらクックパッドが作れるんだそうです。クックパッドは作れないと思うな・・・
 

難しかった問題

試験始まってすぐ『\n』が何だったか忘れてしまった。

九九がうっかり一個抜けちゃうレベルですが幸い途中で思い出せました。スクフェスのプロフ欄で改行したい時にも使えるあれですね。

【空白/改行文字】

\n ニューライン(改行)
\r リターン(?)
\s スペース( ←これ)
\t タブ(??)

ニューラインのnなんですね。
何の略称なのかまで覚えておけば忘れないはず・・・
 

Q1

str = "a\nb\nc"

#1  str.split
#2  str.split()
#3  str.split(/\s/)
#4  str.split(/ /)

=> ["a","b","c"]

splitは引数を取らなくても使える。
引数を取らない、または\sで『空白/改行文字』で区切った配列を出すようだ。
/ /で全部やってくれへんかと適当に答えてしまった。ご都合主義な性格が解答にも現れてしまった。
 

Q2

h1 = { 1 => "foo" , 2 => "bar" , 3 => "baz"}
h2 = { 1 => "Foo" , 2 => "bar" , 3 => "Baz"}
h1.update(h2).sort{ |a,b| a[1] <=> b[1] }

=> [[3,"Baz"],[1,"Foo"],[2,"bar"]]

sortは大文字→小文字の順番らしい。
2→3→1じゃ?と思ったけど選択肢になく、また正解以外の選択肢は全てupdateされていなかったので消去法で答えられた。
 

Q3

h1 = { 1 => "foo" , 2 => "bar" , 3 => "baz"}

#1  h1.reverse
#2  h1.invert
#3  h1.each_with_object({}){|x,(y,z)|~}
#4  h1.each_with_object({}){|(x,y),z)|~}

=> { "foo" => 1 ,  "bar" => 2 , "baz" => 3 }

(正解は複数)

ハッシュのキーと値を入れ替える問題。
reverseは文字列abcをcbaに変えるやつなので違う。
invertはまんまそれ。
each_with_objectってなんだ・・・?


 練習問題を解いていて『removeとかありそうでないメソッドが選択肢にある』パターンがたくさんあった。blockがあるんだからremoveもあるでしょと選ぶと即BANされてしまう。ひどい。
 なので『見覚えのないやつは全部間違い』の精神で今までやってきていて、これもそうなんじゃ?と思ったが、答えは複数あるとある。


 Rubyは会話型言語とのことだがいくら問題と見つめあっても全く会話ができない。({})もなんだよ。エルドラージ覚醒のエキスパンションシンボルかよ(言うほど似てない)。最終的に『正解が複数ある(あるとは言ってない)』と予想しinvertだけして退席した。異界の言葉はわからない。


 Goldのテキストにも載っていなかったがググったら出てきた。#3か#4のどっちかで動くようだ。問題にケチを付けずに、人類が生み出した人類のための言語と真摯に向き合っていけば正解できたかもしれない。問題を他人に押し付ける性格が解答にも現れてしまった。いつか{~}の部分がなんだったか解明して動かしてみたい。
 

Q4

t = Time.now
t += 60*60*24
t

=> (明日)

現在時刻に一日(秒×分×時間)を足す問題。
『+』でいいところが『+=』*1になっているが、ループではないので一回だけ行う。
 

結果

前日までは落ちる落ちる落ちる・・・がブロックワードになっていましたが、今日はむしろ落とす勢いでやりました。90点でした。合格できてよかった。Goldは黄金聖闘士にならないと解けないと思う。おわり。
 

画像:©'08,'11 サンリオ・セガトイズ/ウィーヴ・テレビ東京・ジュエルペット製作委員会

*1:「n += 1」は「n = n + 1」の意。複数回行うとnの値が1ずつ増えていく