/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.collection.euler; import io.vavr.API; import io.vavr.Function1; import io.vavr.collection.Iterator; import io.vavr.collection.Stream; import java.io.File; import java.io.FileNotFoundException; import java.math.BigInteger; import java.net.URL; import java.util.Scanner; import static io.vavr.API.$; import static io.vavr.API.Case; final class Utils { private Utils() { } static final Function1<Integer, BigInteger> MEMOIZED_FACTORIAL = Function1.of(Utils::factorial).memoized(); static final Function1<Long, Boolean> MEMOIZED_IS_PRIME = Function1.of(Utils::isPrime).memoized(); static Stream<BigInteger> fibonacci() { return Stream.of(BigInteger.ZERO, BigInteger.ONE).appendSelf(self -> self.zip(self.tail()).map(t -> t._1.add(t._2))); } static BigInteger factorial(int n) { return Stream.rangeClosed(1, n).map(BigInteger::valueOf).fold(BigInteger.ONE, BigInteger::multiply); } static Stream<Long> factors(long number) { return Stream.rangeClosed(1, (long) Math.sqrt(number)) .filter(d -> number % d == 0) .flatMap(d -> Stream.of(d, number / d)) .distinct(); } static Stream<Long> divisors(long l) { return factors(l).filter((d) -> d < l); } static boolean isPrime(long val) { return API.Match(val).of( API.Case($(n -> n < 2L), false), API.Case($(2L), true), API.Case($(), n -> { final double upperLimitToCheck = Math.sqrt(n); return !PrimeNumbers.primes().takeWhile(d -> d <= upperLimitToCheck).exists(d -> n % d == 0); }) ); } static Stream<String> readLines(File file) { try { return Stream.ofAll(new Iterator<String>() { final Scanner scanner = new Scanner(file); @Override public boolean hasNext() { final boolean hasNext = scanner.hasNextLine(); if (!hasNext) { scanner.close(); } return hasNext; } @Override public String next() { return scanner.nextLine(); } }); } catch (FileNotFoundException e) { return Stream.empty(); } } static File file(String fileName) { final URL resource = Utils.class.getResource(fileName); if (resource == null) { throw new RuntimeException("resource not found"); } return new File(resource.getFile()); } static String reverse(String s) { return new StringBuilder(s).reverse().toString(); } static boolean isPalindrome(String val) { return val.equals(reverse(val)); } static boolean isPalindrome(int val) { return isPalindrome(Long.toString(val)); } }