เลียนแบบการสั่งซื้อ


24

กำหนดตัวเลขสองรายการแหล่งที่มาและรูปแบบจัดลำดับแหล่งใหม่เพื่อให้ตรงกับการเรียงลำดับสัมพัทธ์ของรูปแบบ รายการสองรายการของแหล่งที่มาของการเรียงลำดับควรเปรียบเทียบวิธีเดียวกันกับรายการที่ตำแหน่งเดียวกันของรูปแบบ

ตัวอย่างเช่นการป้อนข้อมูล

s = [-5, 9, 4, 13, 11, -6, 0]
p = [7, -4, 1, -8, 4, -3, 12]

ควรสร้างผลลัพธ์

    [11, -5, 4, -6, 9, 0, 13]

การเปรียบเทียบตำแหน่งแรกและตำแหน่งสุดท้ายผลลัพธ์มี11<13ซึ่งตรงกับ7<12ในรูปแบบ

อินพุต:รายการจำนวนเต็มสองรายการที่ไม่มีความยาวเท่ากัน แต่ละรายการจะไม่มีการทำซ้ำ ขึ้นอยู่กับคุณว่าจะให้แหล่งที่มาหรือรูปแบบก่อน

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

ลีดเดอร์บอร์ด:


ต้องเป็นฟังก์ชัน / โปรแกรมหรือเป็นนิพจน์ / ตัวอย่างเพียงพอหรือไม่
Adám

@NBZ เว้นแต่ความท้าทายจะแทนที่มันค่าเริ่มต้นคืออนุญาตให้ใช้ฟังก์ชั่นและโปรแกรมเท่านั้น ฟังก์ชั่นที่ไม่มีชื่อแม้จะได้รับอนุญาต
Martin Ender

คำตอบ:


10

CJam, 12 10 ไบต์

