从单词生成单词列表

时间:2011-04-15 03:58:59

标签: c# random word

寻找想法,开始使用我称之为障碍词汇词生成器的词。

它需要一个字符串,例如“你好”,基本上看起来会产生类似词语的更多可能性,即返回类似的东西:

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

如您所见,我需要对上限敏感。

我只是在寻找能够解决这个问题的想法/方法。

也许第一次传球是帽子:

  • 你好
  • 你好
  • HELLO
  • 你好
  • HELLO
  • ...

然后将该列表/数组提供给子编号/符号的方法

我很有信心并且最有可能使用C#(至少开始)这个应用程序。

如果已经写了一些可用的东西,那就是我正在谈论的那种东西,那就更好了,我很乐意听到它。

感谢阅读。

4 个答案:

答案 0 :(得分:2)

这个评论太长了,但这不是一个真正的答案。仅仅是一个建议。首先,请考虑以下链接:

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.

每一个都是一个序列。因此,在您的问题中,您可以将原始输入“hello”转换为一个过程,在该过程中您可以获取与字符串中每个字符对应的序列,然后获取这些序列并获取其笛卡尔积。 Eric Lippert链接博客中的方法将是继续从这里继续的好指南。

答案 1 :(得分:1)

此示例将Anthony Pegram的想法纳入代码中。我对您的字母映射和输入进行了硬编码,但您可以轻松地更改它。

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);
            }
        }
    }
}

答案 2 :(得分:0)

答案 3 :(得分:0)

开头
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.