Hình vuông Latin an toàn xoay


12

Vuông Một Latin là một hình vuông đó đã không lặp lại các biểu tượng trong một trong hai X hoặc cột Y . Ví dụ:

ABCD    
DABC
CDAB
BCDA

là một hình vuông như vậy. Lưu ý cách mỗi cột và hàng chứa một hoán vị của 4 chữ cái giống nhau.

Tuy nhiên, hình vuông Latin của chúng tôi có một vấn đề: Nếu tôi xoay hàng thứ hai ( DABC) 1 sang trái, tôi sẽ kết thúc ABCD, nó giống hệt với hoán vị phía trên nó. Nếu không thể xoay bất kỳ 1 cột / hàng nào và có được một cột / hàng khác, thì chúng tôi coi hình vuông là xoay an toàn .

Ví dụ:

ABCD
BDAC
CADB
DCBA

Là xoay an toàn. Lưới có các thuộc tính sau:

  1. Điểm [0, N] sử dụng ký hiệu Nth
  2. Điểm [0, N] và [N, 0] luôn là cùng một ký hiệu . (Tôi cũng muốn nói rằng [x, y] và [y, x] cũng luôn luôn là cùng một chữ cái, nhưng tôi không thể chứng minh điều đó)

Nhiệm vụ của bạn là in ra 1 ô vuông Latin an toàn xoay, khi được thông qua N. Tôi không quan tâm nếu bạn xuất các chữ cái, số, danh sách hoặc mảng 2D. Nếu bạn sử dụng số, cột và hàng trên cùng phải là 0,1,2,3,...(theo thứ tự đó). Nếu bạn sử dụng chữ cái, thì nó phảiA,B,C,D,....

Ví dụ: nếu đầu vào của bạn là 4, bạn nên in:

0,1,2,3            0,1,2,3
1,3,0,2     or     1,0,3,2
2,0,3,1            2,3,1,0
3,2,1,0            3,2,0,1

Không có hình vuông Latin an toàn xoay có kích thước nhỏ hơn 4. Tôi không quan tâm chương trình của bạn sẽ làm gì nếu N nhỏ hơn 4. Đối với người tò mò, số lượng hình vuông an toàn xoay là (bắt đầu từ 4): 2,5,5906,(too long to calculate)

Đây là một , vì vậy hãy cố gắng đưa ra câu trả lời ngắn nhất có thể bằng ngôn ngữ yêu thích của bạn!


Co giơi hạn thơi gian không? (Liên quan: Các phương pháp Monte Carlo có được phép không nếu chúng không được đảm bảo về mặt kỹ thuật để chấm dứt các giá trị cao Ndo không đủ chất lượng số ngẫu nhiên?)
Doorknob

Không giới hạn thời gian, nhưng giải pháp của bạn nên được đảm bảo để chấm dứt.
Nathan Merrill

1
Đối với các ngôn ngữ 1 chỉ mục, hàng đầu tiên có thể là 1,2,3,...?
dặm


@miles vâng, điều đó tốt thôi
Nathan Merrill

Câu trả lời:



2

Sqlserver 2012 - 918 byte

Trên hộp của tôi, cái này chạy trong @k = 5, mặc dù phải mất 16 giây.

Đây là mã xây dựng mã (xem ra Skynet, bạn có cạnh tranh)

Có một mức giá cho kịch bản dài nhất?

DECLARE @k int = 4;

DECLARE @t VARCHAR(max)='WITH C as(SELECT
top '+left(@k,1)+'row_number()over(order by 1/0)n
FROM sys.messages),D(nÆ)as(SELECT
concat(~),~
FROM Ø
WHERE |)SELECT top 1~ FROM Å
WHERE 1=1',@
varchar(999)=''SELECT @+=','+CHAR(x+65)FROM(values(0),(1),(2),(3),(4),(5))x(x)WHERE x<@k
SELECT
@t=REPLACE(REPLACE(REPLACE(REPLACE(@t,'Æ',@),'Ø',STUFF(REPLACE(@,',',',C '),1,1,'')),'Å',STUFF(REPLACE(@,',',',D
'),1,1,'')),'~',STUFF(REPLACE(@,',','.n,'),1,3,'')+'.n'),@='';WITH C as(SELECT top(@k)x
FROM(values(0),(1),(2),(3),(4),(5))x(x))SELECT @+=' AND
'+char(65+C.x)+'.n<>'+char(65+D.x)+'.n'FROM c,c d WHERE C.x<D.x
SELECT @t=REPLACE(@t,'|',STUFF(@,1,4,''));WITH A
as(SELECT top(@k)x
FROM(values(65),(66),(67),(68),(69),(70))x(x))SELECT @t+='AND
'+char(A.x)+'.'+char(C.x)+'<>'+CHAR(B.x)+'.'+char(C.x)+' AND
'+char(A.x)+'.n+'+char(A.x)+'.n'+'
not like''%''+'+char(B.x)+'.n+''%'''FROM A,A B,A C
WHERE A.x<>B.x and C.x<>B.x
EXEC(@t)

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.