2016-10-29 8 views
3

私は2つの配列を1つの文字内で文字を推測することに基づいてフィルタリングする方法を見つけようとしています。私は2つの文字列をルビーで1つにフィルタリングする最良の方法

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

p hidden_array 

を持っていた場合でも、私は[ " - "、 " - "、 "B"、 " - "、 " - "、 "B"]、コンソールに印刷したい場合は、 "B" でした推測される。時間が経つにつれて変化するこのアレイを作成するには、初心者の方がいいでしょうか?多分それはハッシュかもしれませんか?ありがとう!

+0

u、s、o、iを削除する条件とは何ですか? – Gopal

+0

「busboi」は一体何ですか?それは本当の言葉であるはずですか? –

+0

私は 'busboi'が単なる例であると仮定しています、@TomLord! LOL –

答えて

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を使用すると、同じ長さの新しい配列が作成されます。元の配列項目のそれぞれがブロックに渡され、ブロックが新しい配列にどのようにコピーされるかが決まります。それを行うには

+0

素晴らしいです。ありがとうマックス! hangman_promptメソッドの最後にタグが付けられた.join( "")を除いて、すべて私には意味があります。私はbefore .joinを見たことがある。メソッド定義の最後には決してない。しかし、それを理解するのは簡単なはずです!必要な.joinを組み込むためのほんの短い方法のように見えます。 –

+0

ええ、それは私が推測する文法的なトリックです。その理由は、配列を 'put 'すると、ここにあなたが望むものではない改行を持つことになります。それを 'print'するか' puts'の前に結合することができます。 –

2

一つの方法:hereArray#include?を研究する

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' 

主要メソッド、Enumerator#with_index

5

すべての解決策は配列を中心にしていますが、文字列は基本的に文字配列となっています。ただ、文字列を使用します。

word = 'busboi' 
guesses = 'bs' 

word.tr('^'+guesses, '-') 
# => "b-sb--" 

String#tr方法は、あなたがROT13、シンプルサイファーと、このようなのようなものを行うことができますので、第二引数でのマッピングの最初の引数内のすべての文字を変換し、またはこのような場合には否定機能を使用します^を使用して最初のセットを反転し、一致しないすべての文字を置き換えます。

+0

私は好きです。 'word.gsub(/ [^#{guesses}] + /、 ' - ')'は変種です。 –

+0

@CarySwovelandうん、それも動作しますが、 'tr'はこの仕事には完璧です。 – tadman

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 

レッツ・許可証1以上の推測を。

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

guessed?(hidden_word) 
    #=> true 

注意

Iは、各マッチのために実行されるブロックと方法String#scanを使用しました。ブロック内でMatchDataオブジェクトは、クラスメソッドRegexp::last_matchで取得されます。 (あるいは、グローバル変数$~Regexp.last_matchに置き換えることもできます。詳細については、「特別なグローバル変数」をRegexpで検索してください。)メソッドMatchData.beginは、strの文字のインデックスを取得するために使用され、これはちょうど推測された文字に置き換えられます。

関連する問題