加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby Greed Koan – 如何改善我的汤匙?

发布时间:2020-12-16 20:23:04 所属栏目:百科 来源:网络整理
导读:我正在通过Ruby Koans工作,以便尝试学习Ruby,到目前为止,这么好.我已经到了这个写作时的贪婪的koan.我有一个工作的解决方案,但我觉得我已经拼凑在一起只是一堆if / then逻辑,而我不是拥抱Ruby图案. 在下面的代码中,有没有办法让我更充分地拥抱Ruby模式? (我
我正在通过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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读