Diberikan daftar skor (bilangan bulat non-negatif) yang disortir dari yang terhebat hingga yang paling kecil:
[ 10, 10, 6, 6, 4, 0]
Tetapkan setiap skor peringkat integer, dimulai dengan 1 dan naik, sehingga skor yang sama memiliki peringkat yang sama (yaitu mereka diikat):
[ 1, 1, 3, 3, 5, 6 ]
Dalam kasus ikatan, peringkat "dilewati," misalnya karena skor terbesar pertama dan kedua (10 dan 10) diikat, mereka berdua memiliki peringkat 1, dan peringkat 2 "dilewati," sehingga skor terbesar ketiga ( 6) memiliki peringkat 3.
Keluarkan daftar peringkat tidak menurun yang sesuai dengan skor input.
Contohnya
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
Memasukkan
Asumsikan semua skor adalah antara 0 dan 1.000 inklusif, dan input tidak akan lebih dari 500 skor. Input dapat dalam format apa pun yang sesuai untuk bahasa pilihan Anda (termasuk tetapi tidak terbatas pada STDIN, argumen untuk suatu fungsi, array yang sudah disimpan dalam variabel, dll.).
Keluaran
Kembali atau toko dalam variabel memerintahkan daftar yang dihasilkan dari jajaran, atau menulis ke stdout dengan cara terbaca-manusia (misalnya 1 2 3
, [1,2,3]
, 1\n2\n3\n
, dan { 1, 2, 3 }
semua baik-baik saja, 123
tidak, karena ingin pembatas). Skor input dapat disimpan / dicetak bersama dengan peringkat output yang sesuai, tetapi itu tidak diperlukan.
Batasan
Anda dapat menggunakan perpustakaan standar apa pun yang ditawarkan bahasa Anda. Celah standar berlaku.
Kondisi menang
Ini adalah kode-golf , jadi program terkecil (dalam byte) menang. Dalam hal seri, jawaban dengan suara terbanyak menang.
Catatan
Ini didasarkan pada pertanyaan Ruby pada SO yang menghasilkan beberapa jawaban menarik, termasuk yang sangat pendek. Saya mendorong Anda untuk datang dengan solusi Anda sendiri sebelum mencari di sana.
sumber
Jawaban:
J (
76)EDIT: Oh, tunggu! Tidak perlu menjadi fungsi!
Terima kasih Tuhan untuk
i.~
...Atau sebagai fungsi bernama (3 karakter lebih, tetapi tidak berbeda secara fungsional):
Jalankan tes:
sumber
1+i.~
adalah jenis kereta yang dapat ditugaskan dan digunakan inline, sehingga dapat digunakan sebagai fungsi tanpa parens kereta yang biasa. Itu 5 karakter. Dan sebagai catatan,@
lakukan pekerjaan yang sama seperti@:
dalam kasus ini, sehingga Anda bisa menyimpan karakter yang mudah di sana.T-SQL (40)
Asumsikan
@
adalah tabel yang berisi skor sebagai baris.sumber
Pyth , 6
Daftar disimpan di Y untuk memulai. Ini secara fungsional sama dengan solusi 22 karakter ruby: map over d di Y ke indeks d di Y plus 1, lalu cetak.
Contoh:
sumber
Python (33 karakter)
Secara fungsional sama dengan jawaban J saya.
sumber
x
untuk memulai, dan "output" dengan menyimpan hasilnya dalam sebuah variabel.APL, 2 byte
Dalam
⎕IO←1
. Dyadic iota mencari argumen kanannya menjadi argumen kiri. Operator⍨
menyalin argumen kanan ke argumen kiri jika operan digunakan secara monadik. Karena itu solusinya hanya mencari posisi masing-masing elemen vektor yang diberikan dalam dirinya sendiri.Sampel:
sumber
STATA (16)
Hasil dalam b.
Asumsikan c adalah variabel dalam dataset yang berisi input.
sumber
Haskell (31)
Pemakaian:
sumber
r l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group l
dengan 61 karakterJadi untuk menetapkan garis dasar:
Ruby (38)
Dengan asumsi
a
adalah array:(Ini didasarkan pada jawaban falsetru pada utas SO asli dan bukan karya asli saya. Saya tahu ada solusi Ruby yang 22 karakter, tetapi saya ingin melihat seseorang membuat yang lebih pendek daripada itu di Ruby.)
sumber
JavaScript (E6) 41
Fungsi dengan argumen array, mengembalikan array
Tes di konsol Firefox
Output: [1, 1, 3, 3, 5, 6]
Output: [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]
sumber
R, 15
dengan input disimpan sebagai vektor
x
,sumber
Powershell (70)
Itu hanya 51 karakter jika Anda mengambil tugas variabel di awal, yang membuat saya merasa sedikit kurang memadai.
Asumsikan $ a ditugaskan dan disortir sebagaimana ditentukan oleh masalah. $ n melacak peringkat, $ c hanyalah sebuah penghitung yang bekerja dengan $ l, elemen terakhir diperiksa dalam array.
Jika ada yang bisa saya lakukan untuk meningkatkan ini, saya ingin tahu.
sumber
Jawa (57)
Menggunakan 'aturan' yang sama dengan Allbeert :
Constant
i
didefinisikan sebagaiint[]
larik dan berisi input,z
berisi ukuran input. Lainnya,l
,c
,x
dann
, didefinisikan sebagaiint
.Cuplikan kode yang tersisa adalah:
Hasilnya adalah dalam array input.
sumber
Ruby, 22
Saya belum melihat thread SO tapi saya membayangkan ini adalah apa yang mereka hasilkan.
Edit: Ya, itu. Saya ragu mungkin untuk menjadi lebih kecil di Ruby, kecuali jika Anda menganggap Anda mendefinisikannya sebagai metode Array, maka Anda dapat melakukannya dalam 18 karakter dengan
Tapi tentu saja program lengkap di sekitar potongan itu terlihat seperti
sumber
> <> (47)
Tidak terlalu dioptimalkan, hanya menguji air dengan golf pertama saya.
Mengasumsikan bahwa input dipopulasi sebelumnya dalam stack, sehingga elemen pertama dari input adalah yang pertama muncul.
Pengujian:
output
sumber
Clojure, 35
Dengan beberapa interop Java dicampur di:
Sesi REPL:
sumber
C - 62
Sebagai cuplikan kode, karena tidak ada persyaratan untuk fungsi atau program lengkap.
Mengasumsikan
a
,n
,j
, dank
sudah didefinisikan sebagaiint*
,int
,int
, danint
masing-masing, di manaa
adalah array yang berisi input, dann
mengandung panjang input.Ini gagal untuk input dengan panjang 0, dalam hal ini diperlukan 3 karakter lagi.
sumber