0

これを生成できるPHPのアイデア/コード/アルゴリズムを探しています:

5 文字の文字列 [a-zA-Z0-9] があります。

可変フィルタで順列を生成したい

フィルター :

  1. 文字列は「W」
  2. 文字列は数値です
  3. 文字列は「T」
  4. 文字列は大文字
  5. 文字列は「3」

編集:

<?php

$reset = fopen('list.txt', 'w');
fclose($reset);

$chars = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

$file = fopen('list.txt', 'a+');

foreach ($chars as $c0) {
    foreach ($chars as $c1) {
        foreach ($chars as $c2) {
            foreach ($chars as $c3) {
                foreach ($chars as $c4) {

                    $filter = "/[a-z][a-z][a-z][a-z][A-Z]/";
                    $list = $c0 . $c1 . $c2 . $c3 . $c4;

                    if (preg_match($filter, $list)) {
                        $data = $list . "\n";
                        file_put_contents('list.txt', $data, FILE_APPEND);
                    } 
                }
            }
        }
    }
}
fclose($file);
?>
4

2 に答える 2

1

PHP の場合、このパッケージをダウンロードできます: http://pear.php.net/package/Math_Combinatorics

于 2012-08-18T20:23:38.803 に答える
0

可能な順列をすべて生成してからフィルタリングする代わりに、文字列内の各文字の可能な値を返すジェネレータを作成します。それははるかに効果的です(静的な W だけで、入力サイズを非常に大きな要因で縮小できます)。

関数を単純なクラスにラップして (内部状態を保持できるようにするため)、ジェネレーターを作成し、反復ごとに可能な各トークンを返すことができます。次に、各ジェネレーターへの呼び出しを組み合わせて、可能な戻り値を作成することにより、順列を作成します。

また、このような目的で file_get_contents と file_put_contents を使用しないことを強くお勧めします。を使用してファイルを開き、新しい順列があるたびにfopena を実行します。すべての順列が生成されたときにfwrite()呼び出します。fclose

于 2012-08-18T19:07:47.700 に答える