Разбавить строку точками c#

307
29 сентября 2017, 15:47

Собственно есть строка "stackoverflow", нужно её разбавить точками(подскажите алгоритм), вот пример:

stackoverflo.w@gmail.com 
stackoverfl.ow@gmail.com 
stackoverfl.o.w@gmail.com 
stackoverf.low@gmail.com 
stackoverf.lo.w@gmail.com 
stackoverf.l.ow@gmail.com 
stackoverf.l.o.w@gmail.com 
stackover.flow@gmail.com 
stackover.flo.w@gmail.com 
stackover.fl.ow@gmail.com 
stackover.fl.o.w@gmail.com 
stackover.f.low@gmail.com 
stackover.f.lo.w@gmail.com 
stackover.f.l.ow@gmail.com 
stackover.f.l.o.w@gmail.com 
stackove.rflow@gmail.com 
stackove.rflo.w@gmail.com 
stackove.rfl.ow@gmail.com 
stackove.rfl.o.w@gmail.com 
stackove.rf.low@gmail.com 
stackove.rf.lo.w@gmail.com 
stackove.rf.l.ow@gmail.com 
stackove.rf.l.o.w@gmail.com 
stackove.r.flow@gmail.com 
stackove.r.flo.w@gmail.com 
stackove.r.fl.ow@gmail.com 
stackove.r.fl.o.w@gmail.com 
stackove.r.f.low@gmail.com 
stackove.r.f.lo.w@gmail.com 
stackove.r.f.l.ow@gmail.com 
stackove.r.f.l.o.w@gmail.com 
stackov.erflow@gmail.com 
stackov.erflo.w@gmail.com 
stackov.erfl.ow@gmail.com 
stackov.erfl.o.w@gmail.com 
stackov.erf.low@gmail.com 
stackov.erf.lo.w@gmail.com 
stackov.erf.l.ow@gmail.com 
stackov.erf.l.o.w@gmail.com 
stackov.er.flow@gmail.com 
stackov.er.flo.w@gmail.com 
stackov.er.fl.ow@gmail.com 
stackov.er.fl.o.w@gmail.com 
stackov.er.f.low@gmail.com 
stackov.er.f.lo.w@gmail.com 
stackov.er.f.l.ow@gmail.com 
stackov.er.f.l.o.w@gmail.com 
stackov.e.rflow@gmail.com 
stackov.e.rflo.w@gmail.com 
stackov.e.rfl.ow@gmail.com 
stackov.e.rfl.o.w@gmail.com 
stackov.e.rf.low@gmail.com 
stackov.e.rf.lo.w@gmail.com 
stackov.e.rf.l.ow@gmail.com 
stackov.e.rf.l.o.w@gmail.com 
stackov.e.r.flow@gmail.com 
stackov.e.r.flo.w@gmail.com 
stackov.e.r.fl.ow@gmail.com 
stackov.e.r.fl.o.w@gmail.com 
stackov.e.r.f.low@gmail.com 
stackov.e.r.f.lo.w@gmail.com 
stackov.e.r.f.l.ow@gmail.com 
stackov.e.r.f.l.o.w@gmail.com 
stacko.verflow@gmail.com 
stacko.verflo.w@gmail.com 
stacko.verfl.ow@gmail.com 
stacko.verfl.o.w@gmail.com 
stacko.verf.low@gmail.com 
stacko.verf.lo.w@gmail.com 
stacko.verf.l.ow@gmail.com 
stacko.verf.l.o.w@gmail.com 
stacko.ver.flow@gmail.com 
stacko.ver.flo.w@gmail.com 
stacko.ver.fl.ow@gmail.com 
stacko.ver.fl.o.w@gmail.com 
stacko.ver.f.low@gmail.com 
stacko.ver.f.lo.w@gmail.com 
stacko.ver.f.l.ow@gmail.com 
stacko.ver.f.l.o.w@gmail.com 
stacko.ve.rflow@gmail.com 
stacko.ve.rflo.w@gmail.com 
stacko.ve.rfl.ow@gmail.com 
stacko.ve.rfl.o.w@gmail.com 
stacko.ve.rf.low@gmail.com 
stacko.ve.rf.lo.w@gmail.com 
stacko.ve.rf.l.ow@gmail.com 
stacko.ve.rf.l.o.w@gmail.com 
stacko.ve.r.flow@gmail.com 
stacko.ve.r.flo.w@gmail.com 
stacko.ve.r.fl.ow@gmail.com 
stacko.ve.r.fl.o.w@gmail.com 
stacko.ve.r.f.low@gmail.com 
stacko.ve.r.f.lo.w@gmail.com 
stacko.ve.r.f.l.ow@gmail.com 
stacko.ve.r.f.l.o.w@gmail.com 
stacko.v.erflow@gmail.com 
stacko.v.erflo.w@gmail.com 
stacko.v.erfl.ow@gmail.com 
stacko.v.erfl.o.w@gmail.com 
stacko.v.erf.low@gmail.com 
stacko.v.erf.lo.w@gmail.com 
stacko.v.erf.l.ow@gmail.com 
stacko.v.erf.l.o.w@gmail.com 
stacko.v.er.flow@gmail.com 
stacko.v.er.flo.w@gmail.com 
stacko.v.er.fl.ow@gmail.com 
stacko.v.er.fl.o.w@gmail.com 
stacko.v.er.f.low@gmail.com 
stacko.v.er.f.lo.w@gmail.com 
stacko.v.er.f.l.ow@gmail.com 
stacko.v.er.f.l.o.w@gmail.com 
stacko.v.e.rflow@gmail.com 
stacko.v.e.rflo.w@gmail.com 
stacko.v.e.rfl.ow@gmail.com 
stacko.v.e.rfl.o.w@gmail.com 
stacko.v.e.rf.low@gmail.com 
stacko.v.e.rf.lo.w@gmail.com 
stacko.v.e.rf.l.ow@gmail.com 
stacko.v.e.rf.l.o.w@gmail.com 
stacko.v.e.r.flow@gmail.com 
stacko.v.e.r.flo.w@gmail.com 
stacko.v.e.r.fl.ow@gmail.com 
stacko.v.e.r.fl.o.w@gmail.com 
stacko.v.e.r.f.low@gmail.com 
stacko.v.e.r.f.lo.w@gmail.com 
stacko.v.e.r.f.l.ow@gmail.com 
stacko.v.e.r.f.l.o.w@gmail.com 
stack.overflow@gmail.com 
stack.overflo.w@gmail.com 
stack.overfl.ow@gmail.com 
stack.overfl.o.w@gmail.com 
stack.overf.low@gmail.com 
stack.overf.lo.w@gmail.com 
stack.overf.l.ow@gmail.com 
stack.overf.l.o.w@gmail.com 
stack.over.flow@gmail.com 
stack.over.flo.w@gmail.com 
stack.over.fl.ow@gmail.com 
stack.over.fl.o.w@gmail.com 
stack.over.f.low@gmail.com 
stack.over.f.lo.w@gmail.com 
stack.over.f.l.ow@gmail.com 
stack.over.f.l.o.w@gmail.com 
stack.ove.rflow@gmail.com 
stack.ove.rflo.w@gmail.com 
stack.ove.rfl.ow@gmail.com 
stack.ove.rfl.o.w@gmail.com 
stack.ove.rf.low@gmail.com 
stack.ove.rf.lo.w@gmail.com 
stack.ove.rf.l.ow@gmail.com 
stack.ove.rf.l.o.w@gmail.com 
stack.ove.r.flow@gmail.com 
stack.ove.r.flo.w@gmail.com 
stack.ove.r.fl.ow@gmail.com 
stack.ove.r.fl.o.w@gmail.com 
stack.ove.r.f.low@gmail.com 
stack.ove.r.f.lo.w@gmail.com 
stack.ove.r.f.l.ow@gmail.com 
stack.ove.r.f.l.o.w@gmail.com 
stack.ov.erflow@gmail.com 
stack.ov.erflo.w@gmail.com 
stack.ov.erfl.ow@gmail.com 
stack.ov.erfl.o.w@gmail.com 
stack.ov.erf.low@gmail.com 
stack.ov.erf.lo.w@gmail.com 
stack.ov.erf.l.ow@gmail.com 
stack.ov.erf.l.o.w@gmail.com 
stack.ov.er.flow@gmail.com 
stack.ov.er.flo.w@gmail.com 
stack.ov.er.fl.ow@gmail.com 
stack.ov.er.fl.o.w@gmail.com 
stack.ov.er.f.low@gmail.com 
stack.ov.er.f.lo.w@gmail.com 
stack.ov.er.f.l.ow@gmail.com 
stack.ov.er.f.l.o.w@gmail.com 
stack.ov.e.rflow@gmail.com 
stack.ov.e.rflo.w@gmail.com 
stack.ov.e.rfl.ow@gmail.com 
stack.ov.e.rfl.o.w@gmail.com 
stack.ov.e.rf.low@gmail.com 
stack.ov.e.rf.lo.w@gmail.com 
stack.ov.e.rf.l.ow@gmail.com 
stack.ov.e.rf.l.o.w@gmail.com 
stack.ov.e.r.flow@gmail.com 
stack.ov.e.r.flo.w@gmail.com 
stack.ov.e.r.fl.ow@gmail.com 
stack.ov.e.r.fl.o.w@gmail.com 
stack.ov.e.r.f.low@gmail.com 
stack.ov.e.r.f.lo.w@gmail.com 
stack.ov.e.r.f.l.ow@gmail.com 
stack.ov.e.r.f.l.o.w@gmail.com 
stack.o.verflow@gmail.com 
stack.o.verflo.w@gmail.com 
stack.o.verfl.ow@gmail.com 
stack.o.verfl.o.w@gmail.com 
stack.o.verf.low@gmail.com 
stack.o.verf.lo.w@gmail.com 
stack.o.verf.l.ow@gmail.com 
stack.o.verf.l.o.w@gmail.com 
stack.o.ver.flow@gmail.com

