Temukan indeks nilai dalam satu daftar di daftar lainnya


21

Anda harus mengambil dua daftar bilangan bulat positif sebagai input, sebut saja n dan m ini .

Anda dapat berasumsi bahwa:

  • Semua bilangan bulat di n adalah bagian dari m
  • Semua bilangan bulat dalam m adalah unik
  • Daftarnya tidak kosong

Tantangan: Mengembalikan indeks tempat Anda menemukan nilai dalam n , dalam m .

Itu mungkin membingungkan, tapi saya pikir test case akan membuat tugasnya cukup jelas. Contohnya adalah 1-diindeks, Anda dapat memilih 0-diindeks jika Anda ingin (mohon sebutkan).

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

Pemenang akan menjadi solusi terpendek dalam setiap bahasa.


Ngomong-ngomong, ini adalah meta-post yang sangat bagus!


Ini mungkin pertanyaan aneh, tetapi apakah boleh untuk menganggap input akan memiliki ruang tambahan?
DJMcMayhem

Ingin tahu mengapa Anda bertanya, tapi ya, tentu ...
Stewie Griffin

Jawaban:


13

V , 26 byte

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

Cobalah online!

Ini adalah solusi yang sangat aneh dan peretasan, karena V memiliki sedikit atau tanpa konsep angka. Masukan datang dalam format ini:

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

Dengan spasi tambahan di setiap baris.

Hexdump:

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

Penjelasan:

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)

Jika ini tidak membuatnya lebih jelas, berikut adalah contoh buffer selama berbagai tahap yang dilalui loop:

Tahap 1 ( |adalah kursor)

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

Tahap 2:

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

Tahap 3:

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

Tahap 4:

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

Tahap 5:

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

Tahap 6:

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

Tahap 7:

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

Kembali ke tahap 1:

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


8

APL (Dyalog) , 1 byte

Cobalah online!

Catatan: fungsi tidak mengambil skalar sebagai argumen kirinya, jadi untuk memberikan argumen kiri seperti 54, Anda harus membuatnya menjadi array menggunakan ,seperti itu (,54).


7

Mathematica, 25 byte

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

Mengambil dua input mdan n, dan mengembalikan indeks berbasis 1 ndi m.


6

Retina , 32 31 30 byte

1 byte disimpan berkat Kritixi Lithos dan 1 byte terima kasih kepada Martin Ender

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

Menggunakan pengindeksan 0. Input memiliki ruang tambahan di setiap baris.

Cobalah online!

Penjelasan

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

Di sini kita mengganti setiap angka pada baris pertama dengan jumlah angka sebelum angka yang sama pada baris kedua.

G1`

Kemudian, kami menghapus baris kedua, hanya menyisakan baris pertama yang baru sebagai output.



5

C #, 32 Bytes

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

Ini adalah kode sebagai ekspresi lambda, jadi harus valid.

Solusinya adalah dengan indeks berbasis 0. Saya pikir ini cukup maju bagaimana cara kerjanya - itu hanya mengambil item dari n dan memilih indeks item dalam m.



4

Haskell , 32 byte

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

Cobalah online! Diindeks satu.

Upaya lain:

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

Ini adalah operator bawaan kdan menggunakan pengindeksan berbasis nol.

?

Contoh:

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



2

JavaScript (ES6), 28 byte

Mengambil array dalam sintaks currying (n)(m). Diindeks 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)}}

Cobalah

Diperluas:

-> \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 diindeks


2

Japt , 4 byte

m!bV

Uji secara online!

Penjelasan

Tidak banyak yang bisa dijelaskan di sini, tetapi memamerkan fitur menarik dari Japt. Biasanya, Anda akan melewatkan fungsi m, seperti:

mX{VbX}

Ini pada dasarnya U.map(X => V.indexOf(X))(yang Utersirat). Namun, ketika Anda hanya melakukan satu operasi antara dua nilai (di bsini, di Vdan X), Anda bisa memberikan operator dan nilai lainnya dan Japt akan membuat fungsi dari itu. Ini berarti mX{X+2}bisa bermain golf m+2.

Namun, ini tidak berfungsi ketika nilainya berada di urutan yang salah ( mbVakan kependekan dari mX{XbV}). Untuk menyiasatinya, Anda dapat menambahkan tanda seru ke operator, yang memberitahu Japt untuk menukar operan. Ini membutuhkan byte tambahan, tetapi beberapa byte lebih pendek daripada alternatifnya. Dan sekarang Anda tahu lebih banyak tentang Japt.


2

MATL , 2 byte

&m

Ini menggunakan pengindeksan 1. Cobalah online!

Penjelasan

Fungsi-meta &menunjukkan bahwa fungsi berikutnya akan menggunakan spesifikasi sekunder masuk / keluar default (khusus fungsi). Untuk function m( ismember), &menentukan bahwa output keduanya akan diproduksi. Ini berisi indeks (kejadian pertama) setiap entri input pertama pada input kedua.


2

Haskell, 34 byte

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

Contoh penggunaan: [5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

Built-in elemIndexdalam Data.Listdan karena itu lebih lama dari versi di atas. Lingkaran luar melewatin dan loop dalam melalui pasangan di (i,e)mana iadalah indeks ein m. Jaga idimana esama dengan elemen saat ini n.


2

R, 20 5 byte

1-diindeks; matchadalah fungsi bawaan yang menemukan indeks pada input kedua dari elemen pertama, yaitu match(n,m)memberikan jawaban yang diinginkan

match

terima kasih kepada @flodel untuk menunjukkan bahwa mengembalikan fungsi dapat diterima sebagai jawaban!

Cobalah online!


2
Saya pikir match(5 byte) saja akan menjadi solusi yang dapat diterima.
flodel

Anda benar, diperbarui.
Giuseppe


1

J , 2 byte

i.

Ini bukan program lengkap, tetapi fungsi bawaan.

Gunakan seperti itu:

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

Cobalah online!

Perhatikan bahwa ini menggunakan pengindeksan 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 disimpan berkat Dada

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

1-diindeks. Mengambil daftar m dan n sebagai daftar tunggal, seperti f(@m,@n). The x0hanya untuk menjaga output dari mulai dengan 1,2,3,4,5, dll


Jawaban bagus. Perhatikan bahwa fungsi anonim diizinkan, sehingga sub{...}dapat menghemat 2 byte. Selain itu, Anda dapat menggunakan x0alih-alih &&()menyimpan dua byte lagi.
Dada

1

PHP, 56 Bytes

Versi Online

0 Pengindeksan

output sebagai String

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

PHP, 65 Bytes

Keluaran sebagai array

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

PHP, 78 Bytes

solusi dengan array_map

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

untuk array tidak unik ganti dengan 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++]));}

Diindeks 0

Penjelasan:

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

Kode uji:

Coba di sini.

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

Keluaran:

[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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.