Алгоритм перемещения точек (точки) внутри адреса электронной почты - PullRequest
2 голосов
/ 21 марта 2012

Для тех, кто не знает, GMAIL позволяет создавать потенциально неограниченное количество электронных писем на основе вашего исходного электронного письма.Если ваш адрес электронной почты «mygmail@gmail.com», то это может быть достигнуто двумя способами:

1) Добавление текста после «+» в конце вашего gmail, например, mygmail+somethinghere@gmail.com Все электронные письмавсе равно будет отправлено на mygmail@gmail.com

2) Размещение "."в пределах вашего адреса Gmail (кроме начала и конца) egmygmail@gmail.com, mygmail@gmail.com, m.yg.mai.l@gmail.com и т. д. Примечание: my..gmail @ gmai.com и mygmail @gm.ail.com не будет работать!

Я тестирую приложение, которое требует регистрации через действующий адрес электронной почты (отправляет активацию по электронной почте).Метод (1) - самый простой способ сделать это, но поле адреса электронной почты не допускает "+" в нем.Это означает, что мне нужно создать базу данных учетных записей gmail, используя метод (2).

Может ли кто-нибудь помочь с алгоритмом (предпочтительно кодом C / C ++), где я могу предоставить фрагмент текста, и он генерирует всевозможны ли варианты?

Некоторые быстрые математические расчеты показали, что число возможных комбинаций составляет 2 ^ (n - 1), где n - количество символов в письме.

Спасибо

Ответы [ 2 ]

3 голосов
/ 21 марта 2012
def generateComb(cur,rem):
    if len(rem)>0:
        generateComb(cur +rem[0], rem[1:])
        generateComb(cur+'.'+rem[0], rem[1:])
    else:
        print cur

generateComb('m','ygmail')
0 голосов
/ 21 марта 2012

Еще одно решение для вас в псевдокоде. Идея состоит в том, что есть 2 ^ (n - 1) комбинаций, как вы сказали, где n - длина строки письма, поэтому мы кодируем положения точек в диапазоне чисел от 0 до 2 ^ (n - 1) - 1 .

Предположим, s - это ваш адрес электронной почты без @ part (mygmail в вашем примере).

n = length(s)
for i = 0 to 2^(n - 1) - 1
    s2 = ''
    for j = 0 to n - 2 do
        s2 = s2 + s[j]
        if (bit j in i is set)
           s2 = s2 + '.'
    s2 = s2 + s[n - 1]
    print s2

Теперь, если вы не хотите, чтобы все 2 ^ (n-1) комбинации (могут быть слишком большими, если n> 15), просто закройте первый цикл for, например: для i = от 0 до 999, чтобы получить первые 1000 комбинаций.

В C / C ++ 2 ^ (n-1) переводится в 1 << (n - 1), а (бит j в i установлен) переводится в ((i >> j) & 1).

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