เส้นทาง hypercube ที่ยาวที่สุด


18

ท้าทาย

คุณจะได้รับสองบิตบิตที่แตกต่างกันของความยาวเดียวกัน (ตัวอย่างเช่น000และ111.) เป้าหมายของคุณคือค้นหาเส้นทางจากที่หนึ่งไปอีกที่หนึ่งที่:

  • ในแต่ละขั้นตอนที่คุณเปลี่ยนเพียงหนึ่งบิต (คุณสามารถไปจาก000การใด ๆ001, 010, 100)
  • คุณไม่สามารถเยี่ยมชมสตริงบิตเดียวกันสองครั้ง
  • เส้นทางยาวที่สุดเท่าที่จะเป็นไปได้ภายใต้ข้อ จำกัด เหล่านี้

ยกตัวอย่างเช่นที่เกิดจาก000การ111ที่เราสามารถใช้เส้นทาง

000, 001, 011, 010, 110, 100, 101, 111

ซึ่งเข้าชมทั้งหมด 8 บิตความยาว 3 ดังนั้นมันจะต้องเป็นไปได้ที่ยาวที่สุด

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • คุณสามารถรับอินพุตเป็นสองสตริงของศูนย์และหนึ่งหรือเป็นสองอาร์เรย์ของศูนย์และคนหรือเป็นสองอาร์เรย์ของค่าบูลีน
  • คุณไม่สามารถรับอินพุตเป็นจำนวนเต็มสองจำนวนที่มีการแทนค่าไบนารี่ขวา (การเขียน000และ111เป็น0และ7ไม่ถูกต้อง)
  • หากคุณต้องการคุณอาจใช้ความยาวของสตริงบิตเป็นอินพุต
  • โปรแกรมของคุณได้รับอนุญาตให้ส่งออกเส้นทางโดยการพิมพ์บิตสตริงที่เข้าเยี่ยมชมทีละครั้งหรือโดยการส่งกลับอาร์เรย์ของบิตสตริงที่เข้าชม (แต่ละรูปแบบเดียวกับอินพุต)
  • ผลลัพธ์ของคุณควรมีจุดเริ่มต้นและจุดสิ้นสุดของเส้นทาง (ซึ่งเป็นอินพุตของคุณ)
  • นี่คือซึ่งเป็นรหัสที่สั้นที่สุดในหน่วยไบต์

ตัวอย่าง

0 1 -> 0, 1
10 01 -> 10, 00, 01 or 10, 11, 01
000 111 -> any of the following:

   000, 100, 110, 010, 011, 001, 101, 111

   000, 100, 101, 001, 011, 010, 110, 111

   000, 010, 110, 100, 101, 001, 011, 111

   000, 010, 011, 001, 101, 100, 110, 111

   000, 001, 101, 100, 110, 010, 011, 111

   000, 001, 011, 010, 110, 100, 101, 111

1001 1100 -> 1001, 0001, 0000, 0010, 0011, 0111, 0101, 0100, 0110, 1110, 1010, 1011, 1111, 1101, 1100 (other paths exist)

1
เราสามารถใช้ค่าบูลีนแทนค่าและศูนย์ได้หรือไม่?
ข้อบกพร่อง

@ flawr แน่นอนว่าไม่เป็นไร
Misha Lavrov

เราขอสมมติว่าเราจะไม่ได้รับสองสายบิตเท่ากัน (หรือว่าเราจะทำอะไรก็ได้ถ้าใช่)?
Jonathan Allan

1
@JanathanAllan ใช่แล้วสมมติว่า bit-strings นั้นไม่เท่ากัน
Misha Lavrov

คำตอบ:


6

Husk , 27 26 24 bytes

→foΛεẊδṁ≠ÖLm↓≠⁰←ġ→PΠmṠe¬

กำลังดุร้ายช้ามาก ลองออนไลน์!

คำอธิบาย

เปลือกอ่านตามธรรมชาติจากขวาไปซ้าย

