初心者です。MacPerlを使っています。
Perlを使って、例えば9個の文字の中から4個を選ぶ、という組み合わせを、すべてのパターンについてもれなく行うことはできますか?
完全にランダムなものはできました。(例えば、3個の文字を使って4文字からなる配列をすべて(3^4=81通り)作る、など。ひたすら作って同じ配列を消す、というあまり美しくない方法ですが・・・)
ですが、rand関数を使うと、同じものが出てきてしまうことがあるので、数学でいうところのcombinationをつくることができずにいます。
permutationはなんとかできたのですが。。(これもやはり、同じものを消せばいいので。)
combinationの場合、「並び方」は問わないので、同じ要素からなるが順列が異なる配列を同じものとして消したいのです。
どなたかその方法がわかる方はいらっしゃいますか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> 「n個の中からr個を選んで<ランダムに>並べる」


なるほど、それで乱数なんですね。

No.3のコードを改造してみました。ご参考までに。

# combi.pl

# ---- declare
my (@allcnt, @cnt, $f_loop);
my @array = (0, 1, 3, 4, 6, 8, 9);
my $r = 5;

# ---- init
srand(time);

# ---- make counter list
@cnt = (0 .. $r-1);
$f_loop = 1;
while ($f_loop) {
  push @allcnt, [@cnt];

  $f_loop = 0;
  for (my $i = $r-1; $i >=0; $i--) {
    if ($cnt[$i]-$i < @array-$r) {
      $cnt[$i]++;
      while (++$i < $r) { $cnt[$i] = $cnt[$i-1] + 1; }
      $f_loop = 1;
      last;
    }
  }
}

# ---- main
my (@combi, @f1, $s);
foreach (0 .. $#allcnt) {
  do { $s = int(rand() * @allcnt) } while ($f1[$s]);
  $f1[$s] = 1;
  @cnt = @{$allcnt[$s]};

  my (@rand, @f2, $t);
  foreach my $j (0 .. $r-1) {
    do { $t = int(rand() * $r); } while ($f2[$t]);
    $f2[$t] = 1;
    $rand[$t] = $cnt[$j];
  }

  @combi = @array[@rand];
  print "@combi\n";
}
__END__

■簡単に解説を。
# ---- make counter list
 $r 個分のカウンタ(@cnt)を、全組み合わせの数分求めます。(→@allcnt)
# ---- main
 @allcnt からランダムに1つのカウンタを取り出します。(→@cnt)
 @cnt の中身を、ランダムに並べ替えます。(→@rand)
 @rand を使って、@array の中身を取り出します。(→@combi)
 @combi を表示します。

 この辺の流れを、必要数分ループさせます。
 また、ランダムに値を取り出す時は、重複しないようにフラグで管理します。(→@f1,@f2)
    • good
    • 0
この回答へのお礼

たびたびすみません。動きました。どうもありがとうございました。
あとはもうちょっと意味を理解して、適宜アレンジして使いこなせるように頑張ります!!

お礼日時:2001/08/09 18:27

多重ループにすると、nCrのrの数に応じてループが深くなり、かつ汎用的でないので、普通は再帰かそれと同等の動作をするループにします。



ちょっと作ってみましたが、ぱっと見ても恐らく分からないと思いますんで、いろいろ解析してみて補足してください。

# combi.pl

# ---- declare
my (@combi, @cnt, $f_loop);
my @array = (0, 1, 3, 4, 6, 8, 9);
my $r = 5;

# ---- main
@cnt = (0 .. $r-1);
$f_loop = 1;
while ($f_loop) {
  @combi = @array[@cnt];   # 1つの組み合わせが完成
  print "@combi\n";       # 表示

  $f_loop = 0;
  for (my $i = $r-1; $i >=0; $i--) {
    if ($cnt[$i]-$i < @array-$r) {
      $cnt[$i]++;
      while (++$i < $r) { $cnt[$i] = $cnt[$i-1] + 1; }
      $f_loop = 1;
      last;
    }
  }
}
__END__

■説明
 @array に、n個の値を設定してください。
 $r に、選ぶ個数を設定してください。
 結果の数が多い場合、
   perl combi.pl > result.txt
 のように、リダイレクトすればOKです。

