Tìm các chỉ số của các giá trị trong một danh sách trong một danh sách khác


21

Bạn phải lấy hai danh sách các số nguyên dương làm đầu vào, hãy gọi nm này .

Bạn có thể cho rằng:

  • Tất cả các số nguyên trong n là một phần của m
  • Tất cả các số nguyên trong m là duy nhất
  • Các danh sách không trống

Thách thức: Trả về các chỉ số về nơi bạn tìm thấy các giá trị tính bằng n , tính bằng m .

Điều đó có thể gây nhầm lẫn, nhưng tôi nghĩ các trường hợp thử nghiệm sẽ làm cho nhiệm vụ khá rõ ràng. Các ví dụ được lập chỉ mục 1, bạn có thể chọn 0 chỉ mục nếu bạn muốn (vui lòng ghi rõ).

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

Những người chiến thắng sẽ là giải pháp ngắn nhất trong mỗi ngôn ngữ.


Đây là một siêu bài rất hay!


Đây có thể là một câu hỏi lạ, nhưng liệu có ổn không khi cho rằng đầu vào sẽ có một khoảng trống?
DJMcMayhem

Tò mò tại sao bạn hỏi, nhưng ừ, chắc chắn ...
Stewie Griffin

Câu trả lời:


13

V , 26 byte

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

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

Đây là một giải pháp rất lạ và hacky, vì V có rất ít khái niệm về con số. Đầu vào có định dạng này:

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

Với một không gian dấu trên mỗi dòng.

Hexdump:

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

Giải trình:

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)

Nếu điều này không làm cho nó rõ ràng hơn, đây là các ví dụ về bộ đệm trong các giai đoạn khác nhau mà vòng lặp trải qua:

Giai đoạn 1 ( |là con trỏ)

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

Giai đoạn 2:

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

Giai đoạn 3:

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

Giai đoạn 4:

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

Giai đoạn 5:

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

Giai đoạn 6:

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

Giai đoạn 7:

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

Quay lại giai đoạn 1:

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


8

APL (Dyalog) , 1 byte

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

Lưu ý: hàm không lấy vô hướng làm đối số bên trái của nó, vì vậy để cung cấp cho nó một đối số bên trái như thế 54, bạn phải biến nó thành một mảng bằng cách sử dụng ,như vậy (,54).


7

Toán học, 25 byte

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

Đưa hai đầu vào mn, và trả về 1 dựa trên chỉ số của ntrong m.


6

Võng mạc , 32 31 30 byte

Lưu 1 byte nhờ Kritixi Lithos và 1 byte nhờ Martin Ender

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

Sử dụng chỉ mục 0. Đầu vào có một không gian dấu trên mỗi dòng.

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

Giải trình

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

Ở đây chúng tôi thay thế mỗi số trên dòng đầu tiên bằng số lượng trước cùng một số trên dòng thứ hai.

