ค้นหาดัชนีของค่าในรายการหนึ่งในอีกรายการหนึ่ง


21

คุณต้องใช้เวลาสองรายการของจำนวนเต็มบวกเป็น input ขอเรียกเหล่าnและม.

คุณอาจคิดว่า:

  • จำนวนเต็มทั้งหมดในnเป็นส่วนหนึ่งของm
  • จำนวนเต็มทั้งหมดในmมีค่าไม่ซ้ำกัน
  • รายการไม่ว่างเปล่า

ถาม: การกลับมาของดัชนีที่คุณพบค่าในที่nในม.

อาจทำให้สับสน แต่ฉันคิดว่ากรณีทดสอบจะทำให้งานชัดเจน ตัวอย่างมีการจัดทำดัชนี 1 คุณสามารถเลือก 0 ดัชนีหากคุณต้องการ (โปรดระบุ)

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

ผู้ชนะจะเป็นคำตอบที่สั้นที่สุดในแต่ละภาษา


นี่คือเมตาโพสต์ที่ดีมากโดยวิธี!


นี่อาจเป็นคำถามที่แปลก แต่มันก็โอเคที่จะสมมติว่าอินพุตจะมีพื้นที่ต่อท้ายหรือไม่?
DJMcMayhem

อยากรู้ว่าทำไมคุณถึงถาม แต่ใช่แน่นอน ...
Stewie Griffin

คำตอบ:


13

V , 26 ไบต์

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

ลองออนไลน์!

นี่เป็นวิธีแก้ปัญหาที่แปลกและแฮ็คมากเนื่องจาก V ไม่มีแนวคิดเกี่ยวกับตัวเลข อินพุตมาในรูปแบบนี้:

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

ด้วยช่องว่างต่อท้ายในแต่ละบรรทัด

hexdump:

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

คำอธิบาย:

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)

หากสิ่งนี้ไม่ทำให้ชัดเจนยิ่งขึ้นนี่คือตัวอย่างของบัฟเฟอร์ในระหว่างขั้นตอนต่าง ๆ ที่ลูปผ่าน:

ด่าน 1 ( |เป็นเคอร์เซอร์)

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

ด่าน 2:

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

ด่าน 3:

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

ด่าน 4:

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

ด่าน 5:

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

ด่าน 6:

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

ด่าน 7:

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

กลับสู่สเตจ 1:

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


8

APL (Dyalog) 1 ไบต์

ลองออนไลน์!

หมายเหตุ: ฟังก์ชั่นไม่ได้ใช้สเกลาเป็นอาร์กิวเมนต์ซ้ายของตนเพื่อที่จะให้มันอาร์กิวเมนต์ซ้ายเช่น54คุณต้องทำให้มันกลายเป็นอาร์เรย์ใช้เช่นดังนั้น,(,54)


7

Mathematica ขนาด 25 ไบต์

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

ใช้เวลาสองปัจจัยการผลิตmและnและผลตอบแทนดัชนีตาม 1 ในnm


6

Retina , 32 31 30 ไบต์

บันทึก 1 ไบต์ขอบคุณ Kritixi Lithos และ 1 ไบต์ขอบคุณ Martin Ender

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

ใช้การจัดทำดัชนี 0 อินพุตมีช่องว่างต่อท้ายในแต่ละบรรทัด

ลองออนไลน์!

คำอธิบาย

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

ที่นี่เราแทนที่ทุกหมายเลขในบรรทัดแรกด้วยจำนวนของตัวเลขก่อนหมายเลขเดียวกันในบรรทัดที่สอง

