// 4. hét – A gyakorlati feladatok megoldásai
// Futtatás: java Exercises04.java
import java.util.Arrays;

public class Exercises04 {

    // F1. Palindrom-e? (kis- és nagybetű, valamint a nem betű karakterek figyelmen kívül)
    static boolean isPalindrome(String s) {
        int i = 0, j = s.length() - 1;
        while (i < j) {
            char a = s.charAt(i), b = s.charAt(j);
            if (!Character.isLetterOrDigit(a)) { i++; continue; }
            if (!Character.isLetterOrDigit(b)) { j--; continue; }
            if (Character.toLowerCase(a) != Character.toLowerCase(b)) return false;
            i++;
            j--;
        }
        return true;
    }

    // F2. Szavak száma (szóközzel elválasztva, több szóköz is lehet)
    static int wordCount(String s) {
        String t = s.trim();
        return t.isEmpty() ? 0 : t.split("\\s+").length;
    }

    // F3. Betűgyakoriság (angol kisbetűk) egy 26 elemű tömbbel
    static int[] letterFrequency(String s) {
        int[] freq = new int[26];
        for (char c : s.toLowerCase().toCharArray()) {
            if (c >= 'a' && c <= 'z') freq[c - 'a']++;
        }
        return freq;
    }

    // F4. Caesar-kódolás k eltolással (csak angol betűk)
    static String caesar(String s, int k) {
        StringBuilder sb = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (c >= 'a' && c <= 'z') sb.append((char) ('a' + (c - 'a' + k + 26) % 26));
            else if (c >= 'A' && c <= 'Z') sb.append((char) ('A' + (c - 'A' + k + 26) % 26));
            else sb.append(c);
        }
        return sb.toString();
    }

    // F5. Anagramma-e? (ugyanazok a betűk, ugyanannyiszor)
    static boolean isAnagram(String a, String b) {
        return Arrays.equals(letterFrequency(a), letterFrequency(b));
    }

    // F6. Futáshossz-tömörítés: "aaabbc" -> "a3b2c1"
    static String compress(String s) {
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while (i < s.length()) {
            char c = s.charAt(i);
            int j = i;
            while (j < s.length() && s.charAt(j) == c) j++;
            sb.append(c).append(j - i);
            i = j;
        }
        return sb.toString();
    }

    // F7. Szavak sorrendjének megfordítása
    static String reverseWords(String s) {
        String[] w = s.trim().split("\\s+");
        StringBuilder sb = new StringBuilder();
        for (int i = w.length - 1; i >= 0; i--) {
            sb.append(w[i]);
            if (i > 0) sb.append(' ');
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println("F1. isPalindrome(\"A man, a plan, a canal: Panama\") = " + isPalindrome("A man, a plan, a canal: Panama"));
        System.out.println("    isPalindrome(\"hello\") = " + isPalindrome("hello"));
        System.out.println("F2. wordCount(\"  data   structures are fun \") = " + wordCount("  data   structures are fun "));
        int[] f = letterFrequency("Hello World");
        System.out.print("F3. Hello World: ");
        for (int i = 0; i < 26; i++) if (f[i] > 0) System.out.print((char) ('a' + i) + "=" + f[i] + " ");
        System.out.println();
        String enc = caesar("Hello, Wuhan!", 3);
        System.out.println("F4. caesar(3) = " + enc + ", vissza: " + caesar(enc, -3));
        System.out.println("F5. isAnagram(\"listen\", \"silent\") = " + isAnagram("listen", "silent"));
        System.out.println("F6. compress(\"aaabbcdddd\") = " + compress("aaabbcdddd"));
        System.out.println("F7. reverseWords(\"I love data structures\") = " + reverseWords("I love data structures"));
    }
}
