2012-06-06 6 views
9

Ich bin in einer einführenden Software-Entwicklung-Klasse, und meine Hausaufgaben sind erstellen Sie ein Stein Papier Schere Programm, das zwei Argumente (Rock, Papier) usw., und gibt das Argument zurück, das gewinnt.HW Unmöglichkeit ?: "Erstellen Sie ein Stein Papier Schere Programm in Ruby OHNE Bedingungen verwenden"

Jetzt würde ich schnelle Arbeit dieses Problems machen, wenn ich conditionals verwenden könnte, aber die Zuordnung sagt alles, was wir wissen müssen, in den ersten drei Kapiteln des Rubins Lehrbuch ist, und diese Kapitel beinhalten NICHT conditionals! Wäre es möglich, dieses Programm ohne sie zu erstellen? Oder erwartet er nur, dass wir einfallsreich sind und die Bedingungen benutzen? Es ist eine sehr einfache Aufgabe mit Konditionals aber ... Ich denke, dass ich hier etwas vermissen könnte.

EDIT: Ich bin dieses chmod numerisches System zu denken und denken, eine Lösung durch dieses Additivsystem möglich sein kann ...

+4

Es gibt eine berechtigte Bewegung namens [Anti-IF-Kampagne] (http://www.antiifcampaign.com/), die die Objekte verwendet, um die Bedingung selbst bereitzustellen. Es gibt einige weitere Informationen in [dieser SO-Antwort.] (Http://stackoverflow.com/a/7264192/1079354) – Makoto

+1

Eine Idee, was fällt in das _conditionals_ Camp für Sie Professor? Will 'any?' Oder 'all?' Oder 'includes?' Oder ähnliche Methoden zählen hier? Wie steht es mit dem ternären Operator "?:"? – sarnold

+0

Wir haben buchstäblich keinen einzigen bedingten Operator verwendet. Ich bin vertraut mit Java und Javascript, also kenne ich all das Zeug, aber ich möchte den Auftrag in der Zwangsjacke erledigen, wenn du willst. Houdini. –

Antwort

11

hier ein nur unter Verwendung von Hashes:

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 
0

ich über Rubin nicht viel wissen, aber ich habe ein Problem wie dieses lange gelöst durch Verwendung von Werten für jeden einzelnen (z. B. R = 1, P = 2, S = 3).

Eigentlich googelte ich nur nach dem Nachdenken darüber und jemand löste das Problem in Python using an array.

2

Eine einfache Hash zur Rettung:

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 
+1

Bei der Beantwortung von Hausaufgaben Fragen in Betracht ziehen, _sketches_ von Antworten statt voll funktionsfähig Code geben ... – sarnold

+0

@sarnold Jeder gute Lehrer wird ihm scheitern, wenn seine Antwort so knapp ist. Er schreibt es besser in seinen eigenen Worten. – Anil

+0

Mach dir keine Sorgen, Jungs, ich hatte nicht den Mut, dir das zu sagen, aber ich lese Kapitel 3 durch und fand heraus, dass es BEDINGUNGEN enthält. –

8
def winner(p1, p2) 
    wins = {rock: :scissors, scissors: :paper, paper: :rock} 
    {true => p1, false => p2}[wins[p1] == p2] 
end 

Sieger (: rock,: rock) # =>: rock d'oh! - tokland

Per @ sarnold, dies als Übung für den Studenten :).

+1

Wenn Sie Hausaufgabenfragen beantworten, sollten Sie lieber Skizzen von Antworten als voll funktionsfähigen Code schreiben ... außerdem gilt, dass '==' wahrscheinlich als Bedingung gilt. :) – sarnold

+0

Ich sehe nicht, wie ein Vergleich eine bedingte ist. Es wird häufig in Conditionals verwendet, aber das ist nicht das Gleiche. – Mori

+0

== wurde abgedeckt. Ich hätte erwähnen sollen, dass –

3

Ich bezweifle sehr, Sie Array/set Kreuzungen gesehen haben, so nur zum Spaß:

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 
1

Ich denke nur, die einfachste Lösung, so etwas wie sein muss:

@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 
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 
+0

Diese Antwort ist ein bisschen mehr verschleiert als die andere Hash-Antwort, also wechsle ich die richtige Antwort wieder auf die Antwort von @ deideckrx. Dies ist jedoch sehr cool, in seiner Kürze wie ein ternärer Operator. Werde das für eine Weile studieren –

0

pguardiario Lösung oben kann nach dem unten angegebenen modifiziert werden, um sowohl zu zeigen (1), dem Spieler gewonnen (im Gegensatz zu der Wahl des Objekts entgegengesetzt, die gewonnen) und (2) das Ergebnis, wenn es ein Unentschieden:

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!" 

. ..etc

Verwandte Themen