【問題編】入門エンジニア技能試験(Ruby/HTML/CSS/Rails)


> プログラミング学習を初めて間もない方用に試験をつくりました。
> 学習3ヶ月で正答率70%のラインに乗っていたらOKと思います。
> 経験が長い方も何かの時にお役立てください。

**　対象範囲：学習開始1〜3ヶ月**
**　合格許容：正答率70%**

**　制限時間：120分**



## 1: Rubyアルゴリズム問題
記述：2問（共通問題1問＋選択問題2問）

- 共通問題（1問必答）
    1. 年齢管理アプリ作成

> メンバーの名前と年齢を管理できるアプリを作成します。
> 実装する機能は情報の「保存」「一覧表示」「年齢での検索」「アプリの終了」の4つです。
> 「アプリの終了」を選択するまで繰り返しメニュー画面を表示し続けるようにしてください。
> 回答には雛形を使用しても構いません。
> rubyの知識を総動員し自分が最善と考えるコードを書いてください。

```bash:メニュー画面
レビュー数：0
[0]メンバーを登録する
[1]メンバーの一覧を見る
[2]メンバーを年齢別に見る
[3]アプリを終了する
```

```bash:[0]メンバーを登録する
メンバーの名前を入力してください：
TsugumiHoge
年齢を入力してください：
26
```

```bash:[1]メンバーの一覧を見る
[1] : TsugumiHogeの情報
[2] : KoichiTanakaの情報
[3] : ShizukaSakuraの情報
[4] : GeorgeNakamuraの情報
年齢を見たいメンバーの番号を入力してください：
1
名前 : TsugumiHoge
年齢 : 26
```

```bash:[2]メンバーを年齢別に見る
メンバーの年齢の範囲を設定してください。
何歳以上のメンバーを見ますか：
18
何歳以下のメンバーを見ますか：
30 
該当するメンバーは以下のとおりです。
名前 : TsugumiHoge
年齢 : 26
----------------
名前 : GeorgeNakamura
年齢 : 24
----------------
名前 : ShizukaSakura
年齢 : 18
----------------
```

```ruby:雛形
def post_member
  puts "メンバーの名前を入力してください："
  member_name = gets
  puts "年齢を入力してください："
  member_year = gets
  # 入力された情報を保存する
end

def index_members
  # メンバーの名前の一覧を表示する
  puts "年齢を見たいメンバーの番号を入力してください："
  input = gets
  # 入力された値に対応したメンバーの名前と年齢を表示する
end

def sort_members
  puts "メンバーの年齢の範囲を設定してください。\n何歳以上のメンバーを見ますか："
  s_input = gets
  puts "何歳以下のメンバーを見ますか："
  f_input = gets

  # 入力された値に該当する年齢のメンバーだけを抽出し年齢降順に並び替える

  # 該当するデータが存在しない場合に「該当するデータは存在しません。」と出力
  # 該当するデータが存在する場合には「該当するメンバーは以下のとおりです。」と出力し一覧を表示する
end

def end_program
  puts "ご利用ありがとうございました。"
  exit
end

def exception
  puts "無効な値です。もう一度入力してください。"
end


while true do
  puts "メンター数：0" # 入力した情報の数に応じて変動させる
  puts "[0]メンバーを登録する"
  puts "[1]メンバーの一覧を見る"
  puts "[2]メンバーを年齢別に見る"
  puts "[3]アプリを終了する"
  input = gets

  if input == 0 then
    post_member
  elsif input == 1 then
    index_members
  elsif input == 2 then
    sort_members
  elsif input == 3 then
    end_program
  else
    exception
  end
end
```

- 選択問題（どちらかを選択）
    1. うるう年問題
    2. 耳の遠いおばあちゃん問題

**　■ うるう年問題**

要件定義は以下のとおりです。なお今回雛形は存在しません。
> ①範囲の先頭と末尾の年を指定できる
> ②その間にあるすべてのうるう年を一行でputsする
> ③最後にうるう年がいくつあったか教えてくれる
> ④コードの目安は20行以内

この問題内におけるうるう年の定義は以下のとおりとします。
> ①4で割り切れる
> ②100で割り切れる年は400でも割り切れなければいけない
> 例: 1900年（400で割り切れないためうるう年ではない）

