Perl コーディング初心者質問コーナー Part31

このエントリーをはてなブックマークに追加
374nobodyさん

0-9とa-zを使って1桁から4桁の組み合わせを自動で生成させたいのですが、
どのようにスクリプトを組めばよいかまったく分かりません。

たとえば$keyにある値を調べたいとき、

$key = 'hsp';

〜〜自動生成のコード〜〜〜

$value ='自動生成した文字'

if ($key == $value) { print "HIT!"; break; }

〜〜〜ループ〜〜〜〜〜〜

exit;

このような感じにしたいのですが、、、できますでしょうか?
375374:04/02/12 01:06 ID:6vxpFTk5

簡単に言うと、

aa
ab
ac
ad
ae




のように全ての組み合わせを生成して、そのつど判定を行いたいのです。
376nobodyさん:04/02/12 01:11 ID:???
4桁?
その組み合わせが何通りあるのか考えよう。
377nobodyさん:04/02/12 01:26 ID:???
何に使うのかわからんが、思いついたのは

@char = ( 0..9, 'a'..'z' );

を使ってふにふにする。
数字がなければ

@str = ( 'aaaa'..'zzzz' );

で生成できるのかな。
378nobodyさん:04/02/12 01:27 ID:???
foreach(aa..zz){}
379nobodyさん:04/02/12 01:46 ID:???
@char = ('', 0..9, 'a'..'z' );
foreach $c1 (@char) {
 foreach $c2 (@char) {
  foreach $c3 (@char) {
   foreach $c4 (@char) {
    $value = $c1.$c2.$c3.$c4;
    〜〜〜
   }
  }
 }
}
同じ文字列が何度か出てきて、ちょっと無駄だけど。
380nobodyさん:04/02/12 02:25 ID:???
どひゃー、ループのネストかよw
仮にそれだとしても同じ文字列を出さないようにすればいいだろ
381nobodyさん:04/02/12 02:31 ID:???
つか、>>374の仕様に忠実に組むと、ループをネストせざるを得ない希ガス
382nobodyさん:04/02/12 02:53 ID:???
>>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}$/
383nobodyさん:04/02/12 03:02 ID:???
テストしてないけど。
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;
 }
}
384383:04/02/12 03:04 ID:???
あ、初期値 y になって、、、
385nobodyさん:04/02/12 03:33 ID:2BcfCTiO
>>382の下の一行で事足りそうな悪寒。いやそんなまさか
386nobodyさん:04/02/12 04:24 ID:???
或いはこういう事をしたいだけなのかも知れん。

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;
  }
}
387nobodyさん:04/02/12 04:59 ID:???
>>374は、パスワード解析とかがしたいのではないのか。
最大4桁と分かっているが、暗号化されていているとか。
それでひとつひとつしらみつぶしに。
388nobodyさん:04/02/12 05:14 ID:???
「ひょっとしてパス割りしたい?」と>>374におたずねしたい気分ですね。
389nobodyさん:04/02/12 05:35 ID:???
ブルートフォースアタックだな。
390nobodyさん:04/02/12 05:37 ID:ww+BFK9/
>>374
print "HIT!";

これだけでお望みの結果が得られる予感。しかも最速。
ついでにいうと$key == $valueは$key eq $valueの予感
391nobodyさん:04/02/12 05:39 ID:???
print "パスワードクラック成功!";
392374:04/02/12 06:36 ID:???
キャァーーーーーーーーーーーーーーーーー
393nobodyさん:04/02/12 10:50 ID:???
パスワードクラックしたけりゃ、Cを使えよ。Cを。
この種の処理なら、Perlよりも数倍速いぜ。
394374:04/02/12 11:16 ID:???
Cかぁ・・
6文字やるのに1時間かかったよ!
Cを使うしかないね!
だけど一般人が決めるパスワードの文字としてはqとかx、v、zなどあまり
使われそうが無いものを除けば以外と!