PHP: Как определить что строка палиндром?

  • суббота, 23 июля 2016 г. в 21:14:30

Сегодня решил зайти на свою старую почту и за полгода накопилось столько спама. Какая-то Регина поняла, что я ее принц и скинула ссылку на какой-то интимный ресурс. Danilka_44 (что говорит о том, что это парень) нашла меня тоже на каком-то фейковом сайте и т.п. спам (в полной части скину скрины).

Но, среди этого всего хлама, я наткнулся на интересное письмо.

Написали мне 1-го апреля, а зашел на почту только сегодня. Признаюсь честно, но я не помню, что писал этой компании. Не подумайте, что похвастаюсь тем, что компании мне пишут сами. Если бы...

Когда был на втором курсе, я перешел на заочное отделение и начал искать работу на HeadHunter, JobRu и т.п., возможно там и подавал резюме, кто помнит :). В прочем, не важно.

Само письмо меня заинтересовало не только тем, что компания под названием «Лайтсофт» мне предложила работу PHP-программиста (удаленно). А именно тестом, который они мне дали. Я не скажу, что он мега-овер-крутой и сложный, а я такой, типа, умный тру-программист выполнил все задания.

Больше всего мне понравилось последнее задание:

Написать программу на php, которая определяет является ли строка текста палиндромом (читается с обеих сторон одинаково) и осуществляет вывод строки следующим способом: а) если строка является палиндромом, то она выводится полностью; б) если строка не является палиндромом - выводится самый длинный подпалиндром этой строки, т.е. самая длинная часть строки, являющаяся палиндромом; в) если подпалиндромы отсутствуют в строке - выводится первый символ строки.

В университете я делал подобное на C++, но, только с числами. У нас была преподавательница, которая меня очень сильно бесила, вот она и придумывала такие задания. В те годы, для меня это была тяжелая задача, ибо я только поступил в университет и тут надо делать такое. Самое тяжелое было то, что я не знал C++, только Delphi (Object Pascal). Благодаря Delphi, я хоть немного понимал логику синтаксиса C++ (даже учитывая то, что у Delphi и C++ почти ничего схожего).

К сожалению, я по своей глупости не сохранил тест. Но, выложу вопросы которые там были в конце статьи.

Говоря уже о самом задании, вроде я с ними справился. Но, со SQL у меня слабовато, вероятно там допустил ошибки. Последнее задание я хотел выложить в своем блоге. Может кому-нибудь пригодится.

Мне лень описывать подробно как работает моя функция, ибо на часах почти 3 ночи. Данное решение, я выложу на 3 языках программирования: PHP, JavaScript, C#. В качестве практики, я решил вспомнить немного C# и накатал код на этом языке тоже. Думаю разберетесь сами.

P.S.: Кстати, тестировал C# код на онлайн компиляторе CodingGround. Там есть еще много других компиляторов на разные языки.

PHP


_28
<?php
_28
_28
$text = 'Sum summud mud';
_28
_28
function isPal($text){
_28
$text_1 = preg_replace( "'\s'", "", strtolower( $text ) );
_28
$text_2 = iconv("windows-1251", "utf-8", strrev(iconv("utf-8", "windows-1251", $text_1)));
_28
if ( $text_1 == $text_2 ) return true; else return false;
_28
]
_28
_28
function Palindrom($text){
_28
_28
if ( !isPal( $text ) ) {
_28
_28
$words = explode( " ", $text );
_28
$max = "";
_28
_28
for ($i = 0; $i < count($words); $i++)
_28
if ( isPal( $words[$i] ) && strlen( $words[$i] ) > strlen( $max ) ) $max = $words[$i];
_28
_28
if ( $max ) return $max; else return $text[0];
_28
_28
} else return $text;
_28
}
_28
_28
echo Palindrom($text);
_28
_28
?>

C#


_37
using System.IO;
_37
using System;
_37
_37
class Program
_37
{
_37
_37
public static bool isPal(string text) {
_37
string text_1 = text.Replace(" ","").ToLower();
_37
char[] arr = text_1.ToCharArray();
_37
Array.Reverse(arr);
_37
string text_2 = new string(arr);
_37
if ( text_1 == text_2 ) return true; else return false;
_37
}
_37
_37
public static string Palindrome(string text){
_37
_37
if ( !isPal( text ) ) {
_37
_37
string[] words = text.Split(' ');
_37
string max = "";
_37
_37
for (int i = 0; i < words.Length; i++)
_37
if ( isPal( words[i] ) && words[i].Length > max.Length ) max = words[i];
_37
_37
if ( !String.IsNullOrEmpty(max) ) return max; else return text[0].ToString();
_37
_37
_37
} else return text;
_37
_37
}
_37
_37
static void Main()
_37
[
_37
string text = "Sum summus mud";
_37
Console.WriteLine( Palindrome(text) );
_37
]
_37
]

JavaScript


_24
var text = 'Sum summud mud';
_24
_24
function isPal(text){
_24
var text_1 = text.replace(" ", "").toLowerCase();
_24
var text_2 = return text_1.split("").reverse().join("");
_24
if ( text_1 == text_2 ) return true; else return false;
_24
}
_24
_24
function Palindrom(text){
_24
_24
if ( !isPal( text ) ) {
_24
_24
var words = text.split(" ");
_24
var max = "";
_24
_24
for (var i = 0; i < words.length; i++)
_24
if ( isPal( words[i] ) && words[i].length > max.length ) max = words[i];
_24
_24
if ( max ) return max; else return text[0];
_24
_24
} else return text;
_24
}
_24
_24
alert(Palindrom(text));

Вопросы с задания

Задание #1

Дано: table .c { color: red } .a .c { color: green } &lt;table id="t"> &lt;tr> &lt;td class="c">Текст&lt;/td> &lt;/tr> &lt;/table> Задача: написать JavaScript код, делающий "Текст" зелёным, предложите как минимум три варианта (можно больше) (1-2 могут использовать JS библиотеки) только самого кода (копировать задание в ответ не нужно).

Задание #2

Дана таблица с деревом категорий CREATE TABLE category ( id integer not null primary key, parent_category id integer references category(id), name varchar(100) not null ); Напишите запросы (БД - “правильная”, умеющая делать подзапросы, различные соединения и прочее): 1. На выборку всех категорий верхнего уровня, начинающихся на “авто” 2. На выборку всех категорий, имеющих не более трёх подкатегорий следующего уровня (без глубины) 3. На выборку всех категорий нижнего уровня (т.е. не имеющих детей) Напишите индексы, которые позволят сделать эти запросы быстрее.

Задание #3

Дана строка текста. Написать программу на php, которая определяет является ли строка текста палиндромом (читается с обеих сторон одинаково) и осуществляет вывод строки следующим способом: а) если строка является палиндромом, то она выводится полностью; б) если строка не является палиндромом - выводится самый длинный подпалиндром этой строки, т.е. самая длинная часть строки, являющаяся палиндромом; в) если подпалиндромы отсутствуют в строке - выводится первый символ строки. Примеры палиндромов: - Аргентина манит негра - Sum summus mus

А вот и сами письма которые я хотел выложить в конце статьи :)

#палиндром# palindrome# is_palindrome# php# c sharp# c## javascript# js# задания# жизнь