Answer 1

Между каждой парой букв - таких мест у вас 12 - либо точка есть, либо нет. Если есть - обозначим как 1, если нет - как 0. Получается строка из 12 нулей и единиц, т.е. просто бинарное представление числа от 0 до 4095...

Дальше рассказывать или уже все очевидно? :)

Update

Гм, как ни грустно - но таки рассказывать... :(

#include <iostream>
using namespace std;
const char * s = "stackoverflow";

int main(int argc, const char * argv[])
{
    for(unsigned int n = 0; n < 4096; ++n)
    {
        cout << s[0];
        unsigned int m = n;
        for(int i = 0; i < 12; ++i)
        {
            if (m&1) cout << ".";
            m >>= 1;
            cout << s[i+1];
        }
        cout << endl;
    }
}
Answer 2

Рассмотрим строку:

hello

В ней есть длина_строки - 1 мест, куда можно вставить точку:

h.e.l.l.o

В каждое место можно либо вставить точку, либо не вставить. Пусть мы вставили точки в некоторые позиции:

h.e.ll.o

Сопоставим каждой позиции 0 (если мы не вставили в эту позицию точку) или 1 (если вставили):

h.e.l l.o
 1 1 0 1

Получим строку из нулей и единиц:

1101

По сути это число от 0 до (длина_слова - 1) ^ 2 - 1, записанное в двоичной системе исчисления. Переберём все такие числа:

for (int mask = 0; mask < (1 << (длина_слова - 1)); ++mask)

и для каждого числа найдём строку, ему соответствующую:

string result;
for (int i = 0; i < длина_слова - 1; ++i) {
    result.push_back(word[i]);
    if (mask & (1 << i))
        result.push_back('.');
}
result.push_back(word.back());

Ideone

Answer 3

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

Как это будет выглядеть в двоичном виде:

1 - 0001
2 - 0010
3 - 0011 (отбрасываем)
4 - 0100
5 - ...

Ну вот пример кода (правда на С++, ну думаю это не проблема) :

bool check(int num, int length)
{
    if ((1 << length)&num) return false;
    if (1&num) return false;
    for (int i = 0; i < length-1; i++)
    {
        if ( (1 << i) & num  && (1 << (i + 1)) & num) return false;
    }
    return true;
}
int main()
{
    string s = "stackoverflow";
    int length = s.length();
    for (int mask = 0; mask < (1 << 2*length); mask++)
    {
        if (!check(mask,length)) continue;
        string copy = s;
        for (int i = 0; i < length; i++)
        {
            if (mask & (1 << i)) copy.insert(copy.begin()+i,'.');
        }
        cout << copy <<endl;
    }
}

Часть вывода:

sta.cko.v.erflow
s.t.ack.o.verflow
stac.ko.v.erflow
s.ta.ck.o.verflow
st.a.ck.o.verflow
stack.o.v.erflow
s.tac.k.o.verflow
st.ac.k.o.verflow
sta.c.k.o.verflow
s.t.a.c.k.overflow
stackoverf.low
s.tackover.flow
st.ackover.flow
sta.ckover.flow
s.t.ackove.rflow
stac.kover.flow
s.ta.ckove.rflow
st.a.ckove.rflow
READ ALSO
Сортировка списка с учетом регистра list.Sort() - C#

Сортировка списка с учетом регистра list.Sort() - C#

Сортировка списка с учетом регистра listSort() - C#

247
Создание автообновления

Создание автообновления

Я пытался создать автообновление своей программы через zip-архивДля этого использую DotNetZip (Ionic

228
C# Скачивание изображения из документа по url на litres.ru (Режим только чтение)

C# Скачивание изображения из документа по url на litres.ru (Режим только чтение)

Здравствуйте! Недавно столкнулся с проблемой скачивания картинки с сайта litresru

257
Как использовать progress bar если много файлов на загрузку?

Как использовать progress bar если много файлов на загрузку?

Доброй ночи, подскажите как использовать ProgressBar при загрузке множества файловУ меня всегда разный список ссылок и программа узнает об этом...

259