タグ付けされた質問 「combinatorics」

組み合わせ論を伴う課題に。

1
安定した結婚問題
バックグラウンド 2*n結婚する人がいると仮定し、さらに、各人が次nのような制約の下で正確に他の人に惹かれると仮定します。 引力は対称的です。すなわち人Aが人に引き付けられるならば、人はB人Bに引き付けられAます。 魅力は反推移的です。人ならば、すなわちA人がB一人一人に魅了されC、その後、人Aと人がBお互いに惹かれていません。 したがって、アトラクションのネットワークは(無向)完全な2部グラフを 形成しますKn,n。また、各人が自分が惹かれている人をランク付けしたと仮定します。これらは、グラフのエッジの重みとして表されます。 結婚はペアリングであるとお互いに魅了されています。各結婚の1人がパートナーと離婚し、お互いに結婚する可能性がある別の結婚がある場合、結婚は不安定です。(A,B)AB ゴール あなたの仕事は、各人の好みを入力として、各結婚が安定するように各人の結婚を出力する完全なプログラムまたは機能を書くことです。 入力 入力は任意の便利な形式にすることができます。たとえば、重み付きグラフ、設定の順序付きリスト、辞書/関連付けなど。オプションで、総人数を入力として使用できますが、他の入力は許可されません。 出力 出力は任意の便利な形式にすることもできます。たとえば、タプルのリスト、最小エッジカバー、各人にパートナーを関連付ける機能など。唯一の制約は、各結婚が安定していることであり、他の最適化要件はないことに注意してください。 ノート ウィキペディアまたはこのNumberphileビデオで、このO(n^2)問題を解決するための詳細情報とアルゴリズムを見つけることができます。ただし、任意のアルゴリズムを自由に使用できます。 標準的な抜け穴は禁止されています。 これはcode-golfです。最短回答(バイト単位)が優先されます。

3
サンプルをインデックスに変換する
ボールを固定数のビンに入れています。これらのビンは空で始まります。 Empty bin (a=4): 0 0 0 0 そして、一つずつボールをビンに追加します。 0 0 0 1 or 0 0 1 0 or 0 1 0 0 or 1 0 0 0 ビンが取る可能性のあるすべての状態を、重複せずに見逃すことなくすばやくループする方法が必要です。すべての可能なビンを列挙する必要はありません。そのため、代わりに各ビン構成にインデックスを割り当てます。 可能な構成を特定の方法で並べ替えて、インデックスを割り当てます。 合計で昇順で並べ替え0 0 0 0ます。最初に、1つのボールが追加された可能性のある構成、次に2などがあります。 次に、各合計内で、最初のビンから最後まで昇順でソートします。 0 0 0 2 0 0 1 1 0 0 2 0 0 1 0 …

3
投票の三角形を確認する
投票数我々は、ラベルう、Bは、それぞれ行及び列は、任意の昇順になるように、三角形にBを通って1から番号を配置するいくつかの方法(B + 1)/ 2です。最初の4つの投票番号は次のとおりです。 a(0) = 1 a(1) = 1 a(2) = 1 a(3) = 2 a(3)は2です。つまり、1から2までの数字3(3+1)/2 = 6をこのような三角形に配置するには2つの方法があります。 1 1 2 3 or 2 4 4 5 6 3 5 6 詳細については、OEISシーケンスエントリを参照してください。 投票の三角形を与えられたあなたの挑戦は、その正しさを検証することです。投票三角形の条件を満たす(行と列が増加する)場合、三角形を正しく配置するために他にいくつの方法(入力の方法を除く)を出力する必要があります。入力三角形が正しく構成されていない場合は、何も出力しないでください。 末尾の改行が許可されます。 入力 有効な投票三角形である場合とそうでない場合がある数字の三角形。例えば: 1 2 3 4 5 6 1 10 5 9 8 2 7 …

