#c# #random #word
#c# #Случайный #word
Вопрос:
ищу идеи для начала работы над тем, что я бы назвал генератором списка слов-обскурантов word.
он принимает строку, например, «hello» и в основном стремится сгенерировать из нее дополнительные возможности похожих слов, т. Е. возвращает что-то вроде:
- h3ll0
- he11o
- HEL10
- h3LLo
- …
- …
Как вы можете видеть, мне нужно учитывать заглавные буквы.
Я просто ищу идеи / способы, которыми я мог бы это запустить.
Может быть, первый проход выполняет функцию cap:
- здравствуйте
- Здравствуйте
- здравствуйте
- Здравствуйте
- здравствуйте
- …
и затем передайте этот список / массив в метод для дополнительных чисел / символов
Я уверен в C # и, скорее всего, буду использовать его (по крайней мере, для запуска) этого приложения.
Если уже написано что-то доступное, что делает то, о чем я говорю, тем лучше, я хотел бы услышать об этом.
Спасибо за чтение.
Ответ №1:
Это слишком длинно, чтобы быть комментарием, но это не настоящий ответ. Просто предложение. Сначала рассмотрим эту ссылку:
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» в процесс, в котором вы берете последовательности, соответствующие каждому символу в строке, а затем берете эти последовательности и получаете их декартовы произведения. Методология в блоге Эрика Липперта, на который дана ссылка, была бы отличным руководством для продолжения здесь.
Комментарии:
1. Спасибо, отличный ответ / комментарий — к сожалению, я не могу проголосовать за atm
2. @tanxiong: если этого достаточно для начала, вы можете принять ответ.
Ответ №2:
Этот пример воплощает идею Энтони Пеграма в коде. Я жестко запрограммировал ваши сопоставления букв и ввод, но вы сможете легко это изменить.
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);
}
}
}
}
Ответ №3:
Вам следует изучить перестановку строк.
http://www-edlab.cs.umass.edu/cs123/Projects/Permutation/project6.htm
Ответ №4:
Начните с
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.