入力へのランダム出力

入力へのランダム出力

関連質問:ユーザー入力に基づいてランダム出力を生成する方法

のようなユーザー(単一のパラメータ)から入力を受けたいと思いますHello。そして、次のような出力を提供したいと思います。

olleho
llohe
he
llo
lo

上記と同じです。また、単一の入力から何百万ものサンプルを生成したいと思います。このテキストをtxt形式のファイルとして保存したいと思います。どうすればいいですか?


私のEメールアドレスをパラメータとして提供するとしましょう。[Eメール保護]`。それで、このアカウントに関連するパスワードを持つことができるようにしたいと思います。いくつかのサンプル出力は次のとおりです。
[email protected]
Istiakshovon
Istiak
Ishovon
Ishovon0
Iksgc
gmail
moc

可能なすべての方法でサンプルパスワードを作成したいと思います。


追加しましたタグの理由から、多くの人が「awk」を使用してテキスト形式を指定することがわかりました。私はそれに慣れていません(私はLinux初心者だけです)。だから追加しました。

答え1

ユーザーの入力が変数にあると仮定すると、userinput次のawkコードはその入力の無限のランダムなサンプルを生成します。

userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

これは値を取り、$userinput文字列の末尾に改行文字を追加し、コードが壊れるまでその文字列からランダムな文字を書き始めます。追加された改行文字によって、出力に改行文字が表示されることがあります。

コマンドを使用すると、head出力行数を制限できます。 1000行が必要な場合は、出力をパイプしますhead -n 1000。次のコマンドを使用して、出力の最初の10行をテストしますuserinput='Hello World!'

$ userinput='Hello World!'
$ userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd

l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od

空白行を削除するには、出力をに渡しますsed '/./!d'

入力の最初の行から入力文字列を取得するこのコマンドのバリアントです。

awk '{
        s = $0 "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

答え2

パールを使用してアルゴリズム::順列ライブラリモジュール:

#!/usr/bin/perl

use strict;
use Algorithm::Permute qw(permute);

my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$ ./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell

上記のバージョンは、元と同じ長さの順列のみを印刷します。

次のバージョンでは、長さ1から同じ長さまですべての置換を実行します。

#!/usr/bin/perl

use strict;
use Algorithm::Permute;

my $string = shift; # New & Improved! Now takes an argument!

# un-comment only ONE of the following two lines:
#for my $i (reverse 1 .. length($string)) {
for my $i (1 .. length($string)) {

  my $p = Algorithm::Permute->new([split //, $string], $i);
  while (my @res = $p->next) {
    print join('',@res), "\n";
  };
};

たとえば、別の名前で保存しますpermute.pl。実行可能ファイルを作成し、chmod +x permute.pl次のように実行します。

$ ./permute.pl hello

注1:既知のバグがあることがわかりました。完全な配列を実行すると、元の配列が消去されます。Algorithm::Permute モジュールでは、このモジュールは呼び出された配列を消去します。

これは確かにPerlではなく動作です。それはおそらく、モジュールがデフォルトのPerlではなく、コンパイルされたC関数を囲む薄いPerlラッパーであり、C関数が配列を破壊するように書かれているからです。

とにかく、これが私がこのmy @array = split //, $string行を削除し、それを使用してメソッドの匿名[split //, $string]配列Algorithm::Permute->new()を生成した理由です。これにより、ループを介して毎回配列が再生成されます。

通常、配列がループ内で変更されていない場合、または変更されてはならない場合は、ループの外部で一度だけ作成する必要があります。

注 2: 出力の順序を変更するには、スクリプト出力をにパイプするか、スクリプトtacの for ループを次のように変更します。

for my $i (reverse 1 .. length($string)) {

これでエラーがわかりました。上記の更新されたバージョンは現在、それなしで動作しますreverse

関連情報