Tamsayıların listesini sırala


21

Boş olmayan bir pozitif tamsayı listesi verilir, örneğin

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

Bu sayıları kendi değerlerine göre sıralamalısınız, ancak liderlik tablosunda olduğu gibi her zaman olduğu gibi, eğer bir bağ varsa tüm bağlanan sayılar aynı sıralamayı alır ve uygun sayıda sıra atlanır. Yukarıdaki liste için beklenen çıktı bu nedenle

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

Örneğin, girdideki en yüksek değer öyleydi 9, bu bir 1(birinci derece) olur. Üçüncü en yüksek değer 6, yani her ikisi de 6olur 3ve sıralama 4tamamen atlanır.

kurallar

Giriş ve çıkış için herhangi bir uygun, açık, düz bir liste formatını kullanabilirsiniz. Çıktıdaki ilk / en küçük sıralama her zaman 1 olmalıdır .

Bir program veya fonksiyon yazabilir ve standart girdi alma ve çıktı alma yöntemlerimizden herhangi birini kullanabilirsiniz .

Herhangi bir programlama dilini kullanabilirsiniz , ancak bu boşlukların varsayılan olarak yasak olduğunu unutmayın .

Bu , yani en kısa geçerli cevap - bayt olarak ölçülen - kazanır.

Test Kılıfları

