Перестановка слов в C # со специальными символами - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать перестановки слова «пароль», мне удалось создать все перестановки слова с помощью приведенного ниже кода.В настоящее время это делает верхний регистр и нижний регистр.Мне нужно включить перестановки, которые имеют специальные символы, например, где у меня будет "p @ ssword".Где я заменяю «а» на «@» и «о» «0».

Есть идеи, как расширить мою реализацию?

 public static void WritePermutations(string pwd)
    {
        pwd = pwd.ToLower();
        var myDict = new Dictionary<int, string>();
        int Count = 0;

        var results =
            from e in Enumerable.Range(0, 1 << pwd.Length)
            let p =
            from b in Enumerable.Range(0, pwd.Length)
            select (e & (1 << b)) == 0 ? (char?)null : pwd[b]
            select string.Join(string.Empty, p);

        foreach (string s in results)
        {
            string newValue = pwd;
            s.ToLower();
            foreach (char c in s)
            {
                var Old = c.ToString().ToLower();
                var New = c.ToString().ToUpper();
                newValue = ReplaceFirstOccurrence(newValue, Old, New);
                Count++;
            }

            myDict.Add(Count, newValue);
        }

            foreach (var cred in myDict)
            {

                Console.WriteLine(cred.Value);
            }
    }

  public static string ReplaceFirstOccurrence(string Source, string Find, string Replace)
    {
        int Place = Source.IndexOf(Find);
        string result = Source.Remove(Place, Find.Length).Insert(Place, Replace);
        return result;
    }

1 Ответ

2 голосов
/ 15 апреля 2019

Как начать с этих объявлений и функций:

    List<HashSet<char>> _charCombinations = new List<HashSet<char>> {
        new HashSet<char> {'a','@'},
        new HashSet<char> {'o', '0'},
    };

    HashSet<char> GetAlternatives(char c)
    {
        var result = new HashSet<char>();
        foreach (var hashSet in _charCombinations)
        {
            if (hashSet.Contains(c))
            {
                foreach (char c2 in hashSet)
                    result.Add(c2);
            }
        }

        if (char.IsLetter(c))
        {
            result.Add((String.Empty + c).ToUpper()[0]);
            result.Add((String.Empty + c).ToLower()[0]);
        }
        else if (false) // any other char.Is-based logic
        {

        }
        result.Add(c);
        return result;
    }

    IEnumerable<string> GetTransformations(string s, int start)
    {
        char c = s[start - 1];
        foreach (var c2 in GetAlternatives(c))
        {
            if (start == s.Length)
                yield return String.Empty + c2;
            else
            {
                var e = GetTransformations(s, start + 1).GetEnumerator();
                while (e.MoveNext())
                    yield return  c2 + e.Current;

            }
        }
    }

Затем вы можете использовать их следующим образом:

        var e = GetTransformations("password", 1).GetEnumerator();
        var result = new List<string>();
        while (e.MoveNext())
            result.Add(e.Current);
        result.Sort((a,b) => string.CompareOrdinal(a, b));

Это дает 576 строк (слишком долго, чтобы перечислять здесь)Это именно то, что вы ожидаете от 8-буквенного слова, в котором 6 символов имеют 2 варианта, а два других имеют 3 варианта, то есть 2x2x2x2x2x2x3x3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...