3
一般化された誕生日の問題
今夜、婚約者は私の誕生日を祝うために夕食に連れて行ってくれました。外出中、50人でいっぱいのレストランで5人のゲスト(私を含む)にハッピーバースデーが歌われるのを聞きました。これは私に不思議に思いました-元の誕生日の問題(人の部屋にいる2人がN同じ誕生日を共有する確率を見つける)は非常に単純で簡単です。しかし、少なくともk人のうちN、同じ誕生日を共有する確率を計算するのはどうでしょうか? ご参考までに、合計50人のうち少なくとも5人が同じ誕生日を共有する確率は、約1/10000です。 チャレンジ 2つの整数Nとが与えられた場合k、ここでN >= k > 0、少なくともkグループのN人々が同じ誕生日を共有する確率を出力します。物事を単純にするために、365の誕生日が常に存在し、すべての日が平等であると仮定します。 以下のためにk = 2、これはオリジナルの誕生日の問題に帰着し、確率である1 - P(365, N)/(365)**N(ここP(n,k)でn個の要素から形成されたk長順列の数)。の値が大きい場合k、このWolfram MathWorldの記事は役に立つかもしれません。 ルール 出力は決定的であり、選択した言語に対して可能な限り正確でなければなりません。これは、モンテカルロ推定またはポアソン近似がないことを意味します。 Nそしてk、あなたの選択した言語で表現可能な最大の整数を超えないようにします。選択した言語に整数の厳密な最大値がない場合(メモリの制約を除く)、Nおよびkは任意に大きくなる可能性があります。 浮動小数点の不正確さに起因する精度エラーは無視される場合があります-ソリューションは完全に正確な無限精度のフロートを想定する必要があります。 テストケース フォーマット: k, N -> exact fraction (float approximation) 2, 4 -> 795341/48627125 (0.016355912466550306) 2, 10 -> 2689423743942044098153/22996713557917153515625 (0.11694817771107766) 2, 23 -> 38093904702297390785243708291056390518886454060947061/75091883268515350125426207425223147563269805908203125 (0.5072972343239854) 3, 3 -> 1/133225 (7.5060987051979735e-06) 3, 15 …

10
区別できないアイテムの順列
整数のリストを指定すると、整数の順列の数を出力し、区別できない順列を1回カウントします。ある場合はn整数であり、区別がつかない数字の各グループは、長さを持っているn_i、これはありますn! / (n_1! * n_2! * ...) ルール 入力は、1から12個の非負整数を持つ関数またはプログラムの引数としての何らかの形式のリストになります。 出力は、上記のように順列の数を印刷または返します。 標準的な抜け穴や組み込み関数(順列、組み合わせなどの生成)はありません。階乗が許可されます。 テストケース 入力: 1, 3000, 2, 2, 8 1, 1, 1 2, 4, 3, 2, 3, 4, 4, 4, 4, 4, 1, 1 出力: 60 1 83160

23
多角形の数字
多角形の数は、kサイズの1角形のドットの数ですn。 とが与えられn、kあなたの仕事は、対応する番号を出力/印刷するプログラム/関数を書くことです。 得点 これはcode-golfです。バイト単位の最短ソリューションが勝ちです。 例 3RD六角数は(k=6, n=3)で28あるので、28上記のドットが。 テストケース このPythテストスイートから生成できます。 使用法:テストケースごとに2行、n上、k下。 n k output 10 3 55 10 5 145 100 3 5050 1000 24 10990000 さらに詳しい情報 ウィキペディア:https : //en.wikipedia.org/wiki/Polygonal_number Wolfram Mathworld:http : //mathworld.wolfram.com/PolygonalNumber.html OEIS Wiki:http : //oeis.org/wiki/Polygonal_numbers さまざまなnのn対角数のOEISシーケンス:3 (A000217)、4 (A000290)、5 (A000326)、6 (A000384)、7 (A000566)、8 (A000567)、9 (A001106)、10 (A001107)、11 (A051682)、12 (A051624)、13 (A051865)、14 (A051866)、15 …

3
ハンケラブル行列の数を数える
バックグラウンド バイナリハンケル行列は、0sと1s のみを含む一定のスキュー対角(正の傾斜対角)を持つ行列です。たとえば、5x5バイナリハンケル行列は次のようになります a b c d e b c d e f c d e f g d e f g h e f g h i はまたa, b, c, d, e, f, g, h, iはのいずれ0か1です。 レッツは、行列の定義MとしてHankelableを行と列の順序の順列がある場合はMだからMは、ハンケル行列です。これは、1つの順列を行の順序に適用し、場合によっては異なる順列を列に適用できることを意味します。 チャレンジ 課題は、すべての可能な限り最大の値に対して、行列によるハンケラブルの 数を数えることです。nnn 出力 1以上の各整数nに対して、またはであるエントリを持つ行列によるハンケラブル の数を出力します。nn01 以下のためにn = 1,2,3,4,5答えなければなりません2,12,230,12076,1446672。(これらを生成するコードのorlpに感謝します。) 制限時間 私のマシンでコードを実行し、1分後に停止します。nの最大値まで正解を出力するコードが勝ちます。制限時間は、回答n = …

