Создание списка слов из слова - PullRequest
1 голос
/ 15 апреля 2011

ищет идеи для начала того, что я бы назвал генератором списка слов obscurifier слова.

он берет строку, например, "hello", и в основном ищет возможности для создания из этого аналогичных слов,то есть возвращая что-то вроде:

  • h3ll0
  • he11o
  • HEL10
  • h3LLo
  • ...
  • ...

Как видите, мне нужно быть чутко чувствительным.

Я просто смотрю на идеи / способы, которыми я мог бы это реализовать.

Может быть, первый проход делает заглушку:

  • привет
  • Привет
  • Привет
  • Привет
  • Привет
  • ...

, а затем передать этот список / массив в метод под номерами / символами

Я уверен, и, скорее всего, буду использовать C # (по крайней мере, длязапустите это приложение.

Если что-то уже написано, что доступно, что делает то, о чем я говорю, тем лучше, я бы хотел услышать

Спасибо за чтение.

Ответы [ 4 ]

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

Это слишком долго, чтобы быть комментарием, но это не реальный ответ. Просто предложение. Сначала рассмотрим эту ссылку:

http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

Вы могли бы думать о своей проблеме как о вычислении декартового произведения последовательности последовательностей. Если подумать о буквенно-цифровых символах, они имеют от 1 до 3 состояний, таких как исходный символ в нижнем регистре (если это применимо), в верхнем регистре (если это применимо) и замена цифр (еще раз, если это применимо). Или, если вы начинаете с замены цифры, цифры, заглавной и строчной буквы. Такие как:

A -> a, A, 4
B -> b, B, 8
C -> c, C
D -> d, D
// etc.
1 -> 1, L, l
2 -> 2
3 -> 3, e, E
// etc.

Каждый из них является последовательностью. Таким образом, в вашей задаче вы можете превратить исходный ввод «привет» в процесс, в котором вы берете последовательности, соответствующие каждому символу в строке, а затем берете эти последовательности и получаете их декартовы произведения. Методика в блоге Эрика Липперта, на которую ссылаются, будет отличным руководством для продолжения.

1 голос
/ 15 апреля 2011

Этот пример помещает идею Энтони Пеграма в код. Я жестко запрограммировал ваши сопоставления и ввод букв, но вы сможете легко это изменить.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SO5672236
{
    static class Program
    {
        static void Main()
        {
            // Setup your letter mappings first
            Dictionary<char,string[]> substitutions = new Dictionary<char, string[]>
            {
                {'h', new[] {"h", "H"}},
                {'e', new[] {"e", "E", "3"}},
                {'l', new[] {"l", "L", "1"}},
                {'o', new[] {"o", "O"}}
            };

            // Take your input
            const string input = "hello";

            // Get mapping for each letter in your input
            IEnumerable<string[]> letters = input.Select(c => substitutions[c]);

            // Calculate cortesian product
            var cartesianProduct = letters.CartesianProduct();

            // Concatenate letters
            var result = cartesianProduct.Select(x => x.Aggregate(new StringBuilder(), (a, s) => a.Append(s), b => b.ToString()));

            // Print out results
            result.Foreach(Console.WriteLine);
        }

        // This function is taken from 
        // http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
        static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
        {
            IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
            return sequences.Aggregate(
              emptyProduct,
              (accumulator, sequence) =>
                from accseq in accumulator
                from item in sequence
                select accseq.Concat(new[] { item }));
        }

        // This is a "standard" Foreach helper for enumerables
        public static void Foreach<T>(this IEnumerable<T> enumerable, Action<T> action)
        {
            foreach (T value in enumerable)
            {
                action(value);
            }
        }
    }
}
0 голосов
/ 15 апреля 2011

Начните с

Dictionary:
    key:  letter    
    value:  List of alternate choices for that letter

create a new empty word
for each letter in the word,
    randomly choose an alternate choice and add it to the new word.
0 голосов
/ 15 апреля 2011

Вы должны посмотреть на перестановку строк.

http://www -edlab.cs.umass.edu / cs123 / Проекты / Перестановка / project6.htm

...