この回答への補足

ありがとうございました。とりあえず、動かすことはできました。これから内容を理解すべく解析してみます。
ところで、前の方のアドバイスにそって自分で強引につくることもできたのですが、(これもまだどこが正しいのかわからないまま動いた)
どうしても、結果として出てくる配列の並び方は最初に決めた配列(@array)の並び方に依存していて、「ランダムに」並べることができません。

「n個の中からr個を選んで<ランダムに>並べる」

というのは可能でしょうか?
どこかに「配列をランダムに並びかえる」スクリプトを潜り込ませようとしたのですがうまくいきませんでした・・・

補足日時:2001/08/09 09:04
    • good
    • 0

#1の補足です。

答えが不足してました。順列だけで終ってしまってました。

組み合わせについてはI<J<K<Lの条件を追加するだけでいいです。
もっと効率を上げるには、Iに対して、J=I+1からループ開始、、K=J+1から、L=K+1からそれぞれ始まるようにプログラムを組めば重複は排除され組み合わせが得られます。

早とちりでご迷惑かけました。

この回答への補足

概要はわかりました。どうもありがとうございます。
まだPerlの文法にもそれほど詳しくないので、言われたようにこなすのに四苦八苦しているところです。
なかなかうまく文字と数字が対応してくれなかったり、ほしいものだけを表示することができなかったり・・・
もう少し頑張ってみますが、もしPerlでの上手な表現方法がすぐにわかる方がいましたら参考までに教えていただけませんか?
(自分のはとても自己流なのでお世辞にも美しいプログラムとはいえないと思うので・・・)

補足日時:2001/08/07 18:28
    • good
    • 0

Perlはよく知りませんので考え方のみを。


順列や組み合わせで乱数を使うと言うのは聞いたことが有りません。なぜなら、全てのケースがいつ終わるのかと言うことが明確に予測できないからです。

このような場合、普通は多重ループを使います。例えば英字26文字の中から4文字を選び、4文字の中に同じ文字がないものを探すとします。

