来自红宝石的appacademy实践中最长的单词测试

时间:2017-06-08 18:21:42

标签: ruby

我正在尝试进行此测试,并且在线有很多解决方案,但我首先要弄清楚为什么我的解决方案是错误的,即使它在我输入某些字符串时似乎正确的结果:

以下是他们的要求:

  

编写一个接受字符串的方法。返回中最长的单词   串。您可以假设该字符串仅包含字母和   空格。

     

您可以使用字符串split方法来帮助您完成任务。

这是我的解决方案,我认为我可以将字符串转换为数组,从最大长度降序排序,然后只需打印新字符串中的第一个元素:

def longest_word(sentence)
  sentence = sentence.split

  sentence.sort_by! { |longest| -longest.length }

  return sentence[0]
end

这显然不起作用,因为他们的测试给了我所有的错误。测试有:

puts("\nTests for #longest_word")
puts("===============================================")
    puts(
      'longest_word("short longest") == "longest": ' +
      (longest_word('short longest') == 'longest').to_s
    )
    puts(
      'longest_word("one") == "one": ' +
      (longest_word('one') == 'one').to_s
    )
    puts(
      'longest_word("abc def abcde") == "abcde": ' +
      (longest_word('abc def abcde') == 'abcde').to_s
    )
puts("===============================================")

所以问题是为什么?我可以修改我的代码或者这个想法都是错的,我需要完全不同吗?

2 个答案:

答案 0 :(得分:1)

str = "Which word in this string is longest?"

r = /[[:alpha:]]+/
str.scan(r).max_by(&:length)
  #=> "longest"

这个正则表达式读取"匹配一个或多个字符"。外括号构成字符类,意味着括号内的一个字符必须匹配。

要处理带连字符或包含单引号的单词,以下是不完美的修改 1

str = "Who said that chicken is finger-licken' good?"

r = /[[[:alpha:]]'-]+/
str.scan(r).max_by(&:length)
  #=> "finger-licken'"

这个正则表达式读取"匹配一个或多个字母,撇号或连字符"。外括号构成字符类,意味着括号内的一个字符必须匹配。

1我已成功使用" finger-licken'"在拼字游戏中。

答案 1 :(得分:-1)

我写的是:

str = "Write a method that takes in a string"
str.split.sort_by(&:length).last # => "string"