【问题标题】:Is this a bug on RubyMonk or something flaw in my logic thinking?这是 RubyMonk 上的错误还是我的逻辑思维中的缺陷?
【发布时间】:2016-01-28 06:19:07
【问题描述】:

我正在通过 Rubymonk.com 学习 Ruby

以下是项目描述:

招聘程序员 - Ruby 中的布尔表达式

假设您正在为您的新创业公司招募团队成员!给定一个候选人,您需要一个表达式来告诉您他们是否适合某些类型。这是候选对象的外观:

candidate.years_of_experience = 4
candidate.github_points = 293
candidate.languages_worked_with = ['C', 'Ruby', 'Python', 'Clojure']
candidate.applied_recently? = false
candidate.age = 26

我们正在招聘经验丰富的 Ruby 程序员。我们理想的候选人有 2 年或以上的经验,但有些程序员甚至在此之前就变得非常优秀。我们会考虑他们的 Github 积分(一个优秀程序员的一个很好的指标),即使他们没有经验,拥有 500 Github 积分或更多的候选人也可以申请。还有一个问题:Ruby 是一门很酷且很棒的语言,很多聪明的年轻人都非常擅长它。我们爱那些孩子,但对于这项特殊的工作,我们宁愿让他们在学校学习而不是工作。让我们过滤掉 15 岁以下的候选人。另外,我们不想考虑最近申请此职位空缺的候选人。

根据以上描述,我得出以下结论一定是真的:

  1. candidate.languages_worked_with.include?('Ruby')
  2. candidate.years_of_exprience >= 2 ||候选人.github_points >= 500
  3. candidate.age > 15
  4. candidate.applied_recently? == 错误

我的答案是:

is_an_experienced_programmer = (candidate.years_of_exprience >= 2 
|| candidate.github_points >= 500) && candidate.languages_worked_with.include? 'Ruby' 
&& (candidate.age > 15) && !(candidate.applied_recently?)

然后答案是:

is_an_experienced_ruby_programmer =  (candidate.years_of_experience >= 2 
|| candidate.github_points >= 500) && (candidate.languages_worked_with.include? 'Ruby') 
&& ! (candidate.age < 15 || candidate.applied_recently?)

我的答案和答案的唯一区别是:

 (candidate.age > 15) && !(candidate.applied_recently?)

上面说候选人必须年满 15 岁并且最近没有申请。

以及答案:

! (candidate.age < 15 || candidate.applied_recently?)

上面的代码基本上是说,候选人不能低于15岁并且最近没有申请。

它们不一样吗?还是我的逻辑有缺陷?

【问题讨论】:

  • 几乎一样; 15 既不在15 之下,也不在15 之上。将 &gt; 更改为 &gt;= 使它们等效。见De Morgan's Laws
  • 谢谢,Renzo,你的意思是 '(candidate.age >= 15) && !(candidate.applied_recently?)' 相当于'! (candidate.age
  • 有趣的是,当我编写这样的代码时,我通过了测试:'is_an_experienced_ruby_programmer = (candidate.years_of_experience >= 2 || Candidate.github_points >= 500) && (candidate.languages_worked_with.include ? 'Ruby') && !candidate.applied_recently? && (candidate.age > 15)'

标签: logic


【解决方案1】:

几乎相同,您唯一缺少的是 >=

(candidate.age >= 15) && !(candidate_applied_recently?)

这就是为什么你可能会得到错误的答案。

希望对你有帮助。

【讨论】:

  • 谢谢。我试过了,但它得到的结果与我的代码相同。如果逻辑方式没有区别,我怀疑这是 RubyMonk 检查代码的错误。
  • RubyMonk 可能正在检查代码而不是测试输出。
【解决方案2】:

我的结论是,RubyMonk 上的项目的测试逻辑有问题: 当我使用下面的代码时,我通过了测试:

is_an_experienced_ruby_programmer =  (candidate.years_of_experience >= 2 || candidate.github_points >= 500) && (candidate.languages_worked_with.include? 'Ruby') && !candidate.applied_recently? && (candidate.age > 15)

当我在下面使用时,我没有通过测试:

is_an_experienced_programmer = (candidate.years_of_exprience >= 2 || candidate.github_points >= 500) && (candidate.languages_worked_with.include? 'Ruby') && (candidate.age > 15) && !(candidate.applied_recently?)

所以

!(candidate.applied_recently?) && (candidate.age > 15)

不同于

(candidate.age > 15) && !(candidate.applied_recently?)

在 Rubymonk 的心目中?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2021-06-01
    • 2017-07-16
    • 2012-08-03
    • 1970-01-01
    • 2013-05-27
    • 2015-10-19
    相关资源
    最近更新 更多