Sıralamadan sonra bir dizinin dizinlerini alma


14

Bugün meydan okumaniz, bir listeyi alan lve lard arda lsıralanan her öğenin göründüğü konumları veren bir program veya işlev yazmaktır .

Başka bir deyişle, en küçük değerin dizinini, ardından ikinci en küçük değerin dizinini vb. Çıkarır.

Giriş dizisinin yalnızca pozitif tamsayılar içereceğini ve en az bir öğe içerdiğini varsayabilirsiniz.

Test senaryoları:

Input                  | Output (1-indexed)
[7, 4, 5]              | [2, 3, 1]
[1, 2, 3]              | [1, 2, 3]
[2, 6, 1, 9, 1, 2, 3]  | [3, 5, 1, 6, 7, 2, 4]
[4]                    | [1]

Aynı değere sahip iki veya daha fazla öğe göründüğünde, endeksleri en küçükten en büyüğe doğru yan yana görünmelidir.

Bu , en az bayt kazanır!


16
-1, ortak golf dillerinde yerleşikler ile çözülebilecek önemsiz bir meydan okuma için ve 24 saatten daha kısa sürede bir cevap kabul etmek için. Bu ne adil bir meydan okuma, ne de ilginç bir meydan okuma.
Cody Gray

3
24 saat içinde bir cevabı neden kabul ettiğini anladım, yenmek imkansız.
Zacharý

3
@CodyGray 1-2 bayt cevabı gördüğümde aşağı oylamayı düşündüm, ancak aslında, daha standart programlama dilleri için kötü bir zorluk olduğunu düşünmüyorum. Tabii ki, bu zor bir zorluk değil , ama yine de kesinlikle bazı golf olanakları var. Tabii ki, 1 bayt yerleşikleri görmek hoş değil, ama bunun için meydan okumayı suçlamanın adil olduğunu düşünmüyorum.
Dada

1
1 karakterlik bir yerleşik kullanmak neredeyse pratik değildir. Kolay, yalnızca yerleşikler kullanılarak çözülebilir olmak zorunda değildir.
JAD

2
Bu gibi durumlarda en iyi çözüm, burada gerçekten alakalı olmayan kabul etme özelliğini unutmaktır.
Bay Xcoder

Yanıtlar:



11

Dyalog APL, 1 bayt

Dyalog APL, bunu yapmak için yerleşik bir operatör işlevine sahiptir (bunu temizlediğiniz için teşekkür ederim Zacharý).

Misal

⍋11 2 4 15
    2 3 1 4  
{⍵[⍋⍵]}11 4 2 15
    2 4 11 15

Burada listeyi artan sırada döndürmek için sıralı endekslere göre dizine ekliyorum.


Oh, sadece kafa karıştırıcı bir terminolojiye karşı sizi uyarmak için, APL'de, gibi yerleşikler işlev olarak kabul edilirken ¨⍨⍣.∘/\⌿⍀⌸⍤, operatörler gibi şeyler .
Zacharý



9

Javascript (ES6), 39 bayt

@Powelles sayesinde -2 bayt

Bu yalnızca Array.prototype.sortkararlı olduğu tarayıcılarda çalışır .

a=>[...a.keys()].sort((b,c)=>a[b]-a[c])

1 dizinli sürüm (47 bayt):

a=>a.map((_,i)=>i+1).sort((b,c)=>a[b-1]-a[c-1])

Örnek kod snippet'i:

f=
a=>[...a.keys()].sort((b,c)=>a[b]-a[c])
console.log("7,4,5 => "+f([7,4,5]))
console.log("1,2,3 => "+f([1,2,3]))
console.log("2,6,1,9,1,2,3 => "+f([2,6,1,9,1,2,3]))
console.log("4 -> "+f([4]))


[...a.keys()]Bunun yerine a.map((_,i)=>i)size birkaç bayt kazandıracak.
powelles

7

Python 2 , 48 bayt

lambda x:sorted(range(len(x)),key=x.__getitem__)

Çevrimiçi deneyin!


Güzel, çok abarttım. Cevabımı Python 3'e öyle kötü hissetmeyeceğim şekilde değiştirdim
Bay Xcoder

4
@ Mr.Xcoder Bu onun işi ...
Neil