[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
Yakından alakalı. Buradaki fark, bu zorluğun girdilerin sıralanmasını garanti etmesidir; bu, çoğu cevabın bir indexOffonksiyon biçimine dayandığı anlamına gelir . Sıralanmamış girdi için birçok dilde daha kısa alternatif olduğuna inanıyorum.
Martin Ender,


Üzgünüm, ama bunun Lynn'in bağlantısına çok yakın olduğuna inanıyorum. Farklılıklar minimumdur: Değerler kesilir, önceden sıralanmış bir girişi varsayamazsınız ve çıktının yarısı sırasını değiştirmiştir. Bağlantılı soruya kabul edilen cevap neredeyse işe yarıyor. Asgari çabayla, biri çalışmasını sağlayabilir. Bu nedenle, bunun bir kopya olduğunu kabul ediyorum.
Ismael Miguel

Kabul etmiyorum, bu açıkça bir kopyası değil.
Timtech

Timtech ile aynı fikirdeyim, bu meydan okuma daha basit, fakat bir kopya değil.
tuskiomi

Yanıtlar:


13

Kod Golf Yığın Değişiminde Fare Girdileriyle İlgili Aptal Kurallar için Geçici Çözüm: (WESRRMICGSE) 28 bayt

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

10,23,34,2,Kaynağa girdikten sonra derleyiciye csv ( ) girişi yapın. tırnak, parantez, izleyen virgül yok.

WESRRMICGSE, bir bayttan tasarruf etmek için başlangıçtaki '=' işaretini atlayabilmeniz dışında, tam olarak excel'deki programlama gibidir. İşlevsellik farkı, WESRRMICGSE'in kodu otomatik olarak kopyalamak ve tek bir tamsayı girişi ile sağlanan farklı çıktılar sağlamak için formülü aşağı sürüklemesi gerçeğinden geliyor. giriş olarak bir liste sağlanmışsa, bu liste B sütununa (giriş sütunu) gider ve formül, giriş sayısını eşleştirmek için otomatik olarak ilaçla doldurulur. (örneğin: giriş 34, 21, 45, formülle birlikte toplam 3 hücre için formülü 2 hücreye aşağı sürükler).

Düzenleme: Bu cevabın popüler olmasını beklemiyordum. Vaov!


21
Dilin adı biraz iğrenç ...
Conor O'Brien

Hangi kuralları kastediyorsunuz ve bunlar tam olarak ne saçma?
Luis Mendo,

3
@LuisMendo burada bildirilen kurallar: meta.codegolf.stackexchange.com/questions/10199/… Bence kural aptalca, çünkü tam olarak bahsettiği şeyi çevreleyen bir 'tercüman' yazmak için 5 dakika sürdüm . Bu dil zorluklarda ne kadar çok kullanılabiliyorsa kural o kadar sessiz olur. Bunu bağlantıya eklediğinizden emin olacağım.
tuskiomi


9

Python 2,41 bayt

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

Her bir değer için, sırasını azaltarak sıralanmış listedeki dizinini bulun. En büyük değeri 0 yerine 1 vermek için, Python 2 listeleri sayılardan daha büyük olarak kabul ettiğinden, listenin kendisinde fazladan bir "sonsuz" öğe kullanırız.

Daha doğrudan bir çözüm 42 bayttır ve Python 3'te de çalışır.

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

Her eleman için, daha küçük elemanların sayısını sayarak 1 indeksli vardiyaya 1 ekler.


8

Jöle , 5 bayt

ṢṚiЀ

Çevrimiçi deneyin!

Nasıl çalışır

ṢṚ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 bayt

Negatif vektör üzerindeki "min" bağları yöntemiyle standart sıralama işlevini kullanır. catSTDOUT çıkışına eklendi. @Guiseppe'e bir teşekkür kaydedildi

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

Örnek

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

catTam bir program olması için onu paketlemeniz gerektiğini düşünüyorum .
Alex A.

@AlexA. Bunu merak ediyordum. Bunun kendi başına bir fonksiyon olduğunu söylemek adil olmaz mıydı ve bu durumda rank(-a,,'min')a, vektör biçimindeki liste girişi nerede olur ?
MickyT

Bu durumda bunu bir snippet olarak değerlendiriyoruz, çünkü bir değişkenin ad alanında zaten var olduğunu varsayar. Uygun bir işlev sunumu yapmak için ihtiyacınız olacak function(a)rank(-a,,'min').
Alex A.

"mi"yerine kısaltılabilir "min".
Giuseppe

@AlexA. neden sarılması gerekiyor cat? Eğer başvuru function(a)rank(-a,,'mi')yeterli olsaydı ve program çıktısı ile aynı iserank(-scan(),,'mi')
Mark

4

PowerShell v2 +, 43 41 bayt

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

Bağımsız olarak geliştirildi, ancak bunun @ xnor'ın Python çözümü ile aynı algoritma olduğunu görüyorum. olan so / shrug ile .

Tek tek komut satırı argümanları (örneğin, boşlukla ayrılmış liste) girişi alır. Çıktı (varsayılan biçimlendirme) öğeler arasında yeni bir satırdır.

Giriş listesindeki her öğe için, artan sırada sortgiriş listesidir , geçerli öğeyi -dalır .indexOf()ve ekler 1. Açık dizi dökümünü not alın@(...)Tek basamaklı bir girişi hesaba katmak için . Elde edilen sayılar boru hattında bırakılır ve çıktı kesindir.

@Matt sayesinde 2 bayt kaydedildi!

Örnek

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İşe yaramayan bir sebep var mı? Bu benim için belirsiz.
Matt

@Matt Odd. Win8.1 İMKB'mde bunu belirtiyor -Descendingve -Debugbelirsiz. Ancak Win8.1'deki düz kabukta ve Win10'daki kabuk ve İMKB'de iyi çalışıyor. Bu benim Win8.1 kurulumumun ilk seferinde aptalca bir şey olmazdı ...: - / Golf için teşekkürler!
AdmBorkBork

Ayrıca bu tüm test durumlarında işe yaramadı mı? $args|%{@($args|sort -d).indexof($_)+1}daha kısa ama işe
Matt

@Matt Bu işe yaramaz çünkü ikinci bir $argsdöngü kullanıyorsanız {...}, örneğin bir filterya da kullanıyorsanız, kodun betiği için giriş işlevi görür function.
AdmBorkBork,

3

Oktav, 15 bayt

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

MATL'imin limanı Octave'a cevap veriyor. Aynı zamanda Matlab R2016b'de çalışır.

Kod anonim bir işlevi tanımlar. Aramak için değişkene atayın. Ideone'da dene .


3

JavaScript (ES6), 38 adet 36 bayt

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

Düzenleme: @ETHproductions sayesinde 2 bayt kaydedildi.


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

3
@ETHproductions Neden her zaman eğlencemi bozmak zorundasın?
Neil,

2

Jöle , 5 bayt

<S‘ð€

TryItOnline!

Nasıl?

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

Göndermek üzere olduğum J koduna ne kadar benzer? 1+(+/@:<)"0 1~
Dane

Benzer gözüküyor (toplamı azaltmak için kullanılır?), Ancak kodunuzu göndermeyi hiçbir zaman engellememelisiniz!
Jonathan Allan,

Sanırım J-ilham verici bir dilde "dyadik zincir ayrımı" ve "her biri için" ne yaptığını merak ediyordum.
Dane

Ah, açıklamanızdan, kodunuzun daha çok >€µS‘ya da gerçekten benzer olduğunu düşünüyorum <@€µS‘( operatöre @argümanları ters çevirir <). J ~, zincirinin solunda µ, monadik (dyadic yerine) ayrılmanın örtülü olduğu <ve argüman (lar) liste (ler) ise vektörleştiren, üstü kapalıdır.
Jonathan Allan,


2

JavaScript, 87 49 bayt

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 ve ETHproductions'e teşekkürler!


1
Örneğin haritada anonim bir işlev kullanabilirsiniz v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien,

Hiç ihtiyacınız yok .slice()çünkü .mapdizinin bir kopyası üzerinde çalışıyor.
ETHProductions

Ve site politikamız, işlevin adlandırılmasına gerek olmadığı için öncüyü de kaldırabilirsiniz f=.
Conor O'Brien,

Geçen ben kaldır dilim halinde @ETHproductions, [18,13,18]getiri [1,1,2]yerine[1, 3, 1]
Oliver

Oh, bu garip ... Sanırım a.sort()sıralanan diziyi depoladığı için a. Ama değiştirebilir a.slice()için [...a]birkaç byte kaydedin.
ETHProductions

2

Mathematica, 44 bayt 42 bayt 40 bayt

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

3 bayt özel kullanım karakteri nedir U+F4A1( Wolfram docs page )

Düzenleme: bayt tasarrufu için JHM teşekkürler .


1
Test durum için başarısız {10,2,5,4,15,5}(çıkış olmalıdır {2,6,3,5,1,3}değildir {2,5,3,4,1,3}. Not 4iki olduğundan atlanması gereken 5giriş s).
JungHwan Min

Uygun şekilde düzeltildi.
ngenis,

1
-2 geçiş yaparak bayt xve #(etkin bir parantez kurtulmak alma): xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min

2

Pyke, 6 bayt

FQS_@h

Burada dene!

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 bayt

1+1#.</~

Nasıl?

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

Önceki çözüm

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

Merhaba, 8 bayt için daha kısa bir sürüm buldum 1+1#.</~. Row-wise toplamı, base 1 dönüşümü kullanılarak gerçekleştirilir. Diğer bir alternatif 1+\:~i.]de 8 bayttır.
mil

Güzel! Kendi cevabınızı göndermek ister misiniz? Aksi halde temel bir geliştirmeyi dahil edeceğim.
Dane

2
Hayır, sadece bayt tasarrufu önerme konusunda iyiyim. Onları kullanmaktan çekinmeyin
mil


1

Wonder , 28 bayt

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

Kullanımı:

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

Girdilerin azalan düzenlenmiş bir sürümünde öğenin ilk dizinine 1 ekleyen bir işlevle giriş dizisi üzerinde eşleyin.



1

Mathematica, 37 bayt

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

Sorunun kurallarına göre, girdisini sıralayacak saf bir işlev. Ör:

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

Denizanası , 15 bayt

p`&& ~i
  >/+`<

Çevrimiçi deneyin!

açıklama

Jellyfish'teki bir listedeki bir değerin dizinini bulmanın iyi bir yolu görünmüyor, bu nedenle mevcut değerden kaç değerin daha büyük olduğunu sayma ve sonucu artırma yaklaşımını kullanır. Bu büyük ölçüde, belirli bir eleman için bu değeri hesaplayan tek bir fonksiyon inşa edilerek yapılır.

     `<

Bu, karşılaştırma işlecinin iş parçacıklı bir versiyonunu oluşturur, bu nedenle buna bir tamsayı ve bir liste verirseniz, o tamsayı ve listedeki her öğe arasında bir karşılaştırma sonuçları listesi döndürür.

     ~i
     `<

Bu, önceki işlevin sağ argümanını giriş listesiyle körleştirir. Sonuç, bir tamsayı alan ve programın girişiyle karşılaştırmalı sonuçların listesini veren tek bir fonksiyondur.

   & ~i
   /+`<

İşte, /+ekleyerek azaltma, bu sadece bir "bu listeyi topla" fonksiyonu anlamına geliyor. &Bunu önceki fonksiyonun üzerine getirir, bu yüzden şimdi girdideki kaç değerin o tamsayıdan daha büyük olduğunu sayan tek bir fonksiyona sahibiz .

  && ~i
  >/+`<

Ayrıca artım fonksiyonunu da bunun üzerine oluşturuyoruz.

 `&& ~i
  >/+`<

Son olarak, bu işlevi de dizeriz, böylece otomatik olarak kendisine iletilen bir listenin her tamsayısına uygulanır. Kodun düzeni nedeniyle i, bu işlevin girişi olarak da alınır, böylece istenen çıktı hesaplanır.

p`&& ~i
  >/+`<

Sonunda, bu sonucu yazdırır.


1

brainfuck, 124 bayt

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

biçimlendirilmiş:

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

Bu 8 bitlik beyin fırtınası uygulamaları için tasarlanmıştır. Giriş ve çıkış bayt değerleri üzerinden .

Çevrimiçi deneyin.

Her öğe için, bu ondan daha büyük öğe sayısını sayar, sonra sonucu artı bir sayı olarak yazdırır. Bu, mevcut eleman sıfıra eşit olana kadar tüm elemanların arttırılmasıyla gerçekleştirilir, mevcut elemandan önce başka bir eleman sıfır olunca sonuç güncellenir.

Bant 4 hücreli düğümlere ayrıldı.

b c 0 0

burada cöğe ve bgeçerli öğe için negatif olan, aksi halde bir gezinti bayrağıdır.

Sonuç ve geçerli öğenin bir kopyası dizinin solunda tutulur.


1

Java, 215 bayt

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

Açıklama:

Çok açıklayıcı.

Temel olarak dizideki her bir tam sayı için, kendisinden kaç tane büyük olduğunu kontrol eder, ardından yeni diziyi sıralamalarla yazdırır.

Özür dilerim, bu çok özlü değil ama ilk denemelerimden biri ve java için bir giriş görmedim. Eminim daha çok golf oynayabilir.

Sadece statik yönteme atıfta bulunarak ve bir dizi geçirerek çalıştırılabilir. Ana işlevi yazmanın gerekli olduğunu düşünmedim, ancak öyleyse bunu gelecekte yapacağım.


Bu boşlukların bir kısmını kaldırabilir misin? Bu gerçekten hiç golf değil gibi. (örn., boşluklar r = new)
Rɪᴋᴇʀ

@EasterlyIrk Evet, üzgünüm bunu yapmaya alışkın değilim. Sanırım gereksiz tüm boşluklardan kurtuldum.
Henry,

"RütbeNumbersGolf" u "G" ya da başka bir şeye kısaltabilir misin?
Rɪᴋᴇʀ

@EasterlyIrk Evet, teşekkürler.
Henry,

Java'yı iyi kullanmam ama üçünde boşluk bırakabilir misin for (?
Rɪᴋᴇʀ

0

PHP, 101 bayt

Daha kısa bir yol olmalı.

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

işlevi tamsayı dizisi olarak girdiyi alır, girdi değişkenini sayısal dizeler olarak derecelendirir.

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


0

Ruby, 45 40 bayt

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

Bu nasıl adlandırılır? Test durumlarıyla eşleşmesini sağlayamıyorum, eşit seviyede bir böcek var gibi görünüyor. Örneğin , olması gerektiği zaman [10, 2, 5, 4, 15, 5]bana çıktı veriyor - bence sadece 5 bayttan tasarruf etmenizi düzeltmeyi düşünüyorum ! [2, 5, 3, 4, 1, 3][2, 6, 3, 5, 1, 3].uniq
Neil Slater

Soruyu yanlış anlamış gibiyim. Bunu tespit ettiğin için teşekkürler!
Lee W,

0

Clojure, 48 44 bayt

Güncelle: foryerinemap

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

Sadece geçerli olandan daha küçük olan her bir değeri filtreler, listenin uzunluğunu ve artırımları birer birer sayar.



0

PHP, 84 bayt

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

Kullanımı: Fonksiyonu bir tamsayı dizisi ile geçirin ve karşılık gelen tamsayılar dizisini döndürür.

Burada testler geçiyor.



0

K (OK) , 11 bayt

Çözüm:

1+(x@>x)?x:

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

Sıralı listede orijinal listenin arama konumu, daha sonra bir tane ekleyin.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.