
Тестване на палиндроми — част 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;
Очаквайте част втора, където ще покажем какви проблеми могат да възникват от този код и как можем да го подобрим.
[…] първа част на урока стигнахме до момент, в който премахваме точно […]