Текущий архив: 2008.07.06;
Скачать: CL | DM;
Вниз
Получить все возможные комбинации символов :( Найти похожие ветки
← →
Рамиль_ (2008-05-25 21:14) [40]Код не работает.. Ну есть там ошибка логическая.. Думалка в выходные не работает)
← →
Zeqfreed © (2008-05-25 21:16) [41]
> Короч, никто никогда именно такими делами не занимался.
> Ясно
Ы!#!/usr/bin/python
def generator(list):
c = 0
list.reverse()
while True:
c = c + 1
el = list.pop()
list.insert(0, el)
yield el, ((c + len(list) - 1) % len(list) == 0)
gens = []
for i in range(0, 10):
gens.append(generator([0, 1, 2, 3, 4]));
gens[i].next()
comb = [0] * 10;
def update(idx):
global comb
if idx == -1:
return False
val, t = gens[idx].next()
if idx == 9:
print comb
comb[idx] = val
if t:
print "yep"
return update(idx - 1)
return True
go = True
while go:
go = update(9)
← →
No_Dead © (2008-05-25 21:18) [42]> [41] Zeqfreed © (25.05.08 21:16)
извращенец:)))
← →
TIF © (2008-05-25 21:25) [43]> Zeqfreed © (25.05.08 21:16) [41]
Кхе, бфу, кжагхххр... фх... Мне плохо :(
Не, алгоритмический язык проще... Я даже определить не могу, что это такое, то ли C, то ли php... Я теперь вообще завис, после такого поста :-(
← →
Zeqfreed © (2008-05-25 21:31) [44]> что это такое, то ли C, то ли php
То ли там написано :)
Куда более алгоритмически? :)
Основная фишка, которая тут используется это генератор, который позволяет как раз таки не заморачиваться переключением цифр (они же символы, они же все что угодно), он возвращает следующее значение циклически и флаг, прокрутился ли до конца список.
← →
TIF © (2008-05-25 21:33) [45]> Основная фишка
Мне бы ещё догадаться, куда это чудо засунуть и где компилить (если вообще нужно это делать) %)))
← →
Рамиль_ (2008-05-25 21:39) [46]Ну смотри, если еще и это не заработает...
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
SymbArray: array [0..4] of string = ("a", "b", "c", "d", "e");
i: integer;
function NComb(Symb: string; n: integer): string;
var
i: integer;
begin
if n > 1 then
for i := 0 to High(SymbArray) do
begin
Result := NComb(Symb + SymbArray[i], n-1);
Writeln(Result);
end
else
begin
for i := 0 to High(SymbArray) do
begin
Result := Symb + SymbArray[i];
Writeln(Result);
end;
end;
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
for i := 0 to High(SymbArray) do
NComb(SymbArray[i], 3);
ReadLn;
end.
← →
Zeqfreed © (2008-05-25 21:39) [47]
#!/usr/bin/python
def generator(list):
c = 0
list.reverse()
while True:
el = list.pop()
list.insert(0, el)
yield el, (c % len(list) == 0)
c = c + 1
gens = []
comb = [None] * 10
for i in range(0, 10):
gens.append(generator([0, 1, 2, 3, 4]));
comb[i], x = gens[i].next()
def update(idx):
if idx == -1:
return False
val, t = gens[idx].next()
comb[idx] = val
if t:
return update(idx - 1)
return True
while True:
print comb
if not update(9):
break
Так. Я немного отошел после учебы, теперь вроде покрасивее выглядит и пологичнее :)
← →
Zeqfreed © (2008-05-25 21:41) [48]> TIF © (25.05.08 21:33) [45]
Питон это. Великий и всемогущий.
← →
TIF © (2008-05-25 21:44) [49]> Ну смотри, если еще и это не заработает...
>
> program Project2;
Работает, но там комбинации повторяются... Сейчас попытаюсь разобраться с кодом поподробнее
← →
TIF © (2008-05-25 21:44) [50]> Питон это. Великий и всемогущий.
Python?
← →
Zeqfreed © (2008-05-25 21:50) [51]> TIF © (25.05.08 21:44) [50]
Именно.
← →
Умище (2008-05-25 22:07) [52]
unit ufMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm8 = class(TForm)
Button1: TButton;
edNum: TEdit;
Label1: TLabel;
Label2: TLabel;
EdM: TEdit;
Label3: TLabel;
EdN: TEdit;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
end;
PComb=^TCOmb;
TComb=record
n: Integer;
arr: array of String;
end;
var
Form8: TForm8;
SrcSym: String;
Num: Integer;
M: Integer;
N: Integer;
LResult: TList;
implementation
{$R *.dfm}
procedure TForm8.Button1Click(Sender: TObject);
var
i,j,k: Integer;
p,pCurr: PComb;
s: String;
L: TStringList;
begin
LResult.Clear;
Num := StrToInt(EdNum.Text);
M := StrToInt(EdM.Text);
N := StrToInt(EdN.Text);
SetLength(SrcSym,Num);
for i :=1 to Num do SrcSym[i] := Chr(96+i);
New(p);
LResult.Add(p);
p^.n := 1;
s :="";
SetLength(p^.arr,Num);
for i := 1 to Num do p^.arr[i-1] := SrcSym[i];
for i := 2 to N do
begin
New(pCurr);
LResult.Add(pCurr);
p := LResult[i-2];
for j := 1 to Num do
begin
for k := 1 to Length(p^.arr) do
begin
if Pos(SrcSym[j],p^.arr[k-1])>0 then Continue;
SetLength(pCurr^.arr,Length(pCurr^.arr)+1);
pCurr^.arr[High(pCurr^.arr)] := SrcSym[j]+p^.arr[k-1];
end;
end;
end;
L := TStringList.Create;
try
for i := 0 to LResult.Count - 1 do
begin
s :="";
for j := 0 to High(PComb(LResult[i])^.arr) do
begin
s := s+PComb(LResult[i])^.arr[j]+",";
end;
L.Add(s);
end;
L.SaveToFile("c:\comb.txt");
finally
L.Free;
end;
end;
procedure TForm8.FormCreate(Sender: TObject);
begin
LResult := TList.Create;
end;
procedure TForm8.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i := LResult.Count-1 downto 0 do
begin
Dispose(PComb(LResult[i]));
LResult.Delete(i);
end;
LResult.Free;
end;
end.
← →
Умище (2008-05-25 22:10) [53]Единственное не сделано - не удвлены коминации менее чем из M символов.
Вот исправление:L := TStringList.Create;
try
for i := m-1 to LResult.Count - 1 do
begin
s :="";
for j := 0 to High(PComb(LResult[i])^.arr) do
begin
s := s+PComb(LResult[i])^.arr[j]+",";
end;
L.Add(s);
end;
L.SaveToFile("c:\comb.txt");
finally
L.Free;
end;
← →
TIF © (2008-05-25 22:11) [54]Спасибо огромное, сейчас проверю, с чем это едят...
← →
Умище (2008-05-25 22:16) [55]PComb=^TCOmb;
TComb=record
n: Integer;
arr: array of String;
end;
Думал, что n: Integer понадобится в расчетах... Не понадобилось. Удалять не стал.
Естественно, для больших значение Numb и N не хватит ОП...
← →
Anatoly Podgoretsky © (2008-05-25 22:21) [56]
> TIF © (25.05.08 20:44) [35]
> > Да какая тут к черту рекурсия, тут даже дисков не хватит,
>
> > это же !200^N
>
> Да что такое... Не то вы мне дали... Откуда какие-то странные
> огромные факториалы?! У меня может максимальная длина комбинации
> будет 10 символов...
Да, ну, так же чем же разглогольствовал про
> А если N=200? мне что, 200 переменных заволить...
← →
TIF © (2008-05-25 22:26) [57]
Num := StrToInt(EdNum.Text);
Этим мы задаём кол-во символов? Конечно, не очень мне это нравится, например, у меня будет символ точка, так он идёт не по-порядку за латиницей, Chr тут вряд ли поможет...a,b,c,
ab,ac,ba,bc,ca,cb,
При выводе результатов последний элемент обрезается
PS: сейчас мозги потихоньку включаются. попробую поработать над своим вариантом
← →
ага (2008-05-25 22:31) [58]
> TIF © (25.05.08 22:26) [57]
> ab,ac,ba,bc,ca,cb,
Никто так и не задал самый главный вотпрс: ЗАЧЕМ это надо?
← →
Умище (2008-05-25 22:32) [59]
> TIF © (25.05.08 22:26) [57]
> Num := StrToInt(EdNum.Text);Этим мы задаём кол-во символов?
> Конечно, не очень мне это нравится, например, у меня будет
> символ точка, так он идёт не по-порядку за латиницей, Chr
> тут вряд ли поможет...a,b,c,ab,ac,ba,bc,ca,cb,При выводе
> результатов последний элемент обрезаетсяPS: сейчас мозги
> потихоньку включаются. попробую поработать над своим вариантом
Ну я просто последовательно взял буквы. Конечно это совершенно не обязательно...
У меня вроде не обрезается последний элемент...
← →
Умище (2008-05-25 22:32) [60]
> ага (25.05.08 22:31) [58]
> > TIF © (25.05.08 22:26) [57]> ab,ac,ba,bc,ca,cb,Никто
> так и не задал самый главный вотпрс: ЗАЧЕМ это надо?
А какая разница?
← →
TIF © (2008-05-25 22:34) [61]Хм, так и не получилось реализовать такую последовательность:
aaaa
baaa
caaa
...
cccb
cccc
← →
Умище (2008-05-25 22:37) [62]См. ниже
> Умище (25.05.08 19:50) [28]
> > TIF © (25.05.08 19:44) [27]У тебя в массиве есть повторяющиеся
> символы? Их повторно надо использовать? Комбинации неповторяющиеся
> должны быть?
> TIF © (25.05.08 19:53) [29]
> > У тебя в массиве есть повторяющиеся символы? Их повторно
> > надо использовать? Комбинации неповторяющиеся должны быть?
> Повторяющихся нет, комбинации должны быть НЕповторяющиеся.
> ..В крайнем случае можно и с повторами, потом просто отфильтрую
> лишнее
← →
Умище (2008-05-25 22:38) [63]
> TIF © (25.05.08 22:34) [61]
> Хм, так и не получилось реализовать такую последовательность:
> aaaabaaacaaa...cccbcccc
А это уже другой алгоритм...
← →
ага (2008-05-25 22:38) [64]
> Умище (25.05.08 22:32) [60]
>
>
> > ага (25.05.08 22:31) [58]
> > > TIF © (25.05.08 22:26) [57]> ab,ac,ba,bc,ca,cb,Никто
> > так и не задал самый главный вотпрс: ЗАЧЕМ это надо?
>
>
> А какая разница?
Зачастую подобные желания вызваны незнанием или непониманием и решать их
можно более правильно. Так что хотелось бы все-таки узнать - зачем :)
Если действительно нужен перебор всех комбинаций (брутфорс там какой-
нибудь) - нет проблем.
← →
Умище (2008-05-25 22:39) [65]
> ага (25.05.08 22:38) [64]
Да иногда просто размять мозг полезно;)
← →
TIF © (2008-05-25 22:41) [66]> А это уже другой алгоритм...
Так вроде мне его и надо было :) Ой, запутали вы меня. Буду думать
> Зачастую подобные желания вызваны незнанием или непониманием
> и решать их
> можно более правильно. Так что хотелось бы все-таки узнать
> - зачем :)
> Если действительно нужен перебор всех комбинаций (брутфорс
> там какой-
> нибудь) - нет проблем.
Да, что-то вроде этого
← →
Zeqfreed © (2008-05-25 22:43) [67]Чего тут думать-то?
← →
Игорь Шевченко © (2008-05-25 23:06) [68]пароли подбирает, <слово нехорошее>
← →
TIF © (2008-05-25 23:10) [69]> пароли подбирает, <слово нехорошее>
Не совсем. Тут ещё смотря к чему...
Сейчас представлю своё видение проблемы и принцип решения... Вам, наверное, любопытно будет взглянуть :)
← →
Игорь Шевченко © (2008-05-25 23:14) [70]TIF © (25.05.08 23:10) [69]
> Не совсем.
А пофиг. Все равно, кандидат
← →
TIF © (2008-05-25 23:25) [71]Так, кажется вышел на нужный путь
Разобрал всё по пунктам :)
Получилась некая "символьная" система счисления, складывание идёт справа налево... %-)
Символы: A, B и C
Правила:
1) A + A = B
2) B + A = C
3) C + A = AA
Процесс реализации:
| __A
| __B
| __C
| _AA << C + A = AA (переходим в следующий разряд)
| _AB << A + A = B
| _AC
| _BA << C + A = AA | A + A = B
| _BB
| _BC
| _CA
| _CB
| _CC << C + A = AA | C + A = AA
| AAA
| AAB
| AAC
| ABA << A + A = B
| ABB
| ABC << C + A = AA | B + A = C
| ACA
| ACB
| ACC
| BAA << C + A =AA | C + A = AA | A + A = B
| ... и так далее
Мда, конечно выглядит ужасно, но главное в том, что всё совершенно логично и теоретически работает! %-)
← →
Дмитрий С (2008-05-25 23:30) [72]Система счисления без нуля :)
← →
TIF © (2008-05-25 23:31) [73]> Система счисления без нуля :)
Хе... точно :D
← →
Умище (2008-05-25 23:42) [74]С повторами еще проще реализовать...
← →
Дмитрий С (2008-05-26 00:25) [75]Накидал тут за полчасика:
program Project1;
{$APPTYPE CONSOLE}
const
ABCLength=3;
ABC: array[0..ABCLength-1] of char = ("A","B","C");
function IntToABC(n: Integer):string;
begin
Result := "";
while n>0 do
begin
Result := ABC[(n-1) mod ABCLength] + Result;
n := (n-1) div ABCLength;
end;
end;
function ABCToInt(str: string):Integer;
function GetCharIndex(C:Char):Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to ABCLength-1 do
if ABC[I] = C then
begin
Result := I;
Break;
end;
end;
var
I, N:Integer;
begin
Result := 0;
I := 1;
while I <= Length(str) do
begin
N := GetCharIndex(str[I]);
Result := Result * ABCLength + N + 1;
Inc(I);
end;
end;
function MaxForLength(Len: Integer): Integer;
var
E: Integer;
begin
Result := 0;
E := 1;
while Len > 0 do
begin
E := E * ABCLength;
Result := Result + E;
Dec(Len);
end;
end;
function MinForLength(Len: Integer): Integer;
var
E: Integer;
begin
if Len = 1 then
Result := 1
else
Result := MaxForLength(Len - 1) + 1;
end;
var
I, J: Integer;
begin
// Все комбинации алфавита из 6 букв по порядку
for I := MinForLength(6) to MaxForLength(6) do
Write(IntToABC(I):8);
Writeln;
// Таблица сложения чисел
Write("|":4);
for I := MinForLength(1) to MaxForLength(2) do
begin
Write(IntToABC(I):5, "|");
end;
Writeln;
for I := MinForLength(1) to MaxForLength(2) do
begin
Write(IntToABC(I):3, "|");
for J := MinForLength(1) to MaxForLength(2) do
begin
Write(IntToABC(I+J):5, "|");
end;
Writeln;
end;
Readln;
end.
← →
Дмитрий С (2008-05-26 00:37) [76]Если за алфавит взять мой ник V i d, то получается, что
Vid = id+id :)
А при алфавите P i v o
Pivo = PPo + PPPo
или вот:
Pivo = P + Pivv
Pivo = i + Pivi
Pivo = v + PivP
Pivo = o + Piio
Pivo = PP + Piiv
Pivo = Pi + Piii
Pivo = Pv + PiiP
Pivo = Po + PiPo
Pivo = iP + PiPv
Pivo = ii + PiPi
Pivo = iv + PiPP
Pivo = io + PPoo
Pivo = vP + PPov
Pivo = vi + PPoi
Pivo = vv + PPoP
Pivo = vo + PPvo
Pivo = oP + PPvv
Pivo = oi + PPvi
Pivo = ov + PPvP
Pivo = oo + PPio
Pivo = PPP + PPiv
Pivo = PPi + PPii
Pivo = PPv + PPiP
Pivo = PPo + PPPo
Pivo = PiP + PPPv
Pivo = Pii + PPPi
Pivo = Piv + PPPP
Pivo = Pio + ooo
Pivo = PvP + oov
Pivo = Pvi + ooi
Pivo = Pvv + ooP
Pivo = Pvo + ovo
Pivo = PoP + ovv
Pivo = Poi + ovi
Pivo = Pov + ovP
Pivo = Poo + oio
Pivo = iPP + oiv
Pivo = iPi + oii
Pivo = iPv + oiP
Pivo = iPo + oPo
Pivo = iiP + oPv
Pivo = iii + oPi
Pivo = iiv + oPP
Pivo = iio + voo
Pivo = ivP + vov
Pivo = ivi + voi
Pivo = ivv + voP
Pivo = ivo + vvo
Pivo = ioP + vvv
Pivo = ioi + vvi
Pivo = iov + vvP
Pivo = ioo + vio
Pivo = vPP + viv
Pivo = vPi + vii
Pivo = vPv + viP
Pivo = vPo + vPo
:)))
← →
Дмитрий С (2008-05-26 00:40) [77]Очень интересно, автор в [61] приводит последовательность
> aaaa
> baaa
> caaa
> ...
> cccb
> cccc
т.е. увеличение происходит слева. А в примере в [71] - увеличение разрядов справа.
Наводит на мысли о назначении этого перебора....
← →
TIF © (2008-05-26 00:53) [78]> Дмитрий С (26.05.08 00:25) [75]
Быстро однако :)
Хотя я тут тоже начал набрасывать свой вариант, без подобных переводов ABCToInt, всё-таки его доделаю, раз уж начал
> Дмитрий С (26.05.08 00:37) [76]
:) Новый алфавит появился. Про пиво тоже интересно получилось
> т.е. увеличение происходит слева. А в примере в [71] - увеличение
> разрядов справа.
> Наводит на мысли о назначении этого перебора....
Интересно, что же это за мысли? Тоже хочу узнать о своих идеях то, чего не знал :) Опять про подбор паролей, наверное?
Лично тут я просто-напросто ступил, моя кривая "логика" дала знать о себе: сначала пытался делать как обычно, а потом, посидев 5 минут с листом бумаги, обнаружил, что так рассуждать гораздо легче...
← →
Дмитрий С (2008-05-26 01:13) [79]
> Лично тут я просто-напросто ступил, моя кривая "логика"
> дала знать о себе: сначала пытался делать как обычно, а
> потом, посидев 5 минут с листом бумаги, обнаружил, что так
> рассуждать гораздо легче...
Мысли о том, что тебе всеравно на порядок, главное перебрать все слова. А значит ты делаешь подбор чегото...
← →
TIF © (2008-05-26 01:19) [80]> А значит ты делаешь подбор чегото...
Это само собой... Хотя на порядок тоже внимание стоит обратить, а то можно подбирать до скончания века...
Страницы: 1 2 3 вся ветка
Текущий архив: 2008.07.06;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.021 c