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

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

ただいまの
回答率

90.51%

  • Ruby

    7695questions

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

Ruby の配列の扱いで困りました。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 288

krppppp

score 4

paizaさんのアルゴリズム問題を解いている最中、回答へ向けての道のりで詰まってしまったのでアドバイスを頂けましたらとおもいます。
尚、ここに掲載する問題は、公式サイトの練習問題として公開されている物なのでスキルチェック用の問題を流出させる目的、意図ではございません。

問題 

練習問題 長テーブルのうなぎ屋 (paizaランク B 相当)

うなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。

今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。

ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。

入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。

最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。

入力される値

入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。

回答コード

input_lines = gets.split(" ").map(&:to_i)
chairs=Array.new(input_lines[0] , false) #席数 falseデフォで座っている席をtrue
group = input_lines[1] #グループ数

group.times do
    input = gets.split(" ").map(&:to_i)
    f_chair=input[1]-1 #組み毎の先頭が座る席番 インデックスのため-1
    cnt=input[0] #人数
    if f_chair + cnt <= chairs.size then #座る席が0をまたぐか
            next if chairs[f_chair , cnt].any? #座ろうとした席が一つでも埋まっていれば退出してしまう 
            chairs[f_chair,cnt].map{|c| c = true} <--ここに問題あり
    else    
            next if chairs[0 , (f_chair+cnt)%chairs.size].each{|c|c = true} || chairs[f_chair..-1].each{|c|c = true}
            chairs[0 , (f_chair+cnt)%chairs.size].map{|c| c = true}
           chairs[f_chair..-1].map{|c| c = true}

    end
end

#答としてtrueの数を出力

説明

回答のながれとして
0をまたぐ座り方か否かでまず分岐して、そのあとそれぞれ一席でも埋まっていれば出ていてしまうようにしました。
うまく動作しないのが上述した部分で、着席番にtrueをいれたいのですがtrueになりません。(mapメソッドになってますがeachもためしました。)

実際の問題の標準入力例)
6 3
2 3
6 1 
5 2
.
.
.
chairs[f_chair,cnt].map{|c| print c = true}
print chairs

>
true 
true 
true 
[false, false, false, false, false, false] 

true 
[false, false, false, false, false, false] 

true 
true
[false, false, false, false, false, false] 

と、trueの代入を行った直後にデバックとして出力結果を試みながら行っていたのですがchairsの値が変化してくれません。
なぜなのかさっぱりなので原因を教えてほしいです。
またこの問題に対するアルゴリズムの考え方はどうかご意見をお聞かせください。
こんな考えもあるよ、短くかけるよ、なども大歓迎です。

駄文ですがよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こんにちは。

その問題を解くアルゴリズムの実装として正しいかはさておき、

ある配列 ary のインデクス n の位置からm 個を 値 x で上書きする。

ためには、以下のように書くとよいです。(もしかしたら他のより良い書き方があるかもしれませんが)

ary[n, m] = Array.new(m, x)

参考: Rubyリファレンス:[]= (Array)

以下は、上記の例です。

ary = Array.new(10) { |i| i }

p ary # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# インデクス 3 の位置から、4 個の要素を 999 にする。
ary[3, 4] = Array.new(4, 999)

p ary # => [0, 1, 2, 999, 999, 999, 999, 7, 8, 9]

上記にそって、ご質問にある

chairs[f_chair,cnt].map{|c| c = true} <--ここに問題あり


の部分を

chairs[f_chair,cnt] = Array.new(cnt, true)

とすれば、(実際に動かして試してはいませんが)とりあえず、

着席番にtrueをいれたいのですがtrueになりません。

という問題は解決するかと思います。

以上参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 20:51

    迅速な回答ありがとうございます。
    なるほど勉強になりました。

    参考ページを読み進めたところ、この質問に至るまでに付随してつまづいた部分までも補完することが出来ました。
    また、練習問題自体も回答することが出来ました。

    ありがとうございました。

    キャンセル

  • 2018/01/09 23:48

    解決したようで、よかったです!

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7695questions

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