5
NをM個の整数の積として書く方法はいくつありますか?
整数Nが与えられた場合、M整数> 1の積として表現できる方法の数をカウントします。 入力は単純にNおよびMであり、出力は個別の整数グループの総数です。つまり、整数を複数回使用できますが、各グループは別個でなければなりません(存在する3 x 2 x 2場合2 x 2 x 3はカウントされません)。 制約 1 < N <2 31 1 < M <30 例 入力30 2は33つの方法で表現できるため、outputを提供します。 2 x 15 3 x 10 5 x 6 入力16 3はoutputを提供します。これは1、異なるグループが1つしかないためです。 2 x 2 x 4 入力2310 4は出力を与えます10: 5 x 6 x 7 x 11 3 …

22
Stöhrシーケンスを生成する
私はRubyを学び、この問題を解決するための最初の重要なコードを書きました。 課題は、第一生成するn個の要素Stöhr配列、S以下のように定義されます: S [0] = 1 S [n]は、シーケンス内の2つの異なる前の要素の合計として表現できない最小数です。 したがって、シーケンスは1、2、4、7、10で始まります。11(= 1 + 10)と12(= 2 + 10)は前の要素の合計ですが、13はそうではないため、次の要素は13です。 最短のコードを探しています。私自身のRubyの長さは108文字ですが、投稿する前に他の人がどのようなものを思いつくのを待つのでしょうか?

1
Androidフォンのロックを解除するのにどれくらいの時間が必要ですか?
シナリオ 私はパターンマッチングロックスクリーンを使用していますが、残念ながらパターンを忘れてしまいました。ロックを解除するのに必要な時間を知りたいです。このチャレンジに使用するGoogleのロック画面の仕様を以下に示します。 5つの間違ったコードごとに、ユーザーは30 secondsそれ以上入力するまで待たなければなりません。 パターンは、少なくとも4 points以下で構成されている必要があります(以下を参照) ポイントは1回しか使用できませんが、複数回確認できます(下の画像を参照)。 ここでは、この特定のパターンで再び中心点を通過しても、中心点は1回だけ使用されます。 仮説と事実 私たちはスーパーヒーローであり、で任意のパターンを描くことができると仮定します1 second。食べたり寝たりする必要はありません。ええ、私たちは超人です。 私は非常に不運な人です。「最悪のシナリオ」は私の日常生活であるため、最後に試みるパターンは正しいものです。 何が必要ですか? 知らない人のために、Android(および現在他の携帯電話)は、9ポイントマトリックスにパターンを描くことで携帯電話のロックを解除する機能を提供しています。このマトリックスは次のように説明できます。 C(A) M(B) C(C) M(D) X(E) M(F) C(G) M(H) C(I) 「コーナーポイント」を表すC 「中間点」のM 「中心点」のX 簡単にするためにポイントに識別子を付けました 許可される直接接続は次のとおりです。 コーナーポイント: 中間点: 中心点 : ただし、steveverrillが指摘したように、「中心が使用されると(したがって使用できなくなると)、左下隅と右上隅の間の直接接続が明確になり、したがって可能になります」。同じことがすべての「中間点」にも当てはまります。たとえば、ポイントBがすでにカウントされている場合、AとCの間の直接接続が可能です。たとえば、Fがすでにカウントされている場合、CとIの間の直接接続が可能です。等... ルール この課題のポイントは、このいまいましい携帯電話のロックを解除する必要がある時間(人間が読める形式、年/日/月/時間/何時でも)を返すことです。 可能な有効なパターンの数をハードコーディングすることはできません(Googleでさえ、ばかにしないでください)。 最短のコードが勝つ 幸運を !

3
3による可分性のための回路の構築
TCS のブール回路は、基本的にAnd、Or、Notゲートで構成されるDAGであり、「機能的完全性」が知られていることにより、可能なすべての機能を計算できます。例えば、これはALUの基本原則です。 課題:8進数の数字が3で割り切れるかどうかを判断する回路を作成し、何らかの方法で結果を視覚化します(つまり、何らかの画像で) 投票者の判断基準は、回路を生成するコードが任意のサイズの数値にうまく一般化されているかどうか、およびアルゴリズムで作成された視覚化がコンパクト/バランスが取れているがまだ人間が読み取れるかどうかに基づいています(つまり、手作業による視覚化は許可されていません)。すなわち、視覚化はn = 8のみに対して行われますが、コードはすべての「n」に対して理想的に機能します。入賞作品はトップ投票のみです。 やや似た質問:NAND論理ゲートを使用して乗算機を構築する

