在另一个列表中找到值的索引


21

您必须将两个正整数列表作为输入,我们将其称为nm

您可以假设:

  • n中的所有整数都是m的一部分
  • m中的所有整数都是唯一的
  • 列表非空

挑战:返回在m中的n中找到值的位置的索引。

这可能会令人困惑,但是我认为测试用例将使任务非常清晰。示例是1索引的,如果需要,可以选择0索引(请指定)。

n = 5 3 4 1
m = 6 8 4 1 2 5 3 100
output: 6 7 3 4    // 5 is in the 6th position of m 
                   // 3 is in the 7th position of m
                   // 4 is in the 3rd position of m
                   // 1 is in the 4th position of m

n = 5 3 4 9 7 5 7
m = 3 4 5 7 9
output: 3 1 2 5 4 3 4

n = 1 2 3 4 5 6
m = 1 2 3 4 5 6
output: 1 2 3 4 5 6

n = 16 27 18 12 6 26 11 24 26 20 2 8 7 12 5 22 22 2 17 4
m = 15 18 11 16 14 20 37 38 6 36 8 32 21 2 31 22 33 4 1 35 3 25 9 30 26 39 5 23 29 10 13 12 7 19 24 17 34 27 40 28
output: 4 38 2 32 9 25 3 35 25 6 14 11 33 32 27 16 16 14 36 18

n = 54
m = 54
output: 1

获奖者将是每种语言中最短的解决方案。


顺便说一句,是一个非常好的元发布!


这可能是一个奇怪的问题,但是可以确定输入将带有尾随空格吗?
DJMcMayhem

很好奇您为什么要问,但是,是的……
Stewie Griffin

Answers:


13

V,26字节

jòdf kÄ/-
DÓÓ
ÒC1@"Gòdk

在线尝试!

这是一个非常奇怪且棘手的解决方案,因为V几乎没有数字概念。输入格式如下:

6 8 4 1 2 5 3 100 
5 3 4 1 

每行末尾都有空格。

十六进制转储:

00000000: 6af2 6466 206b c42f 122d 0a44 d3d3 0ad2  j.df k./.-.D....
00000010: 0143 311b 4022 47f2 646b                 .C1.@"G.dk

说明:

j                   " Move down one line (to N) (1)
 ò                  " Recursively:
  df                "   (d)elete until you (f)ind a space. This will be saved into
                    "   register '-' (2)
     k              "   Move up one line (to M)
      Ä             "   Duplicate line M (3)
       /<C-r>-      "   Move the cursor forward until the next occurence of register '-' 
                    "   (the number we deleted from N)
                    "   (4)
D                   "   Delete every character *after* the cursor (5)
 ÓÓ                 "   Remove everything on this line except for whitespace
Ò<C-a>              "   Replace every character on this line with `<C-a>`, which is the 
                    "   command for incrementing a number (6)
      C             "   Delete this line into register '"', and enter insert mode
       1<esc>       "   Enter a '1' and return to normal mode
             @"     "   Run register '"' as V code (7)
               G    "   Go to the last line (1)
                ò   " End recursion
                 dk " Delete the last two lines (m and n)

如果这还不清楚,下面是循环执行各个阶段的缓冲区示例:

第一阶段(|是光标)

6 8 4 1 2 5 3 100
|5 3 4 1

阶段2:

6 8 4 1 2 5 3 100
|3 4 1

阶段3:

|6 8 4 1 2 5 3 100
6 8 4 1 2 5 3 100
3 4 1

阶段4:

6 8 4 1 2 |5 3 100
6 8 4 1 2 5 3 100
3 4 1

阶段5:

6 8 4 1 2 |
6 8 4 1 2 5 3 100
3 4 1

阶段6:

|<C-a><C-a><C-a><C-a><C-a>
6 8 4 1 2 5 3 100
3 4 1

阶段7:

|6
6 8 4 1 2 5 3 100
3 4 1

返回阶段1:

6
6 8 4 1 2 5 3 100
|3 4 1



7

Mathematica,25个字节

#&@@@PositionIndex@#/@#2&

