直交対角グレコラテン正方形の構築


11

Nx個のN一意の要素のグリッドを考えます。各要素には、文字(AからNth文字まで)と数字(1からN包括的)があります。したがって、各数字/文字のペアはグリッドに1回だけ存在します。

あなたの仕事は、次のようにグリッドを配置することです:

各行、列、および対角線(折り返しを含む)には、各文字と数字が1回だけ含まれています。

ラッピングとは、つまり

* * * # *
* * # * * 
* # * * *
# * * * *
* * * * #

は、対角線であり、エッジに当たるすべての同様の対角線です。

5x5グリッドの例は次のとおりです。

A1 B2 C3 D4 E5
C4 D5 E1 A2 B3
E2 A3 B4 C5 D1
B5 C1 D2 E3 A4
D3 E4 A5 B1 C2

あなたのタスクは、数値を受け入れるプログラムを作成し、上記のようにx グリッドをN印刷することです。あなたのプログラムは、すべてのために動作するはずです。特定のグリッドが不可能な場合は、印刷する必要があります。NN0 < N <= 26Impossible

anyの答えをハードコーディングすることNは許可されていません。プログラムは、何らかの方法でグリッドを計算する(私が判断した)場合N > 26(または計算に失敗する場合)、ハードコーディングされます。(これは、事前計算された無効なグリッド、または特定のグリッドのオフセットを含む事前計算を防ぐためのものです)。

これは最速のコードの問題であり、スコアはN私のコンピューター上でプログラムを実行するのにかかった時間の合計です。あなたの答えでは、あなたのプログラムをすべて実行してくださいN(だから私は一度だけ時間を計る必要がある)。プログラムが60秒未満で計算できない場合、勝者はN60秒で最大のグリッドを計算できる答えです。複数のプログラムの最大値が同じ場合N、タイブレーカーが最速のソリューションです。

(私はまともなWindows 8マシンを搭載しており、必要なコンパイラーまたはインタープリターはすべて自由に利用できなければなりません)。


マシンがLinuxではなくWindowsであるという事実は、一部のテクノロジーにとって面倒な場合があります。
-orlp

質問に対して+1ですが、あなたの例の分析がかなり速いアルゴリズムを与えるように思えると、実際に速度を測定できるかどうか疑問に思います。文字列を返す関数を書くことはできますか?API呼び出しが実際の印刷に要する時間は計算よりも長いと思うからです。
レベルリバーセント

@steveverrillはい、タイミングのために、文字列を返すことは許容されます。
ネイサンメリル

文字と数字の目的は何ですか。各番号は各文字の横に1回だけ表示されますか、それとも1は常にAの横に表示され、2はBの横に表示されますか?
ジャクベ

@ジャクベはい。各要素は一意である必要があります。つまり、グリッド内の各数字/文字のペアは一意である必要があります。
ネイサンメリル

回答:


5

Python 3

letters = []
numbers = []
for n in range(1,27): 
    if n%2==0 or n%3==0:
        offsets=False
    else:
        offsets = [x for x in range(0,n,2)]
        offsets.extend([x for x in range(1,n,2)])
    letters.append(chr(96+n))
    numbers.append(n)
    if offsets :
        for y in range(n):
            for x in range(n):
                let=letters[(x+offsets[y])%n]
                num=numbers[(offsets[y]-x)%n]
                print (let+str(num), end= "  " if num<10 else " ")
            print("\n")     
    else: 
        print("Impossible\n")

使い方?

素朴な実装は、NxNグリッド内の文字と数字のすべての可能な配置を調べ、直交対角ラテン方格(ODLS)でもあるものを探すことです(したがって、一部の場合はすべてを通過する必要があります)構成およびリターン不可能)。そのようなアルゴリズムは、不合理な時間の複雑さのため、この課題に適さないでしょう。したがって、私の実装で使用されるODLS構造には、次の3つの主要な単純化と正当化(それが機能する理由の部分的な証明と洞察)があります。

最初は、有効な対角ラテン方陣(各行、列、折り返し対角がN個の異なる要素のセットの各要素を正確に1回含むNxNグリッド)の最初のN文字のみを生成する必要があるという概念です。アルファベット。このような対角ラテン方格(DLS)を構築できる場合、要素の適切な交換と反転を使用してDLSを使用してODLSを構築できます。正当化:

Let us first look at an example using the example grid
a1 b2 c3 d4 e5
c4 d5 e1 a2 b3
e2 a3 b4 c5 d1
b5 c1 d2 e3 a4
d3 e4 a5 b1 c2
Every ODLS can be separated into two DLS (by definition), so
we can separate the grid above into two DLS, one containing letters, the other - numbers
a b c d e
c d e a b
e a b c d
b c d e a
d e a b c
and
1 2 3 4 5 
4 5 1 2 3
2 3 4 5 1
5 1 2 3 4 
3 4 5 1 2
If we transform the number DLS by the mapping 1-->e, 2-->d, 3-->c, 4-->b, 5-->a,
1 2 3 4 5 --> e d c b a
4 5 1 2 3 --> b a e d c
2 3 4 5 1 --> d c b a e
5 1 2 3 4 --> a e d c b
3 4 5 1 2 --> c b a e d
Now if we put the transformed number grid next to the original letter grid,
Original  | Transformed
a b c d e | e d c b a
c d e a b | b a e d c
e a b c d | d c b a e
b c d e a | a e d c b
d e a b c | c b a e d
It can be clearly seen that the number grid is a horizontal flip of
the letter grid withminor letter to number substitutions.
Now this works because flipping guarantees that no two pairs occur more than once,
and each DLS  satisfies the requirements of the ODLS.

