สี่เหลี่ยมละตินแบบหมุนได้อย่างปลอดภัย


12

ละตินตารางเป็นตารางที่ไม่มีสัญลักษณ์ซ้ำทั้งใน X หรือ Y คอลัมน์ ตัวอย่างเช่น:

ABCD    
DABC
CDAB
BCDA

เป็นหนึ่งในจตุรัสดังกล่าว สังเกตว่าทุกคอลัมน์และแถวมีการเรียงสับเปลี่ยนของตัวอักษร 4 ตัวเดียวกัน

อย่างไรก็ตามจตุรัสละตินของเรามีปัญหา: หากฉันต้องหมุนแถวที่สอง ( DABC) 1 ไปทางซ้ายฉันจะลงเอยด้วยABCDซึ่งเหมือนกับการเปลี่ยนรูปด้านบน ถ้ามันเป็นไปไม่ได้ที่จะหมุน 1 คอลัมน์ / แถวและคอลัมน์อื่นได้รับ / แถวแล้วเราพิจารณาตารางที่จะปลอดภัยในการหมุน

ตัวอย่างเช่น:

ABCD
BDAC
CADB
DCBA

การหมุนปลอดภัย ตารางมีคุณสมบัติดังต่อไปนี้:

  1. จุด [0, N] ใช้สัญลักษณ์ Nth
  2. จุด [0, N] และ [N, 0] เป็นสัญลักษณ์เดียวกันเสมอ (ฉันอยากจะบอกว่า [x, y] และ [y, x] เป็นตัวอักษรเดียวกันเสมอ แต่ฉันไม่สามารถพิสูจน์ได้)

งานของคุณคือการพิมพ์ละตินสแควร์แบบหมุนได้ 1 อันเมื่อผ่าน N. ฉันไม่สนใจว่าคุณจะพิมพ์ตัวอักษรตัวเลขรายการหรืออาร์เรย์ 2D หากคุณใช้ตัวเลขคอลัมน์และแถวบนสุดจะต้องเป็น0,1,2,3,...(ตามลำดับนั้น) หากคุณใช้ตัวอักษรมันจะต้องเป็นA,B,C,D,....

ตัวอย่างเช่นหากอินพุตของคุณเป็น 4 คุณควรพิมพ์:

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

ไม่มีละตินสี่เหลี่ยมหมุนปลอดภัยขนาดน้อยกว่า 4 ฉันไม่สนใจสิ่งที่โปรแกรมของคุณถ้า N น้อยกว่า 4 สำหรับอยากรู้อยากเห็นจำนวนสี่เหลี่ยมหมุนปลอดภัยหมุนคือ (เริ่มต้นที่ 4): 2,5,5906,(too long to calculate)

นี่คือดังนั้นพยายามหาคำตอบให้สั้นที่สุดในภาษาที่คุณโปรดปราน!


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

ไม่ จำกัด เวลา แต่โซลูชันของคุณควรรับประกันว่าจะยุติ
Nathan Merrill

1
สำหรับภาษาที่มีการจัดทำดัชนี 1 แถวแรกจะเป็นได้1,2,3,...หรือไม่
ไมล์


@ ไฟล์ใช่นั่นเป็นเรื่องดี
นาธานเมอร์ริลล์

คำตอบ:


3

Pyth - 29 ไบต์

กำลังดุร้าย.

hf&!@JsCBTsm.>RdJStQ.A{IMJ^.p

ไม่เสร็จออนไลน์แม้n=4แต่คุณสามารถลองมันออกมาในประเทศหรือทำงานแก้ไขเวอร์ชันนี้ออนไลน์หนึ่งไบต์มากขึ้น


2

Sqlserver 2012 - 918 ไบต์

ในกล่องของฉันสิ่งนี้จะทำงานสำหรับ @k = 5 แม้ว่าจะใช้เวลา 16 วินาที

นี่คือรหัสการสร้างรหัส (ระวัง Skynet คุณมีการแข่งขัน)

มีราคาสำหรับสคริปต์ที่ยาวที่สุดหรือไม่?

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)

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.