【发布时间】:2020-08-06 17:39:33
【问题描述】:
我目前正在 Codewars 上做 5kyu“掌握你的素数:用记忆筛选”kata。挑战 为您提供前 4 个素数的缓存数组,您必须检查 n(例如 5)是否是该数组中的素数,如果是,则返回 true。如有必要(例如,如果 n = 143),您必须将素数添加到缓存数组并在达到 n 时停止,然后检查 n 是否在数组中(因此是素数)。
我的代码(如下)正在通过检查是否为素数的测试。问题是他们抛出了一些奇怪的输入:
n = ($primes.size-5).abs
n = ($primes.size-9).abs
我的代码目前只有这 2 个输入失败。当我根据当时缓存数组的位置评估它们时,它们都评估为假。我方法中的第一行尝试返回 如果 n 的值为 false,则为 true,我也尝试了其他 2 种方法,目前没有任何效果。
令人沮丧的是,在 kata 描述中没有提到这些意外测试。据我所知,输入询问“$primes 长度的绝对值是否减去 5(以及后来的 9),小于 3?”
如果我错了,请向我解释这些输入的含义以及如何改进我的代码以通过这些测试(和 kata)。
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
【问题讨论】:
-
看看那个kata的讨论,有很多类似的抱怨。看来kata写得不好。
-
确实写得不好,但人们已经完成了。
标签: ruby primes memoization boolean-expression sieve