![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
「アルファベットを格納した配列」と「文字列長」を引数として与えると、全ての組み合せの文字列を返してくれるサブルーチンを定義するにはどうすればよろしいでしょうか?
「文字列長」が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ランキング
-
index関数で複数個抜き出す
-
組み合わせを作るアルゴリズム
-
半角文字の縦書き表示
-
ソート時同じ値がある場合、表...
-
WinAPI「MsgWaitForMultipleObj...
-
画面を強制的に再描画させる方法
-
ExcelVBA FindNextを使用して条...
-
Excel VBA ユーザーフォームの...
-
エクセルの当番表を作っていま...
-
Excel VBAで、アクティブシート...
-
エクセルVBAの勉強を始めま...
-
VBAのautofilter、criteriaの配...
-
条件に一致した塩基配列を含む...
-
VBのReturnの使い方
-
アクティブセルから、A列最終行...
-
VBAでの一時停止と再開の方法
-
DoEventsが必要な理由について
-
多重ループの抜けだし方
-
再帰関数のインライン展開
-
ループ内での条件処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
index関数で複数個抜き出す
-
perlで2つの配列を比較する方...
-
perlでファイルの拡張子を除い...
-
桁数指定と四捨五入
-
[Perl]長すぎるif文を簡単にしたい
-
grep関数を用いた複数行からの抽出
-
配列やハッシュで中身が同じか...
-
組み合わせを作るアルゴリズム
-
複数の配列の要素を繰り返し処...
-
正規表現に関する質問
-
データベースから取得したデー...
-
非共通要素を抜き出す
-
ソート時同じ値がある場合、表...
-
Perl 戻り値の型の判定って出来...
-
QNo.3258883データベースから取...
-
配列に入った変数を二度使いたい
-
C言語の関数ポインタのイメージ...
-
ループ中でのmy宣言と処理速度
-
配列から網羅的な文字列を生成...
-
アルファベットn文字の組み合わ...
おすすめ情報