在ruby中将两个字符串过滤为1的最佳方法

时间:2016-10-29 18:20:21

标签: arrays ruby loops filter hidden-field

我试图想出一种方法来将两个数组过滤成一个基于猜测它们中的字母..所以基本上是刽子手。但如果我有

word_array = ["b", "u", "s", "b", "o", "i"]
hidden_array = Array.new(word_array.length, "-")

p hidden_array

如果“b”被猜到,我想打印到控制台[“b”,“ - ”,“ - ”,“b”,“ - ”,“ - ”]。什么是一个很好的初学者方式来创建这个将随时间变化的数组?它应该是哈希吗?谢谢!

4 个答案:

答案 0 :(得分:6)

到目前为止,所有解决方案都围绕着数组,但不要忘记字符串基本上是一个字符数组。只需使用字符串:

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                try {
                    a[i][j] = scanner.nextInt();
                } catch (java.util.NoSuchElementException e) {
                    // e.printStackTrace();
                }
            }
        }        

String#tr方法将第一个参数中的所有字母转换为第二个参数中的映射,因此您可以执行ROT13,简单加密等操作,或者在这种情况下使用否定功能{{1} }反转第一组并替换所有不匹配的字符。

答案 1 :(得分:3)

您可以跟踪数组中找到的字母,并制作一种方法来进行打印

word_array = ["b", "u", "s", "b", "o", "i"]
found_letters = []
def hangman_prompt(found_letters)
  word_array.map do |char|
    found_letters.include?(char) ? char : "-"
  end.join(" ")
end

然后你可以在输入循环中使用它,如下所示:

loop do
  puts hangman_prompt(found_letters)
  puts "what is your guess?"
  input = gets.chomp
  if word_array.include? input
    found_letters << input
  end
end

我在这里使用Array#map创建了一个相同长度的新数组。每个原始数组项都传递给块,这决定了如何将它们复制到新数组中。

答案 2 :(得分:2)

一种方法:

word_array = ["b", "u", "s", "b", "o", "i"]
word_array_i = word_array.map.with_index { |e,i| [e,i] }                                                
#=> [["b", 0], ["u", 1], ["s", 2], ["b", 3], ["o", 4], ["i", 5]] 
p hidden_array = Array.new(word_array.length, "_")

until hidden_array == word_array
  puts 'make a guess'
  guess = gets.chomp
  if word_array.include? guess
    puts 'correct guess'
    ar = word_array_i.select { |arr| arr.first == guess }
                     .flatten.select { |e| e.class == Fixnum }
    ar.each { |e| hidden_array[e] = guess }
  else
    puts 'incorrect guess'
  end
  p hidden_array
  puts
end
puts 'game complete'

研究here Array#include?Enumerator#with_index的主要方法。

答案 3 :(得分:2)

我不会使用数组,只是字符串。

<强>代码

def replace_underscores(word, hidden_word, guess)
  word.scan(Regexp.new(guess)) { hidden_word[Regexp.last_match.begin(0)] = guess }
  hidden_word
end

示例

word = "busboi" 
hidden_word = "_" * word.length
  #=> "______"

replace_underscores(word, hidden_word, "a") # guess "a"
  #=> "______"
replace_underscores(word, hidden_word, "b") # guess "b"
  #=> "b__b__"                                            
replace_underscores(word, hidden_word, "r") # guess "r"
  #=> "b__b__" 
replace_underscores(word, hidden_word, "o") # guess "o"
  #=> "b__bo_" 
replace_underscores(word, hidden_word, "u") # guess "u"
  #=> "bu_bo_" 
replace_underscores(word, hidden_word, "s") # guess "s"
  #=> "busbo_" 

检查是否已猜到hidden_​​word:

def guessed?(hidden_word)
  hidden_word.count('_').zero?
end

guessed?(hidden_word)   
  #=> false

让我们再猜一次。

replace_underscores(word, hidden_word, "i") # guess "i"
  #=> "busboi" 

guessed?(hidden_word)   
  #=> true

备注

我已经使用方法String#scan和每个匹配执行的块。在块中,使用类方法MatchData检索Regexp::last_match对象。 (或者,可以用全局变量$~替换Regexp.last_match。有关详细信息,请在Regexp搜索“特殊全局变量”。)方法MatchData.begin用于获取str中字符的索引,将被猜到的字母替换。