2017-01-31 7 views
1

私は単純なコード分割ゲームを書くために自分のコードに苦労しています。 隠されたコードがあります:ユーザー入力を収集してフィードバックを与える方法

code = ["a","b","b","c"] 

は私のプログラムでは、変数に格納する、その後、ユーザーの入力を要求します。 私は、秘密のコード変数とユーザーの入力を比較して、ユーザーのフィードバックを与えたいと思います。1は良い場所に、0は間違った場所に、 " - "は間違った文字になります。

私はこのような何かを思い付いた:それは同じインデックスにある要素を比較したときに

feedback = [] 
input.each_with_index do |v,i| 
    if v == code.fetch(i) 
    feedback << "1" 
    else 
    feedback << "-" 
    end 
end 

それはOKに動作します。私はコード配列にある要素をどのように見つけることができるのか分かりませんが、同じインデックスには存在せず、ユーザーにフィードバックを与えます。例えば

code = ["a","b","b","c"] 
input = ["b","b","a","z"] 
feedback = ["0","1","0","-"] 
+0

'入力= [ "A" のために返されるべきである何1 sが0秒前に返さなければならないので、

2回のパスが使用されています、 "a"、 "a"、 "a"] '? – mudasobwa

+0

1 - 同じインデックスの同じ文字の場合は0 - 間違ったインデックスの場合は同じ文字の場合は " - "間違った文字の場合: feedback = ["1"、 " - "、 " - "] " – zensupremacy

+0

位置情報を持つ指揮官。 –

答えて

0

あなたは、その文字が別のインデックスでリストにあるかどうかを確認するためにinclude?メソッドを使用することができます。このような何か:同じ

+0

ありがとう、どういうふうに動作するか確認します 編集:チェックしても動作しません。あなたのコードで "?"コード配列に存在しない文字については " - "を与え、ユーザに誤った文字であり、コード配列には含まれていないことを伝える必要があります。 – zensupremacy

+0

'?'あなたが理解することです。あなたの質問には、予想される動作の仕様が含まれていませんでした。 – msergeant

+0

申し訳ありませんが、あなたのコードは機能しません、私はあなたが "?"しかし私はあなたの表記を "?"それを読んでいる誰かを混乱させないように。私の仕様は正しいと思う。フィードバックを与えるとき1 - 正しい文字のために+正しいインデックス、0 - 正しい文字のために間違ったインデックス、誤った文字のための " - "。私はそれがかなり自明だと思う。しかし、とにかくお試しいただきありがとうございます – zensupremacy

0

もう一つの解決策

code = ["a","b","b","c"] 
input = ["b","b","a","z"] 

feedback = input.map.with_index do |num, ind| 
    if code.include? num 
    code[ind] == num ? '1' : '0' 
    else 
    '-' 
    end 
end 

=> ['0', '1', '0', '-'] 

zipmapを使用すると、少し楽しくなります状況。 include?は、入力がこのコードは、あなたが言及した3例で動作しますcode

code = %w(a b b c) 
input = %w(b b a z) 
result = code.zip(input).map do |c, i| 
    if c == i 
    '1' 
    elsif code.include?(i) 
    '0' 
    else 
    '-' 
    end 
end 
puts result.to_s 
+0

これはうまくいきますが、入力= ["b"、 "b"、 "b"]の場合、フィードバック= [0 1 1 0] - 、1、1、 - ] – zensupremacy

0

だろう

code = ["a","b","b","c"] 
input = ["b","b","a","z"] 
feedback = [] 

input.each_with_index do |num, ind| 
    if code.include? num 
    feedback << (code[ind] == num ? '1' : '0') 
    else 
    feedback << '-' 
    end 
end 

結果:あなただけに第一バリアントを編集し、前feedbackを定義したい場合は

input.each_with_index do |v,i| 
    if v == code.fetch(i) 
    feedback << "1" 
    elsif code.include?(v) 
    # right character, wrong spot 
    feedback << "0" 
    else 
    feedback << "-" 
    end 
end 
+0

コメントの@ mudasobwaの質問を参照してください。 –

+0

は入力=%w(b b b b)に対しては機能しませんが、誤ったフィードバック= [0 1 1 0]が生成されます。 feedback = [ - 、1、1、 - ] – zensupremacy

1

であるかどうかをチェックします。

def give_feedback(input, code) 
    feedback = Array.new(input.size) { '-' } 
    code2 = code.dup 

    input.each_with_index do |letter, index| 
    if letter == code[index] 
     feedback[index] = '1' 
     code2[index] = nil 
    end 
    end 

    input.each_with_index do |letter, index| 
    next if feedback[index] == '1' 
    found = code2.index(letter) 
    if found 
     feedback[index] = '0' 
     code2[found]  = nil 
    end 
    end 
    feedback 
end 

p give_feedback(%w(b b a z), %w(a b b c)) 
# ["0", "1", "0", "-"] 
p give_feedback(%w(a a a a), %w(a b b c)) 
# ["1", "-", "-", "-"] 
p give_feedback(%w(c c b a), %w(a b b c)) 
# ["0", "-", "1", "0"] 
+1

はほとんど動作しますが、input =%w(ccba)の場合、間違ったフィードバック= [0 0 1 0]を返し、正しいものがfeedback = [0、 - 、1、0] – zensupremacy

+0

@zensupremacy申し訳ありませんが、3つ以上のバグがありました。 –

+0

が更新されました。それは今すべてのあなたの仕様のためにうまくいくはずです –

0

ただ、好奇心から:

[code, input].map { |a| (0...a.size).zip(a).to_h } 
      .reduce do |e, acc| 
    c = acc.values.dup 
    acc.merge(e) do |_, v1, v2| 
    case (c.delete_at(c.index(v2)) rescue nil) 
    when v1 then "1" 
    when nil then "-" 
    else "0" 
    end 
    end 
end.values 
+0

私の好みでは 'eval'、' forループ '、 'レスキュー例外'が少なすぎます。 –

関連する問題