回文数

时间:2011-03-25 20:59:42

标签: ruby

这是工作代码:

p = (10..14).map { |a|
  (a..14).map { |b|
    a * b
  }
flatten.select { |p|
  p.to_s == p.to_s.reverse
}

但我想保留有关'a'和'b'的信息,这些信息会产生'a * b':

p = (10..14).map { |a|
  (a..14).map { |b|
    [a, b, a * b, '=']
  }
}.select { |v|
  v[2].to_s == v[2].to_s.reverse
}

puts p

此代码打印不是回文编号。我猜这个原因是数字平坦。如何更改代码以获得回文数?

3 个答案:

答案 0 :(得分:7)

您只想展平一个级别,因此请改用flatten(1)

(10..14).map { |a|
  (a..14).map { |b|
    [a, b, a * b, '=']
  }
}.flatten(1).select { |v|
  v[2].to_s == v[2].to_s.reverse
}

或者,将map替换为flat_map

(10..14).flat_map { |a|
  (a..14).map { |b|
    [a, b, a * b, '=']
  }
}.select { |v|
  v[2].to_s == v[2].to_s.reverse
}

注意flatten从Ruby 1.8.7开始接受一个参数。 flat_map是Ruby 1.9.2的新功能。确保您拥有正确的版本,或require "backports/1.9.2/enumerable/flat_map"require "backports/1.8.7/array/flatten"

答案 1 :(得分:1)

是的,因为你没有在第二个版本中调用flatten,所以数组太嵌套而select不起作用,因为v是一行元素,而不是单个元素。但是,如果您只是在第一个版本中调用flatten,则生成的数组将太平。

有多种方法可以解决这个问题:

  1. 在1.9.2中,您可以将外部调用替换为'map with flat_map which works like map`,但会自动生成一个平面数组。
  2. 在1.8.7+中,您可以调用flatten(1)而不是flatten,这会使数组完全平整一层嵌套,从而产生您想要的结构。
  3. 您可以定义一个表示数字的类来代替数组,这样可以避免意外扁平内部数组的问题,从而可以更有意义地访问数字的属性。
  4. 选项3可能如下所示:

    Product = Struct.new(:factor1, :factor2) do
      def product
        factor1 * factor2
      end
    
      def to_s
        "#{factor1} * #{factor2} = #{product}"
      end
    end
    
    products = (10..14).map { |a|
      (a..14).map { |b|
        Product.new(a,b)
      }
    }.flatten.select { |prod|
      prod.product.to_s == prod.product.to_s.reverse
    }
    
    puts products
    

答案 2 :(得分:1)

palindromes = []

(10..14).each do |a|
  (a..14).each do |b|
    p = (a * b).to_s
    palindromes << [a,b] if p == p.reverse
  end
end

puts palindromes.join(',')

wesbailey@feynman:~/code_katas> ruby palindrome.rb 
11,11