Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 05.08.2019
Сообщений: 1
1

Палиндром - учитывать только числа и буквы(игнорируем пробелы, спецсимволы, знаки препинания и т.п.)

05.08.2019, 20:14. Показов 1992. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Помогите с решением задачи:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* 
        Создайте консольное приложение на C# для определения - является ли введенная последовательность символов полиндромом.
        Предусмотреть возможность выбора режима работы приложения(согласно переданному аргументу командной строки при запуске):
 
                1. учитывать только числа и буквы(игнорируем пробелы, спецсимволы, знаки препинания и т.п.);
                2.учитывать все введенные символы. 
*/
 
using System;
 
namespace ConsoleApp1
{
    class Program
    {
        class Palindrom
        {
            public static bool Palindrom1(string str)
            {
                //здесь пытался создать цикл - учитывать только числа и буквы
                return true;
            }
            public static bool Palindrom2(string str)
            {
                int len = str.Length;
                for (int i = 0; i < len / 2; ++i)
                {
                    if (str[i] != str[len - i - 1])
                    {
                        return false;
                    }
                }
                return true;
            }
            static void Main()
            {
                string s;
                Console.Write("Анализ палиндрома\n\nВведите строку: ");
                s = Console.ReadLine();
                int o = 0;
                while (3 > 1)
                {
                    Console.Write("\n1 - Учитывать только числа и буквы\n2 - Учитывать все введенные символы\n3 - Введите новую строку\n0 - Выход\n");
                    Console.Write("\nВыберите пункт: ");
                    o = Convert.ToInt32(Console.ReadLine());
                    if (o > 3)
                    {
                        Console.Write("Вы ввели некорректный пункт!\n");
                        continue;
                    }
                    if (o == 0)
                    {
                        break;
                    }
                    if (o == 1)
                    {
                        if (Palindrom1 (s))
                            Console.WriteLine("\nЭта строка - палиндром");
                        else
                            Console.WriteLine("\nЭта строка - не палиндром");
                    }
                    if (o == 2)
                    {
 
                        if (Palindrom2(s))
                            Console.WriteLine("\nЭта строка - палиндром");
                        else
                            Console.WriteLine("\nЭта строка - не палиндром");                       
                    }
                    if (o == 3)
                    {
                        Console.Write("\nВведите строку: ");
                        s = Console.ReadLine();
                    }
                }
            }
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2019, 20:14
Ответы с готовыми решениями:

Обработать исходный файл и определить число каждого из символов (при этом регистр букв не учитывать, а цифры, знаки препинания и пробелы учитывать)
Задан файл .txt с английским текстом. Обработать исходный файл и определить число каждого из...

Сделать, чтобы поле long_text выводило только 950 знаков, включая пробелы и знаки препинания
Нет, нет, делал поиск по сайту, нашел похожее, но там немного другое. У меня проблема поглубже....

Найти длину самого длинного слова в строке. Знаки препинания не учитывать
Эта программа считает максимальное количество правильно, но знаки препинанию считает частью слова....

Расставить знаки препинания и убрать лишние пробелы
Убрать лишние пробелы, расставить знаки препинания. Пример: «First sentence Second sentence.»...

10
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
06.08.2019, 06:55 2
Используй RegEx
0
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
06.08.2019, 10:00 3
Лучший ответ Сообщение было отмечено Mefoge как решение

Решение

C#
1
2
3
4
5
6
7
8
9
public static bool Palindrom1(string str)
            {
                Regex regex = new Regex(@"\w");
                MatchCollection matches = regex.Matches(str);
                string result = null;
                foreach (Match match in matches)
                    result += match.Value;
                return Palindrom2(result);
            }
1
1 / 1 / 3
Регистрация: 20.03.2015
Сообщений: 30
06.08.2019, 14:33 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
namespace DeleteThis
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            List<string> polindroms = new List<string>();
            var includeDebugPolindroms = false;
            Func<string, bool> poliDefineFunction = IsPolindrom;
 
            foreach (var arg in args)
            {
                if (arg.StartsWith("--"))
                {
                    var appArg = arg.Substring(2);
                    switch (appArg)
                    {
                        case "a":
                            poliDefineFunction = IsPolindrom2;
                            break;
                        case "d":
                            includeDebugPolindroms = true;
                            break;
                        default:
                            throw new ArgumentException($"No such argument {appArg}");
                    }
                }
                else
                    polindroms.Add(arg);
            }
 
