เรียงลำดับรายการตามการพึ่งพา


12

เป้าหมาย

เรียงรายการของไอเท็มเพื่อให้แน่ใจว่าแต่ละไอเท็มถูกแสดงหลังจากการอ้างอิงที่ระบุ

อินพุต

Array (ต้องระบุ) อาร์เรย์ของอาร์เรย์ของจำนวนเต็มโดยที่จำนวนเต็มแต่ละค่าจะระบุดัชนีเป็นดัชนี 0 หรือ 1 ตามรายการอื่นที่ไอเท็มนี้ต้องมาภายหลัง อินพุตอาจเป็นอาร์เรย์หรือสตริงหรือสิ่งอื่นที่มนุษย์สามารถอ่านได้

ตัวอย่างเช่นอินพุต 0-based:

[
  [ 2 ],    // item 0 comes after item 2
  [ 0, 3 ], // item 1 comes after item 0 and 3
  [ ],      // item 2 comes anywhere
  [ 2 ]     // item 3 comes after item 2
]

สมมติว่าไม่มีการอ้างอิงแบบวงกลมมีคำสั่งที่ถูกต้องอย่างน้อยหนึ่งรายการเสมอ

เอาท์พุต

ตัวเลขตามลำดับการพึ่งพา คำสั่งที่ไม่ชัดเจนไม่จำเป็นต้องกำหนดขึ้น ผลลัพธ์อาจเป็นอาร์เรย์หรือข้อความหรือสิ่งอื่นที่มนุษย์อ่านได้

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

เอาต์พุตที่เป็นไปได้สำหรับอินพุตข้างต้นรวมถึง:

[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]

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

ฟังก์ชั่นหรือโปรแกรมที่ทำสิ่งนี้ให้เสร็จในจำนวนไบต์น้อยที่สุดจะได้รับเกียรติในการยอมรับ กำหนดเวลาใน 6 วัน


4
สิ่งนี้เรียกว่าการจัดเรียงทอพอโลยีสำหรับคนที่อยากรู้อยากเห็น
Robert Fraser

อินพุตอาจเป็นอาร์เรย์หรือสตริงหรือสิ่งอื่นที่มนุษย์สามารถอ่านได้เพื่อให้แน่ใจว่า: สามารถเป็นอาร์เรย์ 2 มิติที่มีค่าศูนย์และรายการได้หรือไม่
Luis Mendo

@DonMuesli ขอโทษที่ตอบช้า แต่ไม่ แนวคิดมาจากการพึ่งพารหัส หากคุณเพิ่มโมดูลรหัสอื่นจะไม่รับผิดชอบที่จะต้องแก้ไขโมดูลรหัสที่ไม่เกี่ยวข้องเพื่อประกาศว่าโมดูลเหล่านั้นไม่ได้ขึ้นอยู่กับโมดูลใหม่นี้
Hand-E-Food

นั่นทำให้รู้สึกโดยสิ้นเชิง เดนนิสไม่ควรเป็นผู้ชนะหรือ
Luis Mendo

ใช่. ขออภัยตอนกลางคืนเครียดและวิ่งตามสมมติฐาน
Hand-E-Food

คำตอบ:


3

เยลลี่ 8 ไบต์

ịÐL³ŒḊ€Ụ

นี้จะขึ้นอยู่กับ (unimplemented) วิธีการเชิงลึกจาก@ XNOR คำตอบของงูหลาม

ลองออนไลน์!

มันทำงานอย่างไร

ịÐL³ŒḊ€Ụ  Main link. Input: A (list of dependencies)

 ÐL       Apply the atom to the left until a loop is reached, updating the left
          argument with the last result, and the right argument with the previous
          left argument.
ị         For each number in the left argument, replace it with the item at that
          index in the right argument.
   ³      Call the loop with left arg. A (implicit) and right arg. A (³).
    ŒḊ€   Compute the depth of each resulting, nested list.
       Ụ  Sort the indices of the list according to their values.

8 อักขระเหล่านี้จริง ๆ แล้วจะเป็น 19 ไบต์หรือไม่
Hand-E-Food

@ Hand-E-Food Jelly ใช้การเข้ารหัสที่กำหนดเอง (ไม่ใช่ UTF 8) ดังนั้นอักขระแต่ละตัวจึงเป็นไบต์
Luis Mendo

@ Hand-E-Food Don Muesli ถูกต้อง เยลลี่ใช้หน้ารหัสนี้ตามค่าเริ่มต้นซึ่งเข้ารหัสอักขระทั้งหมดที่เข้าใจเป็นหนึ่งไบต์
Dennis

7

Pyth, 21 ไบต์

hf.A.e!f>xYTxkTbQ.plQ
                    Q  input
                   l   length of input array
                 .p    all permutations of [0, 1, ..., lQ-2, lQ-1]
hf                     find the first permutation for which...
    .e          Q        map over the input array with indices...
       f       b           find all elements in each input subarray where...
        >xYT                 index of dependency is greater than...
            xkT              index of item
      !                    check whether resulting array is falsy (empty)
  .A                     is the not-found check true for [.A]ll elements?

ทดสอบ:

llama@llama:~$ echo '[[2],[0,3],[],[2]]' | pyth -c 'hf.A.e!f>xYTxkTbQ.plQ' 
[2, 0, 3, 1]

7

Python 2, 73 ไบต์

l=input()
f=lambda n:1+sum(map(f,l[n]))
print sorted(range(len(l)),key=f)

เรียงลำดับจุดยอดตามจำนวนลูกหลานของพวกเขาซึ่งfคำนวณซ้ำ หากจุดสุดยอดชี้ไปที่จุดยอดอื่นลูกหลานของมันจะรวมจุดยอดแหลมและลูกหลานของจุดสุดยอดทั้งหมดดังนั้นมันจะมีลูกหลานที่เคร่งครัดกว่า ดังนั้นมันจะถูกวางไว้ช้ากว่าจุดยอดแหลมในการจัดเรียงตามที่ต้องการ

การนับผู้สืบทอดของจุดสุดยอดเป็นหนึ่งสำหรับตัวเองรวมถึงการนับผู้สืบทอดของแต่ละลูก โปรดทราบว่าผู้สืบทอดสามารถนับได้หลายครั้งหากมีหลายเส้นทางที่นำไปสู่

มันจะทำงานเพื่อใช้ความลึกมากกว่าการนับลูกหลาน

f=lambda n:1+max(map(f,l[n]))

ยกเว้นmaxจะต้องให้0ในรายการที่ว่างเปล่า


2
อัลกอริทึมที่สวยงาม สิ่งนี้จะได้คะแนน 12 ไบต์ทั้งใน Pyth และ Jelly
Dennis

4

Pyth, 19 ไบต์

hf!s-V@LQT+k._T.plQ

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

hf!s-V@LQT+k._T.plQ   implicit: Q = input list
               .plQ   all permutations of [0, 1, ..., len(Q)-1]
 f                    filter for permutations T, which satisfy:
      @LQT               apply the permutation T to Q
                         (this are the dependencies)
            ._T          prefixes of T
          +k             insert a dummy object at the beginning
                         (these are the already used elements)
    -V                   vectorized subtraction of these lists
   s                     take all dependencies that survived
  !                      and check if none of them survived
h                    print the first filtered permutation

4

Bash, 35 ไบต์

perl -pe's/^$/ /;s/\s/ $. /g'|tsort

ตัวอย่างการวิ่ง

I / O ได้รับการจัดทำดัชนี 1 แต่ละอาร์เรย์จะอยู่ในบรรทัดแยกกันโดยมีช่องว่างเป็นตัวคั่นรายการ

$ echo $'4\n1\n\n3\n1 3 2' # [[4], [1], [], [3], [1, 3, 2]]
4
1

3
1 3 2
$ bash tsort <<< $'4\n1\n\n3\n1 3 2'
3
4
1
2
5

มันทำงานอย่างไร

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

ตัวเลขทั้งหมดในบรรทัดที่ระบุจะตามด้วยช่องว่างหรือตัวป้อนบรรทัด s/\s/ $. /gส่วนหนึ่งของคำสั่ง Perl แทนที่อักขระช่องว่างผู้ที่มีพื้นที่จำนวนบรรทัดและพื้นที่อื่นจึงทำให้แน่ใจว่าแต่ละnในบรรทัดkแจ๋วk

ในที่สุดหากบรรทัดว่างเปล่า (เช่นประกอบด้วยเฉพาะการป้อนบรรทัด) ให้s/^$/ /เพิ่มพื้นที่ว่างไว้ วิธีนี้การเปลี่ยนตัวผู้เล่นที่สองจะเปิดบรรทัดว่างkเข้าไปเพื่อให้แน่ใจว่าแต่ละจำนวนเต็มเกิดขึ้นอย่างน้อยหนึ่งครั้งในสตริงที่ประปาk ktsort


ถูกต้อง ฉันคิดว่าคุณคร่ำครึtsortดีกว่าหรือเร็วกว่าที่ฉันทำได้ :) ขอบคุณสำหรับคำอธิบายเพิ่มเติม
บาดเจ็บทางดิจิทัล

3

Bash + coreutils, 20 80

nl -v0 -ba|sed -r ':;s/(\S+\s+)(\S+) /\1\2\n\1 /;t;s/^\s*\S+\s*$/& &/'|tsort|tac

ป้อนข้อมูลเป็นบรรทัดที่คั่นด้วยช่องว่างเช่น:

2
0 3

2
  • nl เพิ่มดัชนี zero-based ให้กับทุกบรรทัด
  • sed แยกรายการพึ่งพาเป็นคู่พึ่งพาง่ายและทำให้การพึ่งพาที่ไม่สมบูรณ์ขึ้นอยู่กับตัวเอง
  • tsort การจัดเรียงโทโพโลยีที่จำเป็นต้องมี
  • tac ใส่ลำดับย้อนกลับผลลัพธ์

Ideone Ideone กับ @Dennis 'testcase


2

Python 2, 143 118 116 ไบต์

วิธีการสุ่มมากกว่าเล็กน้อย

from random import*
l=input()
R=range(len(l))
a=R[:]
while any(set(l[a[i]])-set(a[:i])for i in R):shuffle(a)
print a

การแก้ไข:

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