12
コードゴルフ:ボールの配布(I)
チャレンジ このタスクでは、すべてのセルが少なくとも1つのボールを持つ状態で、AのボールをBのセルに分配する方法の数を計算しました。 入力AとBは空白で区切られた1行で与えられ、入力はEOFで終了します。 こちらでソリューションを確認できます。 入力 0 0 1 0 12 4 6 3 18 17 20 19 15 13 18 9 20 20 17 14 9 2 14 13 18 11 出力 1 0 14676024 540 54420176498688000 23112569077678080000 28332944640000 38528927611574400 2432902008176640000 21785854970880000 510 566658892800 334942064711654400 制約 すべてのAとBは区別できます。 0 <= A、B …

3
一意のセットを構成する配列をカウントする
この質問には、目標がまったく異なりますが、合計のセットに適合する配列を見つけるための同様の設定があります。 A長さの配列を考えnます。配列には正の整数のみが含まれます。たとえばA = (1,1,2,2)。f(A)のすべての空でない連続したサブ配列の合計のセットとして定義しましょうA。この場合f(A) = {1,2,3,4,5,6}。作成する手順f(A) は次のとおりです。 の部分配列はAです(1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)。それぞれの合計は1,1,2,2,2,3,4,4,5,6です。したがって、このリストから取得するセットはです{1,2,3,4,5,6}。 逆の配列を除き、などの同じ長さの他の配列がない場合、A 一意の配列を呼び出します。例として、同じ合計セットを生成する長さの他の配列はありません。Bf(A) = f(B)Af((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}3 要素が指定された整数sまたはである配列のみを考慮しますs+1。例えばもしs=1配列のみを含んでいるでしょう1と2。 仕事 所与のためのタスク、nおよびsその長さのユニークな配列の数をカウントすることです。それsはとの間にある1と仮定でき9ます。 配列の逆だけでなく、配列自体もカウントするべきではありません。 例 s = 1、答えは常にn+1です。 s = 2、上から数えて答えn = 1は次のとおりです。 2,3,6,10,20,32,52,86 s = 8、上から数えて答えn = 1は次のとおりです。 2,3,6,10,20,36,68,130 スコア 与えられたためにn、あなたのコードが出力のすべての値に対して答える必要がありますsから1にします9。スコアは、nこれが1分間で完了する最大値です。 テスト中 私のubuntuマシンでコードを実行する必要があるので、コードをコンパイルして実行する方法について、できるだけ詳細な指示を含めてください。 リーダーボード …

3
リンドン単語分解
バックグラウンド A リンドン・ワードは、そのすべての他の回転より厳密に辞書的に小さい非空の文字列です。これらのサブワードが辞書式に増加しないように、Lyndonワードの連結として任意のストリングを一意に因数分解することができます。あなたの挑戦はこれをできるだけ簡潔にすることです。 詳細 印刷可能なASCII文字列のLyndonワード分解を順番に列挙する関数またはプログラムを実装し、結果の部分文字列を何らかの配列またはストリームとして出力する必要があります。文字はコードポイントで比較する必要があり、すべての標準入出力メソッドが許可されます。code-golfの場合と同様に、バイト単位の最短プログラムが優先されます。 テストケース '' [] 'C' ['C'] 'aaaaa' ['a', 'a', 'a', 'a', 'a'] 'K| ' ['K|', ' '] 'abaca' ['abac', 'a'] '9_-$' ['9_', '-', '$'] 'P&O(;' ['P', '&O(;'] 'xhya{Wd$' ['x', 'hy', 'a{', 'Wd', '$'] 'j`M?LO!!Y' ['j', '`', 'M', '?LO', '!!Y'] '!9!TZ' ['!9!TZ'] 'vMMe' ['v', 'MMe'] 'b5A9A9<5{0' ['b', …

27
配列の要素間のすべての非順序ペア
仕事: 配列の要素間で可能なすべてのペアを含む配列を返します。 例 a=["a", "b", "c", "d"];帰りからb=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]]。 可能な組み合わせがすべて含まれていて、明らか["b","d"]に同じである限り、ペアは任意の順序にできます["d","b"]。 入力 クラスの文字で構成される一意の文字列要素の配列[a-z]。 出力 入力配列の要素の可能なすべてのペアを含む2D配列。 テストケース input=["a","b","c"]; //output=[["a","b"],["a","c"],["b","c"]] input=["a","b","c","d","e"]; //output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]] 注:このチャレンジの重複は見つかりませんでした。ある場合は、質問をドロップするためのコメントで通知してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.