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!

Stewie Griffin
sumber
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
DJMcMayhem
sumber
9

Python 2 , 25 byte

lambda a,b:map(a.index,b)

Cobalah online!

Perhatikan bahwa ini menggunakan pengindeksan 0.

Biarawati Bocor
sumber
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).

Kritixi Lithos
sumber
7

Mathematica, 25 byte

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

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

Martin Ender
sumber
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.

Kucing Bisnis
sumber
5

Jawa , 104 81 byte

1 byte berkat Business cat.

void f(int[]a,int[]b){for(int i=0,j=0;i<b.length;)j=a[j++]==b[i]?0*(b[i++]=j):j;}

Cobalah online!

Biarawati Bocor
sumber
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.

MetaColon
sumber
4

Oktaf, 25 byte

@(n,m)([x,~]=find(n==m'))

Cobalah online!

rahnema1
sumber
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
Tidak
sumber
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
skeevey
sumber
2

05AB1E , 5 byte

v²yk,

Cobalah online!

v     # For each value in n (call it y)
 ²    # Push m
  y   # Push y
   k, # Print the 0-indexed index of y in m
Riley
sumber
2

Jelly , 3 byte

iЀ

Cobalah online!

Spesifikasi

  • Input: dua argumen, yang pertama adalah m , dan yang kedua adalah n .
  • Output: satu array
Biarawati Bocor
sumber
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])))

Arnauld
sumber
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

Brad Gilbert b2gills
sumber
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.

Produksi ETH
sumber
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.

Luis Mendo
sumber
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.

nimi
sumber
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!

Giuseppe
sumber
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.

Biarawati Bocor
sumber
1

CJam , 4 byte

{f#}

Blok anonim yang mengharapkan argumen pada stack dan meninggalkan hasilnya pada stack.

Menggunakan pengindeksan 0.

Cobalah online!

Kucing Bisnis
sumber
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)
Gagang pintu
sumber
1

Clojure, 25 byte

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

Diindeks 0.

NikoNyrh
sumber
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

Chris
sumber
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])

Jörg Hülsermann
sumber
0

Bash + coreutils, 51

for n in $1
do grep -wn $n <<<"$2"
done|cut -d: -f1

Cobalah online .


Jawaban sebelumnya:

s()(sort -$1k2)
nl|s|join -j2 - <(nl<<<"$1"|s)|s n|cut -d\  -f3

Cobalah online .

Trauma Digital
sumber
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]
Kevin Cruijssen
sumber