Skip to content

Instantly share code, notes, and snippets.

@youngnh
Created September 10, 2010 14:53
Show Gist options
  • Select an option

  • Save youngnh/573769 to your computer and use it in GitHub Desktop.

Select an option

Save youngnh/573769 to your computer and use it in GitHub Desktop.

Revisions

  1. youngnh revised this gist Sep 10, 2010. 1 changed file with 9 additions and 4 deletions.
    13 changes: 9 additions & 4 deletions about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -29,17 +29,22 @@
    #
    # Your goal is to write the score method.

    def grouping(xs)
    unless xs.empty?
    def grouping(xs, &block)
    unless xs.empty?
    ys = xs.take_while {|x| x == xs.first}
    [ys] + grouping(xs.drop(ys.count))
    rest = xs.drop(ys.count)

    ys = yield ys if block_given?
    block = lambda {|x| x} unless block_given?

    [ys] + grouping(rest, &block)
    else
    xs
    end
    end

    def score(dice)
    scores = grouping(dice.sort).collect do |rolled|
    scores = grouping(dice.sort) do |rolled|
    score_roll rolled.first, rolled.count
    end

  2. youngnh revised this gist Sep 10, 2010. 1 changed file with 16 additions and 2 deletions.
    18 changes: 16 additions & 2 deletions about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -39,13 +39,23 @@ def grouping(xs)
    end

    def score(dice)
    scores = dice.sort.collect do |die|
    {1 => 100, 5 => 50}.fetch die, 0
    scores = grouping(dice.sort).collect do |rolled|
    score_roll rolled.first, rolled.count
    end

    scores.reduce 0, :+
    end

    def score_roll(die, count)
    if count >= 3
    points = die == 1 ? 1000 : (die * 100)
    points + score_roll(die, count - 3)
    else
    points = {1 => 100, 5 => 50}.fetch(die, 0)
    points * count
    end
    end

    class AboutScoringAssignment < EdgeCase::Koan
    def test_score_of_an_empty_list_is_zero
    assert_equal 0, score([])
    @@ -71,6 +81,10 @@ def test_grouping_empty_array_returns_empty_array
    assert_equal [], grouping([])
    end

    def test_grouping_single_element_array_returns_nested_array
    assert_equal [[5]], grouping([5])
    end

    def test_grouping_of_array_returns_subarrays
    assert_equal [[1,1], [5,5]], grouping([1,1,5,5])
    end
  3. youngnh revised this gist Sep 10, 2010. 1 changed file with 18 additions and 1 deletion.
    19 changes: 18 additions & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -29,8 +29,17 @@
    #
    # Your goal is to write the score method.

    def grouping(xs)
    unless xs.empty?
    ys = xs.take_while {|x| x == xs.first}
    [ys] + grouping(xs.drop(ys.count))
    else
    xs
    end
    end

    def score(dice)
    scores = dice.collect do |die|
    scores = dice.sort.collect do |die|
    {1 => 100, 5 => 50}.fetch die, 0
    end

    @@ -58,6 +67,14 @@ def test_score_of_single_2s_3s_4s_and_6s_are_zero
    assert_equal 0, score([2,3,4,6])
    end

    def test_grouping_empty_array_returns_empty_array
    assert_equal [], grouping([])
    end

    def test_grouping_of_array_returns_subarrays
    assert_equal [[1,1], [5,5]], grouping([1,1,5,5])
    end

    def test_score_of_a_triple_1_is_1000
    assert_equal 1000, score([1,1,1])
    end
  4. youngnh revised this gist Sep 10, 2010. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -31,7 +31,7 @@

    def score(dice)
    scores = dice.collect do |die|
    die == 1 ? 100 : (die == 5 ? 50 : 0)
    {1 => 100, 5 => 50}.fetch die, 0
    end

    scores.reduce 0, :+
  5. youngnh revised this gist Sep 10, 2010. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -31,7 +31,7 @@

    def score(dice)
    scores = dice.collect do |die|
    die == 1 ? 100 : 50
    die == 1 ? 100 : (die == 5 ? 50 : 0)
    end

    scores.reduce 0, :+
  6. youngnh revised this gist Sep 10, 2010. 1 changed file with 5 additions and 1 deletion.
    6 changes: 5 additions & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -30,7 +30,11 @@
    # Your goal is to write the score method.

    def score(dice)
    dice.size == 0 ? 0 : 50
    scores = dice.collect do |die|
    die == 1 ? 100 : 50
    end

    scores.reduce 0, :+
    end

    class AboutScoringAssignment < EdgeCase::Koan
  7. youngnh revised this gist Sep 10, 2010. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -30,7 +30,7 @@
    # Your goal is to write the score method.

    def score(dice)
    0
    dice.size == 0 ? 0 : 50
    end

    class AboutScoringAssignment < EdgeCase::Koan
  8. youngnh revised this gist Sep 10, 2010. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -30,7 +30,7 @@
    # Your goal is to write the score method.

    def score(dice)
    # You need to write this method
    0
    end

    class AboutScoringAssignment < EdgeCase::Koan
  9. youngnh created this gist Sep 10, 2010.
    74 changes: 74 additions & 0 deletions about_scoring_project.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    require File.expand_path(File.dirname(__FILE__) + '/edgecase')

    # 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,1,5,1]) => 1150 points
    # score([2,3,4,6,2]) => 0 points
    # score([3,4,5,3,3]) => 350 points
    # score([1,5,1,2,4]) => 250 points
    #
    # More scoring examples are given in the tests below:
    #
    # Your goal is to write the score method.

    def score(dice)
    # You need to write this method
    end

    class AboutScoringAssignment < 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,5,5,1])
    end

    def test_score_of_single_2s_3s_4s_and_6s_are_zero
    assert_equal 0, score([2,3,4,6])
    end

    def test_score_of_a_triple_1_is_1000
    assert_equal 1000, score([1,1,1])
    end

    def test_score_of_other_triples_is_100x
    assert_equal 200, score([2,2,2])
    assert_equal 300, score([3,3,3])
    assert_equal 400, score([4,4,4])
    assert_equal 500, score([5,5,5])
    assert_equal 600, score([6,6,6])
    end

    def test_score_of_mixed_is_sum
    assert_equal 250, score([2,5,2,2,3])
    assert_equal 550, score([5,5,5,5])
    end

    end