Lấy các chỉ số của một mảng sau khi sắp xếp


14

Thử thách của bạn hôm nay là viết một chương trình hoặc chức năng lấy danh sách lvà đưa ra các vị trí trong lđó mỗi phần tử liên tiếp được lsắp xếp xuất hiện.

Nói cách khác, xuất chỉ mục của giá trị nhỏ nhất, theo sau là chỉ số của giá trị nhỏ thứ hai, v.v.

Bạn có thể giả sử rằng mảng đầu vào sẽ chỉ chứa các số nguyên dương và sẽ chứa ít nhất một phần tử.

Các trường hợp thử nghiệm:

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]

Khi hai hoặc nhiều phần tử có cùng giá trị xuất hiện, các chỉ số của chúng sẽ xuất hiện cạnh nhau từ nhỏ nhất đến lớn nhất.

Đây là , ít byte thắng nhất!


16
-1 cho một thử thách tầm thường có thể được giải quyết bằng các ngôn ngữ chơi gôn thông dụng chấp nhận câu trả lời trong vòng chưa đầy 24 giờ. Đây không phải là một thách thức công bằng, cũng không phải là một thử thách thú vị.
Cody Grey

3
Chà, tôi hiểu lý do tại sao anh ấy chấp nhận một câu trả lời trong vòng 24 giờ, không thể đánh bại.
Zacharý

3
@CodyGray Tôi đã nghĩ xuống cấp khi tôi thấy câu trả lời 1-2 byte, nhưng thực sự, tôi không nghĩ đó là một thách thức xấu đối với các ngôn ngữ lập trình chuẩn hơn. Tất nhiên, đó không phải là một thử thách khó khăn, nhưng vẫn có một số khả năng chơi gôn. Tất nhiên, thật khó chịu khi thấy các byte dựng sẵn 1 byte, nhưng tôi không nghĩ rằng thật công bằng khi đổ lỗi cho thách thức đó.
Dada

1
Sử dụng dựng sẵn 1 ký tự là khó thực hành. Easy không nhất thiết có nghĩa là có thể giải quyết được bằng cách chỉ sử dụng nội dung.
JAD

2
Giải pháp tốt nhất trong những trường hợp như vậy là quên đi tính năng chấp nhận te, dù sao đây không thực sự phù hợp.
Ông Xcoder

Câu trả lời:



11

APL Dyalog, 1 byte

Dyalog APL có chức năng vận hành tích hợp (cảm ơn Zacharý vì đã xóa cái này) để làm điều này.

Thí dụ

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

Ở đây tôi đang lập chỉ mục vào danh sách theo các chỉ số được sắp xếp để trả về danh sách theo thứ tự tăng dần.


Ồ, chỉ để cảnh báo bạn về một số thuật ngữ khó hiểu, trong APL, các nội dung giống như được coi là các chức năng, trong khi những thứ như ¨⍨⍣.∘/\⌿⍀⌸⍤là các toán tử.
Zacharý



9

Javascript (ES6), 39 byte

-2 byte nhờ @powelles

Điều này chỉ hoạt động trong các trình duyệt Array.prototype.sortổn định.

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

Phiên bản 1 chỉ mục (47 byte):

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

Đoạn mã ví dụ:

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()]thay vì a.map((_,i)=>i)sẽ tiết kiệm cho bạn một vài byte.
powelles

7

Python 2 , 48 byte

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

Hãy thử trực tuyến!


Thật tuyệt, tôi đã vượt qua> _ <. Tôi đã chuyển câu trả lời của mình sang Python 3 để tôi không cảm thấy tệ như vậy
Ông Xcoder

4
@ Mr.Xcoder Vâng, đó là công việc của anh ấy ...
Neil

@ Mr.Xcoder Thôi nào, bạn không nên cảm thấy tồi tệ vì điều đó! Bạn đã thực hiện một chương trình đầy đủ, tôi đã thực hiện một chức năng và cách tiếp cận của tôi hơi khác một chút.
Erik the Outgolfer 30/07/17

