Ruby 脑筋急转弯锁打开还是关闭?红宝石色

Ruby 脑筋急转弯锁打开还是关闭?红宝石色,ruby,Ruby,试图对经典的Braintaster储物柜问题(打开/关闭100个储物柜的问题)进行编码。当我运行我编写的代码时,它并没有给出10个打开的储物柜的正确答案,而是说所有储物柜都关闭了。我想我在循环中遗漏了什么…有什么建议吗?谢谢 def lockerproblem j = 0 lockers = [] while j < 100 lockers << "open" j += 1 end

试图对经典的Braintaster储物柜问题(打开/关闭100个储物柜的问题)进行编码。当我运行我编写的代码时,它并没有给出10个打开的储物柜的正确答案,而是说所有储物柜都关闭了。我想我在循环中遗漏了什么…有什么建议吗?谢谢

 def lockerproblem
      j = 0
      lockers = []

      while j < 100
       lockers << "open"
       j += 1
      end 

       a = 1
       i = 0

       while a <= 100
       while i < 100
        if ( i + 1 ) % a == 0
          if lockers[i] == "open"
            lockers[i] = "closed"
          else
            lockers[i] = "open"
          end
        end
        i += 1
      end
      a += 1
    end

    lockers[3] = "open"

    lockers.each do |text|
      puts text
    end
  end

  lockerproblem
def锁问题
j=0
储物柜=[]
而j<100

储物柜在阵列初始化时考虑以下事项:

lockers = ["open"] * 100
想想你的
i
变量:它什么时候设置为0?这对内部循环意味着什么?例如:

a, b = 0, 0
while a < 2
  while b < 2
    puts "a=#{a}, b=#{b}"
    b += 1
  end
  a += 1
end
换句话说,你看不到:

为什么??因为
b
会增加到
2
,所以不会重置,并且内部循环只执行一次。可能您在错误的位置设置了
i
的初始值,其中“错误”表示“外部循环之外”

最后,打开第四个储物柜(
locker[3]
)将抛出结果

有许多小的调整可以使代码更容易理解(为了这个小例子的目的,我甚至可以在字符串上定义一个
open?
方法),但这应该足以让您得到预期的答案


这种猴子补丁并不总是一个好主意,尤其是在Ruby内部。但它允许一些简单且好看的东西,比如:

> lockers.find_all(&:closed?).size
=> 10

您可以通过进行三个更改来获得正确答案:

  • i
    需要在
    a的每次迭代开始时重置为0
  • 储物柜应在
    关闭时启动
  • 卸下额外的
    储物柜[3]=“打开”
    线路
更新代码:

def lockerproblem
    j = 0
    lockers = []

    while j < 100
        lockers << "closed"
        j += 1
    end

    a = 1
    i = 0

    while a <= 100
        i = 0
        while i < 100
            if ( i + 1 ) % a == 0

              if lockers[i] == "open"

                lockers[i] = "closed"
              else

                lockers[i] = "open"
              end
            end
            i += 1
        end
        a += 1
    end

    lockers.each do |text|
        puts text
    end
end

lockerproblem
def锁问题
j=0
储物柜=[]
而j<100

没有问题陈述(例如,上下文)的储物柜我不知道应该发生什么,或者为什么。例如,为什么说10个储物柜打开是“正确的”?我只看到代码会把所有东西都关闭,然后把第四个锁存器打开,这正是发生的事情。你可以认为它是一个“经典的脑筋急转弯问题”,我不知道问题是什么,或者你想要达到什么。请详细说明。我猜脑筋急转弯的问题是这个——假设你在一条走廊里,走廊里有100个封闭的储物柜。你首先打开每个储物柜。然后你每秒钟就关上一个储物柜。然后你去每三个储物柜打开它(如果它是关闭的)或关闭它(如果它是打开的)。让我们将此动作称为切换储物柜。继续在通行证编号n上每n个储物柜切换一次。在100次传球后,你只切换储物柜#100,有多少储物柜打开?是的,这就是问题所在!谢谢你的帮助,贾斯汀。这正是我所缺少的。在我看来,当有人试图解决一个脑筋急转弯时,最好是暗示,而不是为他们工作,这就是为什么我20多分钟前的回答不那么明确的原因。
> lockers.find_all(&:closed?).size
=> 10
def lockerproblem
    j = 0
    lockers = []

    while j < 100
        lockers << "closed"
        j += 1
    end

    a = 1
    i = 0

    while a <= 100
        i = 0
        while i < 100
            if ( i + 1 ) % a == 0

              if lockers[i] == "open"

                lockers[i] = "closed"
              else

                lockers[i] = "open"
              end
            end
            i += 1
        end
        a += 1
    end

    lockers.each do |text|
        puts text
    end
end

lockerproblem