我有一個用 Ruby 撰寫的簡單程式“猜謎游戲”。它要求一個 1-100 的數字,如果您猜測的數字更高或更低,則回傳。現在我必須創建第二個程式,以最佳方式玩該游戲。讓他們相互交流的最佳方式是什么?我也可以使用 bash 腳本。
uj5u.com熱心網友回復:
在本練習中使用 bash 是一個好主意,因為您可以使用 shell 單獨測驗每個程式,然后稍后也可以使用 shell 輕松連接這兩個程式。
只需從stdin程式的輸入中讀取,然后將結果寫入stdout. 寫入以stderr記錄程式行為。
作為起點,這是一個檢查猜測數字的程式:
$ cat ./check_guess.rb
#!/usr/bin/ruby
# Ensure output is flushed when piping
STDOUT.sync = true
# Reference number, could be provided by the user or randomly generated, etc.
ref = 12
while true
# Get input
guess = gets
if guess.to_s != ""
STDERR.puts "Received guess = " guess
# Compare with ref. number
if guess.to_i > ref
STDERR.puts "Provided number is higher than " ref.to_s
puts "higher"
elsif guess.to_i < ref
STDERR.puts "Provided number is lower than " ref.to_s
puts "lower"
else
STDERR.puts "Provided number matches!"
puts "match" if ref == guess.to_i
break
end
end
end
手動測驗它:
$ ./check_guess.rb
10
Received guess = 10
Provided number is lower than 12
lower
13
Received guess = 13
Provided number is higher than 12
higher
12
Received guess = 12
Provided number matches!
match
這是一個非常粗略的猜測程式:
$ cat guess.rb
#!/usr/bin/ruby
# Ensure output is flushed when piping
STDOUT.sync = true
# Initial guess. Could be provided by the user or randomly generated, etc.
guess = 5
# Loop until we guess correctly
while true
# Provide guess by simply writing to stdout
STDERR.puts "Guessing number is " guess.to_s
# Print current guess
puts guess.to_s
# Get guess result from stdin, that is, from the other program...
# Use chomp to remove the newline
result = gets.chomp
if result == "match"
STDERR.puts "Guessed!"
break
elsif result == "higher"
guess = guess - 1
STDERR.puts "Provided number is higher, trying smaller number"
else
guess = guess 1
STDERR.puts "Provided number is smaller, trying higher number"
end
end
這也可以手動測驗:
$ ./guess.rb
Guessing number is 5
5
higher
Provided number is higher, trying smaller number
Guessing number is 4
4
match
Guessed!
現在,讓我們創建管道來連接程式:
$ mkfifo guess_out check_guess_out
并從兩個終端運行它們。請注意,stderr訊息仍將發送到終端,下面的命令只是stdout從一個程式連接到另一個程式stdin。
$ cat check_guess_out | ./guess.rb > ./guess_out | $ cat guess_out | ./check_guess.rb > check_guess_out
Guessing number is 5 | Received guess = 5
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 6 | Received guess = 6
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 7 | Received guess = 7
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 8 | Received guess = 8
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 9 | Received guess = 9
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 10 | Received guess = 10
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 11 | Received guess = 11
Provided number is smaller, trying higher number | Provided number is lower than 12
Guessing number is 12 | Received guess = 12
Guessed! | Provided number matches!
現在是真正有趣的部分,即設計一個猜測演算法。祝你好運!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493380.html
