整数のリストをランク付けする


21

正の整数の空でないリストが与えられます、例えば

[6 2 9 7 2 6 5 3 3 4]

これらの数値はその値でランク付けする必要がありますが、リーダーボードでは通常どおり、同点の場合、同点の数値はすべて同じランクになり、適切な数のランクはスキップされます。したがって、上記のリストに期待される出力は次のようになります

[3 9 1 2 9 3 5 7 7 6]

たとえば、入力の最高値は9であったため、これは1(最初のランク)になります。3番目に高い値は6ですので、両方63になり、ランク4は完全にスキップされます。

ルール

入力および出力には、便利で明確なフラットリスト形式を使用できます。出力の最初/最小ランクは常に1でなければなりません。

プログラムまたは関数を作成し、入力を受け取り出力を提供する当社の標準的な方法を使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]

1
密接に関連しています。違いは、そのチャレンジによって入力がソートされることを保証することindexOfです。つまり、ほとんどの回答は関数の形式に依存します。ソートされていない入力については、多くの言語で短い選択肢があると思います。
マーティンエンダー


申し訳ありませんが、これはリンのリンクに近すぎると思います。違いは最小限です。値は切り捨てられ、既にソートされた入力と出力の半分の順序が入れ替わっているとは想定できません。リンクされた質問で受け入れられた答えはほとんど機能します。最小限の労力で、誰かがそれを機能させることができます。そのため、私はこれが重複していると考えています。
イスマエルミゲル

私は同意しません、これは明らかに重複ではありません。
ティムテック16

私はtimtechに同意します、この挑戦​​は簡単ですが、重複ではありません。
tuskiomi

回答:


13

Code Golf Stack Exchangeでのマウス入力に関する愚かなルールのExcelでの回避策:(WESRRMICGSE) 28バイト

rank(RC[1],r1c1:r1024:c1024)

10,23,34,2,ソースを入力した後、リストをcsv()としてコンパイラに入力します。引用符、括弧、末尾のコンマはありません。

WESRRMICGSEは、Excelのプログラミングとまったく同じですが、最初の「=」記号を省略してバイトを保存できる点が異なります。機能の違いは、WESRRMICGSEが数式を下にドラッグしてコードを自動的にコピーし、単一の整数入力で提供されるさまざまな出力を提供するという事実にあります。入力としてリストが提供されると、そのリストはB列(入力列)に入り、数式は入力数に合わせて自動的にドラッグダウンされます。(例:入力34,21,45は、数式を2セル下に「ドラッグ」し、数式で合計3セルになります)。

編集:この答えが人気になるとは思っていませんでした。うわー!


21
言語名は少し不愉快です...
コナーオブライエン

どのようなルールを参照していますか?
ルイスメンドー

3
@LuisMendoここで宣言されたルール:meta.codegolf.stackexchange.com/questions/10199/…ルールが馬鹿げていると思うのは、彼らが話していることを正確に回避する「インタープリター」を書くのに5分かかったからです。この言語をチャレンジで使用できるほど、ルールは愚かになります。これを必ずリンクに含めます。
tuskiomi


9

Python 2、41バイト

lambda l:map(sorted(l+[l])[::-1].index,l)

値ごとに、降順でソートされたリストでそのインデックスを見つけます。Python 2はリストを数値よりも大きいものとして扱うため、最大値を0ではなく1にするには、リスト自体の余分な「無限大」要素を使用します。

より直接的な解決策は42バイトで、Python 3でも機能します。

lambda l:[1+sum(y<x for x in l)for y in l]

各要素について、小さい要素の数をカウントし、1を追加して1インデックス付きにシフトします。



7

R、24 25 20バイト

ネゲートされたベクトルに対して「最小」タイ法で標準ランク関数を使用します。 catSTDOUTに出力するために追加されました。@Guiseppeに感謝します

cat(rank(-scan(),,"mi"))

> cat(rank(-scan(),,"mi"))
1: 9 2 12 3 7 11 15 11 6 8 11 17 11
14: 
Read 13 items
8 13 3 12 10 4 2 4 11 9 4 1 4
> 

cat完全なプログラムにするには、それをラップする必要があると思います。
アレックスA.

@AlexA。私はそれについて疑問に思っていました。これはそれ自体が関数であり、その場合はrank(-a,,'min')aがベクトル形式のリスト入力である場合、それは大丈夫だと言うのは公平でしょうか?
MickyT 16

その場合、変数が名前空間に既に存在することを前提としているため、これをスニペットと見なします。適切な関数のサブミットにするために必要function(a)rank(-a,,'min')です。
アレックスA.

は、だけ"mi"ではなくに短縮できます"min"
ジュゼッペ

@AlexA。なぜそれを包む必要があるのcatですか?提出がfunction(a)rank(-a,,'mi')それで十分であると考えられ、プログラムの出力が次と同じである場合rank(-scan(),,'mi')
Mark

4

PowerShell v2 +、43 41バイト

($a=$args)|%{@($a|sort -d).indexof($_)+1}

独自に開発されましたが、これは@xnorのPythonソリューションと同じアルゴリズムであることがわかりました。

入力を個々のコマンドライン引数(つまり、スペースで区切られたリスト)として受け取ります。出力(デフォルトの書式設定)は、要素間の改行です。

入力リストの各要素についてsort、入力リストを-d昇順で指定し.indexOf()、現在の要素を取得して、を追加します1@(...)1桁の入力を説明するために、明示的な配列キャストに注意してください。結果の数値はパイプラインに残り、出力は暗黙的です。

@Mattのおかげで2バイト節約できました!

PS C:\Tools\Scripts\golfing> .\rank-the-integers.ps1 6 2 9 7 2 6 5 3 3 4
3
9
1
2
9
3
5
7
7
6

sort -dうまくいかなかった理由はありますか?それは私にとって明白です。
マット

@マットオッド 私のWin8.1 ISEでは、それが曖昧である-Descendingと述べてい-Debugます。ただし、Win8.1のストレートシェルおよびWin10のシェルとISEでは正常に動作します。これ、私の特定のWin8.1インストールが間抜けであるのは初めてではありません ...:-/ゴルフをありがとう!
AdmBorkBork 16

また、これはすべてのテストケースで機能しませんでしたか?$args|%{@($args|sort -d).indexof($_)+1}それは短いですが、私はそれが動作するかどうかを知るために良いの外観を持っていなかった
マット

第二ので動作しません@Matt $argsループのスクリプトブロックの入力などの機能{...}に使用していたかのように、filterまたはfunction
AdmBorkBork 16


3

JavaScript(ES6)、38 36バイト

a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)

編集:@ETHproductionsのおかげで2バイト保存されました。


.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
ETHproductions 16

3
@ETHproductionsなぜあなたはいつも私の楽しみを台無しにしなければならないのですか?
ニール

2

ゼリー、5 バイト

<S‘ð€

TryItOnline!

どうやって?

<S‘ð€ - Main link: listOfValues
   ð  - dyadic chain separation
    € - for each
<     - less than (vectorises) - yields a list of 1s and 0s
 S    - sum - yields number of values the current value is less than (those that beat it)
  ‘   - increment - the place of a value is the number that beat it plus 1.

これは私が提出しようとしていたJコードとどのくらい似ていますか?1+(+/@:<)"0 1~
デーン

似ているように見えますが(合計を削減しますか?)、コードの投稿を止めることはありません!
ジョナサンアラン

私は、Jに触発された言語で「二項鎖の分離」と「それぞれ」が何をするのかと思っていたのではないかと思います。
デーン

ああ、あなたの説明から、あなたのコードはもっと似ている>€µS‘か、本当に似ていると思います<@€µS‘(演算子@への引数を逆にします<)。J はの~左側のチェーンで暗黙的でありµ、これは(ダイアディックではなく)モナド分離であり<、引数がリストの場合はベクトル化されます。
ジョナサンアラン

2

Perl 6の 42の  26バイト

:k[R,]ソートされたリストで最初のインデックスを見つける

{map {[R,](.sort).first(*==$^a,:k)+1},@$_}

大きい値をカウントし、1を追加します

{map {1+.grep(*>$^a)},@$_}

2

JavaScript、87 49バイト

f=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })

a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)

Conor O'BrienとETHproductionsに感謝します!


1
マップで匿名関数、つまりを使用できますv=>a.sort((a,b)=>b-a).indexOf(v)+1
コナーオブライエン

配列のコピーを操作する.slice()ため、まったく必要ありません.map
ETHproductions 16

また、サイトポリシーでは、関数に名前を付ける必要がないため、先頭のを削除することf=もできます。
コナーオブライエン

@ETHproductionsスライスを削除すると、代わりに[18,13,18]リターンを渡す[1,1,2][1, 3, 1]
Oliver

ああ、それは奇妙です... a.sort()ソートされた配列をに保存しているからだと思いaます。ただし、に変更a.slice()[...a]て数バイト節約できます。
ETHproductions 16

2

Mathematica、44バイト 42バイト 40バイト

xPosition[SortBy[x,-#&],#][[1,1]]&/@x

は3バイトの私用文字ですU+F4A1Wolframドキュメントページ

編集:バイト節約のためのJHMに感謝します。


1
テストケースで失敗します{10,2,5,4,15,5}(出力はすべきではあり{2,6,3,5,1,3}ません{2,5,3,4,1,3}。入力に42が含まれているため、スキップする必要があることに注意してください5)。
ジョンファンミン

正しく修正されました。
ngenisis

1
-2切り替えることによりバイトx#(有効括弧を取り除きます)xPosition[SortBy[x,-#&],#][[1,1]]&/@x
ジョンファンミン


2

J14 8バイト

1+1#.</~

どうやって?

1+1#.</~ - Consumes and returns a list of integers
       ~ - Use the same list for both inputs
     </  - Create a table of less-than comparisons
  1#.    - Treat each row like digits of a base-one number, returning a list of integers
1+       - Increment the results

以前のソリューション

1+(+/@:<)"0 1~

こんにちは、8バイトの短いバージョンが見つかりました1+1#.</~。行ごとの合計は、ベース1変換を使用して実行されます。別の選択肢は、1+\:~i.]これも8バイトです。
マイル

いいね!独自の回答を投稿しますか?それ以外の場合は、ベース1の改善を含めます。
デーン

2
いや、バイト節約を提案するだけで大​​丈夫です。それらを自由に使用してください
マイル


1

ワンダー、28バイト

@(->@+1:0iO#0rev sort#I#1)#0

使用法:

(@(->@+1:0iO#0rev sort#I#1)#0)[6 2 9 7 2 6 5 3 3 4]

入力の降順で並べ替えられたバージョンのアイテムの最初のインデックスに1を追加する関数を使用して、入力配列をマッピングします。



1

Mathematica、37バイト

Min@Position[-Sort@-#,i]~Table~{i,#}&

問題のルールに従って、その入力をランク付けする純粋な関数。例:

Min@Position[-Sort@-#, i]~Table~{i, #} &[{6, 2, 9, 7, 2, 6, 5, 3, 3, 4}]
(*{3, 9, 1, 2, 9, 3, 5, 7, 7, 6}*)

1

クラゲ、15バイト

p`&& ~i
  >/+`<

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

説明

Jellyfishのリストで値のインデックスを見つける良い方法はまだないようですので、現在の値よりも大きい値の数を数え、結果をインクリメントするアプローチを使用します。これは主に、特定の要素に対してこの値を計算する単項関数を作成することにより行われます。

     `<

これにより、スレッド化された比較演算子のバージョンが作成されるため、これに整数とリストを指定すると、その整数とリスト内の各要素間の比較結果のリストが返されます。

     ~i
     `<

これは、前の関数の右側の引数を入力リストとともにカリー化します。そのため、結果は整数を取り、プログラムの入力と比較結果のリストを提供する単項関数です。

   & ~i
   /+`<

ここに、/+加算による削減があります。これは、単に「このリストを合計する」機能であることを意味します。&これを前の関数に合成するので、入力内の値がその整数よりも大きい値を数える単項関数ができました。

  && ~i
  >/+`<

また、これにインクリメント関数を作成します。

 `&& ~i
  >/+`<

最後に、この関数もスレッド化するため、渡されたリストの各整数に自動的に適用されます。コードのレイアウトがi原因で、たまたまこの関数の入力としても使用されるため、目的の出力が計算されます。

p`&& ~i
  >/+`<

最後に、これにより結果が出力されます。


1

brainfuck、124バイト

->,[>>>+>,]<[-<+]+[-->[<[<<<<]>>>+>[>[>>]<[[<<+<<]>+>[->>>>]]<+>>>]+[-<<+]->]<[<
<<<]>+.,>>[>[>->+>>]<<[-<<<<]>-]+[->+]+>>>>]

フォーマット済み:

->
,[>>>+>,]
<[-<+]
+
[
  -->
  [
    <[<<<<]
    >>>+>
    [
      >[>>]
      <
      [
        [<<+<<]
        >+>[->>>>]
      ]
      <+> >>
    ]
    +[-<<+]
    ->
  ]
  <[<<<<]
  >+.,>>
  [
    >[>->+>>]
    <<[-<<<<]
    >-
  ]
  +[->+]
  +>>>>
]

これは、8ビットのBrainfuck実装用に設計されています。入力と出力はバイト値を介して行われます

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

各要素に対して、これはそれよりも大きい要素の数をカウントし、結果に1を加えたものを出力します。これは、現在の要素がゼロになるまですべての要素をインクリメントし、現在の要素の前に別の要素がゼロになるたびに結果を更新することで実現されます。

テープは4セルのノードに分割され、

b c 0 0

where cは要素でありb、現在の要素に対しては負のナビゲーションフラグ、それ以外の場合は1です。

結果と現在の要素のコピーは、配列の左側に保持されます。


1

Java、215バイト

public class G{public static void L(int[]A){int[]r=new int[A.length];for(int i=0;i<A.length;i++){int c=1;for(int j=0;j<A.length;j++){if(A[j]>A[i])c++;}r[i]=c;}for(int i=0;i<r.length;i++)System.out.print(r[i]+",");}}

説明:

非常に自明です。

基本的に、配列内の各整数について、それよりも大きい数をチェックし、新しい配列をランキングとともに出力します。

申し訳ありませんが、これはあまり簡潔ではありませんが、これらの1つでの最初の試行であり、javaのエントリが表示されませんでした。もっとゴルフができると確信しています。

静的メソッドを参照し、配列を渡すだけで実行できます。メイン関数を書く必要はないと思っていましたが、もしそうなら将来的にはそうするでしょう。


この空白の一部を削除できますか?実際のところ、これはまったくゴルフではありません。(内すなわちスペースr = new
Rɪᴋᴇʀ

@EasterlyIrkはい、申し訳ありませんが、これを行うことに慣れていません。不要な空白はすべて取り除いたと思います。
ヘンリー

「rankNumbersGolf」に「G」などの短い名前を付けることはできますか?
Rɪᴋᴇʀ

@EasterlyIrkはい、ありがとう。
ヘンリー

私はJavaがうまくありませんが、3つのスペースをいくつか削除できますfor (か?
Rɪᴋᴇʀ

0

PHP、101バイト

もっと短い方法が必要です。

function f(&$a){for($r=1;$v++<max($a);$r+=$n,$n=0)foreach($a as$k=>$w)if($w===$v){$a[$k]="$r";$n++;}}

関数は入力を整数の配列として受け取り、入力変数を数値文字列としてのランクで上書きします。

使用法: $a=[1,2,4,2,2,3];f($a);print_r($a);


0

Ruby、45 40バイト

->a{a.map{|x|a.sort.reverse.index(x)+1}}

これはどのように呼ばれますか?テストケースと一致させることはできません。同じランクのバグがあるようです。たとえば、あるべきときに[10, 2, 5, 4, 15, 5]出力[2, 5, 3, 4, 1, 3]が表示されます[2, 6, 3, 5, 1, 3]-削除するだけで修正できると思います.uniq-5バイト節約します!
ニールスレーター

質問を読み違えたようです。見つけてくれてありがとう!
リーW

0

Clojure、48 44バイト

更新:のfor代わりに使用map

#(for[i %](+(count(filter(partial < i)%))1))

現在の値よりも小さい各値を単純にフィルタリングし、リストの長さをカウントし、1ずつ増やします。



0

PHP、84バイト

function r($l){$s=$l;rsort($s);foreach($l as$n)$r[]=array_search($n,$s)+1;return$r;}

使用法:関数rを整数の配列に渡すと、ランク付けされた整数の対応する配列が返されます。

ここでテストに合格。



0

K(oK)、11バイト

溶液:

1+(x@>x)?x:

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

例:

1+(x@>x)?x:6 2 9 7 2 6 5 3 3 4
3 9 1 2 9 3 5 7 7 6
1+(x@>x)?x:5 6 14 19 13 5 19 9 19 9 9 19
11 10 5 1 6 11 1 7 1 7 7 1

説明:

ソートされたリスト内の元のリストの検索位置。次に追加します。

1+(x@>x)?x: / the solution
         x: / save input as x
  (  >x)    / return indices of x sorted in descending order
   x@       / apply these indices to x (thus sort x)
        ?   / lookup right in left
1+          / add one
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.