บนขอบของ hypercube


12

งานของคุณจะได้รับการเขียนฟังก์ชั่นหรือโปรแกรมที่จะนำจำนวนเต็มn>0เป็น input และ output รายการขอบของที่nมิติhypercube ในทฤษฎีกราฟขอบถูกกำหนดเป็น 2-tuple ของจุดยอด (หรือมุมถ้าคุณต้องการ) ที่เชื่อมต่อ

ตัวอย่างที่ 1

hypercube 1 มิติคือเส้นและมีสองจุดซึ่งเราจะเรียกและab

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นผลลัพธ์จะเป็น:

[[a, b]]

ตัวอย่างที่ 2

hypercube 4 มิติ (หรือ tesseract) ประกอบด้วย 32 edge และกราฟมีลักษณะเช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

และผลลัพธ์อาจมีลักษณะเช่นนี้

[[a, b], [a, c], [a, e], [a, i], [b, d], [b, f], [b, j], [c, d], [c, g], [c, k], [d, h], [d, l], [e, f], [e, g], [e, m], [f, h], [f, n], [g, h], [g, o], [h, p], [i, j], [i, k], [i, m], [j, l], [j, n], [k, l], [k, o], [l, p], [m, n], [m, o], [n, p], [o, p]]

กฎระเบียบ

  • คุณสามารถตั้งชื่อจุดยอดในแบบที่คุณชอบตราบใดที่ชื่อนั้นไม่เหมือนใคร
  • ขอบนั้นไม่ได้บอกทิศทางเช่นนั้น[a, b]และ[b, a]ถือว่าเป็นขอบเดียวกัน
  • ผลลัพธ์ของคุณจะต้องไม่มีขอบที่ซ้ำกัน
  • ผลลัพธ์อาจอยู่ในรูปแบบที่เหมาะสม
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดชนะ



ดังนั้น [1,2], [2,3] ฯลฯ ก็โอเค?
Rɪᴋᴇʀ

@ElylyIrk Yep
เมอ

ขอบสามารถส่งออกในลำดับใด ๆ ใช่ไหม?
Luis Mendo

@DonMuesli ถูกต้อง
murphy

คำตอบ:


4

เยลลี่ 13 ไบต์

ạ/S’
2ṗœc2ÇÐḟ

ลองที่นี่ สำหรับอินพุต3เอาต์พุตคือ:

[[[1, 1, 1], [1, 1, 2]],
 [[1, 1, 1], [1, 2, 1]],
 [[1, 1, 1], [2, 1, 1]],
 [[1, 1, 2], [1, 2, 2]],
 [[1, 1, 2], [2, 1, 2]],
 [[1, 2, 1], [1, 2, 2]],
 [[1, 2, 1], [2, 2, 1]],
 [[1, 2, 2], [2, 2, 2]],
 [[2, 1, 1], [2, 1, 2]],
 [[2, 1, 1], [2, 2, 1]],
 [[2, 1, 2], [2, 2, 2]],
 [[2, 2, 1], [2, 2, 2]]]

ฉันหวังว่า[1, 1, 1]ฯลฯ จะเป็น "ชื่อ" โอเค

คำอธิบาย

บรรทัดแรกคือ "เพรดิเคต" บนคู่ของขอบ: [A, B] ạ/S’เท่ากับsum(abs(A - B)) - 1ซึ่งเป็นศูนย์ (false-y) iff AและBแตกต่างกันในหนึ่งพิกัด

บรรทัดที่สองเป็นโปรแกรมหลัก:

  • สร้างขอบทั้งหมดด้วย2ṗ(กำลังคาร์ทีเซียนของ[1, 2])
  • รับคู่ที่เป็นไปได้ทั้งหมดโดยใช้œc2(การรวมกันของขนาดที่สองโดยไม่มีการแทนที่)
  • เก็บเฉพาะองค์ประกอบที่สอดคล้องกับเพรดิเคตที่กำหนดไว้ก่อนหน้า ( ÐḟÇ)

1
ạ/S’และ2ṗœc2ÇÐḟบันทึกสองสามไบต์
Dennis

c/P=2, 2ṗṗ2ÇÐfการทำงานมากเกินไป
Dennis

โครงการ "ตั้งชื่อ" สมาร์ท! แน่นอนภายในกฎ
murphy

9

Python 2, 54 56 62ไบต์

lambda n:{tuple({k/n,k/n^1<<k%n})for k in range(n<<n)}

ขอบที่ซ้ำกันจะถูกลบออกโดยการสร้างชุดยกเว้น Python ต้องการให้องค์ประกอบชุดนั้น hashable ดังนั้นพวกเขาจะถูกแปลงเป็น tuples โปรดทราบว่าชุด{a,b}และ{b,a}มีค่าเท่ากันและแปลงเป็น tuple เดียวกัน xsot บันทึกไว้ 2 n<<nไบต์ด้วย

สิ่งนี้สามารถลดลงได้ถึง 49 ไบต์หากชุดสตริงเป็นรูปแบบเอาต์พุตตกลง

lambda n:{`{k/n,k/n^1<<k%n}`for k in range(n<<n)}

ซึ่งให้ผลผลิตเช่น

set(['set([1, 3])', 'set([2, 3])', 'set([0, 2])', 'set([0, 1])'])

