Преодоление булевых входных тестов в Codewars Kata: «Совершенствуйте свои простые числа: решите с памяткой» - Ruby - PullRequest
1 голос
/ 23 апреля 2020

В настоящее время я делаю кью 5 кюй "Мастер ваших простых чисел: сито с памяткой" на Codewars. Задача дает вам кэшированный массив первых 4 простых чисел, и вы должны проверить, является ли n (например, 5) простым числом в этом массиве, и если да, вернуть true. При необходимости (например, если n = 143), вы должны добавить простые числа в массив из кэша и остановиться, когда вы доберетесь до n, а затем проверить, находится ли n в массиве (и, следовательно, простое число).

My Код (ниже) проходит тесты для проверки, является ли простое число или нет. Проблема в том, что они добавили несколько странных входных данных:

n = ($ primes.size-5) .abs <3 (тест ожидает true) </p>

n = ($ primes.size -9) .abs <3 (тест ожидает true) </p>

Мой код в настоящее время не работает только с этими 2 входами. Когда я оценил их, основываясь на том, где будет находиться кэшированный массив, они оба будут иметь значение false. Первая строка в моем методе пытается вернуть true, если значение n равно false, я пробовал это и двумя другими способами, пока ничего не работает.

К сожалению, в этих неожиданных тестах нет упоминаний в описании ката. Насколько мне известно, входные данные спрашивают: «Является ли абсолютное значение длины $ primes минус 5 (и более поздних 9) меньше 3?»

Кто-нибудь, пожалуйста, объясните мне, если я ошибаюсь, что означают эти входные данные и как я могу улучшить свой код, чтобы пройти эти тесты (и ката).

require "prime"

$primes = [2,3,5,7]

def is_prime(n)
  return true if n.class == FalseClass
  return true if n <= $primes.max && $primes.include?(n)
  ($primes.max+1..n).each do |p|
    next if !p.prime?
    $primes << p
  end
  $primes.include?(n) ? true : false
end

1 Ответ

0 голосов
/ 24 апреля 2020

Вы должны решить этот ката без использования камня prime. Если вы проведете первичный тест самостоятельно, вы поймете, почему тесты имеют смысл.

Тесты из этого Kata, по порядку:

Test.assert_equals(is_prime(1),false)
Test.assert_equals(is_prime(2),true)
Test.assert_equals(is_prime(5),true)
Test.assert_equals(is_prime(143),false)
Test.assert_equals(($primes.size-5).abs<3,true)
Test.assert_equals(is_prime(-1),false)
Test.assert_equals(is_prime(29),true)
Test.assert_equals(is_prime(53),true)
Test.assert_equals(is_prime(529),false)
Test.assert_equals(($primes.size-9).abs<3,true)

Тестирование 1, 2 и 5 может быть сделано без изменения памятки, но 143 - это первое число, где основной тест может включать добавление большего количества простых чисел к заметке. 143 = 11x13, поэтому абсолютно минимальная заметка будет включать только [2,3,5,7,11] на данный момент. Я считаю, что ката пытается убедиться, что вы не добавляете ненужные простые числа в заметку. По какой-то причине они добавили немного места для маневра, чтобы в памятке было два дополнительных простых числа, и оно все равно пройдет.

Следующие тесты немного более продвинуты. 29 прост, но опять же нам не нужно ничего добавлять к заметке, чтобы это обнаружить. По мере того, как мы go просматриваем памятку об известных простых числах, мы проверим, делится ли она на 2, 5, и ... мы на самом деле закончили. 5x5 = 25, что меньше 29, но 7x7 = 49, что на больше , чем 29. Это означает, что если бы 29 делилось на 7 или на большее простое число, оно также делилось бы на меньшее простое число, чем 7. Но мы уже проверили все простые числа, и это не делится . Следовательно, простое число 29.

Та же самая техника работает для 53, потому что у нас уже есть 11 в записке и 11x11> 53.

Последняя проверка для 529 аналогична предыдущей. 529 = 23x23, поэтому нам нужно получить до 23, что является 9-м простым числом.

...