each_with_indexを使って任意の数字を特定する
「each_with_index」とはRubyで使えるメソッドです。繰り返し処理と同時にその要素が何番目に処理されたのかが分かるようになります。
では任意の数字が何番目に格納されているかを確認できるプログラムを作っていきます。インデントは整っていないのでそこはご了承ください。下記の配列を用います。
以下の流れで説明していきます。
- each_with_indexを使う
- 任意の値を指定できるようにする
- 引数を使って条件分岐
- 特定の情報だけ表示されるようにする
1. each_with_indexを使う
ではまずeach_with_indexを使ってみたいと思います。
上記のコードを実行すると結果は下記のようになります。
ここから特定の値だけを取り出す処理を考えていきたいと思います。またブロック変数は0から始まるため、iに+1を加える必要がありそうです。
2. 任意の値を指定できるようにする
任意の値を決めてその値が何番目にあるかを確認できるようにクラスを用意しました。これを今度は「15は5番目にあります」だけ表示されるようにしていきます。
3. 引数を使って条件分岐
実引数「15」を受け取った仮引数「num_target」が、「num」と同じ値だった時に何番目にあるかが表示されるように下記のようにコードを書き直しました。また配列に含まれていない値だった場合の処理も書いてみました。
すると実行結果は以下のようになりました。
4. 特定の情報だけ表示されるようにする
「15は5番目にあります」だけを表示させたいためreturnを使ってみました。
そうすると実行結果は以下のようになりました。
現状のコードだと4番目までの値も確認されているようです。そこで、「その数は配列に含まれていません」というワードをeach_with_indexの外に追いやりました。
これでやっと意図した実行結果を得られるようになりました。
以上です
二重ハッシュを紐解く
二重ハッシュのデータから特定の情報だけを取り出す方法を書きたいと思います。
ここから、名前、もしくは年齢だけ取り出したい時にどうするかについて説明します。
- eachを使う
- キーを連続して指定する
- digを使う
上記の流れで説明します。
1. eachを使う
まずユーザーの情報を全部取り出すようにしたいと思います。当然ながら、下記のコードではエラーが起きてしまいます。
そこでeach文を使ってみることにします。
このような記述をした場合、下記のような出力結果になります。
2. キーを連続して指定する
これで後は名前もしくは年齢だけを出力させたいので、連続してキーを指定します。
このような記述をすることで年齢だけが出力されるようになります。
3. digを使う
別解としてdigメソッドを使うこともできます。
これで今度は名前だけが出力されるようになります。
以上です。
約数の総和を算出する
ある整数の約数の総和を算出するプログラムを作ってみました。また一定の条件下での約数の和も出せるようにしていきたいと思います。コードのインデントは整っていないのでごめんなさい。
- 約数を表示させる
- 約数を足し合わせる
- 1000以下の約数の和を出してみる
- 条件の指定を決められるようにする
以上の流れで進めていきます。
1. 約数を表示させる
まず約数を表示させるプログラムから作ってみようと思いました。とりあえず割り切れる値を出す際は「%」が使えそうですね。
gets.to_iで入力した値をnumとして、1からnumまで繰り返し割り算をし続けて割り切れた場合はその時のiの値を出力するようにしてみました。45を入力した場合は1から45まで割り算をして、割り切れた値である「1、3、5、9、15、45」だけが出力されました。
2. 約数を足し合わせる
では約数の合計を出したいと思います。割り切れた時だけ配列に値を格納していき、sumを使って配列の合計を出すやり方にしてみました。また変数名をもう少し分かりやすいようにしてみました。
これで45を入力した場合は「1、3、5、9、15、45」の合計である78が出力されるようになりました。
3. 1000以下の約数の和を出してみる
では今度は約数の総和とは別に、特定の条件における約数の和も出せるようにしたいと思います。それでは、まず具体的な数字を使って試してみます。1000以下の約数の和も出せるプログラムを作ってみます。
可読性や変数名のネーミングセンスには問題があるかもしれませんが、これでひとまず1000以下の約数の和も出せるようになりました。iが1000以下だった場合は別の配列にもiを格納するようにして合計を出しています。
例えば12600を入力した場合、「48360」という約数の総和と、「10405」という1000以下の約数の和が算出されます。
4. 条件の指定を決められるようにする
上記のコードでは1000以下に条件が限定されてしまっているため、今度は自分で条件を指定できるようにします。またついでに約数の数も出せるようにしてみました。
これで問題なくコードを実行できました。実行結果は以下のようになります。
可読性はもっと高められそうですが、とりあえずここまでにしておきます。
4乗的ガウスを解く
1から40までの整数の4乗の和をプログラムで算出してみました。コードのインデントが整っていないのはご了承ください。
1⁴ + 2⁴ + 3⁴ + ........ + 40⁴
こんな感じの計算ですね。
- 具体的な数字で試してみる
- 40回繰り返し処理をしてみる
- 40回足した総和だけを出す
- Whileで試してみる
上記の流れで説明していきます。
1. 具体的な数字で試してみる
まずは原始的に少ない数字で解いてみます。以下のコードを実行すると「98」が出力されました。1の4乗は1、2の4乗は16、3の4乗は81なので、これを40回分記述しても解けそうです。
2. 40回繰り返し処理をしてみる
40回手作業で足し算していくのは大変なので繰り返し処理をしてみました。
これで実行結果から総和が「21781332」であることがわかります。
3. 40回足した総和だけを出す
ただし上記のコードだと40回分の足し算の結果が全て実行結果として算出されます。40回足した総和だけが実行結果に出るように書き換えてみました。
これで「21781332」だけが実行結果として算出されるようになりました。
4. Whileで試してみる
上記のコードで実装完了ですが、これが最適なコードとは言えなさそうです。勉強のため他の記述の仕方も試してみることにしました。ネットで4乗的ガウスを調べてみたところ、whileを使っている人が多そうでした。
これで同じく「21781332」だけが実行結果として算出されるようになりました。こっちの方がスッキリしているかもしれませんね。
まだまだ勉強不足ですが、これからもっと勉強して瞬時のひらめきで可読性の高いコードを書けるようにしていきたいと思います。
逆数の和を算出する
逆数の和を算出する問題を解いたので記録しておきます。ブログの仕様上インデントが整っていないのでそこはご了承ください。
1/1 = 1
1/1 + 1/2 = 1.5
1/1 + 1/2 + 1/3 = 1.8333...
このような形で1からNまでの整数の逆数の和を出していき、その逆数の和が7を超える最小の値Nを出したいと思います。
めちゃめちゃ非効率なやり方ではありますが、論理が飛躍しないように地道に複数のやり方を試してみました。
以下の流れで話を進めていきます。
- 小数点を含める
- とりあえずN=20で試してみた
- 強引に答えを出してみた
- コードを美しくする
1. 小数点を含める
まず具体的な数字で試してみると
実行結果は「1」となってしまいました。どうやら小数点がなくなってしまうみたいです。そこで「to_f」を使ってみると、実行結果は「2.08333...」となり、小数点も含まれるようになりました。
ただこんなことをしなくても「1」を「1.0」に変えるだけでも小数点が含まれるようになりました。「整数÷整数=整数」という仕様になっているようなので小数点をつけてあげると良いみたいです。
2. とりあえずN=20で試してみた
先ほどは1、2、3と自分で具体的な数字を書いて試しましたが、今度はその数字を「n」にして試してみました。|n|というブロック変数は0から始まるので(n + 1)にしています。
この実行結果はこのようになりました。
N=20で逆数の和は「3.597...」ですし、足していく逆数はどんどん小さくなるため、逆数の和が7を超える最小の値はかなり大きい数字になりそうです。勘では当てられそうにありません。
3. 強引に答えを出してみた
もちろんここから原始的に答えを導くことも可能だと言えます。とりあえず1万回繰り返し処理をしてみて、逆数の和が7を超えた時に繰り返し処理をストップさせてみました。また、何回目でストップしたかが分かるようにブロック変数の中身を「timesCount」にしてみました。ブロック変数は0から始まるため、+1をした上で回数を出力させています。
実行結果は以下のようになりました。N = 616の時に初めて逆数の和が7になるようです。答え自体は合っていると思います。
4. コードを美しくする
答えを出すことだけが目的ならば上記までのやり方でも構わないと思います。しかしとりあえず1万回繰り返してみたというのは、不適切な「仕組み化」だと言えます。
ということで10000.timesではなくwhileを使ったものを試すことにしてみました。
これでどうでしょうか。先ほどと同じく「616」という値が算出されました。合計が7を超えるまで繰り返し処理を行うようにして、配列に値を追加しながら合計を出すようにしていきました。配列を使っているのでlengthメソッドでNの値を出すようにしています。
いかがでしたでしょうか。理解力を深めるために、論理を飛躍させずに地道に答えを導いてみました。僕は勉強不足であるため、もっと適切なコードはあるはずです。こういうやり方が使えるということを教えていただけたら嬉しいです。
ネットワークの仕組み
「プロトコル」とは何だという疑問から、ネットワークの仕組みの1部をまとめてみました。あくまでもアバウトな解釈であるため、ここから説明することで間違えている内容があればご指摘いただけるとありがたいです。まずだいたいのイメージを掴むために、紹介する各用語の親子構造を僕なりに文字の大きさで示してみました。
インターネット(環境)
World Wide Web(技術)
ハイパーテキスト(文書)
ハイパーリンク(参照)
ーーーーーーーーーーーーーーーーーーーー
プロトコル(ルール)
TCP(ルールの1種)
IP(ルールの1種)
HTTP(ルールの1種)
ーーーーーーーーーーーーーーーーーーーー
IPアドレス(インターネット上の住所)
DNS(分かりやすくする技術)
URL(分かりやすくなった住所)
ドメイン(分かりやすくなった住所の1部)
ーーーーーーーーーーーーーーーーーーーー
厳密にはこんな親子構造ではありませんが、だいたいこんなイメージでいいかなと思っています。では以下の手順でそれぞれを説明してみたいと思います。
1. webとは
まずインターネットとは、世界中のコンピュータや情報機器がお互いに接続された「環境」のことです。この環境の中で使われている技術こそがWorld Wide Webという「技術」です。
略してWebという技術は、コンピュータを使って文書と文書を結びつける仕組みのことです。このHTMLで記述された文書のことを「ハイパーテキスト」と言います。そしてこのハイパーテキストの中に埋め込まれるリンクのことを「ハイパーリンク」と言います。
2. プロトコルとは
このネットワークのに接続された機器同士に定められた通信の「ルール」のことを「プロトコル」と言います。このプロトコルの種類の中にHTTP通信やTCP/IPなどがあります。
このプロトコルの種類は4つの階層構造に分けて分類できます。最も上の層である、アプリケーションごとのやりとりを規定するものの1つにHTTPがあります。そしてそれよりも下の層にあり、インターネット通信で中心的な役割を果たすのがTCPとIPです。
HTTPについては下記の記事で詳しく説明しています。
3. DNSとは
上記で示したHTTP通信によってクライアントとサーバー間で通信ができます。この際、サーバーを特定するために使われるインターネット上の住所のことを「IPアドレス」と言います。
そしてこのIPアドレスを、人間が覚えやすい文字列に変換したもののことをドメインと言います。ドメインは「○○.com」の部分を指します。
さらにドメインを含んだ「https://www.○○.com」のようなもののことを「URL」と言います。
この時にドメインをIPアドレスに変換する仕組みのことを「DNS」と言います。
またサーバーを特定する際はIPアドレスだけでなくポート番号も用いられます。マンションに例えるとIPアドレスは住所の番地までであり、ポート番号は部屋番号だと言えます。
以上です。あくまでも僕自身の頭を整理するためにまとめてみました。理解を深めてもう少しわかりやすく説明できそうになったらまた新しく記事にまとめたいと思います。
クローンしたアプリをGitで管理する方法
クローンしたアプリをGitで管理する方法を紹介します。
まず以下の手順でクローンしたアプリを使えるようにします。
ターミナル
そして下記のコマンドを実行します。
ターミナル
grep .gitのコマンドで.gitを含む文字列を検索できます。またlsに-aオプションを用いていることによって隠しディレクトリも表示されるようになっています。.gitを確認した後は-rfオプションをつけたrmコマンドでリポジトリ情報を削除します。
git initでローカルリポジトリを作成し、GitHub Desktopでクローンしたアプリを追加して、「Publish Repository」をすればリモートリポジトリに反映されます。
以上です。