1番外のループではI=1,26でループを回します。
2番目(内側のループもJ=1,26でループを回します。このときI=Jなら何もせずにループエンドに行き、Jが一つ進みます。
次に3番目のループです。ここもK=1,26でループを回します。
この中ではI=K又はJ=KならKが一つ進むようにします。
この応用で4番目まで作ります。この中でI=L,J=L,K=LでなければI,J,K,Lが全て違うわけです。後はI,J,K,Lを文字に対応させます。

別の方法として一重ループでやる方法もあります。M=1から26^4までループさせます。そしてMを4桁の26進数に分解します。これをI,J,K,Lとすると後はおんなじですね。

頑張ってください。わかりにくければ補足してください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q順列・組合わせの記号(P、Π、C、H)について

数学の教科書なんかで、
「順列・組合わせ」という章があり、
順列の計算には nPr のようにPが、
重複順列では nΠr のように、Π が、
組合わせでは nCr のようにCが、
重複組合わせでは nHr のようにHが、
それぞれ用いられます。

Pが permutation の頭文字、
Cが combination の頭文字、
というのは分かりました。
Π と、Hは、どこからくるのでしょうか。
どなたかご存知の方、教えてください。
(Π は、permutation の p をギリシャ文字にしただけなのかな?)

英語のスレッドでもよかったのですが、
当方、一応英語が専門のくせに、分からずにいるということで、
数学専門の方にお伺いしたく、
ここに質問させていただきました。

Aベストアンサー

英語にすれば、それぞれ homogeneous product、repeated permutation で、Hはその頭文字、Πはギリシャ文字でPに対応するものです。重複組み合わせは、同次多項式(x_1+…+x_r)^nの展開係数を計算するときに現れます。同次多項式(homogeneous polynomial)がおそらく由来です。またΠは通常は積の記号として用いますので、直感的にも分かりやすいものでしょう。

ですが、これらの記号は普通は海外では用いません。たとえば二項係数は多くの場合、( )の中に上下に数を二つ並べて書きますし、あるいは、順列は(n,r)=n(n-1)…(n-r+1)のように表すことが多いです。また重複順列はあまり記号法を用いる合理性がない(簡単に指数表示できる)ので、使わない方が無難でしょう。TeXのコマンドにも左下付はないので、"{}_"のように書かないといけません。こういうところにも海外で使われないということが現れています。

Q二つの配列から、同じ値のもの以外を他の配列に入れたい。

二つの配列から、同じ値のもの以外を他の配列に入れたい。


@tmp = ('1','2','3','4','5');
@tmp2 = ('1','3');



@tmp3 = ('2','4','5');

重複を除くの方法はあったのですが、
この場合は、逆の結果が欲しいです。

上記のような結果が欲しいのですが、
うまくできませんでした。

どなたかご伝授いただけないでしょうか?

Aベストアンサー

@wk { @tmp } = (); #tmpの要素でハッシュを作る
delete @wk { @tmp2 }; #tmp2の要素を削除する
@tmp3 = keys %wk;

Qじゅず順列の問題を教えてください

じゅず順列に関する問題でまったく理解できない問題があります・・・。

「xが4個 yが3個 zが1個あるとする。これらをじゅず順列にする方法は何通りあるか。」

じゅず順列は 円順列÷2ということはわかるんですが、同じ文字があるためかどうかわからないんですけど、答えが出てきません。

是非、教えてください。

Aベストアンサー

No.1はよくよく考えてみると間違っているので、無視してください。(失礼しました。)

どうやら、重複を許すととたんに難しくなるようです。

さて、考え方ですが、次のように考えてみてください。

円を8等分した各点(または、正八角形の頂点)の1つにzを固定します。(円順列の考え方と同じですね。)
あとの7カ所にxとyを置く方法を考えることまでは、No.1と同じですが、この先で間違えを犯しています。

zの反対側に置く文字によって、状況が変わってきますので、場合分けします。
・xが来る場合
  残りの6カ所をどのように置こうと対称の形を作ることができない。
・yが来る場合
  置き方によっては対称形を作ることができる。
問題は、対称形ができたときは(円順列では別のものとしてカウントするが、じゅず順列ではカウントしない)重複が存在しないことになります。

ということで、対称形かどうかを判定して、計算する必要があります。

ちょっと難しいですね。

Q配列中の検索文字全が含まれる、配列のある元データを拾いだすのは?

formからcheckboxで任意のデータを送りその全てのデータが、
任意の配列にマッチしたファイルのデータを抜き出すのは
どうしたら出来るか、何かヒントでも教えていただけたら幸いです。
検索文字列 @kensaku #検索文字を&SplitParamで代入
検索元文字列 $kensakuMoto #","区切り文字で文字列を保存
for($i=0;$i<@kensaku;$i++){
if($kensakuMoto=~/$kensaku($i)/){;}else{next;}
}
としても@kensaku全てにマッチしたデータだけを抜き出すことが出来ません。
よろしくお願いします。

Aベストアンサー

ヒントなのか、答えなのか微妙ですが・・・アドバイスとして書きますね(^ ^;
何回ヒットしたかをカウントすれば実現できます。

$count = 0;
for($i=0;$i<@kensaku;$i++){
if($kensakuMoto=~/$kensaku($i)/){
$count++;
}else{
last;
}
}
if($count == $#kensaku+1){
   #ヒットしました。
}else{
   #ヒットしませんでした。
}

こんな感じでどうでしょう?

Q順列と組み合わせ

 高校1年です。数学Aで教えてほしいことがあります。
 数Aの「順列と組み合わせ」という単元があり、そこでは、!(階乗)P(順列)C(組み合わせ)、円順列、じゅず順列、重複順列 等など、いろいろな公式(単語)?が出てきました。
それらの公式は、とりあえず教科書を読んで覚えました。
 しかしいざ問題演習になると、どの公式を使えばいいのかがわかりません。
 『こんな問題にはこの公式を使う』という見分け方をどなたか教えてください。

Aベストアンサー

この範囲は恐らく全ての学生が一度は戸惑います。
ですので、一つずつ考えなくてはなりません。

Pは順番が関係あるとき。一列に並ぶ席順などですね。
Cは順番が関係ないとき。複数名の中から代表者二名を選ぶ、というようなものです。
円順列はそのままで、順列が円になった場合です。円の場合、回転して同じと言う可能性があるので順列とは別に単元が設けられています。
数珠順列は円順列に似ていますが、「手でもてる場合」です。席順の場合は持ち上げられませんが、数珠のように手でもてる場合、裏表の関係になっているものを一種類としなくてはなりません。
重複順列は他とは明らかに違うので絶対に区別できます。他は選択肢を一回しか使えませんが、重複順列は「重複が許されて」います。例えば、蜜柑、林檎、梨をあわせて15個買う、などというような問題です。

問題を解くときに、こうだからこの公式、ではなくて、まずどう考えたからこれを使う、但しこの場合こうだから、と一つ一つ自分を納得させながら式を組み立ててみてください。

Q不特定数存在する特定文字直後にある文字を配列に入れる

perlとMySQLでデータベースを作っています。
だいぶ行き詰ってしまったので質問させてください。

以下のような一行の文字列が存在するとします。

ABC DEF @@@2222 EHI J @@@888 KL MN OPQR @@@632 ST

この中から、
2222
888
632
を取り出して配列に格納することは可能でしょうか?

分割することは可能な気はするのですが、
それを配列に入れるとなるとどうにもならなくなってしまいました。

漠然とした質問で大変申し訳ないのですが、
なにかヒントになるものだけでもお気づきの方いらっしゃいましたら、
ぜひご教示くださいませ。

Aベストアンサー

やり方はいろいろありますが、「英数字と空白以外の文字列」に続く「英数字文字列」を配列に入れるなら、
$str='ABC DEF @@@2222 EHI J @@@888 KL MN OPQR @@@632 ST';
(@array)=($str=~/(?<=[^\s\w])(\w+)/g);

Q順列の問題がわかりません。教えてください。

順列の問題を教えてください。

a,b,c,d,eの5文字すべてを並べて順列を作る。
(1)一番左の文字がaである順列は全部で何個あるか。
(2)作られる順列をアルファベッ順に、1番目abcde, 2番目abced,
   3番目abdce,....と順序を付ける。このとき、bcaedは何番目の   順列か。
(3)(2)において、64番目の順列は何か。

よろしくお願いします。

Aベストアンサー

重複を許さない辞書並べですね。
ベネッセの赤ペン先生の問題で見たことがあります。

(1) aを先頭とする並びは何通り?

 n進法の各桁はその桁の下にどれだけのケースを含んでいるかを表わしています。10進法において1000の桁は、その桁の下、100の位に0~9まで10ケース、10の位に0~9まで10ケース、1の位に0~9まで10ケース、つまり10×10×10=10^3ケースの何倍かを表わしています。例えば、5000は5×10^3ケースを含んでいると考えます。
 以上のように考えると、この記号の並びを数と考えたとき、各桁の下に含まれるケースは、それぞれ4!,3!,2!,1!,0!となります。n! 進数とでも考えて下さい。
 先頭は5桁目ですから、その下には4! ケース含まれます。24です。

(2) bcaedは何番目?

 n! 進数で、各桁の大きさを表わす数は、出現を許された記号の中での0から起算した順位となります。まずbcaedを順位数に置き換えます。a=0,b=1,c=2,d=3,e=4 のように順位に置き換えるのですが、重複を許さないので、既に出現した記号を除いた順位となります。
   b→ a b c d e →1
   c→ a c d e →1
   a→ a d e →0
   e→ d e →1
   d→ d →0
 bcade=11010 となります。
 次に10進法に置き換えます。
   1×4!+1×3!+0×2!+1×1!+0×0!=1×24+1×6+1=31
 10進法に変換すると31 になりますが、これは0から起算しているので、先頭から何番目かという問いに対しては、31+1=32 になります。

(3) 64番目は?

 一般的に10進法をある進法に変換するときは、その進法の下位の各桁からその桁のケースの数で割ったときの余りがその進法の各桁の大きさになることを利用します。
 64番目は10進法では63です。これを今回のn!進法の各桁のケースの数で割っていきます。)の右側には下線があると思って下さい。
   1 )63
   2 )63・・・0
   3 )31・・・1
   4 )10・・・1
      2・・・2

