Perl コーディング初心者質問コーナー Part31
374 :
nobodyさん:
0-9とa-zを使って1桁から4桁の組み合わせを自動で生成させたいのですが、
どのようにスクリプトを組めばよいかまったく分かりません。
たとえば$keyにある値を調べたいとき、
$key = 'hsp';
〜〜自動生成のコード〜〜〜
$value ='自動生成した文字'
if ($key == $value) { print "HIT!"; break; }
〜〜〜ループ〜〜〜〜〜〜
exit;
このような感じにしたいのですが、、、できますでしょうか?
375 :
374:04/02/12 01:06 ID:6vxpFTk5
簡単に言うと、
aa
ab
ac
ad
ae
・
・
・
のように全ての組み合わせを生成して、そのつど判定を行いたいのです。
4桁?
その組み合わせが何通りあるのか考えよう。
何に使うのかわからんが、思いついたのは
@char = ( 0..9, 'a'..'z' );
を使ってふにふにする。
数字がなければ
@str = ( 'aaaa'..'zzzz' );
で生成できるのかな。
foreach(aa..zz){}
@char = ('', 0..9, 'a'..'z' );
foreach $c1 (@char) {
foreach $c2 (@char) {
foreach $c3 (@char) {
foreach $c4 (@char) {
$value = $c1.$c2.$c3.$c4;
〜〜〜
}
}
}
}
同じ文字列が何度か出てきて、ちょっと無駄だけど。
どひゃー、ループのネストかよw
仮にそれだとしても同じ文字列を出さないようにすればいいだろ
つか、
>>374の仕様に忠実に組むと、ループをネストせざるを得ない希ガス
>>374 my @array1 = my @chr = (0..9, 'a'..'z'); # 1桁
my @array2; # 2 桁
for my $chr (@chr) { push @array2, map $chr . $_, @array1 }
my @array3; # 3 桁
for my $chr (@chr) { push @array3, map $chr . $_, @array2 }
my @array4; # 4 桁
for my $chr (@chr) { push @array4, map $chr . $_, @array3 }
要素数 1,727,604 個の配列を作る必然性が全くないがな。
$key =~ /^[0-9a-z]{1,4}$/
テストしてないけど。
for (my $i = 'y'; length($i) < 5; $i = increment($i)) {
;
}
sub increment {
my $str = shift;
my $chars = [$str =~ /./g];
_r_inc($chars);
return join('', @$chars);
}
sub _r_inc {
my $chars = shift;
if ($chars->[-1] == 9) {
$chars->[-1] = 'a';
} elsif ($chars->[-1] eq 'z') {
pop @$chars;
_r_inc($chars);
push @$chars, '0';
} elsif (! @$chars) {
$chars->[0] = '0';
} else {
my $tmp = "$chars->[-1]";
$chars->[-1] = ++$tmp;
}
}
384 :
383:04/02/12 03:04 ID:???
あ、初期値 y になって、、、
385 :
nobodyさん:04/02/12 03:33 ID:2BcfCTiO
>>382の下の一行で事足りそうな悪寒。いやそんなまさか
或いはこういう事をしたいだけなのかも知れん。
my $key = 'hsp';
my @chr = (0..9, 'a'..'z', '');
while (1) {
my $value = "@chr[ rand(@chr), rand(@chr), rand(@chr), rand(@chr) ]";
$value =~ tr/ //d;
if ($key eq $value) {
print 'HIT!';
last;
}
}
>>374は、パスワード解析とかがしたいのではないのか。
最大4桁と分かっているが、暗号化されていているとか。
それでひとつひとつしらみつぶしに。
「ひょっとしてパス割りしたい?」と
>>374におたずねしたい気分ですね。
ブルートフォースアタックだな。
390 :
nobodyさん:04/02/12 05:37 ID:ww+BFK9/
>>374 print "HIT!";
これだけでお望みの結果が得られる予感。しかも最速。
ついでにいうと$key == $valueは$key eq $valueの予感
print "パスワードクラック成功!";
392 :
374:04/02/12 06:36 ID:???
キャァーーーーーーーーーーーーーーーーー
パスワードクラックしたけりゃ、Cを使えよ。Cを。
この種の処理なら、Perlよりも数倍速いぜ。
394 :
374:04/02/12 11:16 ID:???
Cかぁ・・
6文字やるのに1時間かかったよ!
Cを使うしかないね!
だけど一般人が決めるパスワードの文字としてはqとかx、v、zなどあまり
使われそうが無いものを除けば以外と!