Strona główna » Algorytmy » Artykuły » Tekstonimy
 

Tekstonimy

Definicja

Tekstonimy to takie wyrazy, które do zapisania na tradycyjnej klawiaturze telefonu komórkowego wymagają naciśnięcia tej samej sekwencji przycisków (jednokrotnie lub wielokrotnie, liczy się wybór przycisku). Przyjmuje się, że przycisk określany jest cyfrą do której przypisane jest kilka znaków:

Przycisk23456789
LiteryA, B, CD, E, FG, H, IJ, K, LM, N, OP, Q, R, ST, U, VW, X, Y, Z

Przykładowo dla słowa "KOMPUTER" odpowiada sekwencja przycisków 56678837.

Przykład

Najprostszym przykładem tekstonimów jest ABC i CBA, ponieważ oba wymagają naciśnięcia trzy razy z rzędu przycisku 1. Jednak ABCD i zapisana wspak wersja już nie, ponieważ w tym pierwszym przypadku używamy drugiego przycisku na końcu, a w drugim na początku. Innymi słowy odpowiadają im kody przycisków 1112 oraz 2111.

Implementacja

Strategia

Zauważmy, że wszystkie grupy prócz 7 i 9 mają dokładnie po 3 znaki. Dzieląc numer znaku przez 3 pozwoliłoby uzyskać numer grupy do której jest przypisany znak bez korzystania z dodatkowych tablic. Aby z tego korzystać należy zmniejszyć o 1 indeks znaków od litery S włącznie oraz dla Z. Wtedy litera R i S będą miały ten sam indeks, więc będą przynależeć do tej samej grupy, a każdy kolejny znak do odpowiednio następnej.

Rozwiązanie

Funkcja naCyfry() służy do zamiany przekazanego wyrazu na ciąg cyfr, gdzie na i-tej pozycji jest numer przycisku, który trzeba przycisnąć, aby uzyskać i-tą literę wyrazu.

  1. string naCyfry(string wyraz) {
  2.   string w = "";
  3.   for each (char c in wyraz)
  4.   {
  5.     int zmniejsz = 0;
  6.     if (c >= 'S') zmniejsz++;
  7.     if (c >= 'Z') zmniejsz++;
  8.     w += '2' + ((c - 'A' - zmniejsz) / 3);
  9.   }
  10.   return w;
  11. }

Algorytm polega na pobraniu każdego kolejnego znaku, a następnie obliczenia dla niego grupy. Zwracana wartość to tekst, więc obliczony numer grupy jest zamieniany na znak ASCII. W trakcie zamiany należy pamiętać, że oba warunki na zmniejszenie indeksów znaku są niezależne i zawsze oba muszą zostać sprawdzone.

Powyższa funkcja ułatwia napisanie funkcji czyTekstonimy(), która sprowadza się do zaledwie jednej linijki:

  1. bool czyTekstonimy(string wyraz1, string wyraz2) {
  2.   return naCyfry(wyraz1) == naCyfry(wyraz2);
  3. }

Testowanie funkcji

Poniższy fragment kodu wczyta dwa wyrazy, a następnie wypisze wynik czy są on tekstonimami czy nie.

  1. int main () {
  2.   string wyraz1, wyraz2;
  3.   cout << "Podaj pierwszy wyraz:\n";
  4.   getline(cin, wyraz1);
  5.   cout << "Podaj drugi wyraz:\n";
  6.   getline(cin, wyraz2);
  7.   bool wynik = czyTekstonimy(wyraz1, wyraz2);
  8.   cout << "Wyrazy " << (wynik ? "" : "nie ") << "sa tekstonimami";
  9.   system("pause");
  10.   return 0;
  11. }

Zadania

Zadanie 1

Napisz funkcję naCyfry(), która w wyrazie pozwoli na użycie cyfry. Cyfry powinny zostać niezmienione w wyniku, ponieważ wpisanie cyfry 2 wymaga naciśnięcia przycisku 2. Przykładowo wywołanie funkcji dla argumentu "TEST123" powinno zwrócić "8378123".