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

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

19
すべてのサブリストパーティションを生成する
整数の空でないリストが与えられた場合、各パーティションが空でないサブリストであるリストの可能なパーティションをすべて出力します。 リスト[1, 2, 3, 4]の結果は次のとおりです。 [[1, 2, 3, 4]] [[1, 2, 3], [4]] [[1, 2], [3, 4]] [[1, 2], [3], [4]] [[1], [2, 3, 4]] [[1], [2, 3], [4]] [[1], [2], [3, 4]] [[1], [2], [3], [4]] 出力内のリストの順序は重要ではないため、[[1, 2, 3, 4]]最初、最後、またはどこでもかまいません。要素の順序を保持する必要があります。 これはコードゴルフなので、最短の回答が勝ちです。 関連:リストを分割します!

7
Squareまでの合計桁
任意の整数x> 0および任意の基数y> 3が与えられます。 xのすべての数字を合計します(セットベースで記述されている場合)。 これに可能な限り最高の桁を掛けます(常にですbase -1)。 この値がなるまで繰り返します (y - 1) ^ 2 検索されるのは、反復回数とステップです。 例1: x= 739 y= 7 searched: (7 - 1) ^ 2 = 36 based: (b7)2104 sum: (dec)7 mul: (dec)42 based: (b7)60 sum: (dec)6 mul: (dec)36 2 steps needed -> answer is [2, 739, 42, 36] or [739, …

8
ファイの三角形を描く
明確化:基本的に、これを作成する必要があります オイラーのtotient関数の名前はphiです。 phi(8)を計算してみましょう まず、0以下を含まない、8以下のすべての数字を後方にリストします 8 7 6 5 4 3 2 1 次に、8と因子を共有しない数字を見つけ(1はカウントしません)、その場所にa #を配置します。 8 # 6 # 4 # 2 # 数字を削除します。 # # # # - これを行いますが、出力を三角形にまとめます 9 88 777 6666 55555 444444 3333333 22222222 111111111 --------- 123456789 # 非因子共有番号を出力する 9 8# 7## 6#66 5#### 4#4#4# 3##3##3 2#2#2#2# …

2
木を数える
ツリーはないサイクルの接続、無向グラフです。あなたの仕事は、与えられた数の頂点にいくつの木があるかを数えることです。 2つのツリーは、同型でない場合、別個と見なされます。2つのグラフは、それぞれの頂点が1つのグラフの2つの頂点の間にエッジがあるようにペアリングできる場合に同型です。より詳細な説明については、上記のリンクを参照してください。 サイズ1から6の異なるツリーのすべてがどのように見えるかを確認するには、こちらをご覧ください。 出力しようとしているシリーズは、OEISでA000055です。 制限:ソリューションは、入力で実行するのに数分以内にかかる必要があります6。これは、指数時間アルゴリズムを排除することを意図していませんが、すべてのエッジセットに対するブルートフォースなどの二重指数時間アルゴリズムを排除することを意図しています。 入力:負でない整数。 入力は、STDIN、コマンドラインパラメーター、関数入力など、標準的な手段によるものです。 出力:入力と同じ数の頂点を持つ個別のツリーの数。 出力は、STDOUT、関数の戻り値などを含む標準的な手段によるものです。 例: 0, 1, 2, 3, 4, 5, 6, 7を返す必要があり1, 1, 1, 1, 2, 3, 6, 11ます。 得点:ゴルフをバイト単位でコーディングします。最短のコードが勝つように! 標準的な抜け穴は禁止されています。

6
最大連結製品
整数p1、...、pkのリストが提供されます(必ずしも個別ではありません)。それぞれの値は1から9までの値です。p1、...、pkをそれぞれ1回だけ使用して、数字の連結を形成し、新しい数字のリストを作成できます。次に、この新しいリストの積を出力します。目標は、数字の最適な連結を選択することにより、この製品を最大化することです。 たとえば、リスト2 3 2(スペースで区切られた)が与えられます。次の連結を形成できます。 2 3 2(これらの連結の積は12) 23 2(製品は46) 32 2(製品は64) 22 3(製品は66) 連結を形成できる最大の製品は66なので、出力します。 ルール: 少なくとも1つの乗算が必要です(つまり、すべての桁を連結して出力​​することはできません)。 乗算以外の演算子を使用したり、括弧を挿入したりすることはできません。 指定された整数のリストはスペースで区切られ、すべての整数の値は1〜9であると仮定します。 最短コード(バイト単位)が勝ちます! テストケース: 入力:1 2 3; 出力:(63つまり、21*3) 入力:2 5 9; 出力:468(52*9) 入力:1 2 3 4; 出力:1312(41*32)

3
マトリックスプロパティXの再検討(またはXの喜び)
この課題は、一部はアルゴリズムの課題、一部は最適化の課題、一部は単に最速のコードの課題です。 AT行列は、最初の行rと最初の列で完全に指定されますc。マトリックスの残りの各要素は、斜め上および左にある要素の単なるコピーです。それはM[i,j] = M[i-1,j-1]。正方形ではないT行列を許可します。ただし、行数は列数以下であると常に想定しています。たとえば、次の3 x 5 Tマトリックスを考えます。 10111 11011 11101 マトリックスに同じ(ベクトル)合計を持つ非同一のインデックスを持つ2つの空でない列のセットが含まれている場合、マトリックスはプロパティXを持つと言います。1つまたは複数の列のベクトル和は、単に列の要素ごとの合計です。つまり、x要素を含む2つ以上の列の合計は、それぞれがx要素を含む別の列です。1つの列の合計は、列そのものです。 最初の列と最後の列が同じであるため、上記のマトリックスにはプロパティXがあります。単位行列にプロパティXが含まれることはありません。 上記のマトリックスの最後の列を削除するだけの場合、プロパティXを持たず、4/3のスコアを与える例が得られます。 1011 1101 1110 タスク タスクは、バイナリエントリを持ち、プロパティX を持たない最高スコアのTマトリックスを見つけるためのコードを記述することです。わかりやすくするために、バイナリエントリを持つマトリックスは、各エントリが0または1であるというプロパティを持ちます。 スコア スコアは、列の数を最適なスコアマトリックスの行数で割ったものになります。 タイ・ブレーカー 2つの回答のスコアが同じ場合、最初に提出された方が勝ちです。 無制限のスコアを取得する方法を誰かが見つけた(非常に)まれなイベントでは、そのようなソリューションの最初の有効な証明が受け入れられます。可能性がさらに低い場合、有限行列の最適性の証明を見つけることができるので、もちろん勝利も授与します。 ヒント ここでは、プロパティXを使用せずに最高スコアのマトリックスを検索での回答はすべて有効ですが、最適ではありません。プロパティXのないT行列があり、それらは循環的ではありません。 たとえば、プロパティXのない7×12 Tの行列がありますが、そのような巡回行列はありません。 21/11は、これと以前の課題からの現在のすべての答えを打ち負かすでしょう。 言語とライブラリ 自由に利用できるコンパイラ/インタープリター/などを備えた任意の言語を使用できます。LinuxおよびLinuxでも自由に利用できるライブラリ用。 ボーナススコアが2を超える最初の回答には、すぐに200ポイントの賞金が授与されます。トン・ホスペルはこれを達成しました! 現在のリーダーボード C ++。Ton Hospelによるスコア31/15 Javaの。Peter Taylorによるスコア36/19 ハスケル。alexander-brettによるスコア14/8

1
Davenport-Schinzelシーケンスを生成する
バックグラウンド ダヴェンポート-Schinzel配列は、 2つの正の整数パラメータを有しているdとn。によって、指定されDS(d,n)たパラメータのすべてのDavenport-Schinzelシーケンスのセットを示します。 自然数の全てのシーケンスを考えてみましょう1にn満足している、包括的、: シーケンス内の連続する2つの番号は同一ではありません。 より大きい長さのサブシーケンス(連続している必要はありません)はありませんd。 Lこのようなシーケンスの最大長を指定してみましょう(dとn)。次に、DS(d,n)長さを持つそのようなすべてのシーケンスのセットですL。 いくつかの例が役立つかもしれません。ましょうd = 4、n = 3。これらの制約のある最長のシーケンスには、がありL = 8ます。したがって、以下はのメンバーですDS(4,3): [1, 2, 1, 3, 1, 3, 2, 3] 連続する同一の番号はなく、lengthの交互のサブシーケンスがあります4が、より長いサブシーケンスはありません。 1 2 1 2 1 2 1 2 1 3 1 3 1 3 1 3 2 3 2 3 2 3 2 3 1 3 1 …

2
到達可能な蛇の方向の数
この課題は、ゲームSnakeについてのものではありません。 長さの水平線を引くことによって形成された2Dのヘビを想像してくださいn。体に沿った整数点で、この蛇は体を90度回転させることができます。最初にヘビの前部を左端に定義すると、ヘビの後ろの部分が回転によって移動し、前の部分はそのままになります。繰り返し回転することにより、さまざまな蛇の形を作ることができます。 ルール ヘビの体のある部分が別の部分と重なることはできません。 ヘビの体のどの部分も間に重なることなく、最終的な方向に到達できる必要があります。この問題では、接触する2つのポイントが重複しているとカウントされます。 私はヘビとその逆を同じ形だと考えています。 仕事 回転、平行移動、鏡面対称まで、作成可能なさまざまな蛇の形の総数はいくつですか? ヘビの体の一部の回転の例。想像n=10してみると、ヘビは直線の開始方向にあります。ここで、4反時計回りに90度回転します。私たちはヘビ4を10(ヘビ の尾)から垂直に、ヘビをから水平0に4横たえます。ヘビの体には直角が1つあります。 以下は、MartinBüttnerのおかげです。 水平のヘビから始めます。 次に、位置4から回転します。 この向きで回転した後、私たちは終わります。 次に、異なるヘビのこの方向を考えてみましょう。 ローテーション中にオーバーラップが発生する違法な動きを見ることができます。 スコア あなたのスコアは、nあなたのコードが私のコンピューター上で1分以内に問題を解決できる最大のものです。 回転が発生すると、蛇の半分が一緒に移動します。回転しているこの部分のいずれかが、回転中にヘビの一部と重なるかどうかを心配する必要があります。簡単にするために、蛇の幅はゼロであると想定できます。ヘビの特定の点でのみ、時計回りに反時計回りに最大90度回転できます。なぜなら、同じ方向に同じポイントで2つの回転が必要になるため、ヘビを2つに完全に折り畳むことはできません。 作れない形 作ることのできない形の簡単な例は首都Tです。より洗練されたバージョンは (この例についてはHarald Hanche-Olsenに感謝します) この例では、すべての隣接する水平線は垂直線と同様に1離れています。したがって、この位置からの法的な動きはなく、問題は可逆的であるため、開始位置からそこに到達する方法はありません。 言語とライブラリ 自由に利用できるコンパイラ/インタープリター/などを備えた任意の言語を使用できます。LinuxおよびLinuxでも自由に利用できるライブラリ用。 私のマシン タイミングは私のマシンで実行されます。これは、AMD FX-8350 8コアプロセッサへの標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。結果として、簡単に入手できる無料のソフトウェアのみを使用し、コードをコンパイルして実行する方法の完全な指示を含めてください。

10
フィボナッチドミノタイル
あります古典的な組み合わせの結果タイルに、いくつかの方法があること2*nによって、ストリップ1*2ドミノがn 番目のフィボナッチ数は。あなたの目標は、nこれらの8つのタイルのようにダッシュと垂直線で描かれた特定のすべてのタイルを印刷することですn=5: |———— |———— ——|—— ——|—— |||—— |||—— ————| ————| ||——| ||——| |——|| |——|| ——||| ——||| ||||| ||||| n入力として必要な出力を出力するプログラムまたは名前付き関数を提供します。最少バイトが勝ちます。 入力 数n間1および10STDINまたは機能入力を介して包括的な。 出力 2*nストリップの可能なドミノタイルをすべて水平に描画して印刷します。タイルの順序は任意ですが、それぞれ1回だけ表示される必要があります。これらは空白行で区切る必要があります。 垂直ドミノは2つの垂直バー(|)で構成され、水平ドミノは2つのダッシュ(—)で構成されています。-ASCIIのままにするために、ダッシュの代わりにハイフン()を使用できます。 印刷出力が同じように見える限り、空白で何でもできます。

1
少なくともN個の有効な番号を得るために、再生する宝くじのチケットを最小限に抑えます
これはかなり複雑ですが、非常に興味深い数学の主題(「問題をカバーする」として知られています)、 そして、それを実装するためにあなたの助けが欲しい。 宝くじゲームを想像してください。各宝くじは、50個の数字(1〜50)から5つの乱数を選択する必要があります。 チケットが当選する確率、または1、2、3、または4個の良い数字を獲得する確率を知るのは非常に簡単です。 また、1、2、3、4個の適切な番号を持つすべてのチケットを「生成」するのは非常に簡単です。 私の質問(およびコードチャレンジ)はこれに関連していますが、少し異なります。 少なくとも 1つのチケットに3つの良い番号が含まれているなど、いくつかの宝くじ(可能な限り少ない数)を購入したい。 チャレンジ 目標は、次のような汎用ソリューションを(プログラムまたは単なる関数として)任意の言語で実装することです。 // Input: 3 prameters min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want) 上記の例では、以下を呼び出すだけです: min_lottery_tickets(50, 5, 3) プログラムはこの目標を達成するためにプレイするチケットの最小セットを生成します。 例: min_lottery_tickets(10, 5, 2) 次のような7つのチケットを出力します。 1 2 3 4 5 5 6 7 8 9 10 1 2 6 7 10 3 4 8 9 3 4 6 …

6
Chess960位置発生器
環境 Chess960(またはFischer Random Chess)は、アルゼンチンのブエノスアイレスで1996年6月19日に公に発表された元世界チェスチャンピオンのBobby Fischerによって発明され提唱されたチェスの変形です。標準のチェスと同じボードとピースを使用しています。ただし、プレイヤーのホームランクの駒の開始位置はランダム化されます ルール 標準のチェスのように、白いポーンは2番目のランクに配置されます 残りのすべての白いピースは、最初のランクにランダムに配置されます ビショップは反対色の正方形に配置する必要があります 王はルークの間の広場に置かれなければなりません。 黒のピースは白のピースと等しく反対に配置されます。 From:http : //en.wikipedia.org/wiki/Chess960 回答を投稿したいすべての人々のために... 上記のルールに従って960ポジションのいずれかをランダムに生成できるChess960ポジションジェネレーターを作成する必要があります(960のいずれかを出力できる必要があり、1ポジションをハードコーディングすることは受け入れられません!)白ランク1個を出力します。 出力例: rkrbnnbq どこ: kキング qクイーン bビショップ nナイト ルーク これはコードゴルフになり、タイブレーカーが賛成票になります。

26
数学的な組み合わせ
次のような入力を受け取るプログラムを作成します。 n,k 次に計算します: そして、結果を印刷します。 数値の例: 入力: 5,2 内部計算: 印刷出力: 10 私は65文字のPythonソリューションに勝る答えを探していますが、すべての言語は明らかに歓迎されています。 私のソリューションは次のとおりです。 n,k=input();f=lambda x:+(x<2)or x*f(x-1);print f(n)/(f(k)*f(n-k)) 編集: この質問はcodegolfのWebサイトの数学的な組み合わせパズルからのものであることを認めます。私の答えはあまり進歩していないように見えるかもしれませんが、このパズルのリーダーはほぼ半分のキャラクターでそれを解決しました。 言語ごとの現在の最低文字数は次のとおりです。 Perl:35 ルビー:36 Python:39 PHP:62

5
トポロジーソートの総数
特定のDAG(有向非巡回グラフ)の場合、そのトポロジーの並べ替えはすべての頂点の順列であり、DAGのすべてのエッジ(u、v)について、uは順列のvの前に表示されます。 あなたのタスクは、特定のDAGのトポロジカルソートの総数を計算することです。 ルール エンコーディングで有用な計算を行わない限り、隣接行列、隣接リスト、エッジリストなど、任意の形式を使用してグラフを表すことができます。有用な場合は、入力に頂点数や頂点リストなどを含めることもできます。 入力のグラフは常にDAGであると想定できます(サイクルはありません)。 あなたのプログラムは理論的にはどんな入力に対しても機能するはずです。ただし、言語の基本的な整数型をオーバーフローすると失敗する可能性があります。 頂点の名前は、任意のタイプの任意の連続した値にすることができます。例:0または1から始まる数値(もちろん、この数値にコードを格納していない場合のみ)。 これはコードゴルフです。最短のコードが勝ちます。 例 これは、異なる形式の同じ入力です。プログラムはそれらすべてを受け入れる必要はありません。頂点は常に0から始まる整数です。 Adjacency list: [ [1 2 3 5] [2 4] [] [2] [] [3] ] Adjacency matrix: [ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 …

3
任意のランダム性(スピード版)
与えられたinteger nで、セットの合計が以下に等しくなるようにn、範囲1..n^2(両端を含む)でランダムな一意の整数のセットを計算しますn^2 この場合のランダムとは、有効な出力間で一様にランダムであることを意味します。特定の有効な出力ごとnに、生成される可能性が一定でなければなりません。 例えば、n=33分の1のチャンスに出力のそれぞれを持っていなければならない6, 1, 2、3, 5, 1または4, 3, 2。これが設定される、順序は、無関係で4, 3, 2同一であります3, 2, 4 得点 勝者はn60秒未満で最高を計算できるプログラムです。 注:部分的なハードコーディングの可能性を防ぐには、すべてのエントリが4000バイト未満である必要があります テスト中 すべてのコードはローカルのWindows 10マシン(Razer Blade 15、16GB RAM、Intel i7-8750H 6コア、4.1GHz、GPUを悪用したい場合はGTX 1060)で実行されるので、コードを実行するための詳細な手順を提供してください私のマシン。 リクエストに応じて、WSL上のDebianまたはXubuntu仮想マシン(どちらも上記と同じマシン上)でエントリを実行できます。 提出は連続して50回実行され、最終スコアは50件すべての結果の平均になります。

1
転がしてすべての面を見てください!
あなたが20面のサイコロを持っているとしましょう。あなたはそのサイコロを転がし始め、最終的に20個すべての値を転がす前に数十回転がさなければなりません。20個すべての値が50%の確率で表示されるまでに、いくつのロールが必要ですか。そして、n私がすべてのn面を転がす前に、何面のサイコロを振る必要がありますか? いくつかの調査の結果、ロール後にすべての値をロールする可能性を計算するための式が存在することがわかりました。nr P(r, n) = n! * S(r, n) / n**r ここで、は第2種のスターリング数をS(a, b)示し、n個のオブジェクト(各ロール)のセットをk個の空でないサブセット(各サイド)に分割する方法の数を示します。 また、が50%以上の最小のに対応するOEISシーケンス(これをと呼びます)も見つかります。課題は、このシーケンスのth項をできるだけ速く計算することです。R(n)rP(r, n)n チャレンジ 与えられn、検索最小 r場所P(r, n)以上で0.550%。 コードは理論的には負でない整数nを入力として処理する必要がありますが、テストするのはの範囲でのみ1 <= n <= 1000000です。 スコアリングのために、我々は実行するために必要な合計時間かかりなりますR(n)入力に1スルー10000。 あなたのソリューションは、私たちのバージョンを実行して、正しいかどうかをチェックするR(n)かどうかを確認するために、あなたの出力にP(your_output, n) >= 0.5し、P(your_output - 1, n) < 0.5あなたの出力は、実際に最も小さいすなわちことを、r与えられたためn。 S(a, b)ソリューションでは任意の定義を使用できます。ウィキペディアには、ここで役立ついくつかの定義があります。 S(a, b)計算P(r, n)するものや直接計算するものを含め、ソリューションに組み込みを使用できます。 最大1000個の値R(n)と100万個のスターリング数をハードコードできますが、どちらもハードリミットではなく、値を上げたり下げたりする説得力のある引数を作成できる場合は変更できます。 と探しているのr間nで可能な限りすべてをチェックする必要はありませんが、どこかだけでなくr、最小のものを見つける必要があります。rrP(r, n) >= 0.5 プログラムでは、Windows 10で自由に実行できる言語を使用する必要があります。 ソリューションをテストするコンピュータの仕様は次のとおりi7 4790k, 8 GB …

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