我正在通过Ruby Koans工作,以便尝试学习Ruby,到目前为止,这么好.我已经到了这个写作时的贪婪的koan.我有一个工作的解决方案,但我觉得我已经拼凑在一起只是一堆if / then逻辑,而我不是拥抱Ruby图案.
在下面的代码中,有没有办法让我更充分地拥抱Ruby模式? (我的代码包裹在“我的代码[开始|结束]在这里”评论.
# Greed is a dice game where you roll up to five dice to accumulate # points. The following "score" function will be used calculate the # score of a single roll of the dice. # # A greed roll is scored as follows: # # * A set of three ones is 1000 points # # * A set of three numbers (other than ones) is worth 100 times the # number. (e.g. three fives is 500 points). # # * A one (that is not part of a set of three) is worth 100 points. # # * A five (that is not part of a set of three) is worth 50 points. # # * Everything else is worth 0 points. # # # Examples: # # score([1,1,5,1]) => 1150 points # score([2,3,4,6,2]) => 0 points # score([3,3]) => 350 points # score([1,2,4]) => 250 points # # More scoring examples are given in the tests below: # # Your goal is to write the score method. # MY CODE BEGINS HERE def score(dice) # set up basic vars to handle total points and count of each number total = 0 count = [0,0] # for each die,make sure we've counted how many occurrencess there are dice.each do |die| count[ die - 1 ] += 1 end # iterate over each,and handle points for singles and triples count.each_with_index do |count,index| if count == 3 total = doTriples( index + 1,total ) elsif count < 3 total = doSingles( index + 1,count,total ) elsif count > 3 total = doTriples( index + 1,total ) total = doSingles( index + 1,count % 3,total ) end end # return the new point total total end def doTriples( number,total ) if number == 1 total += 1000 else total += ( number ) * 100 end total end def doSingles( number,total ) if number == 1 total += ( 100 * count ) elsif number == 5 total += ( 50 * count ) end total end # MY CODE ENDS HERE class AboutScoringProject < EdgeCase::Koan def test_score_of_an_empty_list_is_zero assert_equal 0,score([]) end def test_score_of_a_single_roll_of_5_is_50 assert_equal 50,score([5]) end def test_score_of_a_single_roll_of_1_is_100 assert_equal 100,score([1]) end def test_score_of_multiple_1s_and_5s_is_the_sum_of_individual_scores assert_equal 300,score([1,1]) end def test_score_of_single_2s_3s_4s_and_6s_are_zero assert_equal 0,score([2,6]) end def test_score_of_a_triple_1_is_1000 assert_equal 1000,1]) end def test_score_of_other_triples_is_100x assert_equal 200,2]) assert_equal 300,score([3,3]) assert_equal 400,score([4,4]) assert_equal 500,score([5,5]) assert_equal 600,score([6,6]) end def test_score_of_mixed_is_sum assert_equal 250,3]) assert_equal 550,5]) end end
非常感谢任何可以给我的帮助,因为我试图让我的头围绕Ruby.
解决方法
好的我可能写了一些有些不同的东西,比如说:
def do_triples number,total total + (number == 1 ? 1000 : number * 100) end
如果你想做一些Ruby以外的几种语言可以做的事情,那么我认为在DIE和DRY之间的交替周二可能有以下的可能性,但是我不认为这些Ruby maxims是否真的适用于普通的子表达式消除.无论如何:
def do_triples number,total total + if number == 1 1000 else number * 100 end end def do_triples number,total if number == 1 1000 else number * 100 end + total end