เรียงลำดับการหมุนเมทริกซ์


12

ให้กำหนดเมทริกซ์ที่ไม่ว่างเปล่าไม่ได้แยกและ จำกัด ด้วยจำนวนที่ไม่ซ้ำดังนี้:

N={457136}

ให้นิยามการเคลื่อนที่แบบ 4 เมทริกซ์เป็น:

  • ↑ * (ขึ้น): เลื่อนคอลัมน์ขึ้น
  • ↓ * (ลง): เลื่อนคอลัมน์ลง
  • → * (ขวา): เลื่อนแถวไปทางขวา
  • ← * (ซ้าย): เลื่อนแถวไปทางซ้าย

เครื่องหมายดอกจัน (*) หมายถึงคอลัมน์ / แถวที่ได้รับผลกระทบจากการย้าย (สามารถเป็นดัชนี 0 หรือดัชนี 1 ขึ้นอยู่กับคุณโปรดระบุว่าหนึ่งในคำตอบของคุณ)


ความท้าทายคือการใช้การเคลื่อนไหวด้านบนจัดเรียงเมทริกซ์ตามลำดับลัคนา (เป็นมุมซ้ายบนสุดต่ำสุดและล่างขวาล่างสูงสุด)

ตัวอย่าง

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

N={423156}
ขาออกเป็นไปได้: หรือ↑0 ↓0(สังเกตว่าการเคลื่อนไหวใด ๆ เหล่านั้นสามารถเรียงลำดับเมทริกซ์ได้ดังนั้นคำตอบทั้งคู่จึงถูกต้อง)


อินพุต:

N={231456}
เอาต์พุตที่เป็นไปได้:→0


อินพุต (ตัวอย่างกรณีทดสอบ):

N={457136}
เอาต์พุตที่เป็นไปได้:↑0↑1←1↑2


อินพุต:

N={596824173}
เอาต์พุตที่เป็นไปได้: ↑0↑2→0→2↑0→2↑1↑2←1


N={127282961023451778139151112181426162119203022232425}
↑2↑1←3→0←3↓0←0←2→3↑3↑4


N={1}


N={1234}


หมายเหตุ

  • อาจมีเอาต์พุตที่ถูกต้องแตกต่างกัน (ไม่จำเป็นต้องเหมือนกันกับกรณีทดสอบหรือสั้นที่สุด)
  • คุณสามารถสมมติว่ามันจะเป็นวิธีการสั่งซื้อเมทริกซ์เสมอ
  • ขอบเชื่อมต่อ (เช่น pacman: v)
  • จะไม่มีเมทริกซ์ที่มีมากกว่า 9 คอลัมน์หรือ / และแถว
  • สมมติว่าเมทริกซ์มีเฉพาะจำนวนเต็มไม่เป็นศูนย์บวก
  • คุณสามารถใช้ 4 ค่าที่แตกต่างนอกเหนือจากตัวเลขเพื่อแสดงการเคลื่อนไหว (ในกรณีนั้นโปรดระบุว่าในคำตอบของคุณ)
  • คอลัมน์ / แถวสามารถทำดัชนีได้ 0 หรือ 1
  • เกณฑ์การชนะ

กรณีทดสอบเพิ่มเติมยินดีต้อนรับเสมอ


5
นี่คือเว็บไซต์ที่คุณสามารถไขปริศนาเหล่านี้ได้ด้วยตัวเอง
Doorknob

1
@Doorknob นั่นจะเป็นประโยชน์เมื่อฉันเขียน Dx ที่ท้าทาย ขอขอบคุณ!
Luis felipe De jesus Munoz

ฉันไม่คิดว่าคุณจะพูดทุกที่ที่คำตอบจะต้องสั้นที่สุด มันตั้งใจหรือไม่ ยกตัวอย่างเช่นเป็นวิธีการแก้ปัญหาที่ถูกต้องสำหรับตัวอย่างที่สองที่คุณได้รับการแก้ปัญหาเป็น←0←0 →0หากเป็นเช่นนั้นฉันคิดว่าครึ่งหนึ่งของตัวเลือกการย้ายมีแนวโน้มว่าจะไม่ถูกใช้
FryAmTheEggman

3
ที่เกี่ยวข้อง? codegolf.stackexchange.com/questions/172824/…
Sumner18

1
นอกจากนี้บางคนอาจต้องการลองopenprocessing.org/sketch/580366 ซึ่งจัดทำโดยผู้ใช้ YouTube ชื่อ carykh มันถูกเรียกว่า "loopover"
Gareth Ma

คำตอบ:


3

JavaScript (ES6),  226  219 ไบต์

ค้นหากำลังดุร้ายโดยใช้การเคลื่อนไหวright ( "R") และdown ( "D")

ส่งคืนสตริงที่อธิบายถึงการย้ายหรืออาร์เรย์ว่างถ้าเมทริกซ์อินพุตถูกเรียงลำดับแล้ว คอลัมน์และแถวในผลลัพธ์ถูกทำดัชนี 0

f=(m,M=2)=>(g=(s,m)=>m[S='some'](p=r=>r[S](x=>p>(p=x)))?!s[M]&&m[0][S]((_,x,a)=>g(s+'D'+x,m.map(([...r],y)=>(r[x]=(m[y+1]||a)[x])&&r)))|m[S]((_,y)=>g(s+'R'+y,m.map(([...r])=>y--?r:[r.pop(),...r]))):o=s)([],m)?o:f(m,M+2)

