package fj.demo.euler; import static fj.Function.flip; import fj.data.Stream; import static fj.data.Stream.iterate; import static fj.function.Integers.multiply; import static fj.function.Integers.subtract; import static fj.Equal.charEqual; import static fj.Equal.streamEqual; import static fj.Ord.intOrd; import static fj.Show.intShow; /** * Find the largest palindrome made from the product of two 3-digit numbers. */ public class Problem4 { public static void main(final String[] a) { final Stream<Integer> tdl = iterate(flip(subtract).f(1), 999).takeWhile(intOrd.isGreaterThan(99)); intShow.println(tdl.tails().bind(tdl.zipWith(multiply)).filter(i -> { final Stream<Character> s = intShow.show(i); return streamEqual(charEqual).eq(s.reverse().take(3), s.take(3)); }).foldLeft1(intOrd::max)); } }