using System;
using System.Linq;
using System.Text;

public class HelloWorld {
  public static void Main(string[] args) {
    // autors: Ginta Varblāne
    // datums: 04.03.2025
    // 3. uzdevums
    // lietoju online programiz.com

    Console.Write("Ievadiet teikumu: ");
    string teikums = Console.ReadLine().ToLower();

    // samaina vārdus lai ir pretējā secībā
    string samainitiVardi = string.Join(" ", teikums.Split(' ').Reverse());
    Console.WriteLine("Samainiti vardi: " +
                      CapitalizeFirstLetter(samainitiVardi));

    // burti pretējā secībā
    string reversedLetters =
        string.Join(" ", teikums.Split(' ').Select(
                             word => new string(word.Reverse().ToArray())));
    Console.WriteLine("Samainiti burti vardos: " +
                      CapitalizeFirstLetter(reversedLetters));

    // centrē tekstu
    CenteredTextDisplay(teikums);

    // pakāpeniski aizvieto ar tukšumu
    GradualRemoval(teikums);

    // pakāpeniski parāda katru burtu
    ReverseGradualReveal(teikums);

    // pakāpeniski pazūd no beigām
    GradualFadeFromEnd(teikums);
  }

  static string CapitalizeFirstLetter(string text) {
    if (string.IsNullOrEmpty(text))
      return text;
    return char.ToUpper(text[0]) + text.Substring(1);
  }

  static string CapitalizeFirstLetterOfFirstWord(string text) {
    if (string.IsNullOrEmpty(text))
      return text;
    // meklē pirmo atstarpi
    int firstSpace = text.IndexOf(' ');
    if (firstSpace == -1)
      // ja nav atstarpes, tad pārmaina visu tekstu
      return char.ToUpper(text[0]) + text.Substring(1);
    else
      // pārmaina pirmo burtu priekš pirmā vārda uz lielo burtu
      return char.ToUpper(text[0]) + text.Substring(1, firstSpace - 1) +
             text.Substring(firstSpace);
  }

  // Funkcija, kas centrē tekstu
  static void CenteredTextDisplay(string text) {
    text = CapitalizeFirstLetterOfFirstWord(text);
    // izmanto teksta viduspunktu
    int mid = text.Length / 2;
    StringBuilder output = new StringBuilder();
    output.Append(text[mid]);
    // izvada vidējo burtu
    Console.WriteLine(output.ToString().PadLeft(mid + 1));

    // pievieno tekstu no abām pusēm
    for (int i = 1; i <= mid; i++) {
      if (mid - i >= 0)
        // pievieno burtu no kreisās puses
        output.Insert(0, text[mid - i]);
      if (mid + i < text.Length)
        // pievieno burtu no labās puses
        output.Append(text[mid + i]);
      Console.WriteLine(output.ToString().PadLeft(mid + i + 1));
    }
  }

  static void GradualRemoval(string text) {
    text = CapitalizeFirstLetterOfFirstWord(text);
    char[] chars = text.ToCharArray();
    int left = text.Length / 2, right = left;
    // ja garums pāra skaits, samazina kreiso pusi
    if (text.Length % 2 == 0)
      left--;
    while (left >= 0 && right < text.Length) {
      // aizvieto kreido burtu ar tukšumu
      chars[left] = ' ';
      // aizvieto labo pusi ar tukšumu
      chars[right] = ' ';
      Console.WriteLine(new string(chars));
      // pāriet uz nākamo burtu
      left--;
      right++;
    }
  }
  static void ReverseGradualReveal(string text) {
    text = CapitalizeFirstLetterOfFirstWord(text);
    // izveido tukšu masīvu
    char[] output = new string(' ', text.Length).ToCharArray();
    for (int i = text.Length - 1; i >= 0; i--) {
      // pievieno burtu no beigām uz sākumu
      output[i] = text[i];
      Console.WriteLine(new string(output));
    }
  }

  static void GradualFadeFromEnd(string text) {
    text = CapitalizeFirstLetterOfFirstWord(text);
    char[] chars = text.ToCharArray();
    for (int i = text.Length - 1; i >= 0; i--) {
      // aizvieto burtu ar tukšumu
      chars[i] = ' ';
      Console.WriteLine(new string(chars));
    }
  }
}
