Başka bir listedeki değerlerin endekslerini bulun


21

Girdi olarak iki pozitif tamsayı listesi almalısınız, hadi n ve m olarak adlandıralım .

Bunu varsayabilirsin:

  • N içindeki tüm tam sayılar m'nin bir parçasıdır
  • Tüm tamsayılar m benzersizdir
  • Listeler boş değil

Zorluk: Değerleri n olarak bulduğunuz yerin indekslerini m , m cinsinden döndürün .

Bu kafa karıştırıcı olabilir, ancak test durumlarının görevi oldukça netleştireceğini düşünüyorum. Örnekler 1 indekslidir, isterseniz 0 indeksli seçebilirsiniz (lütfen belirtin).

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

Kazananlar her dilde en kısa çözüm olacak.


Bu arada çok hoş bir meta-post!


Bu garip bir soru olabilir, ancak girişin sonunda bir boşluk olacağını varsaymak olur mu?
DJMcMayhem

Neden sorduğuna meraklısın, ama evet, elbette ...
Stewie Griffin

Yanıtlar:


13

V , 26 bayt

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

Çevrimiçi deneyin!

Bu çok garip ve sahte bir çözüm çünkü V'nin sayı kavramı yok denecek kadar az. Giriş bu biçimde gelir:

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

Her satırda bir boşluk ile.

HexDump:

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

Açıklama:

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)

Bu daha net yapmazsa, işte döngüden geçen çeşitli aşamalarda arabellek örnekleri:

Aşama 1 ( |imleç)

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

2. aşama:

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

Sahne 3:

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

4. Aşama:

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

Aşama 5:

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

Aşama 6:

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

Aşama 7:

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

1. aşamaya geri dönün:

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



7

Mathematica, 25 bayt

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

İki giriş alır mve nve 1-dayalı endeksleri döner nolarak m.


6

Retina , 32 31 30 bayt

Kritixi Lithos sayesinde 1 byte, Martin Ender sayesinde 1 byte kaydedildi

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

0 indeksleme kullanır. Giriş, her satırda bir boşluk bırakıyor.

Çevrimiçi deneyin!

açıklama

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

Burada ilk satırdaki her sayıyı, ikinci satırdaki aynı sayıdan önceki sayıların sayısıyla değiştiriyoruz.

G1`

Ardından, ikinci satırı sileriz ve çıktı olarak sadece yeni ilk satırı bırakırız.



5

C #, 32 Bayt

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

Bu bir lambda ifadesi olarak kod, bu nedenle geçerli olması gerekir.

Çözüm, 0 tabanlı bir indeks ile. Sanırım nasıl çalıştığını ileri doğru atıyor - sadece n'nin maddelerini alır ve m'nin içindeki maddelerin indekslerini seçer.



4

Haskell , 32 bayt

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

Çevrimiçi deneyin!Tek endekslendi.

Diğer girişimler:

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

Bu yerleşik bir operatördür kve sıfır tabanlı dizinlemeyi kullanır.

?

Örnek:

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



2

JavaScript (ES6), 28 bayt

Küme sözdizimi dizileri alır (n)(m). 0 endeksli.

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 bayt

m!bV

Çevrimiçi test edin!

açıklama

Burada açıklanacak fazla bir şey yok, ancak Japt'un ilginç bir özelliğini gösteriyor. Normalde, şöyle bir işlevi iletirsiniz m:

mX{VbX}

Bu temelde U.map(X => V.indexOf(X))( Uörtük). Ancak, iki değer arasında sadece bir işlemi gerçekleştirirken ( bburada Vve açık X), operatöre sadece diğer değeri verebilirsiniz ve Japt bunun dışında bir işlev görecektir. Bu, mX{X+2}golf oynayabileceği anlamına gelirm+2 .

Ancak, değerler yanlış sırada olduğunda işe yaramaz ( mbVbunun için kısa olur mX{XbV}). Bunu aşmak için, Japt'a operandları değiştirmesini söyleyen operatöre bir ünlem işareti hazırlayabilirsiniz. Bu, fazladan bir bayta mal olur, ancak hala alternatiften daha kısa bir kaç bayt. Ve şimdi Japt hakkında biraz daha fazla şey biliyorsun.


2

MATL , 2 bayt

&m

Bu 1 indeksleme kullanır. Çevrimiçi deneyin!

açıklama

Meta-fonksiyonu bir &sonraki fonksiyonun (fonksiyona özel) ikincil bir varsayılan giriş / çıkış özelliği kullanacağını belirtir. Function m( ismember) işlevi &için ikinci çıktının üretileceğini belirtir. Bu, ikinci girdideki birinci girişin her girişinin (ilk oluşumunun) dizinini içerir.


2

Haskell, 34 bayt

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

Kullanım örneği: [5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

Yerleşik elemIndexolduğu Data.Listbu nedenle uzun yukarıdaki sürümünden daha ve. Dış döngü geçer nve çiftleri ile iç döngü indisidir içinde . Tutun nerede şimdiki unsuru eşittir .(i,e)iemien


2

R, 20 5 bayt

1 endeksli; matchilk elemanların ikinci girişindeki indeksleri bulan yerleşik fonksiyondur, yani match(n,m)istenen cevabı verir.

match

@flodel'e, bir işlevi döndürmenin cevap olarak mükemmel bir şekilde kabul edilebilir olduğuna işaret ettiği için teşekkür ederiz!

Çevrimiçi deneyin!


2
Bence matchtek başına kabul edilebilir bir çözüm olacaktır (5 bayt).
flodel

haklısın, güncellendi.
Giuseppe




1

Haskell, 43 bayt

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 bayt

Dada sayesinde 4 bayt kaydedildi

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

1 endeksli. M ve n listelerini tek bir liste gibi alır f(@m,@n). Bu x0sadece çıktının başlamasını 1,2,3,4,5vb.


Güzel cevap İsimsiz fonksiyonlara izin verildiğini unutmayın, böylece sub{...}2 bayttan tasarruf edebilirsiniz. Ayrıca, iki bayt daha kaydetmek x0yerine kullanabilirsiniz &&().
Dada

1

PHP, 56 Bayt

Çevrimiçi Sürümler

0 Endeksleme

String olarak çıktı

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

PHP, 65 Bayt

Dizi olarak çıktı

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

PHP, 78 Bayt

geçici çözüm array_map

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

benzersiz olmayan diziler için array_flip($_GET[1])[$v] array_search($v,$_GET[1])



0

Java 7, 80 bayt

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

0 endeksli

Açıklama:

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

Test kodu:

Burada dene.

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

Çıktı:

[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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.