Почему Ruby включает? оценить до нуля? - PullRequest
0 голосов
/ 15 сентября 2010

Итак, я полный нюби, работающий с http://www.rubykoans.com/, и я застрял на about_scoring_project.rb.Это мой удар по методу оценки.

def score(dice)
  score = 0;
  if dice.respond_to?("include?") then
    # add 1000 points if rolled 3 ones
    score += 1000 if dice.include?([1, 1, 1])

    # add 100 points times die face value if rolled 3 of a number between 2 and 6
    (2...6).each do |die|
        score += die*100 if dice.include?([die, die, die])

      # award points for each 1 or 5 not a part of a set of 3
      leftovers = dice - [1,1,1]
      leftovers -= [5,5,5]
      leftovers.each do |leftover|
        score += 100 if leftover == 1
        score += 50 if leftover == 5
      end
    end
  end
  score
end

class AboutScoringAssignment < EdgeCase::Koan
  def test_score_examples
    assert_equal 1150, score([1,1,1,5,1])
    assert_equal 0, score([2,3,4,6,2])
    assert_equal 350, score([3,4,5,3,3])
    assert_equal 250, score([1,5,1,2,4])
  end
end

При вызове партитуры с первого assert_equal я ожидаю, что dice.include? ([1,1,1]) оценит как true, но оценивается как ноль (и оценка возвращается0 вместо 1150).

Я попробовал это отдельно ...

require 'test/unit'

class EnumerableTests < Test::Unit::TestCase
  def test_include
    my_enumerable = [1,1,1,5,1]
    assert true, my_enumerable.include?([1,1,1])    
  end
end

... и тест прошел, так что я не знаю, почему у меня ноль в моемметод оценки.

Кто-нибудь видит, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010

Незначительный зазор: Array#include? всегда возвращает true или false, никогда nil.

Чтобы ответить на ваш вопрос: x.include?(y) проверяет, является ли y элементом x, не является ли это подмассивом.

[1,1,1,5,1].include?([1,1,1]) возвращает false, поскольку [1,1,1] не является элементом массива [1,1,1,5,1].[[1,1,1],[5,1]].include?([1,1,1])) вернет true.

В ruby ​​нет метода, который проверял бы, является ли массив подмассивом другого массива, но вы можете легко записать его как arr1.each_cons(arr2.size).include?(arr2) (необходимо require 'enumerator' в1.8.6).Это O(arr1.size*arr2.size).

Если вы хотите его в O(arr1.size + arr2.size), вы можете реализовать алгоритм Кнута-Морриса-Пратта (который предназначен для поиска подстрок, но работает одинаково хорошодля поиска подмассивов, поскольку они, по сути, одно и то же).

0 голосов
/ 16 сентября 2010

Я думаю, вы неправильно понимаете, что делает Array#include?.Он ищет свой аргумент как элемент массива, а не как подпоследовательность.Ваш test_include всегда будет проходить, потому что вы даете assert функцию true в качестве первого аргумента.Вам следует либо использовать assert_equal с этими аргументами, либо (предпочтительно) просто избавиться от первого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...