Найти индексы значений в одном списке в другом

21

Вы должны взять два списка положительных целых чисел в качестве входных данных, давайте назовем их n и m .

Вы можете предположить, что:

  • Все целые числа в n являются частью m
  • Все целые числа в m уникальны
  • Списки непустые

Задача: вернуть индексы, где вы найдете значения в n , в m .

Это может сбивать с толку, но я думаю, что контрольные примеры прояснят задачу. Примеры с 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
Любопытно, почему вы спрашиваете, но да, конечно ...
Стьюи Гриффин

Ответы:

13

V , 26 байтов

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

Попробуйте онлайн!

Это очень странное и хакерское решение, потому что V практически не имеет понятия о числах. Вход поступает в следующем формате:

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

С завершающим пробелом в каждой строке.

HexDump:

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)

Если это не делает его более понятным, вот примеры буфера на различных этапах, через которые проходит цикл:

Этап 1 ( |это курсор)

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
DJMcMayhem
источник
8

APL (Dyalog) , 1 байт

Попробуйте онлайн!

Примечание: функция не принимает скаляры в качестве левого аргумента, поэтому, чтобы дать ей левый аргумент, например 54, вы должны превратить его в массив, используя ,аналогично (,54).

Kritixi Lithos
источник
7

Mathematica, 25 байтов

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

Принимает два входа mи n, и возвращает основанные на 1 индексы nв m.

Мартин Эндер
источник
6

Сетчатка , 32 31 30 байт

1 байт сохранен благодаря Kritixi Lithos и 1 байт благодаря Martin Ender

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

Использует 0-индексацию. Ввод имеет пробел в каждой строке.

Попробуйте онлайн!

объяснение

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

Здесь мы заменяем каждое число в первой строке на число чисел перед тем же числом во второй строке.

G1`

Затем мы удаляем вторую строку, оставляя только новую первую строку в качестве вывода.

Бизнес Кот
источник
5

C #, 32 байта

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

Это код лямбда-выражения, поэтому он должен быть действительным.

Решение с индексом на основе 0. Я думаю, что это довольно просто, как это работает - он просто берет элементы n и выбирает индексы элементов в m.

MetaColon
источник
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
XNOR
источник
3

к, 1

Это встроенный оператор, kиспользующий индексацию с нуля.

?

Пример:

k)6 8 4 1 2 5 3 100 ? 5 3 4 1
5 6 2 3
skeevey
источник
2

JavaScript (ES6), 28 байт

Принимает массивы в карри синтаксисе (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])))

Arnauld
источник
2

Perl 6 , 31 байт

->\n,\m{n.map:{m.first($_,:k)}}

Попытайся

Expanded:

-> \n, \m {  # pointy block lambda

  n.map: {            # map over the values in 「n」
    m.first( $_, :k ) # return the key 「:k」 of the first occurrence
  }
}

0 проиндексировано

Брэд Гилберт b2gills
источник
2

Japt , 4 байта

m!bV

Проверьте это онлайн!

объяснение

Здесь не так много, чтобы объяснить, но это демонстрирует интересную особенность Japt. Обычно вы передаете функцию m, например, так:

mX{VbX}

Это в основном U.map(X => V.indexOf(X))( Uнеявно). Однако, когда вы просто выполняете одну операцию между двумя значениями ( bздесь, on Vи X), вы можете просто дать оператору и другое значение, и Japt сделает из него функцию. Это означает, что mX{X+2}можно играть в гольфm+2 .

Тем не менее, это не работает, когда значения находятся в неправильном порядке ( mbVбудет сокращенно mX{XbV}). Чтобы обойти это, вы можете добавить к оператору восклицательный знак, который сообщает Japt об обмене операндами. Это стоит дополнительный байт, но он все же на пару байт короче, чем альтернатива. И теперь вы знаете немного больше о Джапте.

ETHproductions
источник
2

MATL , 2 байта

&m

Это использует 1-индексирование. Попробуйте онлайн!

объяснение

Мета-функция &указывает, что следующая функция будет использовать (специфичную для функции) вторичную спецификацию входа / выхода по умолчанию. Для функции m( ismember) &указывает, что будет получен ее второй вывод. Он содержит индекс (первое вхождение) каждой записи первого входа во втором входе.

Луис Мендо
источник
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)где iесть индекс eв m. Держите iгде eравен текущему элементу n.

Ними
источник
2

R, 20 5 байт

1-индексированных; matchэто встроенная функция, которая находит индексы на втором входе элементов первого, т.е. match(n,m)дает желаемый ответ

match

спасибо @flodel за указание на то, что возврат функции вполне приемлем в качестве ответа!

Попробуйте онлайн!

Giuseppe
источник
2
Я думаю, что match(5 байт) было бы приемлемым решением.
flodel
Вы правы, обновлены.
Джузеппе
1

J , 2 байта

i.

Это не полная программа, а встроенная функция.

Используйте его как таковой:

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

Попробуйте онлайн!

Обратите внимание, что здесь используется 0-индексирование.

Дрянная Монахиня
источник
1

CJam , 4 байта

{f#}

Анонимный блок, который ожидает аргументы в стеке и оставляет результат в стеке.

Использует 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

Clojure, 25 байт

#(map(zipmap %2(range))%)

0 индексированные.

NikoNyrh
источник
1

Perl 5, 38 34 байта

4 байта сохранены благодаря Dada

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

1-индексироваться. Принимает списки m и n как единый список, например f(@m,@n). Это x0просто для того, чтобы вывод не начинался 1,2,3,4,5и т. Д.

Крис
источник
Хороший ответ. Обратите внимание, что анонимные функции разрешены, поэтому sub{...}вы можете сэкономить 2 байта. Кроме того, вы можете использовать x0вместо того, &&()чтобы сохранить еще два байта.
Дада
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]
Кевин Круйссен
источник