🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

1回答

896閲覧

Rubyのビンゴゲームについて

kaji120

総合スコア39

Ruby

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

0グッド

0クリップ

投稿2021/03/21 05:36

前提・実現したいこと

Rubyでビンゴゲームを作成していたらQiitaの回答でわからない箇所があったので、どなたか解説お願い致します。

該当のソースコード

card[-3..-1]="\n"

上記のコードの解説をお願い致します。
-3〜-1の範囲。つまり後ろから3番目までを改行に置き換える??ということでしょうか?
しかし、cardの後ろから3番目まではBINGOのなかのOGNの5列目最後〜最後から3番目の数字になりませんか?
それでなぜ改行できているのがわからないです。

Ruby

1 2class Bingo 3 def self.generate_card 4 5  b = (1..15).to_a.sample(5) 6 i = (16..30).to_a.sample(5) 7 n = (31..45).to_a.sample(5) 8 n[2] = "" 9 g = (46..60).to_a.sample(5) 10 o = (61..75).to_a.sample(5) 11 card = " B | I | N | G | O\n" 12 13 14 5.times do |j| 15 [b,i,n,g,o].each do |column| 16 card += column[j].to_s + " | " 17 end 18 19 card[-3..-1]="\n" # 右端の' | 'を改行に置換 20 end 21 return card 22 end 23end 24 25puts Bingo.generate_card

現在の私の認識ですが、

①ビンゴでランダムな数字を5つ作成。配列にした後、sampleメソッドの引数でユニークな数字を5つ取り出す

②BINGOの文字列(card)を用意

③処理を5回繰り返すtimesメソッドを使用してcardの文字列BINGOの下に数字を挿入していく。その際、文字列に変換して|と結合できるようにしている

④改行処理をしている。(ここがわからない)

⑤returnでクラスメソッドに返している

補足情報(FW/ツールのバージョンなど)

作成者様のリンクになります

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

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

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

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

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

guest

回答1

0

ベストアンサー

しかし、cardの後ろから3番目まではBINGOのなかのOGNの5列目最後〜最後から3番目の処
それでなぜ改行できているのがわからないです。

インデントがおかしいのでブロックの範囲を勘違いしているのでは?
単に1行ずつ末尾の余分な縦棒を消し、改行を追加しているだけです。

例)
" B | I | N | G | O\n"
" 10 | 20 | 30 | 40 | 50 | "

" B | I | N | G | O\n"
" 10 | 20 | 30 | 40 | 50\n"

投稿2021/03/21 06:53

編集2021/03/21 06:54
sigsegv

総合スコア895

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

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

kaji120

2021/03/22 02:05 編集

ご回答ありがとうございます。 [-3..-1]の指定だと B | I | N | G |O| 10| 20| 30| 40| 50| 10| 20| 30| 40| 50| 10| 20| 30| 40| 50| 10| 20| 30| 40| 50| 10| 20| 30 40 50 最後から3番目までの|を\nの改行に変換だと になりませんでしょうか?
winterboum

2021/03/21 10:27

" | " の3文字を置き換えてます。
sigsegv

2021/03/22 02:06

card が文字列なので、card[-3..-1]は文字列の末尾の3文字という意味。 最後から3番目の "|" というような意味はありません。
kaji120

2021/03/22 03:55

回答ありがとうございます 最後から、3番目ではなく 文字列の最後を改行に変えるということでしょうか? つまり10〜50までの5つの繰り返した処理の一番最後だけを\nに変えると言う認識でよろしいですか? (10-50)(10-50)(10-50)(10-50)(10-50)
sonota88

2021/04/02 14:30 編集

こんなイメージだと思います。 1行目を追加した時点 "4 | 16 | 35 | 57 | 75 | " ↓ 末尾の " | " を改行に置換 "4 | 16 | 35 | 57 | 75\n" 次の行(2行目)を追加した時点 "4 | 16 | 35 | 57 | 75\n11 | 28 | 43 | 59 | 66 | " ↓ 末尾の " | " を改行に置換 "4 | 16 | 35 | 57 | 75\n11 | 28 | 43 | 59 | 66\n" 以下、5行目まで同様 公式のリファレンスでは下記のページの一番下の `self[range] = val` の記述が該当すると思います。 > self[range] = val > rangeで指定したインデックスの範囲に含まれる部分文字列を文字列 val で置き換えます。 https://docs.ruby-lang.org/ja/latest/method/String/i/=5b=5d=3d.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問