Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


nastasa, Я не силён в комбинаторике, поэтому оценить объём выходного файла не берусь.
Я поставил задачу в общем виде:
Необходимо сформировать все возможные слова длиной M символов.
Набор возможных символов задаётся. Число возможных символов >=M
В сформированном слове не должно быть одинаковых символов.
Вот VBS-скрипт, реализующий эту постановку. После его запуска дождитесь сообщения, что он отработал
Код: Выделить весь код
'Sym = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9")

Sym = Array("A", "B", "C", "D", "E", "F", "G")      ' Набор символов для составления слов
M = 7                                               ' Длина слова

File_Out = "Z:\Box_Out\kuku.txt"    ' Файл со списком слов (результат работы)

NM = M - 1
ReDim iSym(NM)

NS = UBound(Sym)

For k = 0 To NM
    iSym(k) = k
Next
    
Set FSO = CreateObject("Scripting.FileSystemObject")
Set NFile = FSO.OpenTextFile(File_Out, 2, True)
    
Do While iSym(0) <= NS
    Equ = False
    For k = 0 To NM
        For kk = k + 1 To NM
            Equ = (iSym(k) = iSym(kk))
            If Equ Then Exit For
        Next
        If Equ Then Exit For
    Next
        
    If Not Equ Then
        SS = ""
        For k = 0 To NM
            SS = SS + Sym(iSym(k))
        Next
'        MsgBox SS
        NFile.WriteLine SS
    End If
            
    For k = NM To 0 Step -1
        iSym(k) = iSym(k) + 1
        If iSym(k) <= NS Then Exit For
        If k <> 0 Then iSym(k) = 0
    Next
Loop

NFile.Close

MsgBox "Скрипт отработал"
Определите путь к выходному файлу.
В приведенном примере длина слова M=7
Взят набор из 7 символов "A", "B", "C", "D", "E", "F", "G"
В выходном файле получилось 5040 значений.

Для набора из 8 символов "A", "B", "C", "D", "E", "F", "G", "H" и длине слова M=7
в выходном файле получилось 40320 значений. И время выполнения выросло резко.
Не знаю, но, по видимому, можно применить более эффективный алгоритм.

Вы можете всё это поменять, лишь бы число возможных символов было не менее длины слова - никаких защит от этого я не предусматривал.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 21-02-2017 в 20:31.


Отправлено: 20:08, 21-02-2017 | #10