ตอนนี้เรากำลังคิดในมิติ n!


9

คำถาม: ด้วยตัวเลขn≥ 2 จำนวนจุดคู่ที่แตกต่างกันของโครงตาข่ายnมิติn x n x n x n x n x n ... x nที่พิกัดอยู่ในช่วงตั้งแต่0ถึงถึงn - 1มีระยะห่างอย่างน้อยที่สุด n ? คู่{(2,1,3,1), (3,2,1,3)}และ{(3,2,1,3), (2,1,3,1)}ไม่ถือว่าแตกต่างจากกันและกันเนื่องจากประกอบด้วยสองจุดเดียวกันในลำดับย้อนกลับ โปรดทราบว่าจำนวนคู่ทั้งหมดเติบโตอย่างรวดเร็ว จำนวนคู่รวมไป6, 351, 32 640, 4 881 250, 1 088 367 840ฯลฯ

กรณีทดสอบ:

2 -> 0 (all pairs are at most a distance of sqrt(2) < 2 apart)
3 -> 28 (They must either be (2,2,1) or a permutation apart, or (2,2,2) apart. Each corner
has three non-corner (2,2,1) points corresponding to it. And each corner is associated 
with a corner pair that is a (2,2,2). Thus. 3.5 * 8 = 28.
4 -> 4,888
5 -> 1,501,948
6 -> 486,039,360 (I would like someone to verify this if possible)

รหัสของคุณควรใช้กับ n <= 5 อย่างน้อยก็ในทางทฤษฎี อย่า hardcode มันเป็นช่องโหว่มาตรฐาน



^ โปรแกรมที่สามารถให้ผลลัพธ์n=15อย่างง่ายดาย
Leun Nun

tinyurl.com/ya2kmb24 <- พอร์ตไปยัง C ซึ่งสามารถคำนวณได้n=20มากถึงขนาดจากการไหลล้น
Leaky Nun

คุณวัดระยะทางอย่างไร การวัดแบบยุคลิด หรือว่ามันเป็นขัดแตะคุณใช้ L_1?
Peter Taylor

@PeterTaylor จากกรณีทดสอบเป็นที่ชัดเจนว่าเราใช้ระยะทางแบบยุคลิดall pairs are at most a distance of sqrt(2) apartแต่ควรระบุให้ชัดเจนยิ่งขึ้น
Giuseppe

คำตอบ:


3

MATLขนาด 12 ไบต์

tt:Z^tZPR>~z

ลองออนไลน์!

คำอธิบาย

tt   % Implicit input n. Duplicate twice
     % STACK: n, n, n
:    % Range [1 2 ... n]
     % STACK: n, n, [1 2 ... n]
Z^   % Cartesian power. Gives an n^n × n matrix C where each row is a Cartesian tuple
     % STACK: n, C
t    % Duplicate
     % STACK: n, C, C
ZP   % Euclidean distance. Gives an n^n × n^n matrix D of pairwise distances
     % STACK: n, D
R    % Upper triangular part: sets elements below the main diagonal to 0. Call that U
     % STACK: n, U
>~   % Less than or equal? Element-wise. Gives a true-false matrix B
     % STACK: n, B
z    % Number of nonzeros. Implicitly display
     % STACK: number of entries in B that equal true

2

เยลลี่ขนาด14 13 ไบต์

1 ไบต์ต้องขอบคุณเดนนิส

ṗ⁸Œc_/€ÆḊ€<ċ0

ลองออนไลน์!

เวอร์ชัน maffs ด่วน

ŒgL€!P:@L!$×P
²S<
ḶœċçÐḟ²ð>0S’2*×⁸ạ⁹$Ѥð€S

ลองออนไลน์!


คุณใช้ล่ามประเภทใดในการดำเนินการนี้ ฉันต้องการลอง แต่ TIO ช้าเกินไปสำหรับ n = 5 (หมดเวลาหลังจาก 1 นาที) prntscr.com/hqbcph
rigged

@ bushdid911 ถ้าคุณพยายามที่จะทำลายขีด จำกัด จะทำลายขีด จำกัด
Leaky Nun

คุณสามารถแทนที่ด้วยæ.`½ ÆḊ€
dylnan

@ bushdid911 มันสามารถวิ่งn=5ได้ แต่ไม่ใช่ในหนึ่งนาที (อาจใช้เวลามากกว่าอายุของจักรวาลระวัง) นี่ไม่ใช่รหัสที่เร็วที่สุดดังนั้นทำไมต้องทำให้รหัสของคุณทำงานเร็ว?
user202729

1
@ bushdid911 ฉันทำรุ่นเร็ว (เอ้อ)
Leun Nun


2

J , 40 ไบต์

2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~

ลองออนไลน์!

จะหมดเวลาใช้งาน TIO เป็นเวลา 5 ถ้าคุณใช้ความแม่นยำแบบขยาย ( 5xแทน5) ฉันจะไม่ลองเลข 6 ในคอมพิวเตอร์ของฉันเนื่องจากจะไม่มีข้อสงสัยใด ๆ ในการแปลล่าม

กำลังมองหาคำแนะนำเกี่ยวกับการเล่นกอล์ฟโดยเฉพาะส่วนที่ผ่านมารุ่นพิกัด ฉันรู้สึกว่าควรจะมีวิธีการถอดหมวกบางอันออก

]<:[:+/&.:*:"1*:<:[:+/"1[:*:อาจถูกแทนที่โดยค่าเท่ากัน

คำอธิบาย

คำอธิบายนี้ทำบน REPL (ช่องว่างสามช่องระบุคำสั่งไม่มีช่องว่างที่ระบุถึงเอาต์พุต) ฉันจะสร้างคำตอบ

การสร้างพิกัด

#~ #: i.@^~ ให้พิกัดทั้งหมดที่เราใส่ใจเกี่ยวกับขัดแตะ

^~ เป็นตัวเลขที่ยกขึ้นเพื่อตัวเองและ i.ให้ช่วง [0, n) โดยที่ n คืออินพุต @รวบรวมฟังก์ชั่นเหล่านั้น

   i.@^~ 2
0 1 2 3

#~ คัดลอกตัวเลขด้วยตัวเองเช่น

   #~ 3
3 3 3

#: แปลงอาร์กิวเมนต์ที่ถูกต้องเป็นฐานที่ระบุโดย อาร์เรย์ที่กำหนดให้เป็นอาร์กิวเมนต์ด้านซ้าย จำนวนหลักในอาร์เรย์สอดคล้องกับจำนวนหลักในเอาต์พุตฐานนั้น (และคุณสามารถมีฐานผสม) ตัวอย่างเช่น

   3 3 3 #: 0
0 0 0
   5 5 #: 120
4 0
NB. If you want 120 base 5 use #.inv
   #.inv 120
4 4 0

ดังนั้นทั้งหมดเข้าด้วยกันนี่บอกว่าแจกแจงผ่านฐานค่าทั้งหมด n (โดยที่ n คืออินพุต) จนถึง n ^ n ให้พิกัดของเราได้อย่างมีประสิทธิภาพ

   (#~ #: i.@^~) 2
0 0
0 1
1 0
1 1

รับระยะทางระหว่างแต่ละคู่

ก่อนอื่นเราจะนำความแตกต่างของแต่ละพิกัดกับคนอื่น ๆ ทั้งหมดโดยใช้ dyad /-table และ~-reflexive โปรดทราบว่าสิ่งนี้ไม่ได้คำนึงถึงความจริงที่ว่าคำสั่งซื้อไม่สำคัญสำหรับคู่: สิ่งนี้สร้างระยะทางที่ซ้ำกัน

  NB. 2 {. takes the first two elements (I'm omitting the rest).
  2 {. -"1/~ (#~ #: i.@^~) 2
 0  0
 0 _1
_1  0
_1 _1

 0  1
 0  0
_1  1
_1  0

จากนั้นเราใช้กริยานี้+/&.:*:ในแต่ละพิกัด (ที่"1หรือที่รู้จักอันดับหนึ่ง) กริยานี้คือ sum ( +/) ใต้ ( &.:) square ( *:) ภายใต้ใช้กริยาด้านขวา (สี่เหลี่ยม) จากนั้นรวบรวมผลลัพธ์และให้เป็นอาร์กิวเมนต์ของคำกริยาด้านซ้าย (ผลรวม) จากนั้นจะใช้อินเวอร์สของคำกริยาด้านขวา (ซึ่งจะเป็นสแควร์รูท)

   +/&.:*: 3 4
5
   +/&.:*:"1 ([: -"1/~ #~ #: i.@^~) 2
      0       1       1 1.41421
      1       0 1.41421       1
      1 1.41421       0       1
1.41421       1       1       0

ไม่น่าแปลกใจที่ระยะทางจำนวนมากเหมือนกัน

นับระยะทางที่มากกว่าหรือเท่ากับอินพุท

ส่วนสุดท้ายคือการดูว่าระยะทางมากกว่าหรือเท่ากับอินพุตที่ใช้]<:หรือไม่ จากนั้นผลลัพธ์ทั้งหมดจะถูกรวมโดยใช้+/^:_(รวมถึงการบรรจบกัน) นับจำนวนของค่าความจริง จากนั้นค่านี้จะถูกหารด้วย 2 ( 2%~นี่~หมายถึงสลับลำดับของอาร์กิวเมนต์ที่ระบุไปยัง%) เหตุผลที่เราสามารถหารด้วย 2 ได้เพราะสำหรับการจับคู่ความจริงแต่ละครั้งจะมีอีกอันสำหรับลำดับการพลิกยกเว้นการจับคู่ที่ประสานงานกับตัวเอง ไม่เป็นไรเพราะจะส่งผลให้ระยะทางเป็น 0


1
35 ไบต์ด้วย+/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
ไมล์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.