```bash:うるう年問題
plz input start year
1800
plz input finish year
2015
----------------------
1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012
----------------------
there're 52 leap years.
----------------------
```

**　■ 耳の遠いおばあちゃん問題**

要件定義は以下のとおりです。なお今回雛形は存在しません。
> ①おばあちゃんには全て大文字で話しかけない限り「WHAT!?」と、聞こえないフリをする
> ②全て大文字で話しかけると聞こえた気になり「NO! I'M 56 YEAR-OLD!」と叫ぶ
> ③叫ぶ言葉の年齢の部分は50歳〜80歳の間で毎回ランダムに変わるものとする
> ④3回連続で"BYE"と入力した時のみ「BYE-BYE, SUNNY!!」と返しアプリを終了する
> ⑤コードの目安は20行以内

```bash:耳の遠いおばあちゃん問題
SAY SOMETHING:
hi
WHAT!?

SAY SOMETHING:
hello
WHAT!?

SAY SOMETHING:
i said HELLO
WHAT!?

SAY SOMETHING:
HELLO
NO! I'M 53 YEAR-OLD!

SAY SOMETHING:
HUH
NO! I'M 50 YEAR-OLD!

SAY SOMETHING:
OK
NO! I'M 59 YEAR-OLD!

SAY SOMETHING:
BYE
NO! I'M 53 YEAR-OLD!

SAY SOMETHING:
BYE
NO! I'M 54 YEAR-OLD!

SAY SOMETHING:
BYE
BYE-BYE, SUNNY!
（アプリの終了）
```

## 2: HTML/CSS問題
短答：全10問必答

> HTML/CSSに関する短答問題です。
> 10個の設問に対し具体的かつ簡潔に答えてください。
> 回答の際にはどの質問に対する答えか明確にわかるよう記述してください。

- HTML問題
    1. imgタグに付与する `alt属性` はどのような役割を持つか.
    2. `<%= link_to "一覧画面へ", "/tweets" %>` という記述を `index.html.erb` に記述した場合どのようなHTMLに変換されるか.
    3. フォームを生成するタグに指定する `type属性`・`name属性`・`placeholder属性`の役割を具体例と共に示せ.
    4. インライン要素とブロック要素とは何か.具体例と共に示せ.
    5. `<br />`のようにタグ内部にスラッシュを使用する場合の目的は何か.
    6. `HTMLで水平線は「 <hr> 」のように記述できます`という説明文をHTMLファイルにそのままコピペしても勝手に文章中に水平線が挿入されてしまうがその解決策を示せ.

- CSS問題
    1. `colorプロパティ` の値を `#000` と設定したがこれは何色か.
    2. セレクタに `a:hover` と指定したがこれはどのような指定をしているか.
    3. ヘッダーを画面上部に固定したい.どのようなプロパティと値を指定すればよいか.
    4. `li要素` にデフォルトで付与される点を消して表示したい場合どのようなプロパティと値を設定すべきか.

## 3: Rails論述問題
論述：4問（共通問題2問＋選択問題5問）

> Ruby on Railsに関係する論述問題です。
> 共通問題2問は必答です。選択問題は5個の内、2個を選択し明記した上で回答してください。
> より具体的な使用例や用語等用いて、必要十分と考える説明を論述してください。

- 共通問題（2問必答）
    1. `MVC` とは何か.具体的に説明せよ.
    2. Modelが `ActiveRecord::Base` を継承していることで何を実現しているのか.具体例を用い説明せよ.

- 選択問題（2問選択）
    1. `callback` とは何か.具体例を用いて説明せよ.
    2. `has_many throughオプション` と `polymorphic association` の違いと具体的な使用例を示せ.
    3. ルーティングにおける `resources` の7つのアクションについて全て挙げそれぞれ用途を示せ.
    4. メソッドに `method(*arg)` のようにアスタリスク付きの引数を設定するとどのようなことが実現できるか.
    5. Modelでアソシエーションに対し `orderオプション` を使用する際には `lambda` を使用する.それはなぜか.


**※　時間よりも早く所定の回答が完了した場合は可能な限り多くの問題に答えてください。**


---

テストは以上です。

解答編は[こちらのエントリー](http://qiita.com/Yama-to/items/277e0351a68797989660)で公開しています。