lambda n:[(k/n,k/n^1<<k%n)for k in range(n*2**n)if k/n&1<<k%n]

อันดับแรกให้ดูที่โซลูชันรุ่นเก่ากว่า

lambda n:[(i,i^2**j)for i in range(2**n)for j in range(n)if i&2**j]

แต่ละหมายเลขในช่วงเวลา[0,2^n)สอดคล้องกับจุดสุดยอดด้วยพิกัดที่กำหนดโดยn-bit ไบนารีสตริง จุดยอดอยู่ติดกันหากพวกเขาแตกต่างกันในบิตเดียวคือถ้าหนึ่งได้รับจากที่อื่นโดย xor-ing พลังของ 2

ฟังก์ชั่นที่ไม่ระบุชื่อนี้สร้างขอบที่เป็นไปได้ทั้งหมดโดยนำทุกจุดยอดและทุกตำแหน่งบิตเพื่อพลิก เพื่อหลีกเลี่ยงการทำซ้ำขอบทั้งสองทิศทางมีเพียง 1 อันเท่านั้นที่พลิกเป็น 0

ในการแก้ปัญหาแข็งแรงเล่นกอล์ฟมากขึ้นkจะใช้ในการเข้ารหัสทั้งสองiและjผ่านk=n*i+jจากการที่สามารถสกัดได้เป็น(i,j) (k/n,k%n)นี่จะเป็นการวนลูปในความเข้าใจ พลังของการ2ทำ1<<จะมีความสำคัญเหนือกว่าผู้ประกอบ

อีกวิธีหนึ่งในการสร้างจุดยอดแต่ละคู่และตรวจสอบว่าการพลิกเป็นบิตนั้นดูเหมือนจะยาวกว่าหรือไม่ (70 ไบต์):

lambda n:[(i,x)for i in range(2**n)for x in range(i)if(i^x)&(i^x)-1<1] 

1
n*2**nเป็นเพียงn<<n
xsot

เปลี่ยนเป็น Python 3.5 lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}บันทึกเป็นไบต์ (การแสดงออกที่ติดดาวช่วยประหยัดสาม แต่ไวยากรณ์ของการหารสูญเสียสอง) อย่างไรก็ตามฉันค่อนข้างมั่นใจว่าโซลูชัน 49- ไบต์ที่คุณมีอยู่นั้นดี
Lynn

4

Mathematica, 48 24 ไบต์

EdgeList@*HypercubeGraph

เป็นเพียงฟังก์ชั่นนิรนามที่ใช้บิวด์อิน


อ่าในตัว! FromLetterNumberในขณะที่คุณไม่ได้มีการตั้งชื่อจุดตามลำดับตัวอักษรคุณสามารถละเว้น ฉันคิดว่าEdgeList@*HypercubeGraphเป็นคำตอบที่ถูกต้อง
murphy

3

JavaScript (SpiderMonkey 30+), 69 64 ไบต์

n=>[for(i of Array(n<<n).keys())if(i/n&(j=1<<i%n))[i/n^j,i/n^0]]

สิ่งนี้เริ่มต้นเป็นพอร์ตของโซลูชัน Python 2 ของ @ xnor แต่ฉันสามารถบันทึก 9 ไบต์ได้โดยเขียนรหัสใหม่เพื่อใช้ลูปเดียว แก้ไข: บันทึกอีก 5 ไบต์โดยแยกiทางอื่น ๆ ตามโซลูชันที่อัปเดตของ @ xnor ซึ่งขณะนี้ยังใช้ลูปเดียว


2

MATL , 20 ไบต์

2i^:qt!Z~Zltk=XR2#fh

ใช้ได้กับภาษา / คอมไพเลอร์รุ่นปัจจุบัน (14.0.0)

ลองออนไลน์!

คำอธิบาย

การใช้งานนี้มากหรือน้อยกว่าความคิดเดียวกับคำตอบ @ XNOR ของ

2i^    % take input n and compute 2^n
:q     % range [0,1,...,2^n-1] (row vector)
t!     % duplicate, transpose into a column vector
Z~     % bitwise XOR with broadcast
Zl     % binary logarithm
tk     % duplicate and round down
=      % true if equal, i.e. for powers of 2
XR     % upper triangular part, above diagonal
2#f    % row and index columns of nonzero values
h      % concatenate vertically

2

Pyth, 13 ไบต์

fq1.aT.c^U2Q2

เอาต์พุตบนอินพุต 3 :

[[[0, 0, 0], [0, 0, 1]], [[0, 0, 0], [0, 1, 0]], [[0, 0, 0], [1, 0, 0]], [[0, 0, 1], [0, 1, 1]], [[0, 0, 1], [1, 0, 1]], [[0, 1, 0], [0, 1, 1]], [[0, 1, 0], [1, 1, 0]], [[0, 1, 1], [1, 1, 1]], [[1, 0, 0], [1, 0, 1]], [[1, 0, 0], [1, 1, 0]], [[1, 0, 1], [1, 1, 1]], [[1, 1, 0], [1, 1, 1]]]

คำอธิบาย:

fq1.aT.c^U2Q2
                  Implicit: input = Q
        ^U2Q      All Q entry lists made from [0, 1].
      .c    2     All 2 element combinations of them.
f                 Filter them on
   .aT            The length of the vector
 q1               Equaling 1.

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