ลองออนไลน์!

แสดงความคิดเห็น

f =                              // f = main recursive function taking:
(m, M = 2) => (                  //   m[] = input matrix; M = maximum length of the solution
  g =                            // g = recursive solver taking:
  (s, m) =>                      //   s = solution, m[] = current matrix
    m[S = 'some'](p =            // we first test whether m[] is sorted
      r =>                       // by iterating on each row
        r[S](x =>                // and each column
          p > (p = x)            // and comparing each cell x with the previous cell p
        )                        //
    ) ?                          // if the matrix is not sorted:
      !s[M] &&                   //   if we haven't reached the maximum length:
      m[0][S]((_, x, a) =>       //     try all 'down' moves:
        g(                       //       do a recursive call:
          s + 'D' + x,           //         append the move to s
          m.map(([...r], y) =>   //         for each row r[] at position y:
            (r[x] =              //           rotate the column x by replacing r[x] with
              (m[y + 1] || a)[x] //           m[y + 1][x] or a[x] for the last row (a = m[0])
            ) && r               //           yield the updated row
      ))) |                      //
      m[S]((_, y) =>             //     try all 'right' moves:
        g(                       //       do a recursive call:
          s + 'R' + y,           //         append the move to s
          m.map(([...r]) =>      //         for each row:
            y-- ?                //           if this is not the row we're looking for:
              r                  //             leave it unchanged
            :                    //           else:
              [r.pop(), ...r]    //             rotate it to the right
      )))                        //
    :                            // else (the matrix is sorted):
      o = s                      //   store the solution in o
)([], m) ?                       // initial call to g(); if we have a solution:
  o                              //   return it
:                                // else:
  f(m, M + 2)                    //   try again with a larger maximum length

คำตอบที่ดี คุณรู้หรือไม่ว่ามี algo ที่มีประสิทธิภาพสำหรับเรื่องนี้หรือถ้าเป็นไปได้ในการกำหนดจำนวนการเคลื่อนไหวสูงสุดที่โซลูชันสามารถทำได้โดยไม่ต้องบังคับให้เดรัจฉาน?
Jonah

1
@Jonah นี่คือเอกสารอธิบายการแก้ปัญหาและให้ขอบเขตบนของจำนวนการเคลื่อนไหว (ดูความท้าทายนี้ซึ่งโดยทั่วไปแล้วเป็นงานเดียวกันกับเกณฑ์การชนะที่แตกต่างกัน)
Arnauld

ว้าวขอบคุณ @Arnauld
Jonah

2

Python 2 , 296 277 245 Python 3 , 200 194 ไบต์

from numpy import*
def f(p):
 s='';u=[]
 while any(ediff1d(p)<0):u+=[(copy(p),s+f'v{v}',f':,{v}')for v in r_[:shape(p)[1]]]+[(p,s+'>0',0)];p,s,i=u.pop(0);exec(f'p[{i}]=roll(p[{i}],1)')
 return s

ลองออนไลน์!

-19: ไม่จำเป็นต้องใช้ลูกศรยูนิโคด ...
-32: ทำใหม่เล็กน้อย แต่ประสิทธิภาพโดยเฉลี่ยช้ากว่ามาก
-45: รับแรงบันดาลใจจากคำตอบของ @ Arnauld เปลี่ยนเป็น Python 3 สำหรับf''(-4 ไบต์)
-6: range( )r_[: ] , diff(ravel( ))ediff1d( )


ค้นหาอย่างละเอียดถี่ถ้วนการรวมกันของเป็นไปได้ทั้งหมดย้ายและ →0หมดเวลาในกรณีทดสอบที่สาม

เนื่องจาก→nเทียบเท่า

01...↓(c-1) 	... repeated r-n times
0
01...↓(c-1)	... repeated n times

โดยที่rและcเป็นจำนวนแถวและคอลัมน์การเคลื่อนไหวเหล่านี้เพียงพอที่จะค้นหาวิธีแก้ปัญหาทั้งหมด


from numpy import*
def f(p):
    s=''                                    #s: sequence of moves, as string
    u=[]                                    #u: queue of states to check
    while any(ediff1d(p)<0):                #while p is not sorted
        u+=[(copy(p),s+f'v{v}',f':,{v}')    #add p,↓v to queue
            for v in r_[:shape(p)[1]]]      # for all 0<=v<#columns
        u+=[(p,s+'>0',0)]                   #add p,→0
        p,s,i=u.pop(0)                      #get the first item of queue
        exec(f'p[{i}]=roll(p[{i}],1)')      #transform it
    return s                                #return the moves taken

>v→↓สอดคล้องตามลำดับ (คนอื่นไม่ได้กำหนด)


0

เยลลี่ 35 ไบต์

ṙ€LXȮƊ¦1
ÇZÇZƊ⁾ULXȮOịØ.¤?F⁻Ṣ$$¿,“”Ṫ

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ เอาต์พุตย้ายไปที่ STDOUT โดยใช้ L สำหรับซ้ายและ R ทางขวา พยายามสุ่มย้ายจนกว่าเมทริกซ์จะถูกจัดเรียงจึงไม่มีประสิทธิภาพมากนักในแง่ของความเร็วหรือความซับซ้อนของอัลกอริทึม

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