Beri peringkat daftar bilangan bulat


21

Anda diberi daftar bilangan bulat positif yang tidak kosong, mis

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

Anda harus memberi peringkat angka-angka ini berdasarkan nilainya, tetapi seperti biasa di papan peringkat, jika ada dasi maka semua angka yang diikat mendapatkan peringkat yang sama, dan jumlah peringkat yang tepat dilewati. Maka output yang diharapkan untuk daftar di atas adalah

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

Misalnya, nilai tertinggi dalam input adalah 9, jadi ini menjadi 1(peringkat pertama). Nilai tertinggi ketiga adalah 6, jadi keduanya 6menjadi 3, dan peringkat 4dilewati seluruhnya.

Aturan

Anda dapat menggunakan format daftar datar yang nyaman, tidak ambigu, untuk input dan output. Peringkat pertama / terkecil dalam output harus selalu 1 .

Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.

Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.

Ini adalah , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Uji Kasus

[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
Erat terkait. Perbedaannya adalah bahwa tantangan menjamin bahwa input diurutkan, yang berarti bahwa sebagian besar jawaban bergantung pada bentuk indexOffungsi. Saya percaya untuk input yang tidak disortir ada alternatif yang lebih pendek dalam banyak bahasa.
Martin Ender


Maaf, tapi saya percaya ini terlalu dekat dengan tautan Lynn. Perbedaannya minimal: Nilai-nilainya terpotong, Anda tidak dapat mengasumsikan input yang sudah diurutkan dan setengah dari output telah ditukar urutannya. Jawaban yang diterima pada pertanyaan terkait hampir berhasil. Dengan sedikit usaha, seseorang bisa membuatnya bekerja. Dengan demikian, saya berpendapat bahwa ini adalah duplikat.
Ismael Miguel

Saya tidak setuju, ini jelas bukan duplikat.
Timtech

Saya setuju dengan timtech, tantangan ini lebih sederhana, tetapi bukan duplikat.
tuskiomi

Jawaban:


13

Penanganan masalah di Excel untuk Aturan konyol Mengenai Input Mouse pada Kode Golf Stack Exchange: (WESRRMICGSE) 28 byte

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

Masukkan daftar sebagai csv ( 10,23,34,2,) ke dalam kompiler setelah memasukkan sumber. tidak ada kutipan, tidak ada tanda kurung, tanda koma.

WESRRMICGSE persis seperti pemrograman dalam excel, kecuali Anda dapat menghilangkan tanda '=' awal untuk menyimpan byte. Perbedaan fungsionalitas berasal dari kenyataan bahwa WESRRMICGSE akan menyeret formula ke bawah untuk menyalin kode secara otomatis dan memberikan output berbeda yang disediakan dengan input integer tunggal. memberikan daftar sebagai input, daftar itu masuk ke kolom B (kolom input), dan rumusnya adalah obat turun secara otomatis untuk mencocokkan jumlah input. (mis: input 34,21,45, akan 'menyeret' formula ke bawah 2 sel, untuk total 3 sel dengan formula).

Sunting: Saya tidak pernah berharap jawaban ini menjadi populer. Wow!


21
Nama bahasanya agak menjengkelkan ...
Conor O'Brien

Aturan apa yang Anda referensikan dan bagaimana tepatnya hal itu konyol?
Luis Mendo

3
@LuisMendo aturan yang dideklarasikan di sini: meta.codegolf.stackexchange.com/questions/10199/... Saya pikir aturannya konyol karena saya membutuhkan waktu 5 menit untuk menulis 'penerjemah' yang menghindari apa yang mereka bicarakan. Semakin banyak bahasa ini dapat digunakan dalam tantangan, semakin konyol aturannya. Saya pasti akan memasukkan ini dalam tautan.
tuskiomi


9

Python 2, 41 byte

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

Untuk setiap nilai, cari indeksnya di daftar yang diurutkan dengan mengurangi urutan. Untuk membuat nilai terbesar memberi 1 daripada 0, kami menggunakan elemen "tak terhingga" tambahan dari daftar itu sendiri, karena Python 2 memperlakukan daftar lebih besar daripada angka.

Solusi yang lebih langsung adalah 42 byte dan juga berfungsi di Python 3.

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

Untuk setiap elemen, hitung jumlah elemen yang lebih kecil, tambahkan 1 untuk beralih ke 1-diindeks.


8

Jelly , 5 byte

ṢṚiЀ

Cobalah online!

Bagaimana itu bekerja

ṢṚiЀ  Main link. Argument: A (array)

ṢṚ     Sort and reverse A.
  iЀ  Find the index of each n in A in the previous result.

7

R, 24 25 20 byte

Menggunakan fungsi peringkat standar dengan metode ikatan "min" di atas vektor yang dinegasikan. catditambahkan ke keluaran ke STDOUT. Tersimpan satu berkat @Guiseppe

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

Contoh

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

Saya pikir Anda perlu membungkusnya catagar menjadi program lengkap.
Alex A.

@AlexA. Saya bertanya-tanya tentang itu. Apakah adil untuk mengatakan bahwa ini adalah fungsi di dalamnya sendiri dan dalam kasus itu rank(-a,,'min')akan baik-baik saja di mana a adalah daftar input dalam bentuk vektor?
MickyT

Dalam hal ini kami akan menganggapnya sebagai cuplikan, karena mengasumsikan bahwa variabel sudah ada di namespace. Untuk membuatnya menjadi penyerahan fungsi yang tepat, Anda perlu function(a)rank(-a,,'min').
Alex A.

dapat disingkat menjadi hanya "mi"daripada "min".
Giuseppe

@AlexA. mengapa harus dibungkus cat? Jika pengajuan sudah function(a)rank(-a,,'mi')dianggap cukup dan keluaran program identik denganrank(-scan(),,'mi')
Mark

4

PowerShell v2 +, 43 41 byte

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

Dikembangkan secara independen, tetapi saya melihat bahwa ini adalah algoritma yang sama dengan solusi Python @ xnor , jadi / angkat bahu.

Mengambil input sebagai argumen baris perintah individual (yaitu, daftar yang dipisahkan spasi). Output (pemformatan default) adalah baris baru antar elemen.

Untuk setiap elemen dalam daftar input, ini sortadalah daftar input dalam -durutan pendampingan, mengambil .indexOf()elemen saat ini, dan menambahkan 1. Perhatikan larik array eksplisit @(...)untuk memperhitungkan input satu digit. Angka-angka yang dihasilkan ditinggalkan di pipa dan output tersirat.

Disimpan 2 byte berkat @Matt!

Contoh

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

Apakah ada alasan yang sort -dtidak berhasil untuk Anda? Itu jelas bagi saya.
Matt

@ Mat Aneh. Pada ISE Win8.1 saya, itu menyatakan itu -Descendingdan -Debugambigu. Tetapi dalam shell langsung pada Win8.1 dan shell dan ISE pada Win10 berfungsi dengan baik. Ini bukan pertama kalinya instal Win8.1 saya konyol ...: - / Terima kasih untuk golfnya!
AdmBorkBork

Juga apakah ini tidak berhasil untuk semua kasus uji? $args|%{@($args|sort -d).indexof($_)+1}itu lebih pendek tetapi saya belum memiliki pandangan yang baik untuk mengetahui apakah itu berfungsi
Matt

@ Matt Itu tidak berfungsi karena yang kedua $argsberfungsi sebagai input untuk blok skrip loop {...}, sama seperti jika Anda menggunakan filteratau function.
AdmBorkBork

3

Oktaf, 15 byte

@(x)sum(x<x')+1

Port jawaban MATL saya untuk Oktaf. Ini juga berfungsi di Matlab R2016b.

Kode mendefinisikan fungsi anonim. Untuk menyebutnya, tetapkan ke variabel. Cobalah di Ideone .


3

JavaScript (ES6), 38 36 byte

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

Sunting: Disimpan 2 byte berkat @ETHproductions.


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

3
@ ETHproductions Mengapa Anda selalu harus merusak kesenangan saya?
Neil

2

Jelly , 5 byte

<S‘ð€

TryItOnline!

Bagaimana?

<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.

Seberapa miripkah ini dengan kode J yang akan saya kirim? 1+(+/@:<)"0 1~
Dane

Tampak mirip (menggunakan pengurangan untuk menjumlahkan?), Tetapi itu tidak berarti menghentikan Anda memposting kode Anda!
Jonathan Allan

Saya kira saya lebih bertanya-tanya apa yang dilakukan "pemisahan rantai diad" dan "untuk masing-masing" dalam bahasa yang terinspirasi oleh J.
Dane

Ah, baik dari penjelasan Anda saya pikir kode Anda lebih suka >€µS‘, atau sangat suka <@€µS‘( @membalikkan argumen ke <operator). J ~tersirat dalam rantai di sebelah kiri µ, yang merupakan pemisahan monadik (bukan diadik) dan menjadi <vektor jika argumennya adalah daftar.
Jonathan Allan

2

Perl 6 ,  42  26 byte

Temukan indeks pertama :kdalam [R,]daftar yang diurutkan terbalik

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

Hitung nilai yang lebih besar, dan tambahkan satu

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

2

JavaScript, 87 49 byte

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)

Terima kasih Conor O'Brien dan produk ETH!


1
Anda dapat menggunakan fungsi anonim di peta, yaitu v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien

Anda tidak perlu .slice()sama sekali, karena .mapberoperasi pada salinan array.
ETHproduk

Dan kebijakan situs kami adalah bahwa fungsi tersebut tidak perlu disebutkan namanya, sehingga Anda dapat menghapus yang utama f=juga.
Conor O'Brien

@ ETHproductions Jika saya menghapus slice, memberikan [18,13,18]pengembalian [1,1,2]bukan[1, 3, 1]
Oliver

Oh, itu aneh ... Saya kira itu karena a.sort()menyimpan array yang diurutkan a. Tapi Anda bisa mengubah a.slice()untuk [...a]menyimpan beberapa byte.
ETHproduk

2

Mathematica, 44 byte, 42 byte, 40 byte

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

adalah karakter penggunaan pribadi 3 byte U+F4A1( halaman Wolfram docs )

Sunting: Terima kasih JHM untuk penghematan byte.


1
Gagal untuk test case {10,2,5,4,15,5}(output {2,6,3,5,1,3}tidak boleh {2,5,3,4,1,3}. Catatan yang 4harus dilewati karena ada dua 5s di input).
JungHwan Min

Benar dikoreksi.
ngenisis

1
-2 byte dengan beralih xdan #(secara efektif mendapatkan menyingkirkan kurung): xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min

2

Pyke, 6 byte

FQS_@h

Coba di sini!

F      - for i in input():
 QS    -     sorted(input())
   _   -    reversed(^)
    @  -   i.find(^)
     h -  ^+1 (not required if allowed to start from 0)

2

J , 14 8 byte

1+1#.</~

Bagaimana?

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

Solusi sebelumnya

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

Halo, saya telah menemukan versi yang lebih pendek untuk 8 byte 1+1#.</~. Penjumlahan baris-bijaksana dilakukan menggunakan konversi basis 1. Alternatif lain adalah 1+\:~i.]8 byte.
miles

Bagus! Apakah Anda ingin memposting jawaban Anda sendiri? Kalau tidak, saya akan menyertakan peningkatan basis-satu.
Dane

2
Nah, saya baik-baik saja dengan hanya menyarankan penghematan byte. Jangan ragu untuk menggunakannya
mil


1

Bertanya-tanya , 28 byte

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

Pemakaian:

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

Memetakan lebih dari array input dengan fungsi yang menambahkan 1 ke indeks pertama item dalam versi input yang diurutkan menurun.


1

Dyalog APL , 7 byte

⊢⍳⍨⍒⊃¨⊂

argumen '

⍳⍨ indeks dalam

indeks yang akan mengurutkan argumen turun

⊃¨ masing-masing dipilih

seluruh argumen

TryAPL online!


1

Mathematica, 37 byte

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

Fungsi murni yang akan memeringkat inputnya, sesuai aturan masalah. Ex:

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

Ubur-ubur , 15 byte

p`&& ~i
  >/+`<

Cobalah online!

Penjelasan

Tampaknya tidak ada cara yang baik untuk menemukan indeks nilai dalam daftar di Jellyfish, jadi ini menggunakan pendekatan penghitungan berapa banyak nilai yang lebih besar dari nilai saat ini dan meningkatkan hasilnya. Ini sebagian besar dilakukan dengan membangun fungsi unary yang menghitung nilai ini untuk elemen yang diberikan.

     `<

Ini membuat versi ulir dari operator perbandingan, jadi jika Anda memberikan ini bilangan bulat dan daftar, itu akan mengembalikan daftar hasil perbandingan antara bilangan bulat itu dan setiap elemen dalam daftar.

     ~i
     `<

Ini menyuarakan argumen kanan dari fungsi sebelumnya dengan daftar input. Jadi hasilnya adalah fungsi unary yang mengambil bilangan bulat dan memberi Anda daftar hasil perbandingan dengan input program.

   & ~i
   /+`<

Di sini, /+adalah pengurangan dengan tambahan, yang berarti itu hanyalah fungsi "jumlah daftar ini". &menyusun ini ke fungsi sebelumnya, jadi kami sekarang memiliki fungsi unary yang menghitung berapa banyak nilai dalam input lebih besar dari integer itu.

  && ~i
  >/+`<

Kami juga menyusun fungsi kenaikan menjadi ini.

 `&& ~i
  >/+`<

Terakhir, kami utas fungsi ini juga, sehingga secara otomatis diterapkan ke setiap bilangan bulat dari daftar yang diteruskan ke sana. Karena tata letak kode, ikebetulan juga diambil sebagai input dari fungsi ini, sehingga ini menghitung output yang diinginkan.

p`&& ~i
  >/+`<

Akhirnya, ini mencetak hasilnya.


1

brainfuck, 124 byte

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

Diformat:

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

Ini dirancang untuk implementasi brainfuck 8-bit. Input dan output adalah melalui nilai byte .

Cobalah online.

Untuk setiap elemen, ini menghitung jumlah elemen yang lebih besar dari itu, lalu mencetak hasilnya ditambah satu. Ini dilakukan dengan menambah semua elemen hingga elemen saat ini sama dengan nol, memperbarui hasilnya setiap kali elemen lain menjadi nol sebelum elemen saat ini.

Rekaman itu dipecah menjadi node 4-sel,

b c 0 0

di mana celemen dan bmerupakan bendera navigasi yang negatif untuk elemen saat ini, sebaliknya satu.

Hasil dan salinan elemen saat ini disimpan di sebelah kiri array.


1

Java, 215 byte

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]+",");}}

Penjelasan:

Sangat jelas.

Pada dasarnya untuk setiap integer dalam array itu memeriksa berapa banyak lebih besar dari itu, lalu mencetak array baru dengan peringkat.

Maaf ini tidak terlalu ringkas tetapi ini adalah percobaan pertama saya di salah satu dari ini dan saya tidak melihat entri untuk java. Saya yakin itu bisa bermain golf lebih banyak.

Itu dapat dijalankan hanya dengan membuat referensi ke metode statis dan melewati sebuah array. Saya tidak berpikir itu perlu untuk menulis fungsi utama tetapi jika itu akan saya lakukan di masa depan.


Bisakah Anda menghapus sebagian spasi putih ini? Karena ini tidak golf sama sekali. (yaitu spasi di r = new)
Rɪᴋᴇʀ

@ EasterlyIrk Ya, maaf saya tidak terbiasa melakukan ini. Saya pikir saya menyingkirkan semua spasi yang tidak perlu.
Henry

Bisakah Anda memberi nama "rankNumbersGolf" sesuatu yang lebih pendek seperti "G" atau sesuatu?
Rɪᴋᴇʀ

@ EasterlyIrk Ya, terima kasih.
Henry

Saya tidak java dengan baik, tetapi dapatkah Anda menghapus beberapa spasi di ketiganya for (?
Rɪᴋᴇʀ

0

PHP, 101 byte

Pasti ada cara yang lebih pendek.

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++;}}

fungsi mengambil input sebagai array bilangan bulat, menimpa variabel input dengan peringkat sebagai string numerik.

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


0

Ruby, 45 40 byte

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

Bagaimana ini disebut? Saya tidak bisa mencocokkannya dengan test case, sepertinya ada bug dengan peringkat yang sama. Misalnya [10, 2, 5, 4, 15, 5]memberi saya output [2, 5, 3, 4, 1, 3]ketika seharusnya [2, 6, 3, 5, 1, 3]- saya pikir untuk memperbaikinya Anda hanya menghapus .uniq- menghemat 5 byte!
Neil Slater

Sepertinya saya salah membaca pertanyaan. Terima kasih telah melihatnya!
Lee W

0

Clojure, 48 44 byte

Perbarui: menggunakan foralih-alihmap

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

Cukup filter setiap nilai yang lebih kecil dari nilai saat ini, hitung panjang daftar dan kenaikan satu demi satu.



0

PHP, 84 byte

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

Penggunaan: Lulus fungsi r array integer Anda dan itu akan mengembalikan array yang sesuai dari integer peringkat.

Lulus tes di sini.



0

K (oK) , 11 byte

Larutan:

1+(x@>x)?x:

Cobalah online!

Contoh:

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

Penjelasan:

Cari posisi daftar asli dalam daftar diurutkan, lalu tambahkan satu.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.