Что нового

Как получить все комбинации из набора слов?

Larry

Новичок
Сообщения
10
Репутация
0
Привет!

У меня есть набор слов:

красный / белый / черный / желтый / зеленый

Мне нужно получить все сущеcтвующие комбинации этих слов:

красный черный

желтый зеленый красный

белый


итд.....

если я не ошибаюсь - то 5^5 = 3125 возможных комбинации

И результат желательно записать в txt в виде 3125 строк. ( 1 вариант на каждую строку)

Подскажите пжл.
Сообщение автоматически объединено:

Привет!

У меня есть набор слов:

красный / белый / черный / желтый / зеленый

Мне нужно получить все сущеcтвующие комбинации этих слов:

красный черный

желтый зеленый красный

белый


итд.....

если я не ошибаюсь - то 5^5 = 3125 возможных комбинации

И результат желательно записать в txt в виде 3125 строк. ( 1 вариант на каждую строку)

Подскажите пжл.

Спустя некоторое время я решил перефразировать задачу, так как никто не откликнулся(((

Есть некоторое выражение:

Код:
Global $word1[2] ;
$word1[0] = "красный"
$word1[1] = "синий"

Global $word2[2] ;
$word2[0] = "белый"
$word2[1] = "черный"

Dim $i[2] = [0, 2]

$expression = $word1[$i] & $word2[$i]


Как получить все возможные комбинации $expression ?
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Если исходных массива только два, то проще простым перебором:
Код:
#include <Array.au3>

Global $word1[2] ;
$word1[0] = "красный"
$word1[1] = "синий"

Global $word2[2] ;
$word2[0] = "белый"
$word2[1] = "черный"

Dim $aExpression[0]
Global $n=0
_Expression($word1 , $word2 , $aExpression)
_Expression($word2 , $word1 , $aExpression)

Func _Expression(ByRef $Array1 , ByRef $Array2 , ByRef $aExpression)
    For $i=0 to UBound($Array1)-1
        For $y=0 To Ubound($Array2)-1
            $n+=1
            Redim $aExpression[$n]
            $aExpression[$n-1]=$Array1[$i]&' '&$Array2[$y]
        Next
    Next
EndFunc

_ArrayDisplay($aExpression)
 
Автор
L

Larry

Новичок
Сообщения
10
Репутация
0
Если исходных массива только два, то проще простым перебором:
Код:
#include <Array.au3>

Global $word1[2] ;
$word1[0] = "красный"
$word1[1] = "синий"

Global $word2[2] ;
$word2[0] = "белый"
$word2[1] = "черный"

Dim $aExpression[0]
Global $n=0
_Expression($word1 , $word2 , $aExpression)
_Expression($word2 , $word1 , $aExpression)

Func _Expression(ByRef $Array1 , ByRef $Array2 , ByRef $aExpression)
    For $i=0 to UBound($Array1)-1
        For $y=0 To Ubound($Array2)-1
            $n+=1
            Redim $aExpression[$n]
            $aExpression[$n-1]=$Array1[$i]&' '&$Array2[$y]
        Next
    Next
EndFunc

_ArrayDisplay($aExpression)
Спасибо!
Все четко.Момба!) Но вот насчет количества массивов - то конечно же это основной параметр - который будет меняться
Тоесть будет меняться количество массивов и количество вариантов в массиве. Соответственно.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Количество элементов в массивах без разницы , а вот если массивов больше двух, то придётся применять более сложные алгоритмы, пример выше не годится !
К первой части вашего вопроса вариант с повторениями и рекурсией :
Код:
Global $a[5]=['красный' , 'белый' , 'черный' ,'желтый' , 'зеленый']
Global $MyFile=@ScriptDir&'\Result.txt'
Dim $res[2]
Global $Text=''
Global $n
Global $m=Ubound($a)

For $n=2 to $m
  redim $res[$n]
  Rec(0)
Next

$hFile=FileOpen($MyFile,2)
FileWrite($hFile,$Text)
FileClose($hFile)

Func Rec($id)
    Local $Tail
    If $id=$n Then
        For $j=0 to $n-1
            $Tail=($j<$n-1?' ':@CR)
            $Text&=$res[$j]&$Tail
        Next
        Return
    EndIf

    For $i=1 to $m
      $res[$id]=$a[$i-1]
      Rec($id+1)
    Next
EndFunc
 
Последнее редактирование:
Автор
L

Larry

Новичок
Сообщения
10
Репутация
0
Количество элементов в массивах без разницы , а вот если массивов больше двух, то придётся применять более сложные алгоритмы, пример выше не годится !
К первой части вашего вопроса вариант с повторениями и рекурсией :
Код:
Global $a[5]=['красный' , 'белый' , 'черный' ,'желтый' , 'зеленый']
Global $MyFile=@ScriptDir&'\Result.txt'
Dim $res[2]
Global $Text=''
Global $n
Global $m=Ubound($a)

For $n=2 to $m
  redim $res[$n]
  Rec(0)
Next

$hFile=FileOpen($MyFile,2)
FileWrite($hFile,$Text)
FileClose($hFile)

Func Rec($id)
    Local $Tail
    If $id=$n Then
        For $j=0 to $n-1
            $Tail=($j<$n-1?' ':@CR)
            $Text&=$res[$j]&$Tail
        Next
        Return
    EndIf

    For $i=1 to $m
      $res[$id]=$a[$i-1]
      Rec($id+1)
    Next
EndFunc
Спасибо!
А я вот первый вариант изменил :

Код:
Dim $aExpression[0]
Global $n=0
_Expression($word1 , $word2 , $word3 , $word4 , $aExpression)
;_Expression($word2 , $word1 , $aExpression)

Func _Expression(ByRef $Array1 , ByRef $Array2 , ByRef $Array3 , ByRef $Array4 , ByRef $aExpression)
    For $a=0 to UBound($Array1)-1
        For $b=0 To Ubound($Array2)-1
            For $c=0 To Ubound($Array3)-1
                For $d=0 To Ubound($Array4)-1
            $n+=1


Разве не подойдет? Вроде работает.

У меня сейчас другая проблема - не знаю как в текстовый файл записывать результат

_ArrayDisplay($aExpression) - мне не подходит(
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Разве не подойдет? Вроде работает.
Не совсем правильная перестановка получится, хотя я не знаю Ваших целей и требований. В таком виде на первом месте будет всегда элемент из первого массива, на втором из второго итд.
Сообщение автоматически объединено:

У меня сейчас другая проблема - не знаю как в текстовый файл записывать результат
Из массива самый простой способ _FileWriteFromArray
 
Автор
L

Larry

Новичок
Сообщения
10
Репутация
0
Не совсем правильная перестановка получится, хотя я не знаю Ваших целей и требований. В таком виде на первом месте будет всегда элемент из первого массива, на втором из второго итд.
На самом деле - так и планировалось изначально. Массивами формирую скелет предложения и делаю вариации.
 
Верх