←ġ→PΠmṠe¬  Hypercube sequences ending in second input, say y=[1,1,0]
     mṠe¬  Pair each element with its negation: [[0,1],[0,1],[1,0]]
    Π      Cartesian product: [[0,0,1],[1,0,1],..,[1,1,0]]
   P       Permutations.
 ġ→        Group by last element
←          and take first group.
           The permutations are ordered so that those with last element y come first,
           so they are grouped together and returned here.

ÖLm↓≠⁰  Find first input.
  m     For each permutation,
   ↓≠⁰  drop all elements before the first input.
ÖL      Sort by length.

foΛεẊδṁ≠  Check path condition.
fo        Keep those lists that satisfy:
    Ẋ      For each adjacent pair (e.g. [0,1,0] and [1,1,0]),
      ṁ    take sum of
       ≠   absolute differences
     δ     of corresponding elements: 1+0+0 gives 1.
  Λε       Each value is at most 1.

→  Finally, return last element (which has greatest length).

4

Mathematica, 108 ไบต์

a=#~FromDigits~2+1&;Last@PadLeft[IntegerDigits[#-1,2]&/@FindPath[HypercubeGraph@Length@#,a@#,a@#2,∞,All]]&

การป้อนข้อมูล:

[{0, 0, 0, 0}, {1, 1, 1, 1}]

เอาท์พุท:

{{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 1}, {0, 0, 1, 0}, {0, 1, 1, 0},
 {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}, {1, 0, 0, 1}, {1, 0, 0, 0},
 {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 0, 1, 0}, {1, 0, 1, 1}, {1, 1, 1, 1}}

3

Mathematica, 175 ไบต์

คำถามแรกที่ดี!

(m=#;n=#2;Last@SortBy[(S=Select)[S[Rest@Flatten[Permutations/@Subsets[Tuples[{0,1},(L=Length)@m]],1],First@#==m&&Last@#==n&],Union[EditDistance@@@Partition[#,2,1]]=={1}&],L])&   


อินพุต

[{0, 0, 0}, {1, 1, 1}]


3

Haskell , 212 207 ไบต์

นี่อาจเป็นวิธีที่ยาวเกินไป แต่ในที่สุดก็ใช้งานได้ในขณะนี้ (ขอบคุณ @Lynn สำหรับเคล็ดลับผลิตภัณฑ์คาร์ทีเซียน !) Thansk @nimi สำหรับ -5 ไบต์!

import Data.List
b%l=[l++[x|b/=last l,x`notElem`l,1==sum[1|(u,v)<-x`zip`last l,u/=v]]|x<-mapM id$[0>1..]<$b]
b!a|f<-nub.concat.((b%)<$>)=snd$maximum$map(length>>=(,))$filter((==b).last)$until(f>>=(==))f[[a]]

ลองออนไลน์!

คำอธิบาย:

b%l -- helper function:
    -- given a path l (that should end in b) this generates all possible extensions
    -- of l (if not possible also l itself) 
            x<-mapM id$[0>1..]<$b -- generate all possible vertices of the hypercube
             -- and check the criteria
           b/=last l,x`notElem`l,1==sum[1|(u,v)<-x`zip`last l,u/=v] 
             -- extend if possible
    [l++[x|  ...                                                   ]| ... ]
b!a| -- actual function: 
     -- first define a helper function:
    f<-nub.concat.((b%)<$>)
     -- begin with the vertex a and apply the function from above repeatedly
     -- until you cannot make the path any longer without violating the
     -- criteria 
                                                                             until(f>>=(==))f[[a]]
     -- only take the paths that actually end in b          
                                                          filter((==b).last)$
     -- and find the one with the maximum length    
                           =snd$maximum$map(length>>=(,))$    

x<-mapM id$[1>0,1<0]<$b
nimi

... คุณต้องการ[True,False]ไหม ถ้ายังทำงานคุณสามารถใช้[False,True] [0>1..]
nimi

โอ้เยี่ยมมากขอบคุณฉันไม่รู้ว่าBoolมันคืออะไรEnumและฉันลืมไปแล้วว่า<$มีอยู่ (ลองครั้งแรก*>ซึ่งไม่ได้อยู่ในโหมโรง)!
ข้อบกพร่อง

3

Mathematica 116 114 ไบต์

ด้วยหลายไบต์ที่บันทึกไว้ต้องขอบคุณ Misha Lavrov

Last@FindPath[Graph[Rule@@@Cases[Tuples[Tuples[{0,1},{l=Length@#}],{2}],x_/;Count[Plus@@x,1]==1]],##,{1,2^l},Alll]&

อินพุต (8 มิติ)

[{1,0,0,1,0,0,0,1},{1,1,0,0,0,0,1,1}]//AbsoluteTiming

เอาท์พุท (ความยาว = 254 หลังจาก 1.82 วินาที)

{1.82393, {{1, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0}, {0, 0,0, 0, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 1, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0,1, 1, 1,0}, {0, 0, 0, 0, 1, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 1, 0, 1, 1}, {0, 0, 0, 0,1, 1, 1, 1}, {0, 0, 0, 0, 1, 1, 0, 1}, {0, 0, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1,0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 1}, {0, 0, 0, 1, 0, 1, 1, 1}, {0, 0, 0, 1, 0, 1, 0, 1}, {0, 0, 0, 1, 1, 1, 0, 1}, {0, 0, 0, 1, 1, 0, 0, 1}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 1, 0, 1, 1}, {0, 0, 0, 1,1, 1, 1, 1}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 0, 1, 1, 0}, {0, 0, 1, 1, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0,0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 1, 0, 0, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 1, 1}, {0, 0, 1, 0,0, 1, 0, 1}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 1, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 1}, {0, 0, 1, 0,1, 0, 1, 1}, {0, 0, 1, 0, 1, 0, 1, 0}, {0, 0, 1, 0, 1, 1, 1, 0}, {0, 0, 1, 0, 1, 1, 1, 1}, {0, 0, 1, 0, 1, 1, 0, 1}, {0, 0, 1, 1,1, 1, 0, 1}, {0, 0, 1, 1, 0, 1, 0, 1}, {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 1, 1, 0, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 1, 0}, {0, 0, 1, 1,0, 0, 1, 1}, {0, 0, 1, 1, 0, 1, 1,1}, {0, 0, 1, 1, 1, 1, 1, 1}, {0, 0, 1, 1, 1, 0, 1, 1}, {0, 0, 1, 1, 1, 0, 0, 1}, {0, 0, 1, 1,1, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 0, 1, 0, 0}, {0, 1, 1, 1,0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 1, 0, 0,0, 0, 1, 1}, {0, 1, 0, 0, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 1, 0, 0, 0, 1, 1, 1}, {0, 1, 0, 0, 0, 1, 0, 1}, {0, 1, 0, 0,1, 1, 0, 1}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 1, 0}, {0, 1, 0, 0, 1, 0, 1, 1}, {0, 1, 0, 0,1, 1, 1, 1}, {0, 1, 0, 0, 1, 1, 1, 0}, {0, 1, 0, 0, 1, 1, 0,0}, {0, 1, 0, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 0}, {0, 1, 0, 1,0, 0, 0, 0}, {0, 1, 0, 1, 0, 0, 0, 1}, {0, 1, 0, 1, 0, 0, 1, 1}, {0, 1, 0, 1, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 1, 0}, {0, 1, 0, 1,0, 1, 1, 1}, {0, 1, 0, 1, 0, 1, 0, 1}, {0, 1, 0, 1, 1, 1, 0, 1}, {0, 1, 0, 1, 1, 0, 0, 1}, {0, 1, 0, 1, 1, 0, 1, 1}, {0, 1, 0, 1,1, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 0, 1, 1, 1, 1}, {0, 1, 1, 0,0, 1, 1, 1}, {0, 1, 1, 0, 0, 0, 1, 1}, {0, 1, 1, 0, 0, 0, 0, 1}, {0, 1, 1, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 0, 1, 0}, {0, 1, 1, 0,0, 1, 1, 0}, {0, 1, 1, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 1}, {0, 1, 1, 0, 1, 1, 0, 1}, {0, 1, 1, 0, 1, 0, 0, 1}, {0, 1, 1, 0,1, 0, 0, 0}, {0, 1, 1, 0, 1, 0, 1, 0}, {0, 1, 1, 0, 1, 0, 1, 1}, {0, 1, 1, 1, 1, 0, 1, 1}, {0, 1, 1, 1, 0, 0, 1, 1}, {0, 1, 1, 1,0, 0, 0, 1}, {0, 1, 1, 1, 0, 0, 0, 0}, {0, 1, 1, 1, 0, 0, 1, 0}, {0, 1, 1, 1, 0, 1, 1, 0}, {0, 1, 1, 1, 0, 1, 1, 1}, {0, 1, 1, 1,0, 1, 0, 1}, {0, 1, 1, 1, 1, 1, 0, 1}, {0, 1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 1, 1,1, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 0, 0}, {1, 0, 1, 1,1, 1, 0, 0}, {1, 0, 0, 1, 1, 1, 0, 0}, {1, 0, 0, 0, 1, 1, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0,0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 1, 1, 0}, {1, 0, 0, 0, 0, 1, 1, 1}, {1, 0, 0, 0,0, 1, 0, 1}, {1, 0, 0, 0, 1, 1, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 1, 0}, {1, 0, 0, 0,1, 0, 1, 1}, {1, 0, 0, 0, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 1, 0}, {1, 0, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 1, 1, 0}, {1, 0, 0, 1,0, 0, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 1, 1, 1}, {1, 0, 0, 1,0, 0, 1, 1}, {1, 0, 0, 1, 1, 0, 1, 1}, {1, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 0, 0}, {1, 0, 0, 1, 1, 0, 1, 0}, {1, 0, 1, 1,1, 0, 1, 0}, {1, 0, 1, 0, 1, 0, 1, 0}, {1, 0, 1, 0, 0, 0, 1, 0}, {1, 0, 1, 0, 0, 0, 0, 0}, {1, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0,0, 0, 1, 1}, {1, 0, 1, 0, 0, 1, 1, 1}, {1, 0, 1, 0, 0, 1, 0, 1}, {1, 0, 1, 0, 0, 1, 0, 0}, {1, 0, 1, 0, 0, 1, 1, 0}, {1, 0, 1, 0,1, 1, 1, 0}, {1, 0, 1, 0, 1, 1, 0, 0}, {1, 0, 1, 0, 1, 0, 0, 0}, {1, 0, 1, 0, 1, 0, 0, 1}, {1, 0, 1, 0, 1, 0, 1, 1}, {1, 0, 1, 0,1, 1, 1, 1}, {1, 0, 1, 0, 1, 1, 0, 1}, {1, 0, 1, 1, 1, 1, 0, 1}, {1, 0, 0, 1, 1, 1, 0, 1}, {1, 0, 0, 1, 1, 1, 1, 1}, {1, 0, 1, 1,1, 1, 1, 1}, {1, 0, 1, 1, 0, 1, 1, 1}, {1, 0, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 1, 0, 0, 0, 1}, {1, 0, 1, 1, 0, 0, 0, 0}, {1, 0, 1, 1,0, 0, 1, 0}, {1, 0, 1, 1, 0, 1, 1, 0}, {1, 0, 1, 1, 0, 1, 0, 0}, {1, 0, 1, 1, 0, 1, 0, 1}, {1, 1, 1, 1, 0, 1, 0, 1}, {1, 1, 0, 1,0, 1, 0, 1}, {1, 1, 0, 0, 0, 1, 0,1}, {1, 1, 0, 0, 0, 0, 0, 1}, {1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0, 1, 0}, {1, 1, 0, 0,0, 1, 1, 0}, {1, 1, 0, 0, 0, 1, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0}, {1, 1, 0, 0, 1, 0, 0, 0}, {1, 1, 0, 0, 1, 0, 0, 1}, {1, 1, 0, 0,1, 0, 1, 1}, {1, 1, 0, 0, 1, 0, 1, 0}, {1, 1, 0, 0, 1, 1, 1, 0}, {1, 1, 0, 0, 1, 1, 1, 1}, {1, 1, 0, 0, 0, 1, 1, 1}, {1, 1, 0, 1,0, 1, 1, 1}, {1, 1, 0, 1, 0, 0, 1, 1}, {1, 1, 0, 1, 0, 0, 0, 1}, {1, 1, 0, 1, 0, 0, 0, 0}, {1, 1, 0, 1, 0, 0, 1, 0}, {1, 1, 0, 1,0, 1, 1, 0}, {1, 1, 0, 1, 0, 1, 0, 0}, {1, 1, 0, 1, 1, 1, 0, 0}, {1, 1, 0, 1, 1, 0, 0, 0}, {1, 1, 0, 1, 1, 0, 0, 1}, {1, 1, 0, 1,1, 0, 1, 1}, {1, 1, 0, 1, 1, 0, 1, 0}, {1, 1, 0, 1, 1, 1, 1, 0}, {1, 1, 0, 1, 1, 1, 1, 1}, {1, 1, 0, 1, 1, 1, 0, 1}, {1, 1, 0, 0,1, 1, 0, 1}, {1, 1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 0, 0, 1, 0, 1}, {1, 1, 1, 0, 0, 0, 0, 1}, {1, 1, 1, 0, 0, 0, 0, 0}, {1, 1, 1, 0,0, 0, 1, 0}, {1, 1, 1, 0, 0, 1, 1, 0}, {1, 1, 1, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 1, 1, 0, 0}, {1, 1, 1, 0, 1, 0, 0, 0}, {1, 1, 1, 0,1, 0, 0, 1}, {1, 1, 1, 0, 1, 0, 1, 1}, {1, 1, 1, 0, 1, 0, 1, 0}, {1, 1, 1, 0, 1, 1, 1, 0}, {1, 1, 1, 0, 1, 1, 1, 1}, {1, 1, 1, 0,0, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1, 0}, {1, 1, 1, 1, 0, 0, 1, 0}, {1, 1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1,0, 0, 0, 1}, {1, 1, 1, 1, 1, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1,1, 0, 1, 0}, {1, 1, 1, 1, 1, 0, 0, 0}, {1, 0, 1, 1, 1, 0, 0, 0}, {1, 0, 1, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1, 1}, {1, 1, 1, 1,1, 0, 1, 1}, {1, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 0, 0, 0, 1, 1}, {1, 1, 0, 0, 0, 0, 1, 1}}}

Tuples[{0,1},{l=Length@#}],{2}]& สร้างตัวเลข 0 ... 8 เป็นรายการไบนารี

ด้านนอกTuples...{2}ผลิตคู่สั่งซื้อทั้งหมดของตัวเลขไบนารีเหล่านั้น

Plus@@x ผลรวมแต่ละคู่สร้างจำนวนสามเท่าของ 0, 1

Cases....Count[Plus@@x, 1]==1 ส่งกลับผลรวมทั้งหมดที่มีเพียง 1 เดียวสิ่งเหล่านี้จะเกิดขึ้นเมื่อตัวเลขไบนารี่ดั้งเดิมสองตัวถูกเชื่อมต่อกันด้วยขอบ

Rules เชื่อมต่อจุดยอดของกราฟแต่ละจุดยอดเป็นเลขฐานสอง

Graph สร้างกราฟที่สอดคล้องกับจุดยอดและขอบดังกล่าว

FindPath ค้นหาเส้นทางสูงสุด 2 ^ n เส้นทางเชื่อมต่อจุดสุดยอด a ถึงจุดสุดยอด b ตัวเลขที่กำหนด

Last ใช้เส้นทางเหล่านี้ที่ยาวที่สุด


สำหรับสามมิติกราฟสามารถแสดงในระนาบดังที่แสดงไว้ที่นี่:

กราฟแท่งแบน

สำหรับอินพุต, {0,0,0}, {1,1,1}ต่อไปนี้คือเอาต์พุต:

{{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}}}

เส้นทางนี้สามารถพบได้ในกราฟด้านบน

นอกจากนี้ยังสามารถรู้สึกเป็นเส้นทางต่อไปนี้ใน 3 {x,y,z}พื้นที่ซึ่งแต่ละจุดสุดยอดสอดคล้องกับจุด {0,0,0} แทนจุดเริ่มต้นและ {1,1,1} แทนจุด "ตรงกันข้าม" ในคิวบ์หน่วย

ดังนั้นเส้นทางการแก้ปัญหาสอดคล้องกับการแวะผ่านของขอบตามคิวบ์หน่วย ในกรณีนี้เส้นทางคือ Hamiltonian: จะไปที่แต่ละจุดสุดยอดหนึ่งครั้ง (เช่นไม่มีการข้ามและไม่มีการตัดจุดยอด)

g4


มีเหตุผลง่ายๆหรือไม่ว่าทำไมเส้นทาง 2 ^ n จาก a ถึง b เป็นเส้นทางที่เพียงพอสำหรับเส้นทางที่ยาวที่สุดที่จะเป็นเส้นทางที่ยาวที่สุด?
Misha Lavrov

@Misha คำถามที่ดีมาก
DavidC

ต่อไปนี้เป็นวิธีคิดอย่างหนึ่ง เส้นทางที่ยาวที่สุดคือเส้นทาง Hamiltonian จะน้อยกว่าจำนวนมุม (เรากำลังนับจำนวนขอบบนเส้นทาง) จำนวนมุมคือ 2 ^ n ดังนั้นความยาวพา ธ สูงสุดจะเท่ากับ 2 ^ n-1
DavidC

ฉันยอมรับว่าความยาวเส้นทางสูงสุดจะเข้าสู่จุดยอด 2 ^ n เสมอ (ถ้าเป็น Hamiltonian) หรือจุดยอด 2 ^ n-1 (ถ้าเส้นทาง Hamiltonian เป็นไปไม่ได้เนื่องจากความเท่าเทียมกัน) มันแตกต่างจากคำถามของฉันซึ่งก็คือ: ทำไมการสร้าง 2 ^ (n + 2) (ฉันเดา 2 ^ n เป็นตัวเลขที่ผิด) เส้นทางที่แตกต่างกัน (บางอันอาจสั้นมาก) รับประกันได้ว่าสิ่งที่ยาวที่สุดจะเป็น ยาวที่สุดในเส้นทางที่ต่างกันทั้งหมด
Misha Lavrov

ในคำอื่น ๆ ทำไม2^(l+2)ในรหัสของคุณ?
Misha Lavrov

3

Haskell , 141 123 ไบต์

c(a:b)=(1-a:b):map(a:)(c b)
c _=[]
q#z=[z]:[z:s|w<-c z,notElem w q,s<-(w:q)#w]
x!y=snd$maximum[(p*>x,p)|p<-[x]#x,last p==y]

ใช้รายการจำนวนเต็ม ลองออนไลน์!

คำอธิบาย

ฟังก์ชั่นหลักคือ!และฟังก์ชั่นเสริมเป็นและ# cได้รับรายชื่อของบิตที่ให้วิธีที่เป็นไปได้ทั้งหมดของหนึ่งพลิกของพวกเขาเช่นc[0,1,1] -> [[1,1,1],[0,0,1],[0,1,0]]

c(a:b)=        -- c on nonempty list with head a and tail b is
 (1-a:b):      -- the list with negated a tacked to b, then
 map(a:)(c b)  -- c applied recursively to b, with a tacked to each of the results.
c _=[]         -- c on empty list gives an empty list.

ฟังก์ชั่น#ใช้รายการของรายการ ("หน่วยความจำ") และรายการ ("บิตเรตเริ่มต้น") มันสร้างเส้นทางไฮเปอร์คิวบ์ทั้งหมดที่เริ่มต้นด้วยองค์ประกอบเริ่มต้นมีเฉพาะบิตที่แตกต่างกันและไม่ได้เหยียบสตริงในหน่วยความจำ

q#z=            -- # on memory q and initial string z is
 [z]:           -- the singleton path [z], and
 [z:s|          -- z tacked to each path s, where
  w<-c z,       -- w is obtained by flipping a bit of z,
  notElem w q,  -- w is not in the memory, and
  s<-(w:q)#w]   -- s is a path starting from w that avoids w and all elements of q.

ฟังก์ชั่นหลัก!เชื่อมโยงมันเข้าด้วยกัน เคล็ดลับผมใช้ที่นี่เป็นp*>x( xซ้ำแล้วซ้ำอีกlength pครั้ง) length pแทน เนื่องจากการทำซ้ำอีกต่อไปxจะมาตามลำดับรายการmaximumเลือกเส้นทางที่ยาวที่สุดในทั้งสองกรณีเนื่องจากพิกัดคู่แรกถูกเปรียบเทียบก่อนที่สอง

x!y=          -- ! on inputs x and y is
 snd$maximum  -- the second element of the maximal pair in
 [(p*>x,p)|   -- the list of pairs (p*>x,p), where
  p<-[x]#x,   -- p is a path starting from x that avoids stepping on x, and
  last p==y]  -- p ends in y.

2

เยลลี่ ,  25  27 ไบต์

+2 ไบต์เพื่อแก้ไขข้อผิดพลาดในการเล่นกอล์ฟของฉัน :( หวังว่าฉันจะหาวิธีที่สั้นกว่านี้

ṫi¥³ḣi
L2ṗŒ!瀵ạ2\S€ỊẠ×LµÞṪ

โปรแกรมเต็มรูปแบบที่ใช้บิตสตริงโดยใช้1และ2* เป็นรายการ ข้อโต้แย้งที่มีและfrom toโปรแกรมจะพิมพ์รายการของรายการเดียวกัน

* 0และ1อาจใช้แทนค่าไบต์ (เพิ่มระหว่างL2ṗและŒ!ç€...ลดลง)

ลองออนไลน์!

อย่างไร?

ปรับปรุง ...

ṫi¥³ḣi - Link 1, getSlice: list of lists, bitstrings; list, toBitstring
   ³   - get 3rd command line argument (fromBitstring)
  ¥    - last two links as a dyad:
 i     -   index (of fromBitstring in bitstrings)
ṫ      -   tail (bitstrings) from (that) index
     i - index (of toBitstring in that result)
    ḣ  - head to (that) index

L2ṗŒ!瀵ạ2\S€ỊẠ×LµÞṪ - Main link: list, fromBitstring; list, toBitstring
L                    - length (of fromBitstring)
 2                   - literal two
  ṗ                  - Cartesian power (of implicit range(2)=[1,2] with L(fromBitstring))
                     - ...i.e. all unique bitstrings of the required length (using [1,2])
   Œ!                - all permutations (of that list)
     ç€              - call the last link (1) as a dyad (i.e. f(that, toBitstring))
       µ         µÞ  - sort by the monadic function:
         2\          -   2-wise reduce with:
        ạ            -     absolute difference
           S€        -   sum €ach
             Ị       -   insignificant (vectorises) (abs(z)<=1 - for our purposes it's really just used for z==1 since only positive integers are possible)
              Ạ      -   all truthy? (1 if so 0 otherwise)
                L    -   length
               ×     -   multiply
                   Ṫ - tail (the last one is one of the maximal results)
                     - implicit print

วิธีการทำงานของ Jelly เป็นเรื่องลึกลับสำหรับฉัน แต่เป็นข้อมูลป้อนเข้า[1,1]และ[2,2]สร้างผลลัพธ์[[1, 1], [2, 1], [1, 2], [2, 2]]เมื่อฉันลองใช้งานออนไลน์ซึ่งไม่ใช่เส้นทางที่ถูกต้อง
Misha Lavrov

อืมข้าคงทำอะไรผิดไปแล้ว - มอง ...
Jonathan Allan

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