質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1003閲覧

Rubyのソースコードについて説明をお願いします。

Candy

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/09/21 11:36

###前提・実現したいこと
前提として、私はRubyを勉強中で入門程度の知識しかありません。
質問したいことは、あるソースコードの処理内容について理解できなかったので、
処理内容についての説明をしてほしいです。
よろしくお願いします。

###該当のソースコード

Ruby

1n = 5 2 3fw = [(1..n*2).to_a] 4 5bw = [(1..n*2).to_a.reverse] 6 7depth = 1 8while true do 9 10 fw = fw.each_with_object([]) do |c, result| 11 1.upto(n){|i| result << c[i, n] + c[0, i] + c[i + n..-1]} 12 end 13 break if (fw & bw).size > 0 14 depth += 1 15 16 bw = bw.each_with_object([]) do |c, result| 17 1.upto(n){|i| result << c[n, i] + c[0, n] + c[i + n..-1]} 18 end 19 break if (fw & bw).size > 0 20 depth += 1 21end 22 23puts depth

###説明してほしいところ
|i| result << c[i, n] + c[0, i] + c[i + n..-1]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

提示されたコードだけから何を意図したコードかを把握するのは難しいかと思います。
確認したところ、書籍「プログラマ脳を鍛える数学パズル」に記載のコードのようです。

https://codeiq.jp/magazine/2014/04/9049/
https://books.google.co.jp/books?id=dnzCCgAAQBAJ&pg=PA179

該当の箇所は、2n枚の並びからn枚を抜き取って配列の先頭に配置する、という処理を表しています。
変数resultは配列なので、<<演算子は追記代入処理になります。
下記のように出力結果を表示すると、並び替えられた配列が追加されていることがわかります。

Ruby

1n = 5 2fw = [(1..n*2).to_a] 3fw = fw.each_with_object([]) do |c, result| 4 1.upto(n){|i| 5 result << c[i, n] + c[0, i] + c[i + n..-1] 6 p result 7 } 8end 9 10# => [[2, 3, 4, 5, 6, 1, 7, 8, 9, 10]] 11# => [[2, 3, 4, 5, 6, 1, 7, 8, 9, 10], [3, 4, 5, 6, 7, 1, 2, 8, 9, 10]] 12# => [[2, 3, 4, 5, 6, 1, 7, 8, 9, 10], [3, 4, 5, 6, 7, 1, 2, 8, 9, 10], [4, 5, 6, 7, 8, 1, 2, 3, 9, 10]] 13# => [[2, 3, 4, 5, 6, 1, 7, 8, 9, 10], [3, 4, 5, 6, 7, 1, 2, 8, 9, 10], [4, 5, 6, 7, 8, 1, 2, 3, 9, 10], [5, 6, 7, 8, 9, 1, 2, 3, 4, 10]] 14# => [[2, 3, 4, 5, 6, 1, 7, 8, 9, 10], [3, 4, 5, 6, 7, 1, 2, 8, 9, 10], [4, 5, 6, 7, 8, 1, 2, 3, 9, 10], [5, 6, 7, 8, 9, 1, 2, 3, 4, 10], [6, 7, 8, 9, 10, 1, 2, 3, 4, 5]]

投稿2017/09/21 12:44

編集2017/09/21 13:09
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Ruby

11.upto(n){|i| result << c[n, i] + c[0, n] + c[i + n..-1]}

は下記と同じです

Ruby

11.upto(n) do |i| 2 result << c[n, i] + c[0, n] + c[i + n..-1] 3end

iには1からnまでの値が入り、

Ruby

1result << c[n, i] + c[0, n] + c[i + n..-1]

がiがnになるまで実行されます(n=5なので5回実行されます)。
rsultという変数に c[n, i] + c[0, n] + c[i + n..-1]が代入されています。

Ruby

1ary = ["東京", "大阪", "名古屋", "福岡", "札幌"] 2newary = ary[1, 2]

上記の場合には新しい配列「newary」として「大阪」「名古屋」の2つの要素を持つ新しい配列が作成されます。

1回目の c[n, i] + c[0, n] + c[i + n..-1]c[5,1] + c[0, 5] + c[6..-1]
c[5,1]は配列の5番目から1つ取り出した配列、c[0, 5]は0番目から5つ取り出した配列、c[6..-1]は6番目から最後までを取り出した配列(-1は配列の最後を指す)を連結させたものとなります

つまり

bw = [(1..n*2).to_a.reverse]

の場合だと1回目にresultに挿入される結果は

[5, 10, 9, 8, 7, 6, 4, 3, 2, 1]

となります。あとは繰り返し配列が追加されていきます。

投稿2017/09/21 12:28

編集2017/09/21 12:48
mtdsnsk

総合スコア789

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問