排序后获取数组的索引


14

今天的挑战是编写一个程序或函数,该程序或函数需要一个列表l并给出排序的l每个连续元素l出现的位置。

换句话说,输出最小值的索引,然后输出第二个最小值的索引,依此类推。

您可以假设输入数组仅包含正整数,并且至少包含一个元素。

测试用例:

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]

当出现两个或多个具有相同值的元素时,它们的索引应从最小到最大依次出现。

这是,最少字节获胜!


16
-1表示微不足道的挑战,可以使用常见的高尔夫语言内置功能解决该挑战,在24小时内接受答案。这既不是一个公平的挑战,也不是一个有趣的挑战。
科迪·格雷

3
好吧,我明白了为什么他在24小时内接受了答案,这是无法击败的。
扎卡里

3
@CodyGray当我看到1-2个字节的答案时,我以为投票否决了,但是实际上,对于更多的标准编程语言来说,这并不是一个坏挑战。当然,这并不是一个艰巨的挑战,但是,仍然肯定会有一些打高尔夫球的可能性。当然,看到1字节的内置文件是令人不快的,但是我不认为将挑战归咎于这一点是不公平的。
达达

1
很难使用内置的1个字符。简单不一定意味着仅使用内置函数即可解决。
JAD

2
在这种情况下,最好的解决方案是忘记te接受功能,这在这里实际上并没有任何关系。
Xcoder先生17年

Answers:



11

Dyalog APL,1个字节

为此,Dyalog APL具有内置的操作员功能(感谢Zacharý清除此操作)。

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

在这里,我通过排序后的索引对列表进行索引,以按升序返回列表。


哦,只是为了提醒您一些APL中令人困惑的术语,例如 的函数被视为函数,而则被视为¨⍨⍣.∘/\⌿⍀⌸⍤运算符。
扎卡里



9

Javascript(ES6),39个字节

-2个字节,感谢@powelles

这仅适用于Array.prototype.sort稳定的浏览器。

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

1索引版本(47字节):

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

示例代码段:

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()]而不是a.map((_,i)=>i)会节省您几个字节。
powelles

7

Python 2,48个字节

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

在线尝试!


很好,我感到厌烦> _ <。我打开我的回答到Python 3这样的,我不觉得不好
Xcoder先生

4
@Xcoder先生,那是他的工作……
Neil

@ Mr.Xcoder来吧,您应该不会为此感到难过!您编写了一个完整的程序,我编写了一个函数,但是我的方法有所不同。
暴民埃里克'17

我并不感到难过,我知道这会出现(我个人讨厌__<blahblah>__语法)。我会做一些果冻,我不想失去自己的训练:)
Xcoder先生17年

1
@ Mr.Xcoder Codegolf并不意味着漂亮的语法和格式。;)
Erik the Outgolfer



4

迅捷 4,82字节

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

测试套件。

说明

在Swift中,l.sorted()创建原始Array的排序副本。我们遍历列表中的排序元素,并在原始数组中打印每个项目的索引后let a=l.index(of:k)!;print(a),然后使用,为了将正确的索引保留在Array中,我们将其分配l[a]0,因为它不会影响正常的输出。


请注意,它是0索引的,因为它是我的Python解决方案的端口。如果您希望它被1索引,请替换print(a)print(a+1)在线尝试!


4

R,5个字节

为此有一个内置函数。

order

3
标准规则是提供功能的程序。order已经是一个函数,因此您不必使用来处理输入scan()。这将是5个字节。
JAD

rank()会节省一个字节
gstats '17

1
我确定rank@JarkoDubbeldam给出了答案,但是我不再看到它了。
djhurio '17

1
正确,它不符合规范,所以我删除了它。
JAD




3

八度,17字节

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

在线尝试!

Octave类似于MATLAB,但具有内联分配功能,这使得使Mathworks HQ的人们感到头疼的事情。据y我所知,您叫什么都没有关系,但是没有那个虚拟变量就无法做。


3

MY,3个字节

我也为此内置了一个功能!

⎕⍋↵

在线尝试!

怎么样?

评估输入,升级,然后用换行符输出。

已建立索引但您使用/ 设置了索引0x48。(甚至可以是一些奇怪的整数,例如-12,默认为1)。


3

Java 8、128 + 19 = 147字节

基于Xcoder先生的解决方案。从0开始。Lambda将输入作为Integer[]并返回Integer[]。字节数包括lambda表达式和所需的导入。

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

在线试用

非高尔夫λ

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

笔记

我使用Integer[]而不是int[]允许使用Arrays.asList没有原始版本的。Integer首选,Long因为将值用作数组索引并且需要强制转换。

最终比我最好的程序风格要短 List由于类和方法名称的代价,解决方案。

这也击败了我尝试的一种解决方案,该解决方案将输入流式传输,映射到(值,索引)对,按值排序并映射到索引,这主要是由于收集流需要的包bag。

致谢

  • -5个字节感谢Nevay

1
您不需要jl->{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字节)。
涅瓦

2

Common Lisp,82个字节

(lambda(l)(loop as i in(sort(copy-seq l)'<)do(setf(elt l(print(position i l)))0)))

在线尝试!




2

MATLAB / 八度,29字节

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

在线尝试!


虽然您的答案是完美的MATLAB,但实际上您可以在Octave中的匿名函数中进行内联分配
桑契斯'17

好一个!我知道在线分配,但是我不知道您可以像这样直接输出
Luis Mendo

1
老实说,我也没有。我从类似的东西开始@(X)([~,y]=sort(X)),当我在寻找一种方法可以从中获取y信息时,我意识到y实际上是赋值的返回值,并且仔细检查后发现甚至不需要括号。MATLAB喜欢所有明确的东西;明确的八度会很高兴。
桑契斯'17

2

JavaScript(ES6),69个字节

0索引。适用于最多包含65,536个元素的列表。

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

测试用例


你能换成n=>a.indexOf(n)公正a.indexOf吗?
扎卡里

@Zacharý不幸的是没有。实例对象的方法不能用作回调。
Arnauld

@Zacharý更糟糕的是,Array#map将3个参数传递给回调函数,并Array#indexOf期望2个参数,因此它将给出不期望的结果。
kamoroso94


2

外壳10 7字节

这是我的Haskell答案(也被1索引)的直接端口:

m→O`z,N

在线尝试!

取消/解释

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

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

在线尝试!

List<Integer>,返回Stream<Integer>包含结果的。

我们从初始列表中获得一个Stream,对其进行排序,然后将每个数字映射到列表中的索引。为了容纳重复的元素,我们将列表中的原始元素设置为0


2

SmileBASIC, 67 bytes

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

Very simple, all it does is generate a list of numbers from 1 to (length of array) and sort this by the same order as the input.


2

Python 3 with Numpy, 38 26 bytes

12 bytes saved thanks to Jo King (no need to give the function a name)

import numpy
numpy.argsort

Output is 0-based.

Try it online!


The function could just be numpy.argsort without the lambda part
Jo King

@JoKing Thanks for the suggestion. I wrote it that way because with just numpy.argsort;import numpy I get an error (numpy has not been imported yet), and with import numpy;numpy.argsort I need to move f= to the code part. Do you know that the standard procedure is in these cases? Move the f= and not count it?
Luis Mendo

Yeah, I guess. Maybe just redefine f=numpy.argsort in the footer
Jo King

@JoKing Good idea. Done. Thanks!
Luis Mendo



1

PHP, 54 bytes

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

Try it online!

This is zero-indexed. Simply sorts the array and returns the keys.


1
The <?php tag is unnecessary for a function. 48 bytes.
Titus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.