Tôi không cảm thấy xấu, tôi biết điều này sẽ xuất hiện (cá nhân tôi ghét __<blahblah>__cú pháp). Tôi sẽ làm một số Jelly, tôi không muốn mất việc đào tạo :)
Ông Xcoder

1
@ Mr.Xcoder Codegolf không có nghĩa là cú pháp và định dạng đẹp. ;)
Erik the Outgolfer 30/07/17



4

Swift 4 , 82 byte

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

Phòng thử nghiệm.

Giải trình

Trong Swift, l.sorted()tạo một bản sao được sắp xếp của Mảng gốc. Chúng tôi lặp qua các phần tử được sắp xếp trong danh sách và sau khi in chỉ mục của từng mục trong Mảng ban đầu let a=l.index(of:k)!;print(a), và sau đó, để giữ các chỉ mục chính xác trong Mảng, chúng tôi gán l[a]cho 0, vì nó không ảnh hưởng đến đầu ra bình thường của chúng tôi.


Hãy lưu ý rằng đây là chỉ mục 0, vì nó là một cổng của giải pháp Python của tôi. Nếu bạn muốn nó được lập chỉ mục 1, thay thế print(a)bằng print(a+1)hoặc Dùng thử trực tuyến! .


4

R , 5 byte

Có một hàm dựng sẵn cho việc này.

order

3
Quy tắc tiêu chuẩn là cung cấp một chương trình chức năng. orderđã là một chức năng, vì vậy bạn không phải xử lý đầu vào bằng cách sử dụng scan(). Đây sẽ là 5 byte.
JAD

rank()sẽ tiết kiệm một byte
gstats

1
Tôi chắc chắn đã có rankcâu trả lời của @JarkoDubbeldam, nhưng tôi không thấy nó nữa.
djhurio

1
Đúng, nó không theo thông số kỹ thuật nên tôi đã xóa nó.
JAD




3

Octave , 17 byte

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

Hãy thử trực tuyến!

Octave giống như MATLAB nhưng với sự phân công nội tuyến, khiến mọi thứ có thể khiến những người ở Mathworks HQ phải đau đầu. Không quan trọng bạn gọi là gì y, nhưng bạn không thể làm gì nếu không có biến giả đó, theo như tôi biết.


3

CỦA TÔI , 3 byte

MY cũng có một nội dung cho việc này!

⎕⍋↵

Hãy thử trực tuyến!

Làm sao?

Đánh giá đầu vào, xếp loại, sau đó đầu ra với một dòng mới.

Lập chỉ mục tuy nhiên bạn đặt chỉ mục, với / 0x48. (Thậm chí có thể là một số nguyên kỳ lạ như -1hoặc 2, mặc định là 1).


3

Java 8, 128 + 19 = 147 byte

Dựa trên giải pháp của ông Xcoder . Dựa trên 0 Lambda lấy đầu vào là một Integer[]và trả về Integer[]. Số lượng byte bao gồm biểu thức lambda và nhập khẩu bắt buộc.

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

Dùng thử trực tuyến

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

Ghi chú

Tôi sử dụng Integer[]thay vì int[]cho phép sử dụng Arrays.asList, không có phiên bản nguyên thủy. Integerđược ưa thích đểLong bởi vì các giá trị được sử dụng như các chỉ số mảng và sẽ yêu cầu truyền.

Điều này cuối cùng đã ngắn hơn phong cách thủ tục tốt nhất của tôi List giải pháp vì chi phí của tên lớp và phương thức.

Điều này cũng đánh bại một giải pháp mà tôi đã thử phát trực tiếp các đầu vào, được ánh xạ tới các cặp (giá trị, chỉ mục) , sắp xếp theo các giá trị và ánh xạ tới các chỉ số, chủ yếu là do hành lý cần thiết để thu thập luồng.