@ Mr.Xcoder Hadi, bunun için üzülmemelisin! Tam bir program yaptınız, bir işlev yaptım ve yaklaşımım biraz farklı.
Outgolfer Erik

Kendimi kötü hissetmiyorum, bunun görüneceğini biliyordum ( __<blahblah>__sözdiziminden bizzat nefret ediyorum ). Biraz Jelly yapacağım, eğitimimi kaybetmek istemiyorum :)
Bay Xcoder

1
@ Mr.Xcoder Codegolf güzel sözdizimi ve biçimlendirme anlamına gelmez. ;)
Outgolfer Erik



4

Swift 4 , 82 bayt

func f(l:[Int]){var l=l;for k in l.sorted(){let a=l.index(of:k)!;print(a);l[a]=0}}

Test odası.

açıklama

Swift'te l.sorted()orijinal Dizinin sıralı bir kopyasını oluşturur. Listedeki sıralı öğeleri arasında ve orijinal Array her öğenin dizinini yazdırma sonra biz döngü let a=l.index(of:k)!;print(a)ve sonra, Array doğru endeksler tutmak için, biz atamak l[a]için 0bu normal çıktıyı etkilemez çünkü.


Python çözümümün bir bağlantı noktası olduğu için bunun 0 dizinli olduğunu unutmayın. Eğer 1-endeksli olmasını istiyorsanız, değiştirmek print(a)ile print(a+1)veya çevrimiçi deneyin! .


4

R , 5 bayt

Bunun için yerleşik bir fonksiyon var.

order

3
Standart kurallar bir işlev programı sağlamaktır. orderzaten bir işlevdir, bu nedenle girişi kullanarak işlem yapmanız gerekmez scan(). Bu 5 bayt olur.
JAD

rank()bir bayt kurtaracak
gstats

1
Eminim rank@JarkoDubbeldam tarafından bir cevap vardı, ama artık görmüyorum.
djhurio

1
Doğru, özellikleri takip etmiyor, bu yüzden sildim.
JAD




3

Oktav , 17 bayt

@(i)[~,y]=sort(i)

Çevrimiçi deneyin!

Oktav, MATLAB gibidir ancak satır içi atama ile Mathworks HQ baş ağrısına insanlara izin veren şeyleri mümkün kılar. Ne dediğin önemli değil y, ama bildiğim kadarıyla bu kukla değişken olmadan yapamazsın.


3

MY , 3 bayt

Benim de bunun için bir yerleşik var!

⎕⍋↵

Çevrimiçi deneyin!

Nasıl?

Girdi, not yükseltme ve sonra yeni satır ile çıktı değerlendirildi.

Dizine eklenir ancak dizini / ile ayarlarsınız 0x48. (Hatta bazı garip tamsayı olabilir -1veya 2varsayılan değerdir 1).


3

Java 8, 128 + 19 = 147 bayt

Bay Xcoder'ın çözümüne dayanarak . 0 tabanlı. Lambda girişi bir olarak alır Integer[]ve geri döner Integer[]. Bayt sayısı lambda ifadesini ve gerekli içe aktarmayı içerir.

import java.util.*;

l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;)l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0;return o;}

Çevrimiçi Deneyin

Ungolfed lambda

l -> {
    Integer
        o[] = l.clone(),
        s[] = l.clone(),
        i = 0
    ;
    for (Arrays.sort(s); i < l.length; )
        l[o[i] = Arrays.asList(l).indexOf(s[i++])] = 0;
    return o;
}

notlar

Kullandığım Integer[]yerine int[]kullanılmasına izin vermek Arrays.asListhiçbir ilkel versiyonları vardır. değerler dizi indeksleri olarak kullanıldığından ve döküm gerektirdiğinden Integertercih edilir Long.

Bu List, sınıf ve yöntem adlarının maliyeti nedeniyle en iyi yöntemsel çözümümden daha kısa oldu .

Bu aynı zamanda , çoğunlukla akışı toplamak için gerekli olan bagaj nedeniyle , girişleri akışa alan, (değer, dizin) çiftlerine eşlenen, değerlere göre sıralanmış ve endekslere eşlenen bir çözümü yendi .

Teşekkür

  • Nevay sayesinde -5 bayt

1
Şunlara ihtiyacınız yoktur j: l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0);return o;}(19 + 128 bayt).
Nevay




2

MATLAB / Oktav , 29 bayt