22110 が記号の順位に相当します。出現を許される記号の中から該当する記号を選んでいくと、以下のようになります。
   2→ a b c d e →c
   2→ a b d e →d
   1→ a b e →b
   1→ a e →e
   0→ a →a
   
∴cdbea
おやおや、前の人と回答が違ってしまいましたね。ご判断はお任せします。

重複を許さない辞書並べですね。
ベネッセの赤ペン先生の問題で見たことがあります。

(1) aを先頭とする並びは何通り?

 n進法の各桁はその桁の下にどれだけのケースを含んでいるかを表わしています。10進法において1000の桁は、その桁の下、100の位に0~9まで10ケース、10の位に0~9まで10ケース、1の位に0~9まで10ケース、つまり10×10×10=10^3ケースの何倍かを表わしています。例えば、5000は5×10^3ケースを含んでいると考えます。
 以上のように考えると、この記号の並びを数と考えたとき、各桁の下...続きを読む

Q二桁の数字からなる配列数10個内に00がある場合、

お世話になります。

二桁の数字からなる配列数10個内に00がある場合、十の位と一の位をそれぞれ取り出すようにテスト中なのですが、配列内に00がある場合、十の位と一の位の数字がコピーされてしまうようです。

#!/usr/bin/perl

@Array="10<>78<>51<>78<>00<>72<>43<>82<>65<>29<>";
foreach$i(0..$#Array){
@Mtmp=split(/<>/,$Array[$i]);
}

