Оглавление > Наибольшее произведение-палиндром (F#)
06.02.2023

Наибольшее произведение-палиндром (F#)

Число-палиндром с обеих сторон (справа налево и слева направо) читается одинаково.
Самый большой палиндром, полученный умножением двух двузначных чисел – 9009 = 91 × 99.
Найдите самый большой палиндром, полученный умножением двух трехзначных чисел.

Решение

  • Первым делом создаем функцию проверки числа на палиндром
    • преобразуем число в строку
    • далее в массив символов
    • сравним массив с развернутым в другую сторону собой же
let isPal (x: int) =
    let s = x.ToString().ToCharArray()
    s = Array.rev s
  • Далее объявляем генератор последовательностей 3-значных чисел от большего к меньшему
let s3 x = seq { x .. -1 .. 100 }
  • Теперь функцию поиска первого палиндрома
    • генерируем последовательность от значения аргумента вниз
    • умножаем каждый элемент на аргумент функции
    • пропускаем до встречи первого палиндрома
    • берем первый элемент, если таковой имеется
let folder x =
    s3 x
    |> Seq.map (( * ) x)
    |> Seq.skipWhile (not << isPal)
    |> Seq.tryHead
  • Ну и в конце соединяем все вместе
    • генерируем базовую последовательность от 999 до 100
    • применяем вышеописанную функцию
    • фильтруем отсутствующие значения (None)
    • находим максимум из оставшихся

let answer = s3 999 |> Seq.map folder |> Seq.choose id |> Seq.max

printfn $"the answer is {answer}" //the answer is 906609