package UE15_030325_Streams2;

import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class UE15_Streams2 {
    public static void main(String[] args) {
        System.out.println(lottoziehung());
        System.out.println(berechnePI(-5));
        System.out.println(berechnePI(1));
        System.out.println(berechnePI(2));
        System.out.println(berechnePI(3));
        System.out.println(berechnePI(1001));
        System.out.println(zaehleZeichenAusVorrat("Hallo 1AI", "aeiou"));
        System.out.println(zaehleZeichenAusVorrat("*code*123#", "?%*!#$"));
        System.out.println(createRandoString("1234", 5));
        System.out.println(Arrays.toString(deleteEquals(new int[]{1, 3, 3, 1, 2, 1, 5})));
        System.out.println(zeichenStatistik("Hallo Welt wie geht es heute"));
    }

    public static Set<Integer> lottoziehung() {
        return new Random().ints(1, 46).distinct().limit(6).boxed().collect(Collectors.toSet());
    }

    public static double berechnePI(int anzGlieder) {
        return anzGlieder < 1 ? -1 : 4 * IntStream.range(0, anzGlieder).mapToDouble(n -> Math.pow(-1, n) / (2 * n + 1)).sum();
    }

    public static int zaehleZeichenAusVorrat(String s, String vorrat) {
//        Set<Character> chars = vorrat.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
        return (int) s.chars().filter(c -> vorrat.chars().mapToObj(n -> (char) n).collect(Collectors.toSet()).contains((char) c)).count();
    }

    public static String createRandoString(String vorrat, int len) {
        return IntStream.range(0, len).mapToObj(_ -> String.valueOf(vorrat.charAt(new Random().nextInt(vorrat.length())))).collect(Collectors.joining());
    }

    public static int[] deleteEquals(int[] ia) {
        return Arrays.stream(ia).distinct().toArray();
    }

    public static Map<Character, Integer> zeichenStatistik(String s) {
        return s.chars().mapToObj(c -> (char) c).collect(Collectors.toMap(Function.identity(), n -> 1, Integer::sum));
    }
}