{_$f#\$f=}

นี่คือฟังก์ชั่นที่ไม่ระบุตัวตนซึ่งใช้s pกับสแต็กและปล่อยผลลัพธ์ไว้บนสแต็ก การสาธิตออนไลน์

ด้วยความขอบคุณMartin Büttnerเป็นเวลา 2 ไบต์

การผ่า

{         e# Define an anonymous function
  _$f#    e# Use a copy of the pattern to map each element to its sort index
  \$      e# Sort the source
  f=      e# Map each sort index to the corresponding source element
}

{_$@$er}สั้นกว่าสองไบต์
เดนนิส

@Dennis แตกต่างกันมากพอที่จะเป็นคำตอบที่แยกจากกัน
Peter Taylor

หากคุณคิดเช่นนั้นฉันจะโพสต์เป็นคำตอบ
เดนนิส

10

J, 9 ไบต์

/:^:2~/:~

นี่คือคำกริยา dyadic ที่ใช้pและsเป็นอาร์กิวเมนต์ซ้ายและขวา ลองมันออนไลน์กับJ.js

ทดสอบการทำงาน

   7 _4 1 _8 4 _3 12 (/:^:2~/:~) _5 9 4 13 11 _6 0
11 _5 4 _6 9 0 13

มันทำงานอย่างไร

สมมติว่าเรานิยามคำสั่งจากซ้ายและขวาให้กับตัวอย่าง

p =: 7 _4 1 _8 4 _3 12
s =: _5 9 4 13 11 _6 0

แล้ว:

  • รถไฟ/:^:2~/:~เป็นตะขอของคำกริยา/:^:2~และ/:~ดังนั้นจึงเรียก

    p (/:^:2~/:~) s
    

    รัน

    p /:^:2~ /:~ s
    
  • คำวิเศษณ์~ใน/:~นั้นสะท้อนเนื่องจาก/:มีการใช้ monadically ดังนั้นการโทร

    /:~ s
    

    รัน

    s /: s
    
  • คำวิเศษณ์~ใน/:^:2~เป็นเรื่อย ๆเนื่องจากคำกริยา/:^:2จะใช้ dyadically ดังนั้นการโทร

    p /:^:2~ y
    

    รัน

    y /:^:2 p
    
  • คำวิเศษณ์^:คืออำนาจ ดังนั้นการโทร

    y /:^:2 p
    

    รัน

    y /: y /: p
    

วางมันทั้งหมดเข้าด้วยกันโทร

p (/:^:2~/:~) s

รัน

(s /: s) /: (s /: s) /: p

วิธีที่ผลงาน

dyadic /:เป็นเกรดที่ใช้คือx /:yผลตอบแทนที่องค์ประกอบของxyเรียงลำดับตามค่าที่สอดคล้องกันของ

  • s /: sเพียงแค่เรียงลำดับองค์ประกอบของs

  • (s /: s) /: pเรียงลำดับ (จัดเรียง) องค์ประกอบของsตามค่าที่สอดคล้องกันของพี

  • การให้คะแนนเป็นสองเท่าจะคำนวณอันดับของอาร์กิวเมนต์ที่ถูกต้อง

    ดังนั้น(s /: s) /: (s /: s) /: pเรียง (จัดเรียง) องค์ประกอบของsเลียนแบบลำดับขององค์ประกอบของหน้า


9

Mathematica, 32 27 ไบต์

Sort@#~Permute~Ordering@#2&

ตัวอย่างการใช้งาน:

Sort@#~Permute~Ordering@#2 &[{-5, 9, 4, 13, 11, -6, 0}, {7, -4, 1, -8, 4, -3, 12}]
(* {11, -5, 4, -6, 9, 0, 13} *)

ความพยายามก่อนหน้า:

Sort[#][[Ordering@Ordering@#2]]&

@DavidCarraher แก้ไขแล้ว!
2012rcampion

1
+1 ฉันค้นพบวิธีแก้ปัญหาแบบเดียวกันนี้หลังจากคุณ 4 นาที! คุณสามารถบันทึกสองสามไบต์:o = Ordering; (Sort@#)[[o@o@#2]] &
DavidC

ทางออกใหม่ที่น่ารักผ่านPermute! การใช้วิธีเรียงสับเปลี่ยนมีประโยชน์มาก
DavidC

7

J, 17 ไบต์

(A.^:_1/:~)~A.@/:

สิ่งนี้ประเมินเป็นคำกริยา dyadic (หมายถึงไบนารี) มันสามารถปรากฏดังต่อไปนี้:

  _5 9 4 13 11 _6 0 ((A.^:_1/:~)~A.@/:) 7 _4 1 _8 4 _3 12
11 _5 4 _6 9 0 13

คำอธิบาย

นี่อาจไม่ใช่วิธีแก้ปัญหา J ที่สั้นที่สุด แต่เป็นวิธีแปลกใหม่

                   Left input is x, right input is y.
            A.@/:  The index of the permutation P that sorts y. /: gives the
                   permutation itself, and A. gives its index in the sorted
                   list of all its permutations.
       /:~         x sorted in ascending order. We are applying the x-sorting
                   permutation to x itself.
(A.^:_1   )~       The inverse of the permutation P applied to the sorted
                   version of x. Since P maps y to its sorted version, its
                   inverse maps the sorted version to y, and thus sorted x to
                   the correct output.

6

Pyth, 10 ไบต์

@LSvzxLSQQ

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย

@LSvzxLSQQ implicit: z = first input line as string
                     Q = second input line evaluated
       SQ  sorted(Q)
     xLSQQ find the index for each element of Q in sorted(Q)
  Svz      sorted(evaluated z)
@LSvz      take the element in ^ for each index

XQSQSvzสั้นกว่าสามไบต์
เดนนิส

@Dennis Dang ทำไมฉันไม่เป็นเจ้าเจ้านี่ คุณต้องการโพสต์หรือไม่
Jakube

1
หากคุณพิจารณาว่ามันแตกต่างจากวิธีการของคุณอย่างแน่นอน
เดนนิส

6

Pyth, 7 ไบต์

XQSQSvz

นี้เป็นโปรแกรมเต็มรูปแบบที่คาดว่าเป็นตัวแทนสตริงของsและPบนเส้นสองเส้น ลองออนไลน์

มันทำงานอย่างไร

           Store the first line of input (rep. of s) in z.
           Evaluate the second line of input and store the result (p) in Q.
  SQ       Sort the elements of p.
    Svz    Evaluate the repr. of s and sort its elements.
XQ         Perform transliteration on p.
           This replaces the lowest element of p with the lowest element of s, etc.

5

Python 2, 51

lambda s,p,a=sorted:[a(s)[a(p).index(x)]for x in p]

ฉันสับสน: ทำไมถึงมีสามพารามิเตอร์
ปีเตอร์เทย์เลอร์

@PeterTaylor พารามิเตอร์ที่สามมีค่าเริ่มต้นดังนั้นจึงสามารถเรียกได้เพียง 2
feersum

@PeterTaylor การเพิ่มบรรทัดแยกa=sortedจะมีผลเหมือนกัน
xnor

Aaaaaah! ผมเป็น misparsing =และคิดว่าร่างกายเริ่มต้นที่
Peter Taylor

5

Mathematica 56 43 30 29 ไบต์

o=Ordering;Sort[#][[o@o@#2]]&

Ordering@#2ส่งคืนลำดับของตัวเลขในรูปแบบ Ordering@Ordering@#2ให้ตำแหน่งที่องค์ประกอบเรียงในแหล่งที่มาควรครอบครอง

Sort[#][[o@o@#2]]& ส่งคืนแหล่งที่มาในตำแหน่งที่ต้องการกล่าวคือแหล่งที่มีลำดับที่สัมพันธ์กันเหมือนกับรายการรูปแบบ

การทดสอบ

o=Ordering;Sort[#][[o@o@#2]]&[{-5, 9, 4, 13, 11, -6, 0}, {7, -4, 1, -8, 4, -3, 12}]

{11, -5, 4, -6, 9, 0, 13}


5

CJam, 8 ไบต์

{_$@$er}

นี่เป็นฟังก์ชั่นนิรนามที่คาดว่าsและp (บนสุด) บนสแต็กและผลักs ที่เรียงลำดับใหม่กลับมา ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

_      e# Push a copy of p.
 $     e# Sort it.
  @    e# Rotate s on top of p and the sorted p.
   $   e# Sort s.
    er e# Perform transliteration.
       e# This replaces the lowest element of p with the lowest element of s, etc.

4

J, 13 ไบต์

/:@/:@[{/:~@]

ฉันยังคงมีปัญหาในการตัดหัวของฉันรอบองค์ประกอบกริยาเจดังนั้นฉันรู้สึกเหมือนบางคน@และ[]อาจจะไม่จำเป็น หากผู้ใช้ J ที่มีประสบการณ์มากกว่านี้สามารถแจ้งให้ฉันทราบว่าสิ่งนี้สามารถบีบอัดได้หรือไม่นั่นจะเป็นการดีมาก :)

คำกริยาสามารถใช้ดังนี้:

   7 _4 1 _8 4 _3 12 (/:@/:@[{/:~@]) _5 9 4 13 11 _6 0
11 _5 4 _6 9 0 13

คำอธิบาย

/:@/:@[{/:~@] NB. Left input is the pattern, right input is the source.
        /:~@] NB. Sort the source.
/:@/:@[       NB. Compute the ordering of the ordering of the pattern.
       {      NB. Use those as indices into the sorted source.

คุณสามารถใช้ dyadic /:การกำจัด{และ@สำหรับ 11 ไบต์:/:~@]/:/:@[
เดนนิส

@Dennis ขอขอบคุณ Zgarb พบวิธีแก้ปัญหาอีก 11 ไบต์ในระหว่างนี้ซึ่งต้องการเพียงสอง/:แต่ฉันยังไม่ได้รับการปรับปรุงคำตอบเลย ( ({~/:)&/:{[)
Martin Ender

4

APL, 17 12 ไบต์

{⍺[⍋⍺][⍋⍋⍵]}

ขอบคุณ @Dennis นี่เป็นสิ่งที่สวยงามมาก

ต่อไปนี้เป็นโซลูชันขนาด 14 ไบต์ที่ไม่ใช้การจัดทำดัชนีซ้ำ:

{⍺[(⍋⍋⍺)⍳⍋⍋⍵]}

น่าเสียดายที่เราไม่สามารถจัดทำดัชนีอาร์เรย์จากภายในรถไฟใน APL


4

Python 2, 48

lambda*l:map(dict(zip(*map(sorted,l))).get,l[0])

ฟังก์ชั่นใหญ่ ๆ วิธีนี้ใช้วิธีการแปลองค์ประกอบของคำตอบอื่น ๆ อีกมากมายโดยใช้พจนานุกรม

อินพุตติดดาวคาดว่ารูปแบบและแหล่งที่มาในลำดับที่และเปลี่ยนพวกเขาลงในรายการ*ll

การแมปsortedเรียงลำดับรายการทั้งสองและdict(zip(_))เปลี่ยนคู่ของรายการให้เป็นพจนานุกรมโดยใช้คีย์จากรายการแรกที่จับคู่กับค่าในลำดับที่สองตามลำดับจากน้อยไปหามาก ดังนั้นผลลัพธ์คือiองค์ประกอบที่ใหญ่ที่สุดของรูปแบบที่จับคู่กับiองค์ประกอบที่ใหญ่ที่สุดของแหล่งที่มา

สุดท้ายเราแปลงรูปแบบ ( l[0]) ผ่านพจนานุกรมนี้โดยการทำแผนที่.getวิธีการ



3

R, 38 ไบต์

function(s,p)sort(s)[match(p,sort(p))]

นี่เป็นวิธีการที่ดี matchจะไม่ได้มีความคิดที่จะใช้
Alex A.


2

Haskell, 65 ไบต์

import Data.List
s#p=[sort s!!i|b<-p,(i,e)<-zip[0..]$sort p,b==e]

ตัวอย่างการใช้งาน: ->[-5,9,4,13,11,-6,0] # [7,-4,1,-8,4,-3,12][11,-5,4,-6,9,0,13]

มันทำงานอย่างไร:

           b<-p                              -- for every b in p
               ,(i,e)<-zip[0..]$sort p       -- walk through the sorted list of p 
                                             -- paired with it's index ->
                                             -- (index,element) or (i,e)
                                      ,b==e  -- for those cases where b equals e
 sort s!!i                                   -- take the i-th element from the
                                             -- sorted list s


2

TeaScript ขนาด 15 ไบต์

ys¡m™x[yi(l)])

สิ่งนี้รับอินพุตเป็นอาร์เรย์ ล่ามไม่ทำงานเพราะฉันกำลังเตรียมล่ามรูปแบบใหม่

คำอธิบาย

y      // Second input
 s¡    // Sort it = s()
m™     // Map over it = m(#
  x[      // Num in first input at index...
    yi(l) // Current char's index in y
  ]
)

อาจเป็นเพราะฉันเข้าใจผิดคำอธิบายไม่ถูกต้องหรือสิ่งนี้ไม่ได้ผล ... ฉันเขียนมันลงใน Pip ตามสิ่งที่ฉันคิดว่าทำและได้รับ13 9 -6 4 11 -5 0ตัวอย่างอินพุต ??
DLosc

2

ความท้าทายของเยลลี่ขนาด 6 ไบต์ภาษาจะโพสต์วันที่

Œ¿œ?Ṣ}

ลองออนไลน์!

ใช้รูปแบบนี้ตามด้วยแหล่งที่มาเป็นอาร์กิวเมนต์สองข้อที่แยกกัน

คำอธิบาย

Œ¿œ?Ṣ}
Œ¿      Generate an integer that describes the order of {the first input}
  œ?    Use that integer to reorder
    Ṣ}  the sorted version of the second {input}

1

Haskell, 56 ไบต์

import Data.List
p%s=[sort s!!(length$filter(<x)p)|x<-p]

%กำหนดฟังก์ชันไบนารี แต่ละรายการในpจะถูกแปลงเป็นรายการที่sมีสถิติการสั่งซื้อเดียวกันคืออันดับที่สัมพันธ์กันในรายการ สถิติการสั่งซื้อของxin pพบได้โดยการนับองค์ประกอบที่เล็กกว่านั้น ( sort p!!xสร้างความน่ารำคาญMaybe) sort sผลที่ได้คือการจัดทำดัชนีลงไป

คำzip/lookupตอบคือความยาวเท่ากันยกเว้นมันให้Justตัวเลข

import Data.List
p%s=[lookup x$zip(sort p)(sort s)|x<-p]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.