/* __ __ __ __ __ ___
* \ \ / / \ \ / / __/
* \ \/ / /\ \ \/ / /
* \____/__/ \__\____/__/.ɪᴏ
* ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
*/
package io.vavr.collection.euler;
import io.vavr.collection.Stream;
import org.junit.Test;
import static io.vavr.collection.euler.Utils.factors;
import static org.assertj.core.api.Assertions.assertThat;
public class Euler12Test {
/**
* <strong>Problem 12: Highly divisible triangular number</strong>
* <p>
* The sequence of triangle numbers is generated by adding the natural
* numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 =
* 28. The first ten terms would be:
* <p>
* 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
* <p>
* Let us list the factors of the first seven triangle numbers:
* <pre>
* 1: 1
* 3: 1,3
* 6: 1,2,3,6
* 10: 1,2,5,10
* 15: 1,3,5,15
* 21: 1,3,7,21
* 28: 1,2,4,7,14,28
* </pre>
* <p>
* We can see that 28 is the first triangle number to have over five
* divisors.
* <p>
* What is the value of the first triangle number to have over five hundred
* divisors?
*/
@Test
public void shouldSolveProblem12() {
assertThat(valueOfFirstTriangleNumberWithMoreDivisorsThan(5)).isEqualTo(28);
assertThat(valueOfFirstTriangleNumberWithMoreDivisorsThan(500)).isEqualTo(76_576_500);
}
private static long valueOfFirstTriangleNumberWithMoreDivisorsThan(long divisorCount) {
return triangleNumbers()
.find(t -> divisorCount(t) > divisorCount)
.get();
}
private static Stream<Long> triangleNumbers() {
return Stream.from(1L).scanLeft(0L, (a, l) -> a + l);
}
private static long divisorCount(long number) {
return factors(number).length();
}
}