foreach$i(0..$#Mtmp){
($M_old_9,$M_old_8,$M_old_7,$M_old_6,$M_old_5,$M_old_4,$M_old_3,$M_old_2,$M_old_1,$M_old_0)=split(/<>/,$Mtmp[$i]);
# if($Mtmp[$i] != ''){
$M_n = substr ("$Mtmp[$i]", -2);#■二桁のの数字
$M_t10=$M_n;
$M_t1 = substr ("$M_t10", -1 , 1);#■一の位を取り出し
chop$M_t10; #■十の位を取り出し
$acount++;
# }
print "No.$i $Mtmp[$i]\n";
$M_yosou++;

$M_old_9=$M_old_8;
$M_old_8=$M_old_7;
$M_old_7=$M_old_6;
$M_old_6=$M_old_5;
$M_old_5=$M_old_4;
$M_old_4=$M_old_3;
$M_old_3=$M_old_2;
$M_old_2=$M_old_1;
$M_old_1=$M_old_0;
$M_old_0=$M_n;#■二桁のの数字

$M_old_n9_10=$M_old_n8_10;
$M_old_n8_10=$M_old_n7_10;
$M_old_n7_10=$M_old_n6_10;
$M_old_n6_10=$M_old_n5_10;
$M_old_n5_10=$M_old_n4_10;
$M_old_n4_10=$M_old_n3_10;
$M_old_n3_10=$M_old_n2_10;
$M_old_n2_10=$M_old_n1_10;
$M_old_n1_10=$M_old_n0_10;
$M_old_n0_10=$M_t10;#■十の位

$M_old_n9_1=$M_old_n8_1;
$M_old_n8_1=$M_old_n7_1;
$M_old_n7_1=$M_old_n6_1;
$M_old_n6_1=$M_old_n5_1;
$M_old_n5_1=$M_old_n4_1;
$M_old_n4_1=$M_old_n3_1;
$M_old_n3_1=$M_old_n2_1;
$M_old_n2_1=$M_old_n1_1;
$M_old_n1_1=$M_old_n0_1;
$M_old_n0_1=$M_t1;#■一の位
}