接受两个输入mand n,并返回nin中从1开始的索引m


6

视网膜32 31 30字节

感谢Kritixi Lithos,节省了1个字节,感谢Martin Ender,节省了1个字节

(\d+)(?=.*¶(\d+ )*\1 )
$#2
G1`

使用0索引。输入在每行上都有一个尾随空格。

在线尝试!

说明

(\d+)(?=.*¶(\d+ )*\1 )
$#2

在这里,我们用第二行相同数字之前的数字替换第一行中的每个数字。

G1`

然后,我们删除第二行,仅保留新的第一行作为输出。



5

C#,32字节

(n,m)=>n.Select(i=>m.IndexOf(i))

这是作为lambda表达式的代码,因此它应该有效。

解决方案是基于0的索引。我认为这是非常有效的方法-它仅取n项并选择m中项的索引。



4

Haskell,32个字节

a%b=[length$fst$span(/=x)b|x<-a]

在线尝试!一索引。

其他尝试:

q(h:t)x|x==h=0|1>0=1+q t x;map.q
f b=map$length.fst.($b).span.(/=)
a%b=[until((==x).(b!!))(+1)0|x<-a]
a%b=[until(\y->x==b!!y)(+1)0|x<-a]
import Data.List;map.flip elemIndex

3

k,1

这是内置的运算符,k并使用基于零的索引。

?

例:

k)6 8 4 1 2 5 3 100 ? 5 3 4 1
5 6 2 3



2

JavaScript(ES6),28个字节

采用currying语法的数组(n)(m)。0索引。

let f =

n=>m=>n.map(v=>m.indexOf(v))

console.log(JSON.stringify(f([5,3,4,1])([6,8,4,1,2,5,3,100])))
console.log(JSON.stringify(f([5,3,4,9,7,5,7])([3,4,5,7,9])))
console.log(JSON.stringify(f([1,2,3,4,5,6])([1,2,3,4,5,6])))
console.log(JSON.stringify(f([16,27,18,12,6,26,11,24,26,20,2,8,7,12,5,22,22,2,17,4])([15,18,11,16,14,20,37,38,6,36,8,32,21,2,31,22,33,4,1,35,3,25,9,30,26,39,5,23,29,10,13,12,7,19,24,17,34,27,40,28])))
console.log(JSON.stringify(f([54])([54])))



2

Japt,4个字节

m!bV

在线测试!

说明

这里没有太多要解释的东西,但是它展示了Japt的有趣功能。通常,您可以将一个函数传递给m,如下所示:

mX{VbX}

这基本上是U.map(X => V.indexOf(X))U隐式的)。但是,当您只是在两个值(b此处为on VX)之间执行一个操作时,您可以给运算符和另一个值,而Japt将从中得到一个函数。这意味着mX{X+2}可以打高尔夫球m+2

但是,如果值的顺序错误(mbV这是的缩写mX{XbV}),则此方法不起作用。为了解决这个问题,您可以在运算符前添加一个感叹号,该符号告诉Japt交换操作数。这会花费一个额外的字节,但仍比替代字节短几个字节。现在,您对Japt有了更多了解。


2

MATL,2个字节

&m

这使用1索引。在线尝试!

说明

元功能&指示下一个功能将使用(特定于功能的)辅助默认输入/输出规范。对于函数mismember),&指定将产生第二个输出。它包含第二个输入中第一个输入的每个条目的索引(第一次出现)。


2

Haskell,34个字节

n#m=[i|a<-n,(i,e)<-zip[1..]m,e==a]

