「アルファベットを格納した配列」と「文字列長」を引数として与えると、全ての組み合せの文字列を返してくれるサブルーチンを定義するにはどうすればよろしいでしょうか?
「文字列長」が2や3の場合には以下のようにforeach文を入れ子にしていますが、「文字列長」の変化に対応できるようなサブルーチンを定義したいと考えます。
@cc = qw(a b c d); # アルファベットを格納した配列
「文字列長」が2の場合、
foreach my $c1 (@cc){
foreach my $c2 (@cc){
push(@str, $c1.$c2);
}
}
aa ab ac ad ba bb bc bd ca cb cc cd da db dc dd
「文字列長」が3の場合、
foreach my $c1 (@cc){
foreach my $c2 (@cc){
foreach my $c3 (@cc){
push(@str, $c1.$c2.$c3);
}
}
}
aaa aab aac aad aba abb abc abd aca acb acc acd ada adb adc add baa bab bac bad bba bbb bbc bbd bca bcb bcc bcd bda bdb bdc bdd caa cab cac cad cba cbb cbc cbd cca ccb ccc ccd cda cdb cdc cdd daa dab dac dad dba dbb dbc dbd dca dcb dcc dcd dda ddb ddc ddd
アドバイスをよろしくお願いします。
No.2ベストアンサー
- 回答日時:
No.1です.
問題を誤読してました.
順列ではないですね.
問題は,文字が``N''種類あるときに
n桁の文字列を生成するということでした.
N進数のn桁の数をすべて列挙するのと同じなので
例えば以下のようにできます.
use strict;
use warnings;
use strict;
use warnings;
sub to_N_pos{
my ($n,$N,$L)=@_;
my @result;
for my $i (1..$L){
unshift @result, $n % $N;
$n = int($n / $N);
}
return $n ? () : @result;
}
sub listup{
my ($list,$L)=@_;
my @result;
my $N=scalar @{$list};
my $n=0;
while(my @r = to_N_pos($n,$N,$L)){
my $result;
for my $i (@r){
$result = $result.$list->[$i];
}
push @result, $result;
$n++;
}
return @result;
}
$,=", ";
print listup(['a'..'d'],2);
listupは
文字のリストのリファレンス,文字列の長さ
を引数として,
結果を配列として出力します.
No.4
- 回答日時:
試していないので無保証ですが, 再帰を使わずがんばってみる:
sub allstring(\@$) {
my ($alphabet, $count) = @_;
my @ans = ();
for my $i (1 .. $count) {
my @tmp = ();
for my $ch (@$alphabet) {
push @tmp, map { $_ . $ch } @ans;
}
@ans = @tmp;
}
@ans;
}
例:
$, = ',';
print allstring(['a' .. 'd'], 2), "\n";
この回答への補足
回答ありがとうございました。以下のエラーが出力されました
Type of arg 1 to main::allstring must be array (not single ref constructor) at Tacosan.pl line 15, near "2)"
Execution of Tacosan.pl aborted due to compilation errors.
No.3
- 回答日時:
再帰呼び出しを使った方法です。
use strict;
my @cc = qw(a b c d);
my $n = 3; # 文字列長を指定
my @result; my @work = ();
search(@cc);
sub search {
my @list = @_;
foreach my $item (@list) {
if (@work == ($n - 1)) {
push @result, join('', @work, $item);
} else {
push @work, $item;
search(@list);
pop @work;
}
}
}
print "@result\n";
No.1
- 回答日時:
↑で
How do I permute N elements of a list?
という項目を見ましょう.
MJDの``Higher-Order Perl''という書籍では
4.3.1節にかなり詳細にでています.
コードそのものは http://hop.perl.plover.com/Examples/
の``permuteなんちゃらら''というものです.
何種類かあります.
一般的にやるとかなり複雑なコードになります.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データベースから取得したデー...
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
DoEventsが必要な理由について
-
VBAのautofilter、criteriaの配...
-
GIFアニメをループさせたくない
-
vba
-
アクティブセルから、A列最終行...
-
VBA Dir関数でファイルをループ...
-
VBのReturnの使い方
-
流れ図(フローチャート)が分か...
-
二次元配列のインデックスについて
-
DOSコマンドのループ内のTIMEコ...
-
Application.OnTime の使い方
-
ループフリー
-
二次元配列における要素数のは...
-
Strawberry Perl for Windows ...
-
VBA for文が止まらない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlでファイルの拡張子を除い...
-
python質問
-
DBIを使ってのデータの取り出し...
-
grep関数を用いた複数行からの抽出
-
データベースから取得したデー...
-
配列内定義サブルーチン呼び出し
-
C言語の関数ポインタのイメージ...
-
桁数指定と四捨五入
-
アルファベットn文字の組み合わ...
-
index関数で複数個抜き出す
-
Perl 戻り値の型の判定って出来...
-
二桁の数字からなる配列数10...
-
サブルーチンと繰り返し処理を...
-
ソート時同じ値がある場合、表...
-
ファイルの最後の行から表示さ...
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
乱数と順列と組み合わせ
-
ハッシュ内の各値部分に配列を...
-
正規表現に関する質問
おすすめ情報