9

私はソフトウェア開発の入門クラスにいます。宿題は、2つの引数(岩、紙)などを取り、勝った引数を返すじゃんけんプログラムを作成することです。

条件文を使用できれば、この問題をすばやく処理できますが、割り当てでは、知っておく必要のあることはすべてルビー教科書の最初の3つの章にあり、これらの章には条件文は含まれていません。それらなしでこのプログラムを作成することは可能でしょうか?それとも、彼は私たちが機知に富み、条件文を使用することを期待しているだけですか?条件文を使った非常に簡単な割り当てですが...ここで何かが足りないのではないかと思っています。

編集:私はそのchmod数値システムについて考えており、その加法システムによって解決策が可能になるかもしれないと思います...

4

8 に答える 8

11

ハッシュのみを使用するものは次のとおりです。

RULES = {
  :rock     => {:rock => :draw, :paper => :paper, :scissors => :rock},
  :paper    => {:rock => :paper, :paper => :draw, :scissors => :scissors},
  :scissors => {:rock => :rock, :paper => :scissors, :scissors => :draw}
}

def play(p1, p2)
  RULES[p1][p2]
end

puts play(:rock, :paper)        # :paper
puts play(:scissors, :rock)     # :rock
puts play(:scissors, :scissors) # :draw
于 2012-09-14T07:59:50.117 に答える
8
def winner(p1, p2)
  wins = {rock: :scissors, scissors: :paper, paper: :rock}
  {true => p1, false => p2}[wins[p1] == p2]
end

勝者(:rock、:rock)#=>:rock d'oh!–トークランド

@sarnoldによると、これは学生の演習として残しておきます:)。

于 2012-06-06T23:14:00.817 に答える
3

配列/セットの交差点を見たことがあるかどうかは非常に疑わしいので、楽しみのために:

def who_wins(p1, p2)
  win_moves = {"rock" => "paper", "paper" => "scissors", "scissors" => "rock"}
  ([p1, p2] & win_moves.values_at(p1, p2)).first
end

who_wins("rock", "paper") # "paper"
who_wins("scissors", "rock") # "rock"
who_wins("scissors", "scissors") # nil
于 2012-06-06T23:18:06.203 に答える
2

救助のための簡単なハッシュ:

def tell_me(a1, a2)
  input = [a1 , a2].sort.join('_').to_sym
  rules = { :paper_rock => "paper", :rock_scissor => "rock", :paper_scissor => "scissor"}
  rules[input]
end
于 2012-06-06T23:12:06.607 に答える
1

最も単純な解決策は次のようなものでなければならないと思います。

@results = {
  'rock/paper' => 'paper',
  'rock/scissors' => 'rock',
  'paper/scissors' => 'scissors',
  'paper/rock' => 'paper',
  'scissors/paper' => 'scissors',
  'scissors/rock' => 'rock'
}

def winner p1, p2
  @results["#{p1}/#{p2}"]
end
于 2012-06-07T00:42:43.953 に答える
1
WINNAHS = [[:rock, :scissors], [:scissors, :paper], [:paper, :rock]]

def winner(p1, p2)
  (WINNAHS.include?([p1,p2]) && p1) || (WINNAHS.include?([p2,p1]) && p2) || :tie
end

winner(:rock, :paper)        #=> :paper 
winner(:scissors, :paper)    #=> :scissors 
winner(:scissors, :scissors) #=> :tie 
于 2015-08-21T02:40:43.447 に答える
0

ルビーについてはよくわかりませんが、それぞれの値を使用して、このような問題をずっと前に解決しました(たとえば、R = 1、P = 2、S = 3)。

実際、私はそれについて考えた後、グーグルで検索しました。誰かが配列を使用してPythonの問題を解決しました。

于 2012-06-06T23:10:38.630 に答える
0

上記のpguardiarioのソリューションは、以下のように変更して、(1)どのプレイヤーが勝ったか(勝ったオブジェクトの選択ではなく)と(2)引き分けがある場合の結果の両方を表示できます。

def rps(p1, p2)
   @results = {
   'rock/paper' => "Player 2 won!",
   'rock/scissors' => "Player 1 won!",
   'paper/scissors' => "Player 2 won!",
   'paper/rock' => "Player 1 won!",
   'scissors/paper' => "Player 1 won!",
   'scissors/rock' => "Player 2 won!",
   'rock/rock' => "Draw!",
   'scissors/scissors' => "Draw!",
   'paper/paper' => "Draw!"
   }

   @results["#{p1}/#{p2}"]
end

rps("rock", "rock")     => "Draw!"
rps("rock", "scissors") => "Player 1 won!"
rps("rock", "paper")    => "Player 2 won!"

...等

于 2016-05-16T14:57:14.383 に答える