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