sugulogの日記

あなたは読み解ける?Ruby問題集、コードを読み解こう!!No.1

スポンサードリンク

f:id:sugulog:20200928154624p:plain
こんにちは、すぐるです!

sugulogをお読みいただきありがとうございます!!

このブログは、「 過去の無知な自分に向けてわかりやすく説明するなら?? 」を基準に書いています。

少しでもお役に立てれば幸いです。

 

今回は、あなたは読み解ける?ということで

  • Ruby問題集 No.1

を記述していきます!!

その為このブログを読むことで、Rubyのコード力が上がるのはもちろん、全体的なレベルアップに繋がります。

また、新しいRubyの問題に出会うたびに追記していきます!!

是非最後までご愛読ください。

※解説で示しているのは1例のため、ご了承ください。

 

Ruby問題集 No.1

Rubyの問題に出会った順に書いてます。

制限時間のない謎解き地獄にはまりながら学習した思い出順なのでご了承ください。

1.以下のコードの時、最終的にx・y・zで表示される値を答えなさい。

f:id:sugulog:20200928143059p:plain

解説

今回のポイントは、上から1つずつしっかり処理していくことです。

順番に流れを追っていくと、始めにxとy、2.timesの中でzを0と定義する。

その後3.timesの処理を行うと、xとzは3となる。

次にxとyの自己代入演算子を処理し、xは4、yは1となる。

これで2timesのendまでの処理が終了したため、2回目の処理に入る。

z=0より、zは0となる。

その後3.timesの処理を行うと、xは7、zは3となる。

次にxとyの自己代入演算子を処理し、xは8、yは2となる。

そして最終的に表示される値は、x:8、y:2、z:3となる。

2.以下のa、b、cで表示される値を答えなさい。

f:id:sugulog:20200928150553p:plain

  解説

今回のポイントは、どのように管理されているかをしっかり把握することです。

先程のコードにわかりやすく、以下のように添字番号を記述しました。

f:id:sugulog:20200928151815p:plain

arrayの後の1つ目の[ ]は、全体の配列からどの添字番号に該当する値を取り出すかを記述しています。

そして2つ目の[ ]はaの場合だと、配列の中にある配列の添字番号を取得し、cの場合だと、ハッシュのキーを取得しています。

そのため、aでは配列0番の中の配列1番のりんご、bでは配列2番のsoccer、cでは配列2番の中のハッシュキーageの26が表示されます。

 3.以下のコードからusersの全てのnameだけを取得し、suguru、takashi、taroが出力されるようなコードを記述しなさい。

f:id:sugulog:20201021174048p:plain

解説

f:id:sugulog:20201021180410p:plain

今回のポイントは、全体の構造をしっかりと掴むことです。

usersの情報は配列の中にいくつかのハッシュで構成さており、今回はnameの値を全て表示するという条件でした。

そのためまずは配列の中のハッシュ(問題画像のピンクで表示されているハッシュ)を1つずつ取り出す作業が必要なため、eachを使い取り出します。

次にputsの記述としては、ブロック変数u(配列から取り出されたハッシュ)の中のuserハッシュの中のprofileハッシュの中のnameを指定しています。

その結果、プログラムを実行するとsuguru、takashi、taroというnameの値が出力されます。

4.下記のコードに追加で記述し最終的に、名前:suguru、出身地:京都、年齢:26と出力させるコードを書きなさい。

f:id:sugulog:20201021193416p:plain

解説

f:id:sugulog:20201021200259p:plain

initializeメソッドは、インスタンスが生成された瞬間に実行する処理を定義するメソッドです。

そのためnewメソッドでインスタンスを生成時に、引数としてsuguruなどの値を渡しています。

後は各値に対し、値を返すためのインスタンスメソッドを記述し、putsで各インスタンスメソッドを呼び出し式展開で記述しています。

その結果、プログラムを実行すると名前:suguru、出身地:京都、年齢:26という値が出力されます。

5.今日の曜日を表示し続けるコードをDateクラスを使用して記述しなさい。ただし、金曜日だった場合だけ「金曜日!!」と表示させなさい。

解説

f:id:sugulog:20201021225952p:plain

1行目でDateクラスを読み込んでいます。

3行目で今日の曜日を0(日曜)〜6(土曜)の数値で取得しています。

4行目でその数値に対する曜日を配列で記述しています。

