Нахождение палиндромных чисел в рубине - PullRequest
2 голосов
/ 26 октября 2009

Итак, я делаю Project Euler, чтобы закрепить свои навыки в Ruby. У меня проблема № 4, которая гласит:

Палиндромное число читается так же в обе стороны. Самый большой палиндром сделан из произведения двух 2-значных цифры 9009 = 91 * 99.

Найдите самый большой палиндром из произведение двух 3-значных чисел.

Сначала я пытаюсь проверить свой код, используя информацию из первого абзаца. Я определил функцию палиндрома следующим образом:

def palindrome?(blah)
  string = blah.to_s
  string.reverse == string
end

Мой код выглядит так:

array = (90..99).to_a
array = array.map{|u| array.map{|y| u*y}}
array = array.sort
array = array.select{|u| palindrome?(u)}
puts array

Программа ничего не выводит. Если я сделаю следующее:

array = (90..99).to_a
array = array.map{|u| array.map{|y| u*y}}
array = array.sort
#array = array.select{|u| palindrome?(u)}
puts array

Я получаю длинную серию несортированных четырехзначных чисел, так что, думаю, она игнорирует сортировку. Наконец, если я просто сделаю:

#array = (90..99).to_a
#array = array.map{|u| array.map{|y| u*y}}
#array = array.sort

array = [7447, 9009, 3551, 2419]
array = array.select{|u| palindrome?(u)}
puts array

Я получаю 7447 и 9009, как и должен. Почему это происходит?

Я использую 1.8.6, потому что это единственная версия, доступная на этом компьютере с Windows.

Ответы [ 4 ]

3 голосов
/ 26 октября 2009

Эта ваша линия

array = array.map{|u| array.map{|y| u*y}}

возвращает вложенный массив, вы должны развернуть его.

Подсказки: (но я не буду рассказывать вам, как)

  1. Возможно, вам не нужна сортировка по промежуточному значению
  2. Вам необходимо удалить дубликаты

Советы:
в следующий раз запустите ваш код в интерактивном интерпретаторе, чтобы вы видели результат каждой строки кода.

2 голосов
/ 26 октября 2009

Вы можете использовать что-то вроде этого


 new_arr = array.inject([]) { |a,u| a += array.map { |y| u*y } }

вместо

  array = array.map{|u| array.map{|y| u*y}}

возвращает вложенный тип массива «[[8100, ..], [], []]». Так вот почему ваш код не работает

1 голос
/ 27 января 2014

Это выглядит более понятным: -

#Steps
    # Define a method for palindrome
    # List out all 3-digit numbers
    # Multiply each numbers by each numbers
    # List out all palindrome numbers
    # Choose the largest (max) palindrome number

    def is_a_palindrome?(n)
        n == n.to_s.reverse.to_i
    end

    def problem_four
        palindrome = [ ]
        array = 111.upto(999)
        array.each do |x|
            array.each do |y|
                multiply = x * y
                if is_a_palindrome?(multiply)
                    palindrome << multiply
                end
            end 
        end
        palindrome.max
    end

    puts problem_four

    #$ ruby problem_four.rb
        #906609
0 голосов
/ 29 января 2015

Найдите самый большой палиндром из двух трехзначных чисел.

Я сделал это решение, надеюсь, это поможет новичку

to=999
from=100
palindromes=[]
for i in from..to do
    for j in 1..to do
        k=i*j
        palindromes << k if k.to_s==k.to_s.reverse
    end
end
palindromes.max  #this will return 906609
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...