

AtCoderのABC294-Cの問題を解くためのコードを書いたのですが、入力を以下の様にすると、16回行われるはずのループが4回で止まってしまいます。

**入力:**

[code]

    3 3
    1 2 3
    4 5 6
    7 8 9
    
[/code]

**作成したコード:**

[code]

    require 'set'
    h,w=gets.chomp.split(" ").map(&:to_i)
    board=[]
    h.times do |i|
        board[i]=gets.chomp.split(" ").map(&:to_i)
    end
    sets=[]
    2**(h+w-2).times do |i|
    #    printf("%04b\n",i)
        count=0
        (h+w-2).times do |k|
            if i[k]==1
                count+=1
            end
        end
        unless count==h-1
            next
        end
        flag=true
        pos=[0,0]
        s=Set.new
        s.add(board[0][0])
        (h+w-2).times do |j|
            dir=[0,0]
            if i[j]==1
                dir=[1,0]
            else
                dir=[0,1]
            end
            pos[0]+=dir[0]
            pos[1]+=dir[1]
            d=board[pos[0]][pos[1]]
            if s.include?(d)
                flag=false
                break
            else
                s.add(d)
            end
        end
        if flag==true
            sets.push(s)
        end
    end
    puts sets.size
    
[/code]


CC BY-SA 4.0
2023-03-25T01:33:11.733
94304
2023-03-25T05:34:50.057
2023-03-25T05:34:50.057
3060
54984
question
ruby
Rubyでループが途中で止まってしまう


詳細は見ていないのですが、ぱっと見た感じ `2**(h+w-2).times do |i|` の `2**`
の意味がなさそうなのが気になったので、括弧が不足しているのが原因ではないでしょうか。

[code]

    2**1.times{p _1}   #=> 0
    (2**1).times{p _1} #=> 0 1
    
[/code]


CC BY-SA 4.0
2023-03-25T01:51:08.647
94305
2023-03-25T01:51:08.647
14277
94304
answer


最初のループの始まりを次のようにしてください。これでうまくいくはずです。

[code]

    (2**(h+w-2)).times do |i|
    
[/code]

解説

`**`は[かなり高い優先順位の演算子](https://docs.ruby-
lang.org/ja/latest/doc/spec=2foperator.html)ですが、オブジェクトのメソッド呼び出しの`.`の方が(ドキュメントには明記されていませんが)高いです。そのため、`2**(h+w-2).times
do |i| ... end`は`2**((h+w-2).times do |i| ...
end)`と解釈されます。つまり、ループは`h+w-2`しかおきず、その後(無意味に)2の累乗していることになります。


CC BY-SA 4.0
2023-03-25T01:54:21.557
94306
2023-03-25T01:54:21.557
7347
94304
answer