依存関係に基づいてアイテムを並べ替える


12

ゴール

アイテムのリストをソートして、各アイテムが指定された依存関係の後にリストされるようにします。

入力

整数の配列の配列。各整数は、このアイテムの後に来る必要がある別のアイテムの0ベースまたは1ベースのインデックスを指定します。入力は、配列または文字列、または人間が読めるものであれば何でもかまいません。

たとえば、0ベースの入力:

[
  [ 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
]

循環依存関係はなく、常に少なくとも1つの有効な順序があると仮定します。

出力

依存関係の番号。あいまいな順序は確定的である必要はありません。出力は、配列またはテキスト、または人間が読み取れるその他のものです。

有効な注文が複数ある場合でも、出力には1つの注文のみを指定する必要があります。

上記の入力の可能な出力は次のとおりです。

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

得点

これを最小限のバイト数で完了する関数またはプログラムが、受け入れの栄光を勝ち取ります。締め切りは6日です。


4
これは、好奇心の強い人のためにトポロジカルソートと呼ばれます。
ロバートフレイザー

入力は、配列または文字列、または人間が読める他の何かであるかもしれません。念のため:ゼロと1を持つ2D配列にすることができます。
ルイスメンドー

@DonMuesli、返信が遅くなって申し訳ありませんが、いいえ。このアイデアは、コードの依存関係から生まれました。別のコードモジュールを追加した場合、この新しいモジュールに依存していないことを宣言するために無関係なコードモジュールを変更する必要はありません。
手電子食品

それはまったく理にかなっています。デニスは勝者になってはいけませんか?
ルイスメンドー

はい、そうです。申し訳ありませんが、ストレスの多い夜遅く、仮定に基づいて急いでいます。
Hand-E-Food

回答:


3

ゼリー、8バイト

ịÐL³ŒḊ€Ụ

これは、@ xnorのPython answerの(実装されていない)深度アプローチに基づいています

オンラインでお試しください!

使い方

ịÐ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ではない)を使用するため、各文字は1バイトです
ルイスメンドー

@ Hand-E-Food Don Muesliは正しいです。Jellyはデフォルトでこのコードページを使用します。このコードページは、理解しているすべての文字をそれぞれ1バイトとしてエンコードします。
デニス

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
美しいアルゴリズム。これは、PythとJellyの両方で12バイトを記録します。
デニス

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/ $. /gPerlコマンドの一部は、これらの空白文字をスペース、行番号、および別のスペースに置き換えます。したがって、行kのnkに先行するようにします。

最後に、行が空の場合(つまり、改行のみで構成されている場合)、その行のs/^$/ /前にスペースを追加します。このようにして、2番目の置換は空の行kをに変換しk k、各整数がにパイプされる文字列で少なくとも1回出現するようにしtsortます。


いいでしょう 私はあなた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 すべての行にゼロベースのインデックスを追加します
  • sed 依存関係リストを単純な依存関係ペアに分割し、不完全な依存関係をそれらに依存させます。
  • tsort 必要なトポロジカルソートを行います
  • tac 出力を逆順にします

イデオネ。 @Dennisのテストケースを使用したIdeone


2

パイソン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.