/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.collection.euler; import io.vavr.collection.Stream; import io.vavr.collection.List; import org.junit.Test; import static java.util.Comparator.reverseOrder; import static io.vavr.collection.euler.Utils.isPrime; import static org.assertj.core.api.Assertions.assertThat; public class Euler41Test { /** * <strong>Problem 41 Pandigital prime</strong> * <p> * We shall say that an <i>n</i>-digit number is pandigital if it makes use * of all the digits 1 to <i>n</i> exactly once. For example, 2143 is a * 4-digit pandigital and is also prime. * * What is the largest <i>n</i>-digit pandigital prime that exists? * <p> * See also <a href="https://projecteuler.net/problem=41">projecteuler.net * problem 41</a>. */ @Test public void shouldSolveProblem41() { assertThat(nDigitPandigitalNumbers(4)).contains(2143); assertThat(isPrime(2143)).isTrue(); assertThat(largestNPandigitalPrime()).isEqualTo(7652413); } private static int largestNPandigitalPrime() { return Stream.rangeClosedBy(9, 1, -1) .flatMap(n -> nDigitPandigitalNumbers(n) .filter(Utils::isPrime) .sorted(reverseOrder())) .head(); } private static List<Integer> nDigitPandigitalNumbers(int n) { return List.rangeClosed(1, n) .permutations() .map(List::mkString) .map(Integer::valueOf); } }