Wprowadzenie
Często mamy potrzebę szybkiego przekazania komuś słownie numeru, np. kodu PIN, numeru telefonu, numeru konta.
Odczytanie lub zapamiętanie ciągu liter trwa znacznie krócej, niż tej samej długości ciągu cyfr dziesiętnych, o ile tylko ciąg liter wygląda jak słowo języka naturalnego. Cechę taką mają, między innymi, ciągi par liter, z których pierwsza jest spółgłoską a druga samogłoską, zakończone opcjonalną spółgłoską.
Jeśli, tworząc słowa tej postaci, ograniczymy się do liter alfabetu łacińskiego, będziemy mieli do dyspozycji 20 spółgłosek i 6 samogłosek.
Wymowa słów zawierających spółgłoski 'q', 'v' oraz 'x' może być trudna. Po ich odrzuceniu, do naszej dyspozycji pozostanie 17 spółgłosek:
b, c, d, f, g, h, j, k, l, m, n, p, r, s, t, w, z
i 6 samogłosek:
Możemy z nich utworzyć 17 * 6 = 102
pary spółgłoska-samogłoska. Z tego zbioru odrzucimy dwie pary, które trudno jest wypowiedzieć: "ji" oraz "jy". W rezultacie pozostanie nam 100 różnych par liter. Przy pomocy jednej pary możemy więc reprezentować ciąg dwóch cyfr dziesiętnych.
Chcąc ustalić numer reprezentowany przez zadane słowo, dzielimy je na grupy po dwie litery, z których pierwsza będzie spółgłoską, a druga samogłoską. Z każdej takiej grupy uzyskamy dwie cyfry numeru.
Dodatkowo, jeśli długość słowa jest nieparzysta, na końcu pozostanie nam jedna litera "nie do pary". Na jej podstawie wyznaczymy ostatnią cyfrę numeru.
Spółgłoskom przyporządkujemy, w kolejności alfabetycznej, liczby całkowite od 0 do 16, a samogłoskom liczby od 0 do 5.
Dla pary spółgłoska-samogłoska obliczymy wartość wyrażenia:
(numer spółgłoski) * 6 + (numer samogłoski)
Wartością będzie liczba od 0 do 101. Ponieważ ze zbioru dozwolonych par liter usunęliśmy "ji" oraz quot;jy", od uzyskanej z powyższego wzoru liczby:
-
odejmujemy 2, jeśli para liter w porządku leksykograficznym następuje po "jy"
-
odejmujemy 1, jeśli para liter w porządku leksykograficznym występuje pomiędzy "ji" a "jy"
Obliczona w ten sposób wartość wyznaczy dwie cyfry numeru. Pierwsza z nich będzie bardziej znaczącą cyfrą zapisu dziesiętnego tej wartości, a druga cyfra mniej znaczącą.
Jeśli na końcu słowa była litera "nie do pary", to musi to być spółgłoska z przedziału od 'b' do 'm'. Jej pozycja w ciągu spółgłosek wskaże ostatnią cyfrę numeru.
Przykład
Obliczymy numer reprezentowany przez słowo "beza". Dzielimy słowo na dwie pary liter: "be" i "za".
Ponieważ:
-
spółgłoska 'b' w ciągu spółgłosek ma numer 0
-
samogłoska 'e' w ciągu samogłosek ma numer 1
-
"be" w porządku leksykograficznym jest przed "ji"
-
0 * 6 + 1 = 1
pierwszymi dwiema cyframi bedzie "01".
Dla drugiej pary liter:
-
spółgłoska 'z' w ciągu spółgłosek ma numer 16
-
samogłoska 'a' w ciągu samogłosek ma numer 0
-
"za" w porządku leksykograficznym jest po "jy"
-
16 * 6 + 0 - 2 = 94
czyli kolejne dwie cyfry to 94
.
Ustaliliśmy więc, że słowo beza
reprezentuje numer 0194
.
Gdybyśmy, dopisując na końcu słowa "beza" literę 'm' zrobili z niego bezam
, uzyskalibyśmy reprezentację numeru 01949
, gdyż 'm' w ciągu spółgłosek ma numer 9.
Polecenie
Napisz program, który dla danego jako parametr słowa, czyli ciągu liter, wypisze na wyjście odpowiadający mu numer - ciąg cyfr. Ten sam program, wywołany z argumentem będącym numerem, powinien wypisać na wyjście odpowiadające mu słowo.
Program powinien sensownie reagować na błędne dane.
Wskazówki
W rozwiązaniu zadania mogą się przydać standardowe funkcje Pascala:
ord(c)
-
daje kod znaku c
chr(i)
-
daje znak o kodzie i
oraz dostępne we Free Pascalu funkcje:
paramCount
-
daje liczbę argumentów, z jakimi program został wywołany
paramStr(i)
-
daje napis przekazany jako i-ty argument programu