            if (includeDebugPolindroms)
                polindroms.AddRange(new[] {"ллолл","геереег", "фывхфыв", "asd_adsa", "asd_a_asd", "asd.a.asd"});
 
            foreach (var poli in polindroms)
                ShowPoliInfo(poli, poliDefineFunction);
        }
 
        private static void ShowPoliInfo(string poli, Func<string, bool> func)
        {
            Console.WriteLine($"{ poli }\t{ (func(poli) ? "is" : "is not") } polindrom");
        }
 
        private static bool IsPolindrom(string poli)
        {
            for (var i = 0; i < poli.Length / 2; ++i)
                if (poli[i] != poli[poli.Length - 1 - i])
                    return false;
 
            return true;
        }
 
        private static bool IsPolindrom2(string poli)
        {
            poli = Regex.Replace(poli, "[^A-Za-zА-Яа-я0-9]", "");
            for (var i = 0; i < poli.Length / 2; ++i)
                if (poli[i] != poli[poli.Length - 1 - i])
                    return false;
 
            return true;
        }
    }
}
Использовать
Program ПОЛИНДРОМ1 ПОЛИНДРОМ2 (и т.д.);
Program ПОЛИНДРОМ1 ПОЛИНДРОМ2 --a; //Альтернативная проверка (IsPolinrom2)
Program ПОЛИНДРОМ1 ПОЛИНДРОМ2 --d; //Добавить дебаг - полиндромы
Program ПОЛИНДРОМ1 ПОЛИНДРОМ2 --a --d;
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
06.08.2019, 18:07 5
C#
1
2
3
4
5
6
7
8
9
10
11
bool IsPalindrome(string s)
{
    int i = 0, j = s.Length - 1;
    while (i < j)
    {
        if (!char.IsLetterOrDigit(s[i])) i++;
        else if (!char.IsLetterOrDigit(s[j])) j--;
        else if (char.ToLower(s[i++]) != char.ToLower(s[j--])) return false;
    }
    return true;
}
0
1 / 1 / 3
Регистрация: 20.03.2015
Сообщений: 30
06.08.2019, 18:12 6
Цитата Сообщение от kolorotur Посмотреть сообщение
Как все сложно...
И добавить решение ничуть не проще. Гениально

Добавлено через 3 минуты
Цитата Сообщение от Mefoge Посмотреть сообщение
while (3 > 1)
Кстате, только увидел. "Креативный" вайл тру =P
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
06.08.2019, 18:46 7
Deenis, сложность не в количестве строк.
0
1 / 1 / 3
Регистрация: 20.03.2015
Сообщений: 30
06.08.2019, 18:50 8
Цитата Сообщение от kolorotur Посмотреть сообщение
Deenis, сложность не в количестве строк.
В понимании "что происходит".

Я не спорю, что это решение лучше по производительности. Но в плане читабельности решение на уровне WTF
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
06.08.2019, 19:02 9
Цитата Сообщение от Deenis Посмотреть сообщение
решение на уровне WTF
Ну если у вас простейший цикл с тремя условиями проблемы с пониманием вызывает, то я не знаю...
0
1 / 1 / 3
Регистрация: 20.03.2015
Сообщений: 30
06.08.2019, 19:06 10
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну если у вас простейший цикл с тремя условиями проблемы с пониманием вызывает, то я не знаю...
Я прочитал, понял, оценил производительность и читаемость. И тут мне пишут про проблемы с пониманием. Тут мои полномочия всё
0
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
07.08.2019, 09:46 11
можно еще проще)
C#
1
2
3
4
5
bool IsPalindrome(string s)
        {
            string replaced = Regex.Replace(s, @"\W", "");
            return replaced.SequenceEqual(replaced.Reverse());
        }
0
07.08.2019, 09:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2019, 09:46
Помогаю со студенческими работами здесь

Заменив пробелы символами табуляции и удалив знаки препинания
Вывести на экран введенную строку, предварительно заменив пробелы символами табуляции и удалив...

Удалить из строки все знаки препинания. Пробелы оставить
Подскажите как это можно реализовать через, к примеру find

Как вставить пробелы и знаки препинания в расшифрованном тексте?
N = str('Qpna, vjg hqqn? yqwnf vcmg').lower().split() D = ans = A =...

В строке заменить все знаки препинания на пробелы. Вывести результат
помогите


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru