С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294

Перебрать все возможные комбинации символов и в верхнем, и в нижнем регистрах

24.11.2018, 09:37. Показов 3183. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На вход подаётся массив символов в нижнем регистре, необходимо перебрать все возможные комбинации символов и в верхнем, и в нижнем регистрах. Написал метод:
Кликните здесь для просмотра всего текста
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
static void AlternateCharCases(char[] word, int startIndex, List<string> result)
        {
            var tmpVarriable = word.ToArray();
            if (startIndex == word.Length)
            {
                result.Sort();
                return;
            }
            for (int i = startIndex; i < word.Length; i++)
            {
                if (!result.Contains(new string(word)))
                {
                    if (char.IsLetter(word[i]))
                    {
                        result.Add(new string(word));
                        word[i] = Char.ToUpper(word[i]);
                        result.Add(new string(word));
                        
                    }
                    else
                        result.Add(new string(word));
                }
                else
                {
                    word[i] = Char.ToUpper(word[i]);
                    result.Add(new string(word));
                }  
            }
            AlternateCharCases(tmpVarriable, startIndex + 1, result);

При входном массиве символов ('c','a','t') не рассмотрен вариант перебора ('C','a','T').
На скриншоте показаны комбинации, которые смог получить. Прошу помочь в поиске ошибки...
Миниатюры
Перебрать все возможные комбинации символов и в верхнем, и в нижнем регистрах  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2018, 09:37
Ответы с готовыми решениями:

Перебрать в цикле все возможные комбинации: вопрос оптимизации кода
Здравствуйте! Задача следующая: есть несколько массивов. Пусть будет 5. Необходимо перебрать все возможные комбинации по 5 значений, каждое...

Перебрать все комбинации заданных чисел
Здравствуйте. Это легче показать на примере. Будет нагляднее. Например, в первой строке консоли вводятся несколько некоторых чисел (то...

Перебрать все комбинации сортировки list
Есть List экземпляров класса List&lt;int&gt; lst=new List&lt;int&gt;(); for (int i=0; i&lt;4; i++) { lst.Add(i); } Нужно сделать так, чтобы мы...

8
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
24.11.2018, 10:25
Мне кажется здесь лучше разделить создание набора вариантов и создание выходных значений. Выходных значений будет два в степени длины исходной коллекции. Вы готовы к такому результату?
Для создания набора вариантов будет достаточно цикла (вариант для длины коллекции не более 31 символа)
C#
1
2
3
4
5
6
uint count = (uint) Math.Pow(2, word.Length);
for (uint ind=0; ind < count; ind++)
{
    // Биты ind служат указателями в каком регистре надо использовать 
   // символы входной коллекции
}
Добавлено через 7 минут
Метод расширения для получения значения бита по номеру
C#
1
2
3
4
5
6
7
8
9
10
11
static public bool IsBit (this uint Bits, int Number)
{
     if (Number <0 || Number > 31)
             return false;
     uint mask = 1;
     for (int i = 0; i <Number; i++)
         mask = mask << 1;
     if ((Bits & mask) == 0)
         return false;
    return true;
}
Добавлено через 5 минут
Его использование
C#
1
2
3
4
5
6
7
8
9
10
11
uint count = (uint) Math.Pow(2, word.Length);
for (uint ind=0; ind < count; ind++)
{
          string newWord="";
          for (int i=0; i < word.Length; i++)
               if (ind.IsBit(i))
                    newWord += Char.ToUpper(word[i]);
               else
                    newWord += Char.ToLower(word[i]);
         result.Add(newWord);
}
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
24.11.2018, 18:59  [ТС]
Элд Хасп, к такому меня жизнь не подготовила. По битам немного не понял, с помощью них проверяем регистры входных символов? Если да, то этого делать не надо, т.к. входные символы массива и так в нижнем регистре.
В моем примере необходимо использовать рекурсию. Может сможете помочь в моем примере найти ошибку? Буду очень благодарен
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
24.11.2018, 19:16
Цитата Сообщение от Kurtis Посмотреть сообщение
к такому меня жизнь не подготовила. По битам немного не понял, с помощью них проверяем регистры входных символов? Если да, то этого делать не надо, т.к. входные символы массива и так в нижнем регистре.
Нет. Вы не правильно поняли метод. В первом цикле формируется полный набор всех возможных вариантов. Набор получаем как биты числа ind. Если бит равен нулю, то соответствующий символ толжен быть в нижнем регистре, если единице - в верхнем.
Второй цикл- вложенный- переводит полученную комбинацию битов в нужное строковое представление, используя заданную коллекцию символов.
Запустите и проверьте как работает. Даст требуемый Вам результат.
Цитата Сообщение от Kurtis Посмотреть сообщение
В моем примере необходимо использовать рекурсию. Может сможете помочь в моем примере найти ошибку? Буду очень благодарен
Рекурсия - это Ваше желание или необходимое по ТЗ условие. В рекурсии здесь необходимости нет, она только запутает код.
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
24.11.2018, 19:38  [ТС]
Элд Хасп, да, это часть задания. Не указал сначала, т.к. думал что немного мой метод поправят и все Мой косяк... Можно ли исправить ошибку в моем варианте?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
24.11.2018, 20:40
Цитата Сообщение от Kurtis Посмотреть сообщение
да, это часть задания. Не указал сначала, т.к. думал что немного мой метод поправят и все Мой косяк... Можно ли исправить ошибку в моем варианте?
Там проблема в том, что сам подход не верный. Не то что не правильный результат даёт. Я не проверял. Может если подправить и будет давать правильный. Сам подход не правильный. Вы или не изучали комбинаторику, или не выучили её. Это стандартные методы, получения комбинаций, они уже давно разработаны и понятны, прозрачны.
Вот здесь я Вам дам реализацию основанную на типовом получении комбинаций.
С подробным комментарием
Сам метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static IEnumerable<string> LowerUpperChar(IEnumerable<char> Chars)
        {
            if (!(Chars?.Count() > 0)) // Если входной последовательности нет
                return null;           // то возвращаем null 
 
            if (Chars.Count() == 1)    // Если входная последовательность состоит из одного символа
                return                 // то возвращаем последовательность из этого символа в обоих регистрах
                    Chars.Select(ch => ch.ToString().ToLower()).Concat(Chars.Select(ch => ch.ToString().ToUpper()));
 
            return  // В иных случаях
                  LowerUpperChar(Chars.Take(1)) // Получаем последовательность из первого символа
                  .SelectMany                   // Сочетаем последовательности
                  (
                      str => // Лямбда для строк первой последовательности
                       LowerUpperChar(Chars.Skip(1)),  // Получаем последовательность из символов кроме первого
                      (strFirst, strOther) => // Лямбда для строк обеих последовательности
                      strFirst + strOther // Объединяющее выражение
                  );
        }
Его использование
C#
1
2
3
            string cat = "cat";
            foreach (string str in LowerUpperChar(cat))
                Console.WriteLine(str);
Добавлено через 3 минуты
Как просили рекурсивный метод.
Но, как видите, он на много объёмнее чем прямое получение всех комбинаций. Если ещё развернуть все LINQ методы в явные циклы, то там, вообще, выйдет две страницы кода.
Оно Вам надо?
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
24.11.2018, 20:52  [ТС]
Элд Хасп, сложновато все совсем...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,047
Записей в блоге: 2
24.11.2018, 21:07
Цитата Сообщение от Kurtis Посмотреть сообщение
сложновато все совсем...
Там, если убрать комментарии и декоративные переносы строк, всего три строки кода.... Что сложного?
Если что непонятно - интересуйтесь.

Сам типичный метод получения комбинаций:
  • Получаем, все возможные комбинации первого символа (здесь две комбинации: верхний и нижний регистр)
  • Если есть ещё символы, то получаем все комбинации для оставшихся символов.
  • Соединяем всеми возможными вариантами оба множества комбинаций.
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
29.11.2018, 19:39  [ТС]
Элд Хасп, доброго времени суток, таким получился метод с рекурсией
C#
1
2
3
4
5
6
7
8
9
if (word.Length == startIndex)
     {
          result.Add(new string(word));
          return;
     }
     word[startIndex] = char.ToLower(word[startIndex]);
     AlternateCharCases(word, startIndex + 1, result);
     word[startIndex] = char.ToUpper(word[startIndex]);
     AlternateCharCases(word, startIndex + 1, result);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2018, 19:39
Помогаю со студенческими работами здесь

Все возможные комбинации
Как вывести построчно все возможные комбинации, нижний, верхний регистр и цифры, Длинна :18 знаков.

Все возможные комбинации чисел
Есть числа 1,2,3,7,8,9. Как вывести их все возможные комбинации, если известно что цифры не могут повторяться? Нужно в консоли Как-то...

Все возможные трёхсимвольные комбинации
Нужно получить все возможные трёхсимвольные комбинации из следующих символов: string s = { &quot;a&quot;, &quot;b&quot;, &quot;c&quot;,...

Найти все возможные комбинации
Есть строка, к примеру . Где первая цифра в ячейке это номер предмета, а после запятой позиция. Сколько таких предметов и позиций не...

Вывести все возможные комбинации 5 из 10
Здравствуйте,хочу сделать программу в которую буду писать 10 цифр от 1 до 50,потом вывести все возможные комбинации из 5 цифр без учетом...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru