Ruby 不会打印变量
Ruby wont print variable
我一直在尝试制作一个假的小 pin-cracking 脚本,但出了点问题,这让我很沮丧。它随机抽取 4 个数字,并将它们与其他 4 个数字进行比较,但由于某种原因,在猜到这些数字后,它不再打印它们。
#RubyCodeStart
pass1 = 4
pass2 = 9
pass3 = 2
pass4 = 8
guess = 0
flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
loop do
if flag1 == 0
crack1 = rand(0..9)
end
if flag2 == 0
crack2 = rand(0..9)
end
if flag3 == 0
crack3 = rand(0..9)
end
if flag4 == 0
crack4 = rand(0..9)
end
if crack1 == pass1
crack1 = pass1
flag1 = 1
end
if crack2 == pass2
crack2 = pass2
flag2 = 1
end
if crack3 == pass3
crack3 = pass3
flag3 = 1
end
if crack4 == pass4
crack4 = pass4
flag4 = 1
end
guess += 1
puts "#{crack1} \| #{crack2} \| #{crack3} \| #{crack4} === Guess \# #{guess}"
# if crack == pass
# break
# end
end
sleep(30)
我所做的一切都不起作用,而且它拒绝打印它,直到它被发现。如果需要我会添加数据。
输出:
8 | 0 | 6 | 1 === Guess # 1
4 | 6 | 1 | 8 === Guess # 2
| 1 | 3 | === Guess # 3
| 1 | 5 | === Guess # 4
| 3 | 9 | === Guess # 5
| 3 | 3 | === Guess # 6
| 5 | 4 | === Guess # 7
| 3 | 4 | === Guess # 8
| 4 | 3 | === Guess # 9
| 0 | 6 | === Guess # 10
| 3 | 8 | === Guess # 11
| 4 | 5 | === Guess # 12
| 2 | 4 | === Guess # 13
| 8 | 7 | === Guess # 14
| 8 | 4 | === Guess # 15
| 9 | 5 | === Guess # 16
| | 7 | === Guess # 17
| | 5 | === Guess # 18
| | 7 | === Guess # 19
| | 7 | === Guess # 20
| | 7 | === Guess # 21
| | 1 | === Guess # 22
| | 2 | === Guess # 23
| | | === Guess # 24
| | | === Guess # 25
| | | === Guess # 26
| | | === Guess # 27
| | | === Guess # 28
| | | === Guess # 29
| | | === Guess # 30
| | | === Guess # 31
| | | === Guess # 32
| | | === Guess # 33
| | | === Guess # 34
| | | === Guess # 35
| | | === Guess # 36
| | | === Guess # 37
| | | === Guess # 38
| | | === Guess # 39
| | | === Guess # 40
您需要在循环外声明 crack
变量:
# other variables
crack1 = 0
crack2 = 0
crack3 = 0
crack4 = 0
loop do
# loop code
end
为什么您的代码不起作用?
因为在每个 loop
中,所有 crack
变量都被清除了,因为它们的原始范围。在每次迭代中,每个 crack
变量都设置为 rand(0..9)
或 nil
.
所以,在
之后
if flag1 == 0
crack1 = rand(0..9)
end
crack1
将被设置为某个随机数,因此您稍后可以打印它的值,但是一旦 flag1
不是 0
,那么 crack1
将设置为 nil
.
考虑到对您的问题的评论(并添加一些其他提示),这里有一个选项可以让您的代码稍微干燥:
pass = [4, 9, 2, 8]
flag = [0, 0, 0, 0]
crack = [0, 0, 0, 0]
guess = 0
until crack == pass do
(0..3).each do |i|
crack[i] = rand(0..9) if flag[i] == 0
flag[i] = 1 if crack[i] == pass[i]
end
guess += 1
puts "#{crack.join(" | ")} === Guess \# #{guess}"
end
这将创建完全相同的输出,除了它在密码被破解后退出循环。
我一直在尝试制作一个假的小 pin-cracking 脚本,但出了点问题,这让我很沮丧。它随机抽取 4 个数字,并将它们与其他 4 个数字进行比较,但由于某种原因,在猜到这些数字后,它不再打印它们。
#RubyCodeStart
pass1 = 4
pass2 = 9
pass3 = 2
pass4 = 8
guess = 0
flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
loop do
if flag1 == 0
crack1 = rand(0..9)
end
if flag2 == 0
crack2 = rand(0..9)
end
if flag3 == 0
crack3 = rand(0..9)
end
if flag4 == 0
crack4 = rand(0..9)
end
if crack1 == pass1
crack1 = pass1
flag1 = 1
end
if crack2 == pass2
crack2 = pass2
flag2 = 1
end
if crack3 == pass3
crack3 = pass3
flag3 = 1
end
if crack4 == pass4
crack4 = pass4
flag4 = 1
end
guess += 1
puts "#{crack1} \| #{crack2} \| #{crack3} \| #{crack4} === Guess \# #{guess}"
# if crack == pass
# break
# end
end
sleep(30)
我所做的一切都不起作用,而且它拒绝打印它,直到它被发现。如果需要我会添加数据。
输出:
8 | 0 | 6 | 1 === Guess # 1
4 | 6 | 1 | 8 === Guess # 2
| 1 | 3 | === Guess # 3
| 1 | 5 | === Guess # 4
| 3 | 9 | === Guess # 5
| 3 | 3 | === Guess # 6
| 5 | 4 | === Guess # 7
| 3 | 4 | === Guess # 8
| 4 | 3 | === Guess # 9
| 0 | 6 | === Guess # 10
| 3 | 8 | === Guess # 11
| 4 | 5 | === Guess # 12
| 2 | 4 | === Guess # 13
| 8 | 7 | === Guess # 14
| 8 | 4 | === Guess # 15
| 9 | 5 | === Guess # 16
| | 7 | === Guess # 17
| | 5 | === Guess # 18
| | 7 | === Guess # 19
| | 7 | === Guess # 20
| | 7 | === Guess # 21
| | 1 | === Guess # 22
| | 2 | === Guess # 23
| | | === Guess # 24
| | | === Guess # 25
| | | === Guess # 26
| | | === Guess # 27
| | | === Guess # 28
| | | === Guess # 29
| | | === Guess # 30
| | | === Guess # 31
| | | === Guess # 32
| | | === Guess # 33
| | | === Guess # 34
| | | === Guess # 35
| | | === Guess # 36
| | | === Guess # 37
| | | === Guess # 38
| | | === Guess # 39
| | | === Guess # 40
您需要在循环外声明 crack
变量:
# other variables
crack1 = 0
crack2 = 0
crack3 = 0
crack4 = 0
loop do
# loop code
end
为什么您的代码不起作用?
因为在每个 loop
中,所有 crack
变量都被清除了,因为它们的原始范围。在每次迭代中,每个 crack
变量都设置为 rand(0..9)
或 nil
.
所以,在
之后if flag1 == 0
crack1 = rand(0..9)
end
crack1
将被设置为某个随机数,因此您稍后可以打印它的值,但是一旦 flag1
不是 0
,那么 crack1
将设置为 nil
.
考虑到对您的问题的评论(并添加一些其他提示),这里有一个选项可以让您的代码稍微干燥:
pass = [4, 9, 2, 8]
flag = [0, 0, 0, 0]
crack = [0, 0, 0, 0]
guess = 0
until crack == pass do
(0..3).each do |i|
crack[i] = rand(0..9) if flag[i] == 0
flag[i] = 1 if crack[i] == pass[i]
end
guess += 1
puts "#{crack.join(" | ")} === Guess \# #{guess}"
end
这将创建完全相同的输出,除了它在密码被破解后退出循环。