Sự nhìn nhận

  • -5 byte nhờ Nevay

1
Bạn không cần 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 byte).
Nevay




2

MATLAB / Octave , 29 byte

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

Hãy thử trực tuyến!


Trong khi câu trả lời của bạn là MATLAB hoàn hảo, bạn thực sự có thể thực hiện gán nội tuyến trong các hàm ẩn danh trong Octave .
Sanchise

Tốt một! Tôi biết về chuyển nhượng nội tuyến, nhưng tôi không biết bạn có thể xuất trực tiếp như thế
Luis Mendo

1
Thành thật mà nói, tôi cũng vậy. Tôi đã bắt đầu với một cái gì đó giống như @(X)([~,y]=sort(X)), và trong khi tôi đang tìm cách để có được yđiều này, tôi nhận ra ythực sự là giá trị trả về từ bài tập, và kiểm tra kỹ hơn cho thấy rằng dấu ngoặc thậm chí không cần thiết. MATLAB thích mọi thứ rõ ràng; Octave hạnh phúc khi nó không mơ hồ.
Sanchise

2

JavaScript (ES6), 69 byte

Chỉ số 0. Hoạt động cho danh sách chứa tới 65.536 phần tử.

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

Các trường hợp thử nghiệm


Bạn có thể thay đổi n=>a.indexOf(n)thành chỉ a.indexOf?
Zacharý

@ Zacharý Thật không may. Một phương thức của một đối tượng được điều khiển có thể được sử dụng như một cuộc gọi lại.
Arnauld

@ Zacharý Thậm chí tệ hơn là Array#mapchuyển 3 đối số cho hàm gọi lại và Array#indexOfmong đợi 2, vì vậy nó sẽ cho kết quả không mong muốn.
kamoroso94


2

Chồng , 10 7 byte

Đây là một cổng trực tiếp của câu trả lời Haskell của tôi , cũng được tìm thấy 1:

m→O`z,N

Hãy thử trực tuyến!

Ungolfed / Giải thích

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 byte

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

Hãy thử trực tuyến!

Mất một List<Integer>, trả về một Stream<Integer>chứa kết quả.

Chúng tôi nhận được một luồng dựa trên danh sách ban đầu, sắp xếp nó, sau đó ánh xạ từng số vào chỉ mục của nó trong danh sách. Để chứa các phần tử trùng lặp, chúng tôi đặt phần tử gốc trong danh sách thành 0.


2

SmileBASIC, 67 byte

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

Rất đơn giản, tất cả những gì nó làm là tạo ra một danh sách các số từ 1 đến (độ dài của mảng) và sắp xếp thứ tự này theo cùng thứ tự với đầu vào.


2

Python 3 với Numpy , 38 26 byte

12 byte được lưu nhờ Jo King (không cần đặt tên cho hàm)

import numpy
numpy.argsort

Đầu ra dựa trên 0.

Hãy thử trực tuyến!


Chức năng có thể chỉ là numpy.argsortkhông có phần lambda
Jo King

@JoKing Cảm ơn lời đề nghị. Tôi đã viết nó theo cách đó bởi vì numpy.argsort;import numpytôi chỉ gặp một lỗi ( numpychưa được nhập) và import numpy;numpy.argsorttôi cần chuyển f=sang phần mã. Bạn có biết rằng các thủ tục tiêu chuẩn là trong những trường hợp này? Di chuyển f=và không tính nó?
Luis Mendo

Vâng, tôi đoán vậy. Có lẽ chỉ cần xác định lại f=numpy.argsortở chân trang
Jo King

@JoKing Ý kiến ​​hay. Làm xong. Cảm ơn!
Luis Mendo



1

PHP , 54 byte

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

Hãy thử trực tuyến!

Đây là chỉ số không. Đơn giản chỉ cần sắp xếp các mảng và trả về các phím.


1
Các <?phpthẻ là không cần thiết cho một hàm. 48 byte.
Tít

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.