また金曜日のみ表示の仕方を変えるため、6行目からはif文を使い記述しています。

その際、dayで取得した数値を配列のインデックスして指定することで、数値に該当する曜日を表示させています。

その結果、プログラムを実行すると今日の曜日が出力され、金曜日だけ表示を変えて出力されます。

6.timesメソッドを使い110までの数値を順番に足し合わせて、最後に全て足した結果を出力するプログラムを記述しなさい。

解説

f:id:sugulog:20201022180547p:plain

1〜10を順番に足すということは、1+2=3、3+3=6、6+4=10...と足していくということです。

まずここで1〜10の数値に対しては変数ブロックを使うことで、表すことができます。注意点として、変数ブロックのiは0スタートなので+1をしてあげることで、1〜10の数字を表すことができるということです。

後は3、6、10といった数字は、毎回計算されるごとに出される値です。

つまり、解説1文目の計算式を使うと1+2=n、n+3=n、n+4=n...と表すことができます。

以上のことよりn = i + 1 + nと表すことができます。

最後に自己代入演算子が使えるので、n += i + 1とコードを整えました。

7.名前以外にピリオド(.)や空白があるとエラーと表示され、ない場合はOKと表示される名前を入力するメソッドを作成しなさい。

解説

f:id:sugulog:20201022192553p:plain

まずは13行目で名前を入力してもらっています。

15行目ではメソッドを呼び出すと同時に、引数で入力された名前を渡しています。
そして1行目に戻り、引数を受け取っています。

2行目からはif文を使用し、include?メソッドでピリオド(.)や空白がある(含まれる)場合はエラーと表示され、ない場合はOKと表示させています。

8.以下のコードを実行したとき、出力される値を答えなさい。

f:id:sugulog:20201022212658p:plain

解説

3行目のeachで黄色の配列からピンク色の配列をそれぞれ取り出しています。

その結果、fruitには["apple", [200, 200, 300]]といった取り出した各配列が代入されています。

次に5行目のeachではfruit配列の添字1、つまり青色の配列である[200, 200, 300]を指定し取り出し、priceに代入するという処理を各配列で行っています。

後は自己代入を行い配列から取り出した数値を足しています。

これを各配列で行っています。

その結果答えとして、以下のように表示されます。

f:id:sugulog:20201022214908p:plain

 9.aとbどちらもTrueまたはFalseであればTrueと出力し、どちらかがFalseでどちらかがTrueであればFalseと出力するメソッドを論理演算子を使用し記述しなさい。

解説

f:id:sugulog:20201023002933p:plain

論理演算子ではどちらもは&&で記述することができ、Trueの場合はa&&b、Falseの場合は!a&&!bで表すことができます。

また、どちらもTureまたはどちらもFalseなので条件をそれぞれ()で囲み、間に||を記述することで条件を定義することができます。

後はif文に従って記述すれば完成です。

10.以下のコードからキーとバリューを取り出し、神奈川県の県庁所在地:横浜市とだけ表示されるコードを追加しなさい。

f:id:sugulog:20201024145729p:plain

解説

f:id:sugulog:20201024150316p:plain

まず5行目のeachで配列からハッシュを取り出しています。

そして6行目でarrayに代入されたハッシュのキーとバリューをそれぞれ取り出しています。

その際のポイントとしては、ブロック変数としてkey、valueを指定することです。

この結果、それぞれのキーとバリューを1つずつ取り出すことができます。

後は今回の場合、表示させるのはキーの神奈川県とバリューの横浜市の組み合わせだけなので、if文を使いvalue横浜市の時だけ表示させるようにしています。

後は式展開を使い表示させています。

その結果、神奈川県の県庁所在地:横浜市とだけ表示されるプログラムを記述することができました。

 

以上、今回のブログでした。

Rubyのコード力が上がり、全体的なレベルアップに繋がりましたか??

これからもどんどん知識を蓄えていきますね(≧∀≦)/

sugulog.hatenadiary.jp 

最後に!!

今後も、「 過去の無知な自分に向けてわかりやすく説明するなら?? 」を基準にブログを書いていきます。

少しでも気になった方はお試しでもいいので1度、読者登録お願いします!

またTwitterでもプログラミングに関することを中心に情報を発信してます。

宜しければそちらのフォローもお願いします。

最後までご愛読いただきありがとうございました!!