2番目の単純化は、1つの要素の適切な構成(SC)が見つかった場合(各行、列、折り返し対角線がその要素を1回だけ含むNxNグリッド)を見つけた場合、要素を置き換えることでDLSを構築できるという概念ですSCをシフトします。正当化:

If "_" is an empty space and "a" the element then a valid SC of a 7x7 grid is
a _ _ _ _ _ _
_ _ a _ _ _ _
_ _ _ _ a _ _
_ _ _ _ _ _ a
_ a _ _ _ _ _ 
_ _ _ a _ _ _
_ _ _ _ _ a _
or
a _ _ _ _ _ _
_ _ _ a _ _ _
_ _ _ _ _ _ a
_ _ a _ _ _ _
_ _ _ _ _ a _ 
_ a _ _ _ _ _
_ _ _ _ a _ _
(the second one can actually be obtained from the first one via rotation)
now say we took the second SC, shifted it one unit to the right and 
replaced all "a" with "b"
a _ _ _ _ _ _       _ a _ _ _ _ _       _ b _ _ _ _ _
_ _ _ a _ _ _       _ _ _ _ a _ _       _ _ _ _ b _ _
_ _ _ _ _ _ a       a _ _ _ _ _ _       b _ _ _ _ _ _
_ _ a _ _ _ _  -->  _ _ _ a _ _ _  -->  _ _ _ b _ _ _
_ _ _ _ _ a _       _ _ _ _ _ _ a       _ _ _ _ _ _ b
_ a _ _ _ _ _       _ _ a _ _ _ _       _ _ b _ _ _ _
_ _ _ _ a _ _       _ _ _ _ _ a _       _ _ _ _ _ b _
Now if we overlaid the SC of "a" with the SC of "b" we get
a b _ _ _ _ _
_ _ _ a b _ _
b _ _ _ _ _ a
_ _ a b _ _ _
_ _ _ _ _ a b 
_ a b _ _ _ _
_ _ _ _ a b _
If we repeated these steps for the other five letters, we would arrive at a DLS
a b c d e f g
e f g a b c d
b c d e f g a
f g a b c d e
c d e f g a b 
g a b c d e f
d e f g a b c
This is a DLS, since each SC follows the general requirements of a DLS 
and shifting ensured that each element has its own cell.
Another thing to note is that each row contains the string "abcdefg" that is offset 
by some cells. This leads to another simplification: we only need to find the 
offsets of the string in every row and we are finished.

最後の単純化は次のとおりです-N = 2またはN = 3を除く素数NのすべてのDLSを構築でき、Nを適切なDLSを構築できる2つの数値に因数分解できる場合、そのNのDLSは構築されます。その逆も成り立つと思います。(言い換えれば、2または3で割り切れないNのDLSのみを構築できます)

Pretty obvious why 2x2 or 3x3 cant be made. For any other prime this can be done
by assigning a each consecutive row a shift that is by two bigger than the previous, 
for N=5 and N=7 this looks like (with elements other than "a" ommited)
N=5
a _ _ _ _ offset = 0
_ _ a _ _ offset = 2
_ _ _ _ a offset = 4
_ a _ _ _ offset = 6 = 1 (mod 5)
_ _ _ a _ offset = 8 = 3 (mod 5)
N=7
a _ _ _ _ _ _ offset = 0
_ _ a _ _ _ _ offset = 2
_ _ _ _ a _ _ offset = 4
_ _ _ _ _ _ a offset = 6
_ a _ _ _ _ _ offset = 8 = 1 (mod 7)
_ _ _ a _ _ _ offset = 10 = 3 (mod 7)
_ _ _ _ _ a _ offset = 12 = 5 (mod 7
(Why this works on all prime N (actually all N that are not divisible
by 3 or 2) can probably be proven via some kind of induction but i will
omit that, this is just what my code uses and it works)
Now, the first composite number that is not
divisible by 2 or 3 is 25 (it also occurs in the range our program must test)
Let A denote the DLS of N = 5
a b c d e 
d e a b c 
b c d e a 
e a b c d 
c d e a b
Let F be the DLS A where each letter is substituted by the letter five postions after it 
a-->f, b-->g etc. So F is 
f g h i j 
j e f g h 
g h i j f 
j f g h i 
h i j f g
Let K be the DLS a where each letter is substituted by the letter ten postions after it
a-->k, b--> l etc.
Let P be defined likewise (so a-->p, b-->q etc)
Let U be defined likewise (so a-->u, b-->v etc)
Now, since the DLS A could be constructed, then by substituting a --> A, b--> F etc.
we get a DLS of N=5*5 (A has five rows and five columns and each is filled with a 
grid of five rows and five columns)
A F K P U
P U A F K
F K P U A
U A F K P
K P U A F
Now since smaller DLS in the big DLS satisfies the 
conditions of a DLS and the big one also satisfies the DLS conditions,
then the resulting grid is also a DLS 

ここにコードを入力してください

小さい-大きいDLSの意味

Now this kind of thing works for all constructible N and can be proven similiarly.

I have a strong sense that the converse (if some N isnt constructible
(2 and 3) then no multiple of that N is constructible) is also true but have a hard time 
proving it (test data up to N=30 (took a veeery long time to calculate) confirm it though)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.