
のようなユーザー(単一のパラメータ)から入力を受けたいと思います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
。