package UE14_130225_Streams1;

import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;

public class UE14_Streams1 {
    public static void main(String[] args) {
        zahlenreihen();

        printFolgeOhne3(1);
        printFolgeOhne3(5);
        printFolgeOhne3(10);
        printFolgeOhne3(20);

        for (int i = 1; i <= 6; i++) wuerfelStatistik(i);

        for (int i = 0; i <= 100; i++) alleTeiler(i);

        for (int i = 0; i <= 100; i++)
            if (istPrimzahl(i)) System.out.println(i + ": is a Prime Number");
            else System.out.println(i + ": is NOT Prime Number");

        for (int i = 0; i <= 10; i++) System.out.println(i + ": " + gaussSumme(i));

        verticalString("Hallo");
        verticalString("Hallo!!!");
        verticalString("a(&\t/'?%\n§''%Z??/§$%");

        mitStern("Hallo");
        System.out.println();
        mitStern("Hallo!!!");
        System.out.println();
        mitStern("a(&/'?%§''%Z??/§$%");
        System.out.println();

        deleteBlanks("Hallo Welt wie gehts");
        System.out.println();

        System.out.println(enthaeltZiffern("Hallo 3AI"));
        System.out.println(enthaeltZiffern("Hallo Welt"));
        System.out.println(enthaeltZiffern("0"));
        System.out.println(enthaeltZiffern("A"));
        System.out.println(enthaeltZiffern(""));
    }

    public static void zahlenreihen() {
        IntStream.rangeClosed(1, 25).forEach(n -> System.out.print(n + " "));
        System.out.println();
        IntStream.rangeClosed(1, 25).filter(n -> n % 2 != 0).forEach(n -> System.out.print(n + " "));
        System.out.println();
        IntStream.iterate(20, n -> n - 5).limit(9).forEach(n -> System.out.print(n + " "));
        System.out.println();
        IntStream.iterate(1, n -> n * 2).limit(7).forEach(n -> System.out.print(n + " "));
        System.out.println();
        AtomicInteger power = new AtomicInteger(1);
        IntStream.iterate(2, n -> n + power.getAndUpdate(x -> x * 2)).limit(8).forEach(n -> System.out.print(n + " "));
        System.out.println();
    }

    public static void printFolgeOhne3(int anz) {
        IntStream.iterate(4, n -> n + 1).filter(n -> n % 3 != 0).limit(anz).forEach(n -> System.out.print(n + " "));
        System.out.println();
    }

    public static void wuerfelStatistik(int augenzahl) {
        System.out.println(augenzahl + ": " + new Random().ints(1000, 1, 7).filter(n -> n == augenzahl).count());
    }

    public static void alleTeiler(int z) {
        System.out.println(z + ": " + IntStream.rangeClosed(1, z).filter(n -> z % n == 0).mapToObj(String::valueOf).reduce((a, b) -> a + ", " + b).orElse(""));
    }

    public static boolean istPrimzahl(int z) {
//        return z > 1 && IntStream.rangeClosed(2, z).filter(n -> z % n == 0).count() == 1;
        return z > 1 && IntStream.rangeClosed(2, (int) Math.sqrt(z)).allMatch(n -> z % n != 0); // More Efficient (from 10-12ms to 5-8ms)
    }

    public static int gaussSumme(int n) {
        return IntStream.rangeClosed(1, n).sum();
    }

    public static void verticalString(String s) {
        s.chars().forEach(c -> System.out.println((char) c));
    }

    public static void mitStern(String s) {
        s.chars().forEach(c -> System.out.print((char) c + "*"));
    }

    public static void deleteBlanks(String s1) {
        s1.chars().filter(c -> c != ' ').forEach(c -> System.out.print((char) c));
    }

    public static boolean enthaeltZiffern(String s) {
        return s.chars().filter(Character::isDigit).findAny().isPresent();
    }
}