G1`

จากนั้นเราลบบรรทัดที่สองเหลือเพียงบรรทัดแรกใหม่เป็นเอาต์พุต



5

C #, 32 ไบต์

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

นี่คือรหัสในรูปของแลมบ์ดาดังนั้นมันควรจะถูกต้อง

การแก้ปัญหาอยู่กับดัชนี 0 ตาม ฉันคิดว่ามันค่อนข้างจะก้าวหน้าไปข้างหน้าว่ามันทำงานอย่างไร - ใช้เวลาเพียงแค่รายการของ n และเลือกดัชนีของรายการเป็น m



4

Haskell , 32 ไบต์

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

ลองออนไลน์!หนึ่งในการจัดทำดัชนี

ความพยายามอื่น ๆ :

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

นี่คือโอเปอเรเตอร์ในตัวkและใช้การจัดทำดัชนีแบบ zero-based

?

ตัวอย่าง:

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



2

JavaScript (ES6), 28 ไบต์

(n)(m)ใช้เวลาในอาร์เรย์ไวยากรณ์ currying 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

Japt , 4 ไบต์

m!bV

ทดสอบออนไลน์!

คำอธิบาย

ไม่มีคำอธิบายมากมายที่นี่ แต่มันแสดงให้เห็นถึงคุณสมบัติที่น่าสนใจของ Japt โดยปกติคุณจะผ่านฟังก์ชั่นไปที่m:

mX{VbX}

นี่เป็นพื้นU.map(X => V.indexOf(X))( Uเป็นนัย) อย่างไรก็ตามเมื่อคุณเพียงแค่ทำการดำเนินการอย่างใดอย่างหนึ่งระหว่างสองค่า ( bที่นี่บนVและX) คุณสามารถให้โอเปอเรเตอร์กับค่าอื่น ๆ และ Japt จะทำให้ฟังก์ชั่นใช้งานได้ วิธีนี้สามารถที่จะแข็งแรงเล่นกอล์ฟmX{X+2}m+2

แต่นี้ไม่ทำงานเมื่อค่าที่อยู่ในคำสั่งที่ไม่ถูกต้อง ( mbVจะสั้นmX{XbV}) ในการหลีกเลี่ยงปัญหานี้คุณสามารถเพิ่มเครื่องหมายอัศเจรีย์ไปยังผู้ควบคุมเครื่องซึ่งบอกให้ Japtor แลกเปลี่ยนตัวถูกดำเนินการ ค่าใช้จ่ายนี้เป็นไบต์พิเศษ แต่ก็ยังสั้นกว่าอีกสองไบต์ และตอนนี้คุณรู้เพิ่มเติมเกี่ยวกับ Japt นิดหน่อย


2

MATL , 2 ไบต์

&m

สิ่งนี้ใช้การจัดทำดัชนี 1 ตัว ลองออนไลน์!

คำอธิบาย

เมตาฟังก์ชั่น&บ่งชี้ว่าฟังก์ชั่นถัดไปจะใช้ข้อมูลจำเพาะ (/ ฟังก์ชั่นเฉพาะ) รองเริ่มต้นใน / ออก สำหรับ function m( ismember) &ระบุว่าเอาต์พุตที่สองจะถูกสร้างขึ้น สิ่งนี้มีดัชนีของ (การเกิดขึ้นครั้งแรกของ) แต่ละรายการของอินพุตแรกในอินพุตที่สอง


2

Haskell, 34 ไบต์

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

ตัวอย่างการใช้: [5,3,4,9,7,5,7] # [3,4,5,7,9]->[3,1,2,5,4,3,4]

built-in elemIndexนั้นData.Listยาวกว่าเวอร์ชั่นด้านบน ห่วงด้านนอกผ่านไปnและภายในวงผ่านคู่(i,e)ที่iเป็นดัชนีของในe mเก็บiที่เท่ากับองค์ประกอบปัจจุบันของen


2

R, 20 5 ไบต์

1 การจัดทำดัชนี; matchเป็นฟังก์ชันบิวอินที่ค้นหาดัชนีในอินพุทที่สองขององค์ประกอบแรกคือmatch(n,m)ให้คำตอบที่ต้องการ

match

ขอบคุณ @flodel ที่ชี้ให้เห็นว่าการคืนค่าฟังก์ชันเป็นที่ยอมรับอย่างสมบูรณ์ว่าเป็นคำตอบ!

ลองออนไลน์!


2
ฉันคิดว่าmatch(5 ไบต์) เพียงอย่างเดียวจะเป็นทางออกที่ยอมรับได้
flodel

คุณถูกต้องอัพเดท
Giuseppe



1

CJam , 4 ไบต์

{f#}

บล็อกที่ไม่ระบุชื่อที่คาดว่าจะมีข้อโต้แย้งในสแต็กและปล่อยให้ผลลัพธ์ในสแต็ก

ใช้การจัดทำดัชนี 0

ลองออนไลน์!


1

Haskell, 43 ไบต์

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 ไบต์

บันทึกได้ 4 ไบต์ด้วย Dada

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

1 การจัดทำดัชนี ใช้เวลารายการmและnf(@m,@n)เป็นรายการเดียวเช่น x0เป็นเพียงเพื่อให้การส่งออกจากที่เริ่มต้นด้วย1,2,3,4,5ฯลฯ


คำตอบที่ดี โปรดทราบว่าอนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุชื่อดังนั้นsub{...}คุณสามารถประหยัดได้ 2 ไบต์ นอกจากนี้คุณสามารถใช้x0แทน&&()การบันทึกเพิ่มเติมสองไบต์
Dada

1

PHP, 56 ไบต์

รุ่นออนไลน์

0 การจัดทำดัชนี

ส่งออกเป็นสตริง

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

PHP, 65 ไบต์

เอาต์พุตเป็นอาร์เรย์

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

PHP, 78 ไบต์

วิธีแก้ปัญหาด้วย array_map

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

สำหรับอาร์เรย์ที่ไม่ซ้ำกันแทนที่ด้วย array_flip($_GET[1])[$v] array_search($v,$_GET[1])



0

Java 7, 80 ไบต์

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

0 การจัดทำดัชนี

คำอธิบาย:

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

รหัสทดสอบ:

ลองที่นี่

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

เอาท์พุท:

[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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.