ソート後に配列のインデックスを取得します


14

今日の課題は、リストlを取得し、ソートさlれた各連続要素がl現れる位置を与えるプログラムまたは関数を作成することです。

つまり、最小値のインデックスを出力し、次に2番目に小さい値のインデックスを出力します。

入力配列には正の整数のみが含まれ、少なくとも1つの要素が含まれると想定できます。

テストケース:

Input                  | Output (1-indexed)
[7, 4, 5]              | [2, 3, 1]
[1, 2, 3]              | [1, 2, 3]
[2, 6, 1, 9, 1, 2, 3]  | [3, 5, 1, 6, 7, 2, 4]
[4]                    | [1]

同じ値を持つ2つ以上の要素が表示される場合、それらのインデックスは最小から最大の順に並んで表示されます。

これは、最少バイトが勝ちます!


16
-1一般的なゴルフの言語で組み込み関数を解くことができる些細な挑戦のために、そして 24時間未満の答えを受け入れます。これは公平な挑戦でも、興味深い挑戦でもありませんでした。
コーディグレイ

3
まあ、なぜ彼が24時間以内に答えを受け入れたのかわかります。それは打ち負かすことは不可能です。
ザカリー

3
@CodyGray 1-2バイトの回答を見たときにダウンボーティングを考えましたが、実際には、より標準的なプログラミング言語にとって悪い挑戦だとは思いません。もちろん、難しい挑戦ではありませんが、それでも、ゴルフの可能性は間違いなくあります。もちろん、1バイトのビルトインを見るのは不快ですが、そのための挑戦を非難するのは公平ではないと思います。
ダダ

1
1文字のビルトインを使用することはほとんど練習になりません。簡単というのは、必ずしもビルトインのみを使用して解決できるという意味ではありません。
JAD

2
このような場合の最善の解決策は、受け入れ機能を忘れることです。これは、とにかくここではあまり関係ありません。
ミスターXcoder

回答:



11

Dyalog APL、1バイト

Dyalog APLには、これを行うための組み込みの演算子関数があります(これをクリアしてくれたZacharýに感謝します)。

⍋11 2 4 15
    2 3 1 4  
{⍵[⍋⍵]}11 4 2 15
    2 4 11 15

ここでは、ソートされたインデックスによってリストにインデックスを付け、リストを昇順で返します。


ああ、混乱する用語を警告するために、APLでは、組み込み関数は関数と見なされますが、¨⍨⍣.∘/\⌿⍀⌸⍤演算子は演算子と見なされます。
ザカリー



9

Javascript(ES6)、39バイト

@powellesのおかげで-2バイト

これArray.prototype.sortは、安定しているブラウザでのみ機能します。

a=>[...a.keys()].sort((b,c)=>a[b]-a[c])

1インデックスバージョン(47バイト):

a=>a.map((_,i)=>i+1).sort((b,c)=>a[b-1]-a[c-1])

サンプルコードスニペット:

f=
a=>[...a.keys()].sort((b,c)=>a[b]-a[c])
console.log("7,4,5 => "+f([7,4,5]))
console.log("1,2,3 => "+f([1,2,3]))
console.log("2,6,1,9,1,2,3 => "+f([2,6,1,9,1,2,3]))
console.log("4 -> "+f([4]))


[...a.keys()]代わりにa.map((_,i)=>i)数バイト節約します。
パウエルズ

7

Python 2、48バイト

lambda x:sorted(range(len(x)),key=x.__getitem__)

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


ナイス、ゴルフをしなかった> _ <。私はその気を悪くしないように、Pythonの3に私の答えを切り替える
氏Xcoder

4
@ Mr.Xcoderまあ、それは彼の仕事です...-
ニール

@ Mr.Xcoderさあ、あなたはそれを気にしないでください!あなたは完全なプログラムを作成し、機能を作成しましたが、私のアプローチは少し異なります。
エリックアウトゴルファー

気分は悪くありませんが、これが表示されることはわかっていました(個人的には__<blahblah>__構文が嫌いです)。私はいくつかのゼリーをします、私は私のトレーニングを失いたくないです:)
Xcoder氏17

1
@ Mr.Xcoder Codegolfは、きれいな構文とフォーマットを意味しません。;)
アウトゴルファーのエリック



4

Swift 4、82バイト

func f(l:[Int]){var l=l;for k in l.sorted(){let a=l.index(of:k)!;print(a);l[a]=0}}

テストスイート。

説明

Swift l.sorted()で、元の配列のソートされたコピーを作成します。リストでソートされた要素を経由して、元の配列内の各アイテムのインデックスを印刷した後、我々はループlet a=l.index(of:k)!;print(a)し、その後、アレイ内の正しいインデックスを維持するために、我々は割り当てl[a]0それが私たちの通常の出力には影響を与えませんので、。


これは私のPythonソリューションの移植であるため、これは0から始まるインデックスであることに注意してください。あなたはそれが1、インデックス付きになりたい場合は、交換するprint(a)print(a+1)またはオンラインをお試しください!


4

R、5バイト

これには組み込み関数があります。

order

3
標準ルールは、機能のプログラムを提供することです。orderは既に関数であるため、を使用して入力を処理する必要はありませんscan()。これは5バイトです。
JAD

rank()バイトを節約します
gstats

1
rank@JarkoDubbeldamによる回答があったと確信していますが、私はもうそれを見ていません。
ジュリオ

1
正しい、仕様に従っていないので削除しました。
JAD




3

オクターブ、17バイト

@(i)[~,y]=sort(i)

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

Octaveは、MATLABに似ていますが、インラインで割り当てられているため、Mathworks HQの従業員は頭痛の種になります。あなたが何を呼ぶかは関係ありませんがy、私の知る限り、そのダミー変数なしではできません。


3

俺の、3バイト

MYにもこの機能が組み込まれています!

⎕⍋↵

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

どうやって?

入力を評価し、グレードアップしてから、改行で出力します。

ただし、/でインデックスを設定します0x48。(-1またはのような奇妙な整数でもかまいません。2デフォルトはです1)。


3

Java 8、128 + 19 = 147バイト

Xcoder氏のソリューションに基づきます。0ベース。Lambdaは入力をanとして受け取り、Integer[]を返しますInteger[]。バイトカウントには、ラムダ式と必要なインポートが含まれます。

import java.util.*;

l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;)l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0;return o;}

オンラインで試す

ゴルフされていないラムダ

l -> {
    Integer
        o[] = l.clone(),
        s[] = l.clone(),
        i = 0
    ;
    for (Arrays.sort(s); i < l.length; )
        l[o[i] = Arrays.asList(l).indexOf(s[i++])] = 0;
    return o;
}

ノート

Integer[]代わりにint[]を使用して、の使用を許可しArrays.asListます。これにはプリミティブバージョンはありません。IntegerLong値が配列インデックスとして使用され、キャストが必要になるためです。

これは最終的に私の最高の手続き型よりも短くなりました List、クラス名とメソッド名のコストのために、ソリューション。

これは、主にストリームを収集するために必要な手荷物のために、入力をストリーミングし、(値、インデックス)ペアにマッピングし、値でソートし、インデックスにマッピングする試みも解決しました。

謝辞

  • ネバイのおかげで-5バイト

1
必要ありませんjl->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0);return o;}(19 + 128バイト)。
ネヴァイ




2

MATLAB / オクターブ、29バイト

[~,y]=sort(input(''));disp(y)

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


あなたの答えは完璧なMATLABですが、実際にはOctaveの匿名関数でインライン代入を行うことができます。
-Sanchises

いいね!インラインの割り当てについては知っていましたが、そのように直接出力できるとは知りませんでした
ルイスメンドー

1
正直に言うと、私もです。のようなものから始めて、これ@(X)([~,y]=sort(X))から抜け出す方法を探していたときに、実際には割り当てからの戻り値yであることに気付きましyた。MATLABはすべてが明示的であることを好みます。Octaveは、明確な場合に満足します。
-Sanchises

2

JavaScript(ES6)、69バイト

0インデックス付き。最大65,536個の要素を含むリストで機能します。

a=>[...a=a.map((n,i)=>n<<16|i)].sort((a,b)=>a-b).map(n=>a.indexOf(n))

テストケース


n=>a.indexOf(n)ちょうどに変更できますa.indexOfか?
ザカリー

@Zacharý残念ながらそうではありません。インスタンス化されたオブジェクトのメソッドは、コールバックとして使用できません。
アーナルド

@Zacharýさらに悪いことはArray#map、コールバック関数に3つの引数を渡し、Array#indexOf2 を期待するため、望ましくない結果が生じることです。
kamoroso94



2

Java(OpenJDK 8)、72バイト

l->l.stream().sorted().map(i->{int j=l.indexOf(i);l.set(j,0);return j;})

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

を受け取り、結果を含むをList<Integer>返しますStream<Integer>

最初のリストに基づいてStreamを取得し、ソートしてから、各番号をリスト内のインデックスにマッピングします。重複する要素に対応するために、リストの元の要素をに設定し0ます。


2

SmileBASIC、67バイト

DEF I(A)DIM B[0]FOR I=1TO LEN(A)PUSH B,I
NEXT
SORT A,B
RETURN B
END

非常に簡単で、1から(配列の長さ)の数字のリストを生成し、これを入力と同じ順序でソートするだけです。


2

パイソン3numpyの38の 26バイト

Jo Kingのおかげで12バイト節約(関数に名前を付ける必要はありません)

import numpy
numpy.argsort

出力は0ベースです。

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


関数はnumpy.argsort、ラムダ部分なしである可能性があります
ジョーキング

@JoKing提案をありがとう。numpy.argsort;import numpyエラーが発生するだけで(numpyまだインポートされていないため)、コード部分import numpy;numpy.argsortに移動f=する必要があるため、このように書きました。標準的な手順がこれらの場合であることを知っていますか?移動しf=、それを数えませんか?
ルイスメンドー

そうかもね。f=numpy.argsortフッターで再定義するだけかもしれません
ジョーキング

@JoKing良いアイデア。できた ありがとう!
ルイスメンドー




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