1

このコードがこの入力に対して間違った出力を与えるのはなぜですか?

def palindrome?(str)
   str.delete('^a-zA-Z')
   str.downcase 
   str == str.reverse
end


INPUT = "A man, a plan, a canal -- Panama"

OUTPUT = Failure/Error: palindrome?("A man, a plan, a canal -- Panama").should be_true, "Incorrect results for input: \"A man, a plan, a canal -- Panama\""
      Incorrect results for input: "A man, a plan, a canal -- Panama"
    # spec.rb:7:in `block (2 levels) in <top (required)>'
    # ./lib/rspec_runner.rb:36:in `block in run_rspec'
    # ./lib/rspec_runner.rb:32:in `run_rspec'
    # ./lib/rspec_runner.rb:23:in `run'
    # lib/graders/weighted_rspec_grader.rb:6:in `grade!'
    # ./grade:31:in `<main>'
4

2 に答える 2

4

String の delete メソッドと downcase メソッドは String 自体を変更せず、変更されたコピーを返します。レシーバーを変更する場合は、bang バリアントを使用します。

str.delete!('[^a-zA-Z]')
str.downcase!

考え直して、これをしないでください。次のような恐ろしいことが起こるからです。

string = "hello123"
palindrome?(string)
string    #=> "OLLEH"

代わりに、引数のコピーを作成し、それを変更します。

def palindrome?(arg)
  str = arg.dup
  str.delete!('[^a-zA-Z]')
  str.downcase!
  str == str.reverse
end
于 2012-10-14T02:25:09.580 に答える
0

文字列の回文の総数を見つける方法

class String 
  def palindrome?
    self == self.strip.reverse
  end
  def sub_str_arr
    (0..self.length).inject([]){|ai,i|
      (1..self.length - i).inject(ai){|aj,j|
        aj << self[i,j]
      }
    }
  end
  def num_palindromes
    return -1 if self.length > 100000000
    self.sub_str_arr.reject!{|item| item if item.length < 2 || !item.palindrome?}.size
  end
end

puts "dabadbadbadbdbadbadbdabdbadbadbadbadbadadadbdbdbdbadbdabadbadbdbadbabdabdbbdabdabdbadba".num_palindromes
于 2013-05-02T00:48:14.857 に答える