考えると二組、例えば:繰り返し
{A B C}, {1 2 3 4 5 6}
を最小限に抑えながら、デカルト積を列挙私は同じ要素の間にできるだけ多くのスペースを置くために、デカルト積を生成したいです。たとえば、[A1, A2, A3, A4, A5, A6, B1…]
は、すべてのA
が互いに隣接しているため、正しくありません。
[A1, B2, C3, A4, B5, C6, A2, B3, C4, A5, B6, C1, A3…]
を視覚的に表現する:
| | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | | | | | | | | | | | | | | | | | |
| 2 | | 2 | | | | | | | | | | | | | | | | |
| 3 | | | 3 | | | | | | | | | | | | | | | |
| 4 | | | | 4 | | | | | | | | | | | | | | |
| 5 | | | | | 5 | | | | | | | | | | | | | |
| 6 | | | | | | 6 | | | | | | | | | | | | |
| 1 | | | | | | | | | | | | | | | | | | |
| 2 | | | | | | | 7 | | | | | | | | | | | |
| 3 | | | | | | | | 8 | | | | | | | | | | |
| 4 | | | | | | | | | 9 | | | | | | | | | |
| 5 | | | | | | | | | | 10| | | | | | | | |
| 6 | | | | | | | | | | | 11| | | | | | | |
| 1 | | | | | | | | | | | | 12| | | | | | |
| 2 | | | | | | | | | | | | | | | | | | |
| 3 | | | | | | | | | | | | | 13| | | | | |
| 4 | | | | | | | | | | | | | | 14| | | | |
| 5 | | | | | | | | | | | | | | | 15| | | |
| 6 | | | | | | | | | | | | | | | | 16| | |
| 1 | | | | | | | | | | | | | | | | | 17| |
| 2 | | | | | | | | | | | | | | | | | | 18|
または、同等しかし、行/列を繰り返すことなく受け入れ可能な解決策は、それが1によって相殺ラップするたびに、例えば「対角線の下」に行くことになります:
他の解決策もありますが、それは私が最も簡単に考えるものです。しかし、私は壁に向かって頭を叩いて、それを一般的に表現する方法を見つけようとしています.2つのセットの基数がお互いの倍数であるのは便利なことですが、アルゴリズムでは、サイズ5と7、またはサイズ12と69(実際の例です)のようになります。
これについて確立されたアルゴリズムはありますか?私は、有理数が自然数の集合にどのように写像されているかを考えて(計算可能であることを証明するために)注意をそらし続けますが、この場合はℕ×pathを通る経路は機能しません。
とてもアプリケーションがRubyで書かれているが起こるが、私は、言語を気にしないでください。擬似コード、Ruby、Python、Java、Clojure、Javascript、CL、英語の段落 - あなたの好みを選んでください。 Pythonで
概念実証ソリューションは、(すぐにルビーに移植し、レールとフックアップする):
import sys
letters = sys.argv[1]
MAX_NUM = 6
letter_pos = 0
for i in xrange(MAX_NUM):
for j in xrange(len(letters)):
num = ((i + j) % MAX_NUM) + 1
symbol = letters[letter_pos % len(letters)]
print "[%s %s]"%(symbol, num)
letter_pos += 1
カーディナリティが倍数でない場合に起こることすべてが、それはラップに時間がかかることである - 例えばA1 B2 C3 D1 A2 B3 C1 D2 A3 B1 C2 D3。 2つの数字が共起する場合は、セット全体をカバーするまで、折り返しはありません。あなたがする必要があるのは、ラップが起こるまで待ってから、まだカバーされていないシンボルを見つけることだけです。 – mcdowella
これは線形代数の宿題のように聞こえる。私はあなたが間違った問題を説明していると思います。一歩踏み込んでコースの教材を読んでください。問題がどのようになっているのかははっきりしているはずです。 – starmole
これは宿題ではありません。アプリケーションはRailsのワークアウトアプリです。私は趣味のプロジェクトとしてやっています。基本的なアイデアは、あなたが6つのタイプのab運動をそれぞれがまっすぐに、左に、または右に行うことができれば、合計18の運動があるが、あなたは毎日それらのすべてをしたくないということであり、あなたがそれらがすべて体の同じ側にあることを望んでいない日に5日しかしないでください。そのため、アプリケーションはすべての組み合わせを見つけ出し、それを行うための合理的な順序を提示します。私はその問題をDBスキーマなどで汚染したくありませんでした。私のコアな質問はアルゴリズムについてです。 – tsm