Jelenovi pivo nelej

Palindrome.cs – třída pro práci s palindromy v jazyce C#

Když se podíváte na data vydání předchozích článků, zjistíte, že mezi tímto a předchozím je výrazně větší časový odstup, než mezi ostatními.

Ne, že bych snad na blog zanevřel, nebo byl pracovně natolik vytížen, abych si nenašel čas na napsání nového článku. Tím pravým důvodem je intenzivní studium jazyka C#, kterému jsem se posledních pár měsíců věnoval.

V menu nalevo brzy přibude nová položka Ke stažení (pokud čtete tento článek už nějaký čas po jeho publikování, možná tam už je :)) s mými aplikacemi.

Ale teď už rovnou k tématu dnešního článku a tím je třída Palindome.cs s metodami IsPalindrome()GetPalindromes() napsaná v jazyce C#.

Palindrom (z řec. palindromos = běžící pozpátku) je řetězec znaků, který má, čtený z obou směrů, stejný význam. Může jím být třeba věta „Jednu sundej.“, číslo 1221 a nebo datum 7.10.2017. Palindromická může být i melodie.

Podíváme-li se na palindrom pohledem programátora, napadnou nás v první řadě dvě metody, nebo chcete-li funkce.

První metoda na řetězec vrátí logickou hodnotu, dle toho zda řetězec je, nebo není palindromem a druhá, využije té první a vyhledá v zadaném řetězci všechny palindromy, které vrátí v generické kolekci.

A třída Palindrome.cs s metodami IsPalindrome() a GetPalindromes() přesně tuto funkcionalitu poskytuje:

using System.Collections.Generic;
using System.Text;

namespace Palindrome
{
 public class Palindrome
 {
  private List<char> PrepareInput(string input)
  {
  var modInput = input.ToLower().Trim()
    .Replace('!', '.')
    .Replace('?', '.')
    .Replace(':', '.')
    .Replace(',', '.')
    .Replace(';', '.')
    .Replace('-', '.')
    .Replace(' ', '.');

  var preparedInput = new List<char>();
  foreach (var character in modInput)
  {
   if (character != '.')
    preparedInput.Add(character);
  }

  return preparedInput;
 }

 public bool IsPalindrome(string input)
 {
  var preparedInput = new List<char>(PrepareInput(input));

  var cleanInput = new StringBuilder();
  foreach (var character in preparedInput)
  {
   cleanInput.Append(character);
  }

  preparedInput.Reverse();

  var reversedCleanInput = new StringBuilder();
  foreach (var character in preparedInput)
  {
   reversedCleanInput.Append(character);
  }

  return reversedCleanInput.ToString() == cleanInput.ToString() ? true :  false;
 }

//druhý argument maxLenght (int) omezuje maximální délku palindromu
 public List<string> GetPalindromes(string input, int maxLenght)
 {
  var preparedInput = new List<char>(PrepareInput(input));

  var cleanInput = new StringBuilder();
  foreach (var character in preparedInput)
  {
   cleanInput.Append(character);
  }

  if (cleanInput.Length < 3)
    throw new System.ArgumentOutOfRangeException("input must have at least 3 alphabet characters");

  if (maxLenght < 3)
    throw new System.ArgumentOutOfRangeException("maxLenght is smaller than 3 but a palindrome must have at least 3 characters");

  if (maxLenght > cleanInput.Length)
   throw new System.ArgumentOutOfRangeException("maxLenght must be shorter than or equal to alphabet characters in the input string");

  var potencialPalindromes = new List<string>();
  var startIndex = 0;
  var lenght = 2;
  while (lenght <= cleanInput.Length)
  { 
   while (startIndex < cleanInput.Length - lenght && lenght <= maxLenght)
   {
    potencialPalindromes.Add(cleanInput.ToString().Substring(startIndex, lenght + 1));
    startIndex++;
   }
   lenght++;
   startIndex = 0;
  }

  var palindrome = new Palindrome();
  var palindromes = new List<string>();

  potencialPalindromes.Reverse();

  foreach (var potencialPalindrome in potencialPalindromes)
   if (palindrome.IsPalindrome(potencialPalindrome))
    palindromes.Add(potencialPalindrome);

  return palindromes;
  }
 }
}

Na závěr, ukázka volání obou metod:

var palindrome = new Palindrome();

palindrome.IsPalindrome("Jelenovi pivo nelej.");
palindrome.GetPalindromes("Máta knihu o palindromech? Tse, šest! Jednu sundej.", 12);

Nápad napsat tuto třídu jsem dostal téměř přesně před měsícem, tedy 7.10.2017, kdy bylo aktuální datum palindromem.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

+ 74 = 84