2017-09-24 15 views
1

我想做一个游戏,它涉及到它返回的字符数量,你已经猜到了在随机生成的字的正确位置(例如,字是“板”你输入“船”,你会得到2/5,然后你进入“板”,你会得到5/5)。红宝石回报匹配字符大小

word = File.readlines("wordslist.txt").sample; 
guess = gets 
same = guess.each_char.zip(word.each_char).select{ |g,w| g == w }.size 

它适用于单词长度下的任何猜测。如果这个词是“再见”,我输入“byk”它将返回3/3,但如果我输入“by”它将返回2/3。只是想看看我是否做错了什么。

回答

1

发生这种情况的原因是File.readlinesgets不会从返回的字符串中修剪尾随的换行符。

irb(main):001:0> File.read("wordslist.txt") 
=> "hello\nbye\n" 
irb(main):002:0> File.readlines("wordslist.txt") 
=> ["hello\n", "bye\n"] 
irb(main):003:0> gets 
bye 
=> "bye\n" 

当你的字典有 “再见\ n”,你输入 “BYK \ n”,其实有3场比赛, “B”, “Y” 和 “\ n”。如果您输入“by \ n”,则换行符不匹配。如果输入字符串长度相同,换行符只会匹配,并且返回的值将比您预期的多1。

为了解决这个问题,你可以调用这两个字符串.chomp比较字符之前删除尾随空白:

word = File.readlines("wordslist.txt").sample.chomp; 
guess = gets.chomp 
same = guess.each_char.zip(word.each_char).select{ |g,w| g == w }.size 

提示:您可以使用.count代替.select.size

same = guess.each_char.zip(word.each_char).count{ |g,w| g == w } 
+0

很好,谢谢。 – Anthemius

0
def number_same_position(guess, word) 
    (0..word.size-1).count { |i| guess[i] == word[i] } 
end 

number_same_position("boat", "board") #=> 3 
number_same_position("bait", "board") #=> 1 
number_same_position("sulk", "board") #=> 0 
number_same_position("boater", "board") #=> 3 
number_same_position("", "board")  #=> 0 

你可以改为三个点((0...word.size)),但我总是使用两个点。回收string[i] #=> nili >= string.size