Trova gli indici dei valori in un elenco in un altro


21

Devi prendere due liste di numeri interi positivi come input, chiamiamoli n e m .

Puoi presumere che:

  • Tutti i numeri interi in n fanno parte di m
  • Tutti i numeri interi in m sono unici
  • Gli elenchi non sono vuoti

Sfida: restituisce gli indici di dove trovi i valori in n , in m .

Potrebbe essere fonte di confusione, ma penso che i casi di test renderanno il compito abbastanza chiaro. Gli esempi sono 1-indicizzati, puoi scegliere 0-indicizzati se vuoi (per favore specifica).

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

I vincitori saranno le soluzioni più brevi in ​​ogni lingua.


Questo è un bel post-post comunque!


Questa potrebbe essere una domanda strana, ma sarebbe OK supporre che l'input avrà uno spazio finale?
DJMcMayhem

Curioso perché lo chiedi, ma sì, certo ...
Stewie Griffin,

Risposte:


13

V , 26 byte

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

Provalo online!

Questa è una soluzione molto strana e confusa, perché V ha poco o nessun concetto di numeri. L'input è disponibile in questo formato:

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

Con uno spazio finale su ogni riga.

hexdump:

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

Spiegazione:

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)

Se ciò non lo rende più chiaro, ecco alcuni esempi del buffer durante le varie fasi attraversate dal loop:

Fase 1 ( |è il cursore)

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

Fase 2:

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

Fase 3:

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

Fase 4:

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

Fase 5:

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

Fase 6:

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

Fase 7:

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

Torna alla fase 1:

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


8

APL (Dyalog) , 1 byte

Provalo online!

Nota: la funzione non non prende scalari come argomento a sinistra, in modo da dare un argomento di sinistra come 54, si deve fare in un array utilizzando ,in questo modo (,54).


7

Mathematica, 25 byte

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

Prende due input me nrestituisce gli indici 1 nin di m.


6

Retina , 32 31 30 byte

1 byte salvato grazie a Kritixi Lithos e 1 byte grazie a Martin Ender

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

Utilizza l'indicizzazione 0. L'input ha uno spazio finale su ogni riga.

Provalo online!

Spiegazione

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

Qui sostituiamo ogni numero sulla prima riga con il numero di numeri prima dello stesso numero sulla seconda riga.

G1`

Quindi, eliminiamo la seconda riga, lasciando solo la nuova prima riga come output.



5

C #, 32 byte

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

Questo è il codice come espressione lambda, quindi dovrebbe essere valido.

La soluzione è con un indice basato su 0. Penso che sia abbastanza veloce come funziona: prende semplicemente gli elementi di n e seleziona gli indici degli elementi in m.



4

Haskell , 32 byte

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

Provalo online! One-indicizzato.

Altri tentativi:

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

Questo è un operatore integrato ke utilizza l'indicizzazione in base zero.

?

Esempio:

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



2

JavaScript (ES6), 28 byte

Accetta le matrici nella sintassi del curry (n)(m). 0-indicizzati.

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

Provalo

Allargato:

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


2

Japt , 4 byte

m!bV

Provalo online!

Spiegazione

Non c'è molto da spiegare qui, ma mostra un'interessante caratteristica di Japt. Normalmente, si passa una funzione a m, in questo modo:

mX{VbX}

Questo è fondamentalmente U.map(X => V.indexOf(X))(ilU è implicito). Tuttavia, quando stai solo eseguendo un'operazione tra due valori ( bqui, su Ve X), puoi semplicemente dare all'operatore e l'altro valore e Japt ne farà una funzione. Questo significa che mX{X+2}può essere giocato a golf m+2.

Tuttavia, questo non funziona quando i valori sono nell'ordine sbagliato ( mbVsarebbe l'abbreviazione dimX{XbV} ). Per ovviare a questo, è possibile anteporre un punto esclamativo all'operatore, che indica a Japt di scambiare gli operandi. Questo costa un byte extra, ma è ancora un paio di byte più corto dell'alternativa. E ora sai qualcosa in più su Japt.


2

MATL , 2 byte

&m

Questo utilizza 1-indicizzazione. Provalo online!

Spiegazione

La meta-funzione &indica che la funzione successiva utilizzerà una specifica in / out di default secondaria (specifica della funzione). Per function m( ismember), &specifica che verrà prodotto il suo secondo output. Questo contiene l'indice di (la prima occorrenza di) ciascuna voce del primo input nel secondo input.


2

Haskell, 34 byte

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

Esempio di utilizzo: [5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

Il built-in elemIndexè in Data.Liste quindi più lungo della versione precedente. Il ciclo esterno passa attraverso ne il ciclo interno attraverso coppie di (i,e)dove iè l'indice di ein m. Mantieni idove è euguale all'elemento corrente di n.


2

R, 20 5 byte

1-indicizzati; matchè la funzione incorporata che trova gli indici nel secondo input degli elementi del primo, ovvero match(n,m)fornisce la risposta desiderata

match

grazie a @flodel per aver sottolineato che la restituzione di una funzione è perfettamente accettabile come risposta!

Provalo online!


2
Penso che match(5 byte) da solo sarebbe una soluzione accettabile.
flodel

hai ragione, aggiornato.
Giuseppe,


1

J , 2 byte

i.

Questo non è un programma completo, ma una funzione integrata.

Usalo come tale:

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

Provalo online!

Si noti che questo utilizza l'indicizzazione 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

Clojure, 25 byte

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

0-indicizzati.


1

Perl 5, 38 34 byte

4 byte salvati grazie a Dada

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

1-indicizzati. Prende le liste m e n come una singola lista, come f(@m,@n). L' x0è solo per mantenere l'uscita dalla iniziano 1,2,3,4,5, etc.


Bella risposta. Si noti che sono consentite funzioni anonime, quindi è sub{...}possibile risparmiare 2 byte. Inoltre, è possibile utilizzare x0invece di &&()salvare altri due byte.
Dada,

1

PHP, 56 byte

Versioni online

0 indicizzazione

output come String

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

PHP, 65 byte

Uscita come matrice

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

PHP, 78 byte

soluzione con array_map

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

per matrici non uniche sostituire con 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++]));}

0-indicizzato

Spiegazione:

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

Codice di prova:

Provalo qui.

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

Produzione:

[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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.