print "\$acount=$acount\n<br>\@Mtmp=@Mtmp \n<br>\$M_n=$M_n \n<br>\$M_t10=$M_t10 \n<br>\$M_t1=$M_t1 \n<br>\$M_old_9=$M_old_9\n<br>\$M_old_8=$M_old_8\n<br>\$M_old_7=$M_old_7\n<br>\$M_old_6=$M_old_6\n<br>\$M_old_5=$M_old_5\n<br>\$M_old_4=$M_old_4\n<br>\$M_old_3=$M_old_3\n<br>\$M_old_2=$M_old_2\n<br>\$M_old_1=$M_old_1\n<br>\$M_old_0=$M_old_0\n<br>\$M_old_n9_10=$M_old_n9_10\n<br>\$M_old_n8_10=$M_old_n8_10\n<br>\$M_old_n7_10=$M_old_n7_10\n<br>\$M_old_n6_10=$M_old_n6_10\n<br>\$M_old_n5_10=$M_old_n5_10\n<br>\$M_old_n4_10=$M_old_n4_10\n<br>\$M_old_n3_10=$M_old_n3_10\n<br>\$M_old_n2_10=$M_old_n2_10\n<br>\$M_old_n1_10=$M_old_n1_10\n<br>\$M_old_n0_10=$M_old_n0_10\n<br>\$M_old_n9_1=$M_old_n9_1\n<br>\$M_old_n8_1=$M_old_n8_1\n<br>\$M_old_n7_1=$M_old_n7_1\n<br>\$M_old_n6_1=$M_old_n6_1\n<br>\$M_old_n5_1=$M_old_n5_1\n<br>\$M_old_n4_1=$M_old_n4_1\n<br>\$M_old_n3_1=$M_old_n3_1\n<br>\$M_old_n2_1=$M_old_n2_1\n<br>\$M_old_n1_1=$M_old_n1_1\n<br>\$M_old_n0_1=$M_old_n0_1\n<br><br>";
__END__;

上記の実行結果は
# perl test3.cgi
No.0 10
No.1 78
No.2 51
No.3 78
No.4 00
No.5 72
No.6 43
No.7 82
No.8 65
No.9 29
$acount=10
<br>@Mtmp=10 78 51 78 00 72 43 82 65 29
<br>$M_n=29
<br>$M_t10=2
<br>$M_t1=9
<br>$M_old_9=
<br>$M_old_8=
<br>$M_old_7=
<br>$M_old_6=
<br>$M_old_5=
<br>$M_old_4=
<br>$M_old_3=
<br>$M_old_2=
<br>$M_old_1=
<br>$M_old_0=29
<br>$M_old_n9_10=1
<br>$M_old_n8_10=7
<br>$M_old_n7_10=5
<br>$M_old_n6_10=7
<br>$M_old_n5_10=0
<br>$M_old_n4_10=7
<br>$M_old_n3_10=4
<br>$M_old_n2_10=8
<br>$M_old_n1_10=6
<br>$M_old_n0_10=2
<br>$M_old_n9_1=0
<br>$M_old_n8_1=8
<br>$M_old_n7_1=1
<br>$M_old_n6_1=8
<br>$M_old_n5_1=0
<br>$M_old_n4_1=2
<br>$M_old_n3_1=3
<br>$M_old_n2_1=2
<br>$M_old_n1_1=5
<br>$M_old_n0_1=9
<br><br>
なのですが、上記の00を取り出した部分がなぜか十の位と一の位どちらもコピーされてしまいます。
これはなぜこのような症状がおきるのでしょうか。また00の際も十の位と一の位それぞれ0を取り出すにはどのようにすれば宜しいでしょうか。

2.下記の
$M_old_9=
...
$M_old_0=
の所が二桁の数字が順次展開されないのは何故なのでしょうか。

お忙しいかとは存じますが、よろしくお願い致します。

お世話になります。

二桁の数字からなる配列数10個内に00がある場合、十の位と一の位をそれぞれ取り出すようにテスト中なのですが、配列内に00がある場合、十の位と一の位の数字がコピーされてしまうようです。

#!/usr/bin/perl

@Array="10<>78<>51<>78<>00<>72<>43<>82<>65<>29<>";
foreach$i(0..$#Array){
@Mtmp=split(/<>/,$Array[$i]);
}

foreach$i(0..$#Mtmp){
($M_old_9,$M_old_8,$M_old_7,$M_old_6,$M_old_5,$M_old_4,$M_old_3,$M_old_2,$M_old_1,$M_old_0)=split(/<>/,$Mtmp[$i...続きを読む

Aベストアンサー

何で配列を使わずに妙な番号のついた通常の変数を山盛り使ってるんでしょうか。

とりあえず下二桁を逆順に出していると言うことで

#!/usr/bin/perl
# -*- coding: utf8 -*
use strict;
use warnings;
use Fatal qw(:void open close);
use feature ':5.10';

#use utf8;
#use Encode qw/from_to decode encode/;



while (my $line = <DATA>) {
chomp $line;

my @array = split /<>/, $line;
my $itemcount = 0;

foreach my $item (@array) {
say "No. $itemcount $item";
$itemcount++;
}

say "\$itemcount=$itemcount";

my $outstring1;
my $outstring2;
my $outstring3;
foreach my $item (reverse @array) {
$outstring1 .= "<br>$item\n";

my $d1 = chop $item;
my $d10 = chop $item;
$itemcount--;
$outstring2 .= "<br>M_${itemcount}_10=$d10\n";
$outstring3 .= "<br>M_${itemcount}_1=$d1\n";
}

say $outstring1;
say $outstring2;
say $outstring3;
}

__END__
10<>78<>51<>78<>00<>72<>43<>82<>65<>29<>

No. 0 10
No. 1 78
No. 2 51
No. 3 78
No. 4 00
No. 5 72
No. 6 43
No. 7 82
No. 8 65
No. 9 29
$itemcount=10
<br>29
<br>65
<br>82
<br>43
<br>72
<br>00
<br>78
<br>51
<br>78
<br>10

<br>M_9_10=2
<br>M_8_10=6
<br>M_7_10=8
<br>M_6_10=4
<br>M_5_10=7
<br>M_4_10=0
<br>M_3_10=7
<br>M_2_10=5
<br>M_1_10=7
<br>M_0_10=1

<br>M_9_1=9
<br>M_8_1=5
<br>M_7_1=2
<br>M_6_1=3
<br>M_5_1=2
<br>M_4_1=0
<br>M_3_1=8
<br>M_2_1=1
<br>M_1_1=8
<br>M_0_1=0

あんまり短く書いてもわけわからないでしょうからとりあえずこんなところで。

何で配列を使わずに妙な番号のついた通常の変数を山盛り使ってるんでしょうか。

とりあえず下二桁を逆順に出していると言うことで

#!/usr/bin/perl
# -*- coding: utf8 -*
use strict;
use warnings;
use Fatal qw(:void open close);
use feature ':5.10';

#use utf8;
#use Encode qw/from_to decode encode/;



while (my $line = <DATA>) {
chomp $line;

my @array = split /<>/, $line;
my $itemcount = 0;

foreach my $item (@array) {
say "No. $item...続きを読む

Q同じものを含む順列

連続する16個の数字から、4つ取り出してその組合せを全て表す処理を作ろうとしています。
まずは意味からと思い、いろいろ検索して調べても、うまく理解できず、最後の手段でここに投稿いたします。
組合せのパターンを割り出すのに、「同じものを含む順列」を使って行うと言われています。
いろいろ調べて混在したものが、意味の違いの点?で、「同じものを含む順列」と「重複順列」とは同じことを表すのでしょうか。
また、「同じものを含む順列」のパターン出力のプログラムを作る必要があり、参考になるサンプルが存在するなら教えていただけないでしょうか。
(順列や組合せは見つかったのですが)

宜しくお願いします。

Aベストアンサー

「同じものを含む順列」
例えば:aaabbcc の様にa3個、b2個、c2個が同じである9文字の順列。(aacbcab…等々)

「重複順列」
例えば a、b、cを繰り返し使用する事を許可して、5個並べる。(aaabbでも良いし、aaaaaでも良いし…etc)


>連続する16個の数字から、4つ取り出してその…
その4個が全て異なるなら、単なる組み合わせ。

4個の内に同じ物があっても良い場合は、組み合わせと重複順列。(ものすごく難しそうな予感がします)

Q配列の文字置換え

push(@xx1, $xx);
push(@xx2, $yy);
push(@xx3, $zz);

$yyに含まれている「&lt;」と「&gt;」をそれぞれ普通の
<、>に変換したいのですがどのように書けばいいですか?
教えてください。

Aベストアンサー

$yy =~ s/&lt;/</g;
$yy =~ s/&gt;/>/g;
で $yy 内に含まれている文字列の置換が出来ますよ。
配列とは関係無いですが、聞きたいことはこれであってますか?


人気Q&Aランキング

おすすめ情報