• Главная
  • »
  • PHP
  • »
  • PHP: Как определить что строка палиндром?

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

Дата: 24.07.2016 в 00:14, Категория: PHP
  • 3162
  • 8
PHP: Как определить что строка палиндром?

Сегодня решил зайти на свою старую почту и за полгода накопилось столько спама. Какая-то Регина поняла, что я ее принц и скинула ссылку на какой-то интимный ресурс. 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

<?php

$text = 'Sum summud mud';

function isPal($text){
        $text_1 = preg_replace( "'\s'", "", strtolower( $text ) );
        $text_2 = iconv("windows-1251", "utf-8", strrev(iconv("utf-8", "windows-1251", $text_1)));
        if ( $text_1 == $text_2 ) return true; else return false;
]

function Palindrom($text){

        if ( !isPal( $text ) ) {

                $words = explode( " ", $text );
                $max = "";

                for ($i = 0; $i < count($words); $i++) 
                if ( isPal( $words[$i] ) && strlen( $words[$i] ) > strlen( $max ) ) $max = $words[$i];

                if ( $max ) return $max; else return $text[0];

        } else return $text;
}

echo Palindrom($text);

?>

# C

using System.IO;
using System;

class Program
{

        public static bool isPal(string text) {
                string text_1 = text.Replace(" ","").ToLower();
                char[] arr = text_1.ToCharArray();
                Array.Reverse(arr);
                string text_2 = new string(arr);
                if ( text_1 == text_2 ) return true; else return false;
        }

        public static string Palindrome(string text){

                if ( !isPal( text ) ) {

                        string[] words = text.Split(' ');
                        string max = "";

                        for (int i = 0; i < words.Length; i++) 
                        if ( isPal( words[i] ) && words[i].Length > max.Length ) max = words[i];

                        if ( !String.IsNullOrEmpty(max) ) return max; else return text[0].ToString();

                } else return text;

        }

        static void Main()
        [
                string text = "Sum summus mud";
                Console.WriteLine( Palindrome(text) );
        ]
]

# JavaScript

var text = 'Sum summud mud';

function isPal(text){
        var text_1 = text.replace(" ", "").toLowerCase();
        var text_2 = return text_1.split("").reverse().join("");
        if ( text_1 == text_2 ) return true; else return false;
}

function Palindrom(text){

        if ( !isPal( text ) ) {

                var words = text.split(" ");
                var max = "";

                for (var i = 0; i < words.length; i++) 
                if ( isPal( words[i] ) && words[i].length > max.length ) max = words[i];

                if ( max ) return max; else return text[0];

        } else return text;
}

alert(Palindrom(text));

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

# Задание #1

Дано: table .c { color: red } .a .c { color: green } <table id="t"> <tr> <td class="c">Текст</td> </tr> </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

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