複数キーの並べ替え


20

インデックスのリストと0個以上の整数のリストが与えられた場合、最初の入力からのキー優先度で昇順でソートされた整数のリストを出力します。

キー入力をとし[1, 0, 2]、リスト入力をとします[[5, 3, 4], [6, 2, 1], [5, 2, 1]]。これらのリストは、2番目の要素、1番目の要素、3番目の要素の順に昇順で並べ替える必要があります。

  1. 最初に、indexの値でソートします1[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
  2. 次に、indexの値を使用して、最初の並べ替えの関係を解除します0[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
  3. 最後に、indexのvluesとの残りの関係を解除します2(これは実際には何も変更しません。関係が残っていないためです)。

詳細

  • ソートは安定しています。2つの要素が指定されたソートキーに関して同等に比較される場合、それらは出力内で同じ相対的な順序のままである必要があります。たとえば、指定されたソートキーの下でABが等しく、入力がであった[..., A, ..., B, ...]場合、出力のABに配置する必要があります。
  • ソートキーは、入力リストのいずれかに存在しない要素を参照することはありません。
  • ソートキーは繰り返されません。したがって、[1, 2, 1]ソートキーの有効なリストではありません。
  • ソートキーによって参照されない要素は、ソート順を考慮しません。出力の順序は、初期相対順序とソートキーによって参照される要素の値のみが決定します。
  • ソートキーをゼロインデックスにするか1インデックスにするかを選択できます。
  • ソートキーには負の値はありません。1インデックスを使用することを選択した場合、ソートキーにもゼロはありません。
  • 整数値は、言語のネイティブ表現可能な範囲を超えません。選択した言語がネイティブに任意の精度の整数(Pythonなど)に対応している場合、メモリの制約を条件として、任意の整数値を入力に含めることができます。

リファレンス実装(Python 2)

#!/usr/bin/env python

keys = input()
lists = input()

print sorted(lists, key=lambda l:[l[x] for x in keys])

オンラインで試す

テストケース

形式:keys lists -> output。すべてのソートキーはゼロインデックスです。

[1, 0, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[5, 2, 1], [6, 2, 1], [5, 3, 4]]
[1, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[6, 2, 1], [5, 2, 1], [5, 3, 4]]
[0, 1] [[1, 2], [2, 1]] -> [[1, 2], [2, 1]]
[1, 0] [[1, 2], [2, 1]] -> [[2, 1], [1, 2]]
[0] [[4], [10, 11, -88], [-2, 7]] -> [[-2, 7], [4], [10, 11, -88]]
[2] [[-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6]] -> [[-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2]]
[2, 1] [[9, 2, -2, -10, -6], [3, -4, -2]] -> [[3, -4, -2], [9, 2, -2, -10, -6]]
[2, 4, 8] [[5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5], [-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3]] -> [[-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3], [5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5]]
[1, 2, 3, 4, 5] [[-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [5, 3, -6, -5, -4, -4, -8, 2], [9, -4, 1, -1, -3, -2], [-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [1, -5, -3, -10, -7, 9, -8, -5, -1], [-9, 4, -1, -1, 2, 4]] -> [[-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -5, -3, -10, -7, 9, -8, -5, -1], [9, -4, 1, -1, -3, -2], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [5, 3, -6, -5, -4, -4, -8, 2], [-9, 4, -1, -1, 2, 4]]
[8, 7, 3, 2, 4, 9, 1] [[8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9]] -> [[10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5]]

一部のテストケースは、不愉快なほど長いようです。
16

@Fatalizeリストの長さに比べてソートキーが少ない場合や、ソートキーが多い場合を対象としています。
メゴ

1
@Fatalizeこれが、コピーアンドペーストが可能な理由です。必要に応じて、Retinaを使用して、使用可能な形式にフォーマットを変更します。
mbomb007

それが私たちの言語の自然なデータ型(つまり行列)である場合、すべての行が同じ長さを持つと仮定できますか?
ルイスメンドー

@LuisMendoいいえ。ギザギザの配列をサポートできる必要があります。
Mego

回答:


6

1
その仕組みの内訳はありますか?
-JamEngulfer

@JamEngulfer:それは答えに指定されている必要がありますが、:Þ、「ソート指定されたソート・キーで」ある⁴ị(質問尋ねるように動作しますソートキーを生成する)、配列の順序を変更する2番目のコマンドライン引数を使用し、$上書きされますプログラムが正しく解析されるように優先順位。

5

CJam、13バイト

{W%{{X=}$}fX}

スタックの最上位にリストのリストと優先順位のリストを期待し、それらをリストのソートされたリストで置き換える名前のないブロック。

オンラインでお試しください!(テストスイートとして。)

説明

タイブレーカーを使用した並べ替えは、優先度の低いキーから優先度の高いキーへと安定してリスト全体を繰り返し並べ替えることによって実装できます。

W%      e# Reverse priority list.
{       e# For each priority X...
  {     e#   Sort the lists by the result of this block...
    X=  e#     Extract the Xth element from the current list.
  }$
}fX

4

ルビー、35バイト

->k,a{a.sort_by{|e|e.values_at *k}}

eval.inで参照してください:https ://eval.in/652574


4

Haskell、38バイト

import Data.List
sortOn.flip(map.(!!))

使用例:( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]-> [[3,-4,-2],[9,2,-2,-10,-6]]

非ポイントフリー:f k v=sortOn(\x->map(\y->x!!y)k)v


4

Mathematica、22 19バイト

SortBy[Extract/@#]&

1ベースのインデックスを使用します。この名前のない関数はカリー化されているため、呼び出し規約は次のとおりです。

SortBy[Extract/@#]&[{2, 1, 3}][{{5, 3, 4}, {6, 2, 1}, {5, 2, 1}}]

Mathematica SortByは関数のリストを取ることができます。この場合、個々の関数は連続したタイブレーカーとして使用されるため、まさにそれが必要です。必要なのは、対応するリスト要素を返す関数のリストを作成することだけです。これはで行うことができますExtractExtract通常、Extract[list, index]リスト要素を返すバイナリ関数です。ただし、単項で使用した場合、渡されたリストからでExtract[index]要素を取得する関数を返しますindex。言い換えると、のindexパラメータをExtractカリー化できます。Extract与えられたインデックスのリストにマッピングすることでこれを利用し、必要な関数のリストを作成します。


するべきではExtract/@#ないExtract/@(#+1)?0の入力開始の指標
JungHwan分

2
@JHM「ソートキーをゼロインデックスにするか1インデックスにするかを選択できます。」
マーティンエンダー

私は訂正します。
ジョンファンミン

(驚くほど)エレガント!しかし、あなたが1-indexingしていることを考える[{1, 0, 2}][{2, 1, 3}]、あなたの例にあるべきではありませんか?実際、現在は最初の要素、次にヘッド、次に2番目の要素でソートしているようです。
グレッグマーティン

@GregMartin申し訳ありませんが、コピー/貼り付けは失敗します。
マーティンエンダー

3

Python、50バイト

lambda l,k:sorted(l,key=lambda x:[x[y]for y in k])

これは、リファレンス実装の些細なゴルフバージョンです。lリストパラメータでありk、ソートキーパラメータです。l要素が整数(リスト、タプル、またはint-keyed dictsなど)で添字付け可能である限り、任意の反復可能にすることができます。k任意の反復可能にすることができます。


3

Brachylog、29バイト

tT,?hg:Tz:{:2f}o:ta
heI,?t:Im

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

説明

o - Order入力として追加の述語で使用できる事実を使用します:[Keys, a list]要素のリストをにある順序a listでインデックスa keyにあるそれぞれのリストを使用してリストを順序付けますKeys

                          Input = [Keys, List of lists]

tT,                       Call the Keys T
   ?hg:T                  Create the list [[T], List of lists]
        z                 Zip [T] with the list of lists
         :{   }o          Order by the output of this predicate
                :ta       Keep only the last element of each sublist in the Output

           :2f            Find all outputs of the predicate below

heI,                      Take a key I
    ?t:Im                 Output is the Ith element of the sublist

3

CJam(12バイト)

{{1$\f=}$\;}

オンラインデモ。これは、テストケースに指定された順序で引数を受け取り、ソートされた値をスタックに残す匿名ブロック(関数)です。組み込みのソートに依存します$が安定しが、公式の通訳はそれを保証します。

解剖

{          e# Define a block. Stack: orders values-to-sort
  {        e#   Sort by...
    1$\f=  e#     Copy orders from the stack, and map array lookup
  }$
  \;       e#   Pop the orders to leave just sorted-values
}

3

J、6バイト

]/:{&>

キーのインデックスはゼロです。LHSはキーのリストであり、RHSは値の配列です。Jは不規則配列をサポートしていないため、各配列はボックス化する必要があります。

使用法

   f =: ]/:{&>
   < 1 0 2
┌─────┐
│1 0 2│
└─────┘
   5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│5 3 4│6 2 1│5 2 1│
└─────┴─────┴─────┘
   (< 1 0 2) f  5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│5 2 1│6 2 1│5 3 4│
└─────┴─────┴─────┘
   (< 1 2) f  5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│6 2 1│5 2 1│5 3 4│
└─────┴─────┴─────┘
   (< 0) f 4 ; 10 11 _88 ; _2 7
┌────┬─┬─────────┐
│_2 7│4│10 11 _88│
└────┴─┴─────────┘

説明

]/:{&>  Input: keys (LHS), values (RHS)
   {&>  Select from values at each index in keys
]       Get the values
 /:     Sort up the values using the ones selected with the keys

2

JavaScript(ES6)、55バイト

(k,l)=>k.reduceRight((l,i)=>l.sort((a,b)=>a[i]-b[i]),l)

ECMAscript標準は、基礎となるソートが安定していることを保証していません。したがって、次の68バイトのコードはその仮定を行いません。

(k,l)=>l.sort(g=(a,b,i=0)=>i<k.length?a[k[i]]-b[k[i]]||g(a,b,i+1):0)

2

Pyth、5 4バイト

@LDF

オンラインで試す:デモンストレーションまたはテストスイート

@Maltysenに1バイトをありがとう。

説明:

@LDFQ   Q (=input) added implicitly. 
  D     sort a list of lists by
@L         the sublists generated by some indices
   FQ   executes ^ with the the input as parameter

これがうまくいったことに本当に驚きました。それは本当に奇妙な構文です。


私はあなたが交換することにより保存することができると思うQEF
Maltysen

@Maltysenありがとう。これは通常の1トークン方式でのみ可能だと思いました。
ジャクベ

1
砂糖のルールは非常にアドホックで一貫性がなく、残念なことに、特定のことがうまくいくかどうかを試してみるのが最善です。
マルティセン

2

JavaScript(ES6)46

k=>l=>l.sort((a,b)=>k.some(i=>v=a[i]-b[i])&&v)

ソート中の各比較で、キーインデックスをスキャンして正しい順序を見つけます

テスト

f=k=>l=>l.sort((a,b)=>k.some(i=>v=a[i]-b[i])&&v)

;`[1, 0, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[5, 2, 1], [6, 2, 1], [5, 3, 4]]
[1, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[6, 2, 1], [5, 2, 1], [5, 3, 4]]
[0, 1] [[1, 2], [2, 1]] -> [[1, 2], [2, 1]]
[1, 0] [[1, 2], [2, 1]] -> [[2, 1], [1, 2]]
[0] [[4], [10, 11, -88], [-2, 7]] -> [[-2, 7], [4], [10, 11, -88]]
[2] [[-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6]] -> [[-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2]]
[2, 1] [[9, 2, -2, -10, -6], [3, -4, -2]] -> [[3, -4, -2], [9, 2, -2, -10, -6]]
[2, 4, 8] [[5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5], [-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3]] -> [[-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3], [5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5]]
[1, 2, 3, 4, 5] [[-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [5, 3, -6, -5, -4, -4, -8, 2], [9, -4, 1, -1, -3, -2], [-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [1, -5, -3, -10, -7, 9, -8, -5, -1], [-9, 4, -1, -1, 2, 4]] -> [[-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -5, -3, -10, -7, 9, -8, -5, -1], [9, -4, 1, -1, -3, -2], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [5, 3, -6, -5, -4, -4, -8, 2], [-9, 4, -1, -1, 2, 4]]
[8, 7, 3, 2, 4, 9, 1] [[8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9]] -> [[10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5]]`
.split('\n').map(row=>{
  var [keys,list,expected]=row.split(/] -?>? ?\[/)
  keys=eval(keys+']');
  list=eval('['+list+']');
  expected=eval('['+expected);
  var result=f(keys)(list);
  var ok=result.join`|`==expected.join`|`;
  console.log(ok?'OK':'KO',keys+' '+list.join`|`+' -> ' +expected.join`|`,ok?'':result.join`|`)
})


2

PHP、212 170バイト

function m(&$i,$k){foreach($i as$a=>$y)for($b=-1;++$b<$a;){for($p=0;$p<count($k)&!$r=$i[$b][$x=$k[$p++]]-$i[$b+1][$x];);if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}}}

PHPには 、安定したソートが組み込まれていません。古いバージョンを選択すると、必要な仕様で再帰コールバックを行う方法がありません。しかし、気にしないでください:再帰コールバックイテレータを使用すると、膨大コストがかかります。だからそれができるかどうかもチェックしなかった。

内側のループを別のループに置き換えることができます foreach。それはスワッピングでいくつかのバイトを節約します。ただし、$b<$a(または$b<count($i))をチェックしないと、無限ループになります。そしてそのチェックで、foreach、スワッピングが勝つだけ費用がかかります。

最初に再帰的に比較を行いました。しかし、反復により大量のバイトが節約されます。

壊す

// bubble sort
function m(&$i,$k)
{
    foreach($i as$a=>$y)
        for($b=-1;++$b<$a;)
        {
            // comparison:
            for($p=0;$p<count($k)                       // loop through keys
                &
                !$r=$i[$b][$x=$k[$p++]]-$i[$b+1][$x]    // while element equals its successor
            ;);
            // if element is larger than its successor, swap them
            if($r>0)
            {
                $s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;
            }
        }
}

全体if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}をとして記述して$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];、7バイト節約できます。これは、短絡評価の悪用を伴うXORスワップを使用して、をエミュレートします。スワップは、の場合にのみ実行されます。これは、データベースで(時々)使用されるのと同じトリックを使用します。多くの場合、表示されます。if(){ ... } $r>0mysqli_connect( ... ) or die('Cannot connect');
イスマエルミゲル

@IsmaelMiguel XORスワップは配列に対して機能しません。$bループの事後条件にできるので、10バイト節約できます。;)
タイタス

XORスワップをテストし、機能しました(残りのコードではテストしませんでした)。2つのテストケースを作成しました:sandbox.onlinephpfunctions.com/code/…(コードを作成)とsandbox.onlinephpfunctions.com/code / ...(XORスワップ)。text-compare.comによると、出力は同じです。
イスマエルミゲル

@IsmaelMiguel関数をテストするには、実行する必要があります。m($i,$k);前に挿入すると、var_dumpバージョンがガベージを生成します。
タイタス

:/関数を実行しなかったことにも気付きませんでした...:/しかし、それはクールなアイデアでした!
イスマエルミゲル

1

R 40バイト

for(i in rev(il)){dd=dd[order(dd[,i]),]}

説明:

リストのリストは、Rのdata.frameとして最もよく表されます。

ll2 = list(c(5,3,4), c(5,3,7), c(6,2,1), c(6,1,3), c(5,2,1))
dd = data.frame(do.call(rbind, ll2))
dd
      X1 X2 X3
    1  5  3  4
    2  5  3  7
    3  6  2  1
    4  6  1  3
    5  5  2  1

インデックスリストがilの場合(インデックスは1から):

il = list(1, 2, 3)

ソートは次のコードで実行できます。

for(i in rev(il)){dd = dd[order(dd[,i]),]}

出力:

dd
  X1 X2 X3
5  5  2  1
1  5  3  4
2  5  3  7
4  6  1  3
3  6  2  1


1

ラケット218バイト

(λ(il ll)(define qsl(λ(l i)(if(null? l)l(let*((h(first l))(t(rest l))(g(λ(ff)(filter(λ(x)(ff(list-ref x i)
(list-ref h i)))t))))(append(qsl(g <)i)(list h)(qsl(g >=)i))))))(for((i(reverse il)))(set! ll(qsl ll i)))ll)

Ungolfed(il = indexリスト; ll =リストのリスト; qsl =リストのリストのクイックソート; h = head(最初の要素); t = tail(残りの要素または残りの要素); g =変更可能なフィルターfn):

(define qsl
  (λ(l i)
    (if (null? l)
        l
        (let* ((h (first l))
               (t (rest  l))
               (g (λ(ff) (filter (λ(x) (ff (list-ref x i) (list-ref h i))) t))))
          (append (qsl (g <) i)
                  (list h)
                  (qsl (g >=) i)
                  )))))
(define f
  (λ(il ll)
    (for ((i (reverse il)))
      (set! ll (qsl ll i)))
    ll))

テスト:

(f (list 0 1 2) (list (list 5 3 4) (list 5 3 7) (list 6 2 1) (list 6 1 3) (list 5 2 1)))
(f [list 1 2] [list [list 5 3 4] [list 6 2 1] [list 5 2 3]])

出力:

'((5 2 1) (5 3 4) (5 3 7) (6 1 3) (6 2 1))
'((6 2 1) (5 2 3) (5 3 4))

1

PHP、139バイト

新しい宇宙船オペレーターusortを使用します

<?$a=$_GET[a];function c($x,$y,$i=0){$k=$_GET[k];return$x[$k[$i]]-$y[$k[$i]]?:($k[++$i]?c($x,$y,$i):0);}usort($a,c);echo json_encode($a);

代わりに$x[$k[$i]]<=>$y[$k[$i]]使用できます$x[$k[$i]]-$y[$k[$i]]、PHPバージョン7-2バイト以上で

実際のライブラリのように独自のインデックス197バイトを作成するバージョン

<?$m=min(array_map(min,$a=$_GET[a]));foreach($a as$p=>$v){$k="";foreach($s=$_GET[s]as$f){$k.=str_pad($v[$f]-$m,5,0,0);}$k.=str_pad($p,5,0,0);$r[$k]=$v;}ksort($r);echo json_encode(array_values($r));

を使用してみてください<?function c($x,$y,$i=0){$k=$_GET[k];return $x[$k[$i]]<=>$y[$k[$i]]?:($k[++$i]?c($x,$y,$i):0);}usort($a=$_GET[a],c);echo json_encode($a);$_GETはスーパーグローバルです。つまり、すでにどこでもグローバルであるということです。を削除しglobal$k;、関数内で割り当てを移動すると完了です。また、これはを使用$_GETしているため、を使用する必要があります<?。これにより、10バイト節約できます。(うまくいけば)動作します。
イスマエルミゲル

@IsmaelMiguel関数内でのみグローバルを使用しているのを見たことのない馬鹿のような気がします。
ヨルグヒュルサーマン16年

PHP sort関数はクイックソートを使用します。それは安定していません。それとは別に、の-代わりに<=>との2 バイトを保存し、の匿名コールバックで2バイトを保存できますusort
タイタス

@Titus関数c($x,$y,$i)の本体の最後にあるため、匿名関数は使用できません。
イスマエルミゲル

@JörgHülsermann心配する必要はありません、私たち全員が愚かな間違いを犯します。
イスマエルミゲル

0

Clojure、29バイト

#(sort-by(fn[c](mapv c %))%2)

うまくsort-by安定しており、ベクトルのソート方法を知っています。ベクトルは関数として動作できます。([4 6 9 7] 2)9(0ベースのインデックス付け)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.