用法示例:[5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

内置elemIndex在其中Data.List,因此比上述版本更长。外循环通过n,内循环通过(i,e)其中in i的索引对。保持where 等于当前元素emien


2

R, 20 5个字节

1分索引;match是内置函数,用于在第一个元素的第二个输入中找到索引,即match(n,m)给出所需的答案

match

感谢@flodel指出返回函数完全可以作为答案!

在线尝试!


2
我认为仅match(5个字节)将是一个可以接受的解决方案。
flodel

您是正确的,已更新。
朱塞佩


1

J,2个字节

i.

这不是一个完整的程序,而是一个内置函数。

像这样使用它:

echo 6 8 4 1 2 5 3 100 i. 5 3 4 1

在线尝试!

请注意,这使用0索引。



1

Haskell,43个字节

a*b=[[fst x|x<-zip[0..]b,y==snd x]!!0|y<-a]
a*b=                                         -- define function * with 2 args
    [                                |y<-a]  -- for each elt in first arg
               zip[0..]b                     -- match elts in second arg w/ idxs
                                             -- [a,b,c] -> [[0,a],[1,b],[2,c]]
     [fst x|x<-                  ]           -- take first element in each pair
                        ,y==snd x            -- if the index matches
                                  !!0        -- first element (always only 1)


1

Perl 5,38 34字节

多亏了达达,节省了4个字节

sub{map$x{$_}//($x{$_}=++$x)x0,@_}

1个索引。将列表mn视为一个列表,例如f(@m,@n)。的x0只是保持输出从开始1,2,3,4,5


好答案。请注意,允许使用匿名函数,因此sub{...}可以节省2个字节。同样,您可以使用x0而不是&&()节省另外两个字节。
Dada's

1

PHP,56字节

在线版本

0索引

输出为字符串

<?foreach($_GET[0]as$v)echo" ".array_flip($_GET[1])[$v];

PHP,65字节

输出为数组

<?foreach($_GET[0]as$v)$r[]=array_flip($_GET[1])[$v];print_r($r);

PHP,78字节

解决方法 array_map

<?print_r(array_map(function($v){return array_flip($_GET[1])[$v];},$_GET[0]));

对于非唯一数组替换为 array_flip($_GET[1])[$v] array_search($v,$_GET[1])



0

Java 7,80字节

void c(int[]a,java.util.List b){for(int i=0;i<a.length;a[i]=b.indexOf(a[i++]));}

0索引

说明:

void c(int[]a,java.util.List b){  // Method with integer-array and List parameters
  for(int i=0;i<a.length;         //  Loop over the integer-array
    a[i]=b.indexOf(a[i++])        //   And change every value to the index of the List
  );                              //  End of loop (no body)
}                                 // End of method

测试代码:

在这里尝试。

import java.util.Arrays;
class M{
  static void c(int[]a,java.util.List b){for(int i=0;i<a.length;a[i]=b.indexOf(a[i++]));}

  public static void main(String[] a){
    int[] x = new int[]{ 5, 3, 4, 1 };
    c(x, Arrays.asList(6, 8, 4, 1, 2, 5, 3, 100));
    System.out.println(Arrays.toString(x));

    x = new int[]{ 5, 3, 4, 9, 7, 5, 7 };
    c(x, Arrays.asList(3, 4, 5, 7, 9));
    System.out.println(Arrays.toString(x));

    x = new int[]{ 1, 2, 3, 4, 5, 6 };
    c(x, Arrays.asList(1, 2, 3, 4, 5, 6));
    System.out.println(Arrays.toString(x));


    x = new int[]{ 16, 27, 18, 12, 6, 26, 11, 24, 26, 20, 2, 8, 7, 12, 5, 22, 22, 2, 17, 4 };
    c(x, Arrays.asList(15, 18, 11, 16, 14, 20, 37, 38, 6, 36, 8, 32, 21, 2, 31, 22, 33, 4, 1, 35, 3, 25, 9, 30, 26, 39, 5, 23, 29, 10, 13, 12, 7, 19, 24, 17, 34, 27, 40, 28));
    System.out.println(Arrays.toString(x));


    x = new int[]{ 54 };
    c(x, Arrays.asList(54));
    System.out.println(Arrays.toString(x));
  }
}

输出:

[5, 6, 2, 3]
[2, 0, 1, 4, 3, 2, 3]
[0, 1, 2, 3, 4, 5]
[3, 37, 1, 31, 8, 24, 2, 34, 24, 5, 13, 10, 32, 31, 26, 15, 15, 13, 35, 17]
[0]
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.