การสร้าง Greco-Latin Square


11

พิจารณากริดขององค์ประกอบที่ไม่ซ้ำกันNx Nแต่ละองค์ประกอบมีตัวอักษร (จาก A ถึงNตัวอักษรที่รวม, รวม) และตัวเลข (จาก 1 ถึงNรวม) ดังนั้นคู่ / ตัวเลขแต่ละตัวจะอยู่ในกริดเพียงครั้งเดียว

งานของคุณคือการจัดตารางเช่น:

แต่ละแถวคอลัมน์และแนวทแยง (รวมถึงการตัด) ประกอบด้วยตัวอักษรและตัวเลขแต่ละตัวอย่างแน่นอน

โดยการพันผมหมายถึง

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

เป็นแนวทแยงมุมพร้อมกับเส้นทแยงมุมที่คล้ายกันทั้งหมดซึ่งกระทบกับขอบ

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

งานของคุณคือการเขียนโปรแกรมที่รับตัวเลขNและพิมพ์กริดNx Nตามที่อธิบายไว้ข้างต้น 0 < N <= 26โปรแกรมของคุณควรจะทำงานใด ๆ Impossibleถ้าตารางโดยเฉพาะอย่างยิ่งเป็นไปไม่ได้แล้วคุณควรพิมพ์

Nไม่อนุญาตให้เข้ารหัสคำตอบสำหรับสิ่งใด ๆ โปรแกรมเขียนโค้ดยากถ้าคำนวณกริดในลักษณะที่แตกต่างกัน (ตามที่ฉันตัดสิน) สำหรับโปรแกรมใด ๆN > 26(หรือถ้ามันไม่สามารถคำนวณได้) (สิ่งนี้มีไว้เพื่อป้องกันการคำนวณล่วงหน้ารวมถึงกริดที่ไม่ถูกต้องคำนวณล่วงหน้าหรือออฟเซ็ตสำหรับกริดที่กำหนด)

นี่เป็นปัญหารหัสที่เร็วที่สุดและคะแนนของคุณคือจำนวนครั้งที่ใช้ในการเรียกใช้โปรแกรมของคุณNในคอมพิวเตอร์ของฉัน ในคำตอบของคุณโปรดให้โปรแกรมของคุณทำงานทั้งหมดN(ดังนั้นฉันจะต้องใช้เวลาเพียงครั้งเดียวเท่านั้น) หากไม่มีโปรแกรมใดสามารถคำนวณได้ภายใน 60 วินาทีผู้ชนะคือคำตอบที่สามารถคำนวณกริดด้วยค่าที่มากที่สุดNใน 60 วินาที หากหลายโปรแกรมมีค่าสูงสุดเท่ากันNดังนั้น tiebreaker เป็นวิธีแก้ปัญหาที่เร็วที่สุด

(ฉันมีเครื่อง Windows 8 ที่ได้รับพลังงานอย่างเหมาะสมและผู้รวบรวมหรือล่ามที่จำเป็นต้องใช้ได้อย่างอิสระ


ความจริงที่ว่าเครื่องของคุณเป็น Windows และ Linux อาจไม่น่ารำคาญสำหรับเทคโนโลยีบางอย่าง
orlp

+1 สำหรับคำถาม แต่จากการวิเคราะห์ตัวอย่างของคุณดูเหมือนว่าจะให้อัลกอริทึมที่รวดเร็วมากฉันสงสัยว่าคุณจะสามารถวัดความเร็วได้หรือไม่ เราสามารถเขียนฟังก์ชั่นที่คืนค่าสตริงได้หรือไม่? เพราะฉันเชื่อว่าเวลาที่การเรียก API ใช้ในการพิมพ์จริงจะนานกว่าการคำนวณ
เลเวลริเวอร์เซนต์

@ สตีฟเวอร์ริลล์ใช่สำหรับจุดประสงค์ในการส่งคืนสตริงจะยอมรับได้
Nathan Merrill

วัตถุประสงค์ของตัวอักษรและตัวเลขคืออะไร แต่ละหมายเลขปรากฏถัดจากตัวอักษรแต่ละตัวเพียงครั้งเดียวหรือ 1 สามารถปรากฏขึ้นถัดจาก A, 2 ถัดจาก B, ...
Jakube

@ Jakube ใช่ แต่ละองค์ประกอบจะต้องไม่ซ้ำกันซึ่งหมายความว่าแต่ละคู่ / ตัวอักษรในตารางจะต้องไม่ซ้ำกัน
Nathan Merrill

คำตอบ:


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 และมองหารูปแบบที่เป็นรูปสี่เหลี่ยมจตุรัสละติน - Orthogonal-Diagonal (ODLS) ด้วยเหตุนี้สำหรับบางคนมันก็ต้องผ่านทั้งหมด การกำหนดค่าและส่งคืนเป็นไปไม่ได้) อัลกอริทึมดังกล่าวจะไม่เหมาะกับความท้าทายนี้เนื่องจากความซับซ้อนของเวลาที่ไร้สาระ ดังนั้นจึงมีสามหลักเรียบง่ายและเหตุผล (หลักฐานบางส่วนและข้อมูลเชิงลึกว่าทำไมมันทำงาน) เพื่อการก่อสร้าง ODLS ที่ใช้ในการดำเนินการของฉัน:

ประการแรกคือความคิดที่ว่าเราจะต้องสร้าง Diagonal Latin Square ที่ถูกต้องเท่านั้น (ตาราง NxN ซึ่งแต่ละแถว, คอลัมน์, เส้นทแยงมุมมีองค์ประกอบของชุดขององค์ประกอบที่แตกต่างกัน N ครั้งเดียว) ของตัวอักษร N ตัวแรกของ ตัวอักษร หากเราสามารถสร้าง Diagonal Latin Square (DLS) เช่นนั้นก็สามารถสร้าง ODLS ได้โดยใช้ DLS พร้อมการแลกเปลี่ยนองค์ประกอบและการพลิกที่เหมาะสม เหตุผล:

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.

การทำให้เข้าใจง่ายที่สองคือความคิดที่ว่าถ้าเราพบการกำหนดค่าที่เหมาะสม (SC) ขององค์ประกอบหนึ่ง (กริด 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.

การทำให้เข้าใจง่ายครั้งสุดท้ายมีดังนี้ - DLS ทั้งหมดของไพรม์ N, ยกเว้น N = 2 หรือ N = 3, สามารถสร้างได้, และถ้า N สามารถแยกตัวประกอบออกเป็นสองตัวเลขซึ่ง DLS ที่เหมาะสมสามารถสร้างได้, ดังนั้น DLS ของ N นั้นสามารถ ถูกสร้างขึ้น ฉันคาดเดาว่าการสนทนายังถือ (ในคำอื่น ๆ เราสามารถสร้าง DLS สำหรับ N ที่ไม่หารด้วย 2 หรือ 3)

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.