Тестване на палиндроми — част 1

Това е стандартна задача, която често се дава за пример при ученето на някакъв език за програмиране.

Самата задача стимулира мисленето при търсене на начин да се реши и често води до запознаване с възможностите на езика.

Палиндроми са думи, които прочетени на обратно изглеждат също както и когато се прочетат направо.

Палиндроми са думите “невен” и “потоп”, както и изразите “ангел легна” и “дебел лебед”.

В случаи на словосъчетания и изрази с по няколко думи е позволено интервалите да се пренебрегват, така че “аз обичам мач и боза” също е палиндром.

Подход

В програмирането често се случва една и съща цел да се постигне по няколко начина. Затова нека разгледаме няколко решения.

При тестване ще използваме израза: “If I Had a Hi-Fi”.

Винаги търсете подходящи тестове за дадена функционалност. Ако бях използвал примерно само “SOS” можеше да изпусна условието, че интервали е позволено да се игнорират. Още повече — в гореописания израз имаме дори и тире като специален знак.

Колкото повече частни случаи тестваме, толкова по-уверени можем да сме, че script-ът ни работи правилно.

Игнориране на знаци различни от букви

Като за начало ще трябва да намерим начин да игнорираме всички знаци различни от букви.

За целта бихме могли да използваме str_replace.

Игнориране на интервали

Ако игнорирането на интервали беше достатъчно можеше да напишем:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(' ', '', $test);

echo $simplified;

Това би извело “IfIHadaHi-Fi”.

Действието на функцията str_replace би трябвало да е познато от урока Първи стъпки в PHP – функции за текст

Премахване на тирето, след интервалите

Проблемът обаче е тирето. Затова можем да извикаме втори път функцията:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace('-', '', str_replace(' ', '', $test));

echo $simplified;

Резултатът от първото извикване на функцията го подаваме към второто извикване на функцията. За повече четимост може да го напишем така:

$test = 'If I Had a Hi-Fi';

$no_spaces = str_replace(' ', '', $test);
$no_spaces_and_dashes = str_replace('-', '', $no_spaces);

echo $no_spaces_and_dashes;

Обърнете внимание на имената на променливите. Грешка на новаците е при второто викане на функцията да пуснат оригиналния текст. Той обаче, все още съдържа интервали и тогава изчезват само тиретата.

Замяна на всички знаци

Така можем да копираме функцията още няколко пъти за други специални знаци:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(' ', '', $test);
$simplified = str_replace('-', '', $simplified);
$simplified = str_replace(',', '', $simplified);
$simplified = str_replace('.', '', $simplified);

echo $simplified;

Този начин на изреждане на всички знаци не е много подходящ и води до много код.

Масиви, вместо повторно викане на функцията

Ако сте чели внимателно описанието на функцията str_replace може би ви е направило впечатление, че може за find и replace да се подаде не просто текст, а масиви. Тогава елементи от първия ще се заменят със съответните елементи от втория.

Можем да пренапишем кода, който имаме до момента по следния начин:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(
    array(' ', '-', ',', '.'),
    array('',  '',  '',  ''),
    $test
);

echo $simplified;

Допълнително опростяване

Кодът е форматиран така, че лесно да може да се види кой знак с какъв ще бъде заместен. В случая всички се заместват с празен string — ''. Затова можем да запазим първия аргумент като масив, а втория да си остане просто '':

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(
    array(' ', '-', ',', '.'),
    '',
    $test
);

echo $simplified;

Очаквайте част втора, където ще покажем какви проблеми могат да възникват от този код и как можем да го подобрим.

Един отговор за “Тестване на палиндроми — част 1”

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.