G1`

Sau đó, chúng tôi xóa dòng thứ hai, chỉ để lại dòng đầu tiên mới làm đầu ra.



5

C #, 32 byte

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

Đây là mã dưới dạng biểu thức lambda, vì vậy nó phải hợp lệ.

Giải pháp là với chỉ số dựa trên 0. Tôi nghĩ rằng nó khá khó khăn về phía trước cách thức hoạt động - nó chỉ đơn giản là lấy các mục của n và chọn các chỉ số của các mục trong m.



4

Haskell , 32 byte

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

Hãy thử trực tuyến! Một chỉ mục.

Những nỗ lực khác:

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

Đây là một toán tử tích hợp trong kvà sử dụng lập chỉ mục dựa trên zero.

?

Thí dụ:

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



2

JavaScript (ES6), 28 byte

Đưa các mảng trong cú pháp currying (n)(m). Chỉ số 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

Perl 6 , 31 byte

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

Thử nó

Mở rộng:

-> \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 được lập chỉ mục


2

Japt , 4 byte

m!bV

Kiểm tra nó trực tuyến!

Giải trình

Không có nhiều điều để giải thích ở đây, nhưng nó cho thấy một tính năng thú vị của Japt. Thông thường, bạn sẽ truyền một hàm cho m, như vậy:

mX{VbX}

Điều này về cơ bản U.map(X => V.indexOf(X))( Ulà ẩn). Tuy nhiên, khi bạn chỉ thực hiện một thao tác giữa hai giá trị ( bở đây, trên VX), bạn chỉ có thể cung cấp cho toán tử và giá trị khác và Japt sẽ tạo một hàm từ đó. Điều này có nghĩa là mX{X+2}có thể được chơi golf m+2.

Tuy nhiên, điều này không hoạt động khi các giá trị sai thứ tự ( mbVsẽ viết tắt mX{XbV}). Để giải quyết vấn đề này, bạn có thể thêm dấu chấm than cho toán tử, thông báo cho Japt để hoán đổi toán hạng. Điều này tốn thêm một byte, nhưng nó vẫn ngắn hơn một vài byte so với giải pháp thay thế. Và bây giờ bạn biết thêm một chút về Japt.


2

MATL , 2 byte

&m

Điều này sử dụng lập chỉ mục 1. Hãy thử trực tuyến!

Giải trình

Hàm meta &chỉ ra rằng hàm tiếp theo sẽ sử dụng thông số vào / ra mặc định thứ cấp (dành riêng cho chức năng). Đối với hàm m( ismember), &chỉ định rằng đầu ra thứ hai của nó sẽ được tạo ra. Điều này chứa chỉ số của (lần xuất hiện đầu tiên) của mỗi mục nhập của đầu vào đầu tiên trong đầu vào thứ hai.


2

Haskell, 34 byte

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

Ví dụ sử dụng: [5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

Tích hợp sẵn elemIndextrong Data.Listvà do đó dài hơn phiên bản trên. Các vòng ngoài đi qua nvà vòng lặp bên trong thông qua cặp (i,e)nơi ilà chỉ số của etrong m. Giữ vị itrí ebằng với phần tử hiện tại của n.


2

R, 20 5 byte

1 chỉ số; matchlà hàm dựng sẵn tìm các chỉ số trong đầu vào thứ hai của các phần tử của hàm thứ nhất, nghĩa là, match(n,m)cho câu trả lời mong muốn

match

cảm ơn @flodel vì đã chỉ ra rằng việc trả về một hàm là hoàn toàn chấp nhận được như một câu trả lời!

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


2
Tôi nghĩ match(5 byte) một mình sẽ là một giải pháp chấp nhận được.
flodel

bạn đúng, cập nhật.
Giuseppe


1

J , 2 byte

i.

Đây không phải là một chương trình hoàn chỉnh, mà là một chức năng tích hợp.

Sử dụng nó như vậy:

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

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

Lưu ý rằng điều này sử dụng lập chỉ mục 0.



1

Haskell, 43 byte

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 byte

4 byte được lưu nhờ Dada

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

1 chỉ mục. Lấy danh sách mn dưới dạng một danh sách, như f(@m,@n). Đây x0chỉ là để giữ cho đầu ra bắt đầu với 1,2,3,4,5, vv


Câu trả lời tốt đẹp. Lưu ý rằng các hàm ẩn danh được cho phép, vì vậy sub{...}có thể giúp bạn tiết kiệm 2 byte. Ngoài ra, bạn có thể sử dụng x0thay vì &&()để lưu thêm hai byte.
Dada

1

PHP, 56 byte

Phiên bản trực tuyến

0 lập chỉ mục

đầu ra dưới dạng Chuỗi

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

PHP, 65 byte

Đầu ra dưới dạng mảng

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

PHP, 78 byte

cách giải quyết với array_map

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

không phải là mảng duy nhất thay thế bằng array_flip($_GET[1])[$v] array_search($v,$_GET[1])



0

Java 7, 80 byte

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

Chỉ số 0

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

[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]
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.