[~,y]=sort(input(''));disp(y)

Çevrimiçi deneyin!


Cevabınız mükemmel MATLAB olsa da, aslında Octave'deki anonim işlevlerde satır içi atama yapabilirsiniz .
Sanchises

İyi bir! Satır içi atamayı biliyordum, ancak doğrudan bu şekilde çıkabileceğinizi bilmiyordum
Luis Mendo

1
Dürüst olmak gerekirse, ben de. Böyle bir şeyle başladım ve bundan @(X)([~,y]=sort(X))kurtulmanın bir yolunu ararken , aslında ödevin geri dönüş değeri yolduğunu fark ettim yve daha yakından incelendiğinde, parantezlerin bile gerekli olmadığını ortaya çıkardım . MATLAB her şeyi açıkça sever; Oktav açık olduğunda mutludur.
Sanchises

2

JavaScript (ES6), 69 bayt

0 endeksli. 65.536 adede kadar öğe içeren listeler için çalışır.

a=>[...a=a.map((n,i)=>n<<16|i)].sort((a,b)=>a-b).map(n=>a.indexOf(n))

Test senaryoları


n=>a.indexOf(n)Sadece değiştirebilir misin a.indexOf?
Zacharý

@ Zacharý Maalesef değil. Örneklendirilmiş bir nesnenin yöntemi geri arama olarak kullanılamaz.
Arnauld

@ Zacharý Daha da kötüsü, Array#mapgeri çağırma işlevine 3 argüman iletir ve Array#indexOf2'yi bekler, böylece istenmeyen sonuçlar verecektir.
kamoroso94


2

Kabuk , 10 7 bayt

Bu benim Haskell cevabımın doğrudan bir limanı , ayrıca 1-indexed:

m→O`z,N

Çevrimiçi deneyin!

Ungolfed / Açıklaması

Code        Description               Example
         -- implicit input            [2,6,1]
      N  -- natural numbers           [1,2,3,..]
   `z,   -- zip, but keep input left  [(2,1),(6,2),(1,3)]
  O      -- sort                      [(1,3),(2,1),(6,2)]
m→       -- keep only indices         [3,1,2]

2

Java (OpenJDK 8) , 72 bayt

l->l.stream().sorted().map(i->{int j=l.indexOf(i);l.set(j,0);return j;})

Çevrimiçi deneyin!

A alır List<Integer>, Stream<Integer>sonuçları içeren bir döndürür .

İlk listeyi temel alan bir Akış elde ederiz, sıralarız, ardından her bir sayıyı listedeki dizine eşleriz. Yinelenen öğeleri barındırmak için listedeki orijinal öğeyi olarak ayarladık 0.


2

SmileBASIC, 67 bayt

DEF I(A)DIM B[0]FOR I=1TO LEN(A)PUSH B,I
NEXT
SORT A,B
RETURN B
END

Çok basit, tek yaptığı 1'den (dizi uzunluğu) bir sayı listesi oluşturmak ve bunu girişle aynı sıraya göre sıralamaktır.


2

Numpy ile Python 3 , 38 26 bayt

Jo King sayesinde 12 bayt kaydedildi (işleve bir ad vermenize gerek yok)

import numpy
numpy.argsort

Çıktı 0 tabanlıdır.

Çevrimiçi deneyin!


İşlev numpy.argsortlambda kısmı olmadan olabilir
Jo King

@ JoKing Öneri için teşekkürler. Bu şekilde yazdım çünkü sadece numpy.argsort;import numpybir hata alıyorum ( numpyhenüz içe aktarılmadı) ve kod kısmına import numpy;numpy.argsorttaşınmam gerekiyor f=. Bu durumda standart prosedürün olduğunu biliyor musunuz? Taşı f=ve sayılmıyor mu?
Luis Mendo

Evet sanırım. Belki sadece f=numpy.argsortaltbilgide yeniden tanımlayın
Jo King

@ İyi bir fikir. Bitti. Teşekkürler!
Luis Mendo



1

PHP , 54 bayt

<?php function i($a){asort($a);return array_keys($a);}

Çevrimiçi deneyin!

Bu sıfır indekslidir. Diziyi sıralar ve anahtarları döndürür.


1
<?phpEtiketi, bir işlev için gereksizdir. 48 bayt.
Titus

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.