最終更新日:2022-08-21数珠順列(配置に条件付き)を全て出力するツイッターで出したエクセルVBAの問題です。それぞれの個数を決めて、配置に制限を設けた時の全ての配置パターンを出力するという問題です。出題元のツイートhttps://twitter.com/yamaoka_ss/status/1559809556494004224ここは手作業で1つずつ数えていくという暴挙に出ました(笑)最後はなんとか正解にたどり着いたようです。白玉2個、赤玉4個、青玉5個を数珠つなぎにする。どの赤玉も隣り合わないように配置するとき、配置パターンを全て出力せよ。※今回は白は2個ですよhttps://twitter.com/yamaoka_ss/status/1560536268206772225お借りした問題じゃなければ、100本ノック魔球編の難しめくらいの問題だったかもしれませんね。やるべきことははっきりしているのだけど、現実的な処理時間に収められるかが問題ですかね。引用リツイート筆者自身も途中経過として、引用リツイートしています。今日プログラム書いて答えを出す時間の方が短かったですかね。いうか、白2を手作業では無理ですねwww一応こんな風に出力して、条件付き書式で色付けてみた。あれー、なんか偏ってねなー・・・そうか、赤の隣に白が来ないパターンは1通りしかないのか・・・うーん、合ってるよね。一応処理時間は3分くらいでした。パターンを少し早めに打ち切っているので、全順列よりは少なくしてはいます。単純な順列としては、FACT(11)=39916800このくらいの処理なら、最近のPCなら時間はかかっても処理出来ないことも無いだろうと見当をつけて開始です。再帰処理で配列の順番を入れ替えながら全順列を作るようにしました。作成した順列の中から、赤玉が隣り合う配置パターンと、同色が複数あるので同一配置になるものを除外します。数珠なので輪にしたときに同一となる配置、さらに裏返したときに同じ配置になるパターンを除外します。これらをどのように判定するかが難しいところですね。赤玉の連続は簡単に判定できます。輪にした時の判定をどうするか...1つずつずらして回転させて判定...それはちょっと処理時間がかかってしまいそうです。そこで配置パターンを2回繰り返してくっ付けます。パターン1この文字列内のどこかにパターン1があれば重複パターンと判定します。ひっくり返したときの判定をどうするか...これは単純に文字列を反転させれば良さそうです。輪の判定なので2回繰り返した文字列の反転を使います。1ンータパこの文字列内のどこかにパターン1があれば重複パターンと判定します。以上の考えを基にVBAを作成しました。実際のVBAコードでは、処理速度を考慮して判定順序等の工夫をしています。赤玉の連続は早めに打ち切るようにしています。手元のPCでは、160秒くらいで出力できています。VBAコードを掲載しました。Function3色なので3新法で順列を作る方法ツイッターでこのように指摘を受けました。https://twitter.com/yamaoka_ss/status/1560930969812873221前出VBAを作成の時には、この方法は面倒だなと思ったのですが、改めて考えてみると、、、3進法を使って順列作った後に、各色をカウントして対象の時だけ処理すれば良いと気づいたので、この方法でVBAを作成しました。順列を作る部分以外は、前出のVBAの部品をほぼそのまま使用しています。各色の数は、VBA内でマジックナンバーになっていますが、急遽作成ということで。aryIn2Outこれらは、前出のVBAと全く同じなので、それをそのままCallしています。処理時間は数秒で終わります。処理件数が少ないので速いですね。見るTRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)無効な前方参照か、コンパイルされていない種類への参照です。(配置に条件付き)を全て出力するこのサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。(配置に条件付き)を全て出力するこのサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。