「スキップ」でスコアのリストをランク付けする


8

最大から最小に事前に並べ替えられたスコア(非負の整数)のリストがある場合:

[ 10, 10, 6,  6,  4,  0]

各スコアに1から昇順の整数ランクを割り当てます。これにより、等しいスコアが同じランクになります(つまり、同順位になります)。

[ 1, 1, 3, 3, 5, 6 ]

同順位の場合、ランクは「スキップ」されます。たとえば、1番目と2番目に大きいスコア(10と10)は同数であるため、どちらもランク1であり、ランク2は「スキップ」されているため、3番目に大きいスコア( 6)はランク3です。

入力スコアに対応する降順でないランクのリストを出力します。

In:  10 10  6  6  4  0
Out:  1  1  3  3  5  6
In:  10  9  8
Out:  1  2  3
In:   0  0  0
Out:  1  1  1
In:  16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
Out:  1  2  2  4  5  5  7  8  8  8 11 12 12 12 15

入力

すべてのスコアが0〜1,000であり、入力のスコアは500以下であると想定します。入力は、選択した言語に適した形式にすることができます(STDIN、関数の引数、変数に既に格納されている配列などを含みますが、これらに限定されません)。

出力

戻り値または変数に格納ランクの結果順序付きリスト、または人間が読める形でSTDOUTに書き込む(例えば1 2 3[1,2,3]1\n2\n3\n、および{ 1, 2, 3 }すべての罰金です。123区切り文字の希望のために、ではありません)。入力スコアは、対応する出力ランクとともに保存/印刷できますが、必須ではありません。

制限事項

言語が提供する標準ライブラリを使用できます。標準の抜け穴が適用されます。

勝利条件

これはなので、最小のプログラム(バイト単位)が優先されます。同数の場合、投票数が最も多い回答が優先されます。

ノート

これは、SOに関するRubyの質問に基づいており、非常に短いものも含め、いくつかの興味深い回答が生成されました。そこを見る前に、独自のソリューションを考え出すことをお勧めします。


1
これが事前に並べ替えられておらず、ランクが元の順序を維持する必要がある場合、これはより良い方法であり、違法なより良い答えになると思います。つまり、[
10、4、6、0、6、10

@Cruncher、それは良い点です。新しいスレッドを自由に開始してください。
ジョーダン

回答:


8

J(7 6)

編集:ああ、待って!関数である必要はありません!

>:i.~y

神に感謝i.~...

>:@:i.~

または名前付き関数として(3文字以上ですが、機能的には異なりません):

f=:>:@:i.~

テストを実行します。

   f=:>:@:i.~
   f 10 10  6  6  4  0
1 1 3 3 5 6
   f 10  9  8
1 2 3
   f 0  0  0
1 1 1
   f 16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

1
これが何をするのかコメントしてください。
corsiKa 2014

1
1+i.~はインラインで割り当てて使用できる種類の列車なので、通常の列車の括弧なしで関数として使用できます。それは5文字です。そして、記録のために、この場合@と同じ仕事を@:するので、そこに簡単なキャラクターを保存することができたでしょう。
algorithmhark

8

T-SQL(40)

SELECT RANK()OVER(ORDER BY B DESC)
FROM @

仮定@は、スコアを行として含むテーブルです。


3

バース、6

m'XYdY

リストはまずYに格納されます。これは、機能的には22文字のルビソリューションと同じです。YのdをYプラス1のdのインデックスにマップしてから印刷します。

例:

$ echo "=Y[16 15 15 12 11 11 10 9 9 9 8 2 2 2 0)m'XYdY" | python3 pyth.py

[1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]

3

Python(33文字)

lambda x:[1+x.index(i)for i in x]

機能的には私のJ回答と同じです。


入力は任意の形式にすることができるxため、最初に格納する配列を宣言し、変数に結果を格納することで配列を「出力」できます。
isaacg 2014

3

APL、2バイト

⍳⍨

⎕IO←1。Dyadic iotaは、右の引数を左の引数に検索します。オペレータコピーオペランドがmonadically使用されている場合は、左の引数に右引数。したがって、解は、それ自体で与えられたベクトルの各要素の位置を検索するだけです。

サンプル:

    ⍳⍨10 10 6  6  4  0
1 1 3 3 5 6
    ⍳⍨0  0  0 
1 1 1 
    ⍳⍨16 15 15 12 11 11 10  9  9  9  8  2  2  2  0
1 2 2 4 5 5 7 8 8 8 11 12 12 12 15

2

スタタ(16)

egen b=rank(c),f

結果はbです。

cが入力を含むデータセット内の変数であると仮定します。


1
コードゴルフのスタタ?これは本当にワームの缶を開きます。
シャドウトーカー2014

2

ハスケル(31)

f x=succ.(`elemIndexJust`x)<$>x -- Requires the Safe module

使用法:

f [10,10,6,6,4,0] --evaluates to [1,1,3,3,5,6]

私の解決策はr l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group l61文字
でした

また、最初のソリューションは、単相性の制限のため機能しません
誇り高いhaskellerは

それはmomoprophismの制限です... GHCIで動作するようになりましたが、コンパイルされないので、削除する必要があると思います...
recursion.ninja

あなたはそれがうまくいくようにそれを作り直すことができます
誇りに思うhaskeller '

1

ベースラインを確立するために:

ルビー(38)

仮定aは配列です:

r,i=1,0;a.map{|x|i+=1;x==a[i-2]?r:r=i}

(これは元のSOスレッドでのfalsetruの回答に基づいており、私のオリジナルの作品ではありません。22文字のRubyソリューションがあることは知っていますが、誰かがRubyよりも短いものを考えてほしいと思います。)


1

JavaScript(E6)41

配列引数を持つ関数、配列を返す

F=s=>s.map((n,i)=>p-n?(p=n,r=i+1):r,p=-1)

Firefoxコンソールでテストする

F([10,10,6,6,4,0])

出力:[1、1、3、3、5、6]

F([16, 15, 15, 12, 11, 11, 10, 9, 9, 9, 8, 2, 2, 2, 0])

出力:[1、2、2、4、5、5、7、8、8、8、11、12、12、12、15]



1

パワーシェル(70)

$n=1;$c=0;$l=$a[0];$a|%{if($l-eq$_){$n}else{$n=$c+1;$n}$l=$a[$c];$c++}

最初に変数の割り当てを削除すると51文字になるため、少し不満が少なくなります。

$ aが問題によって指定されたとおりに割り当てられ、ソートされていると想定します。$ nはランクを追跡し、$ cは配列でチェックされる最後の要素である$ lと連携する単なるカウンターです。

これを改善するために私にできることがあれば、私は知りたいです。


1

ジャワ(57)

Allbeertと同じ「ルール」を使用する:

定数iint[]配列として定義され、入力を含み、入力zのサイズを含みます。その他、lcxn、と定義されていますint

残りのコードスニペットは次のとおりです。

l=0;c=1;for(x=0;x<z;x++){n=i[x];i[x]=n==l?c:(c=x+1);l=n;}

結果は入力配列にあります。


1

ルビー、22歳

私はSOスレッドを見ていませんが、これが彼らが思いついたものだと思います。

a.map{|i|a.index(i)+1}

編集:うん、そうです。Rubyでそれを小さくすることは不可能だと思いますが、それをArrayメソッドとして定義していると想定しない限り、18文字でそれを行うことができます

map{|i|index(i)+1)

しかし、もちろん、そのスニペットに関する完全なプログラムは次のようになります

class Array
  def ranks
    map{|i|index(i)+1)
  end
end

p [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15].ranks

1

> <>(47)

特に最適化されていません。最初のゴルフで水をテストするだけです。

r:1:nr2&>ao$:@=?vr~&:|   
&1+&l3)?^;      >r:nr

入力の最初の要素が最初にポップされるように、入力がスタックに事前入力されていると想定します。

テスト:

fish.py ranks.fish -v 1 2 3 4 5 6 7 8 9 9 10 10

出力

1
1
3
3
5
6
7
8
9
10
11
12

1
魚の提出物で「水をテストする」と私は笑顔になりました
IngoBürk14年

1

Clojure、35歳

いくつかのJava相互運用機能が混在している場合:

(fn[l](map #(+ 1(.indexOf l %)) l))

REPLセッション:

golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [10 10  6  6  4  0])
(1 1 3 3 5 6)
golf> ((fn[l](map #(+ 1(.indexOf l %)) l)) [16 15 15 12 11 11 10  9  9  9  8  2  2  2  0])
(1 2 2 4 5 5 7 8 8 8 11 12 12 12 15)

0

C-62

関数または完全なプログラムの要件がなかったため、コードスニペットとして。

前提anj、及びk既にとして定義されint*intint、およびintはそれぞれ、ここでa入力を含む配列であり、n入力の長さを含みます。

これは長さ0の入力では失敗します。この場合、さらに3文字が必要です。

printf("1");for(k=j=1;++j<=n;)printf(" %d",*a-*(a+++1)?k=j:k);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.