
「アルファベットを格納した配列」と「文字列長」を引数として与えると、全ての組み合せの文字列を返してくれるサブルーチンを定義するにはどうすればよろしいでしょうか?
「文字列長」が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ランキング
-
perlで2つの配列を比較する方...
-
データベースから取得したデー...
-
VBのReturnの使い方
-
VBA for i=1 to lastrow
-
範囲指定したセルを1つずつ飛...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
ループフリー
-
vb.netです。2次元配列の要素を...
-
VBAで3秒だけ時間を止めたい
-
CSVファイルの特定の行だけを読...
-
英語でのシャープとコメの呼び...
-
エクセルの当番表を作っていま...
-
VBA横データを縦にしたいです
-
エクセルVBAでTransposeの不思議
-
画面を強制的に再描画させる方法
-
vb.netからエクセル関数書き込み
-
チェックデジットについて
-
VBAでの一時停止と再開の方法
-
ボタンが押された時にループか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DBIを使ってのデータの取り出し...
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
配列やハッシュで中身が同じか...
-
組み合わせを作るアルゴリズム
-
乱数と順列と組み合わせ
-
ハッシュ内の各値部分に配列を...
-
半角文字の縦書き表示
-
アルファベットn文字の組み合わ...
-
C++のstring型文字列を分割して...
-
python質問
-
visual basic 2015で文字列の1...
-
ファイルの最後の行から表示さ...
-
QNo.3258883データベースから取...
-
配列に入った変数を二度使いたい
-
index関数で複数個抜き出す
-
繰り返して表示するのではなく1...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
VBのReturnの使い方
おすすめ情報