Meniru pemesanan

24

Dengan dua daftar angka, satu sumber dan satu pola , susun ulang sumbernya untuk mencocokkan urutan relatif dari pola tersebut. Dua entri dari sumber yang disusun ulang harus membandingkan dengan cara yang sama seperti entri pada posisi pola yang sama.

Misalnya input

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

harus menghasilkan hasilnya

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

Membandingkan posisi pertama dan terakhir, hasilnya 11<13, yang cocok 7<12dengan pola.

Input: Dua daftar bilangan bulat kosong yang sama panjangnya. Setiap daftar tidak akan memiliki pengulangan. Terserah Anda apakah sumber atau pola diberikan terlebih dahulu.

Output: Daftar yang mengatur ulang nomor sumber untuk memiliki urutan relatif yang sama dengan nomor pola.

Papan peringkat:

Tidak
sumber
Haruskah itu suatu fungsi / program, atau apakah cukup ekspresi / cuplikan?
Adám

Jawaban:

10

CJam, 12 10 byte

{_$f#\$f=}

Ini adalah fungsi anonim, yang mengambil s ptumpukan dan meninggalkan hasilnya di tumpukan. Demo online

Dengan terima kasih kepada Martin Büttner untuk 2 byte.

Pembedahan

{         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
}
Peter Taylor
sumber
{_$@$er}lebih pendek dua byte.
Dennis
@ Dennis, itu cukup berbeda untuk menjadi jawaban yang terpisah
Peter Taylor
Jika Anda berpikir begitu, saya akan mempostingnya sebagai jawaban.
Dennis
10

J, 9 byte

/:^:2~/:~

Ini adalah kata kerja diad yang menggunakan p dan s sebagai argumen kiri dan kanan. Cobalah online dengan J.js .

Uji coba

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

Bagaimana ini bekerja?

Katakanlah kita mendefinisikan menetapkan input kiri dan kanan dari contoh via

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

Kemudian:

  • Kereta /:^:2~/:~adalah kait dari kata kerja /:^:2~dan /:~, begitu panggilan

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

    dieksekusi

    p /:^:2~ /:~ s
    
  • Kata keterangan ~di dalam /:~adalah refleksif , karena /:digunakan secara monadik. Demikian panggilan

    /:~ s
    

    dieksekusi

    s /: s
    
  • Kata keterangan ~di dalam /:^:2~adalah pasif , karena kata kerjanya /:^:2digunakan secara dua arah. Demikian panggilan

    p /:^:2~ y
    

    dieksekusi

    y /:^:2 p
    
  • Kata keterangannya ^:adalah kekuatan . Demikian panggilan

    y /:^:2 p
    

    dieksekusi

    y /: y /: p
    

Menyatukan semuanya, menelepon

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

dieksekusi

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

Bagaimana bahwa karya

Diad /:adalah kelas dengan menggunakan , yaitu, x /:ymengembalikan unsur x , diurutkan sesuai dengan nilai-nilai yang sesuai y.

  • s /: scukup mengurutkan elemen s .

  • (s /: s) /: pmengurutkan elemen (diurutkan) dari s sesuai dengan nilai yang sesuai dari p .

  • Peningkatan dua kali pada dasarnya menghitung tata cara argumen yang benar.

    Jadi, (s /: s) /: (s /: s) /: ppilah elemen (sortir) dari s , meniru urutan elemen p .

Dennis
sumber
9

Mathematica, 32 27 byte

Sort@#~Permute~Ordering@#2&

Contoh penggunaan:

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

Upaya sebelumnya:

Sort[#][[Ordering@Ordering@#2]]&
2012 Arcampion
sumber
@DavidCarraher Diperbaiki!
2012rcampion
1
+1 Saya menemukan solusi yang sama ini 4 menit setelah Anda! Anda dapat menyimpan beberapa byte:o = Ordering; (Sort@#)[[o@o@#2]] &
DavidC
Solusi baru yang indah via Permute! Penggunaan permutasi yang sangat berguna.
DavidC
7

J, 17 byte

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

Ini mengevaluasi ke kata kerja diad (artinya biner). Ini dapat ditimbulkan sebagai berikut:

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

Penjelasan

Ini mungkin bukan solusi terpendek yang mungkin, tetapi ini adalah pendekatan baru.

                   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.
Zgarb
sumber
6

Pyth, 10 byte

@LSvzxLSQQ

Cobalah online: Demonstrasi

Penjelasan

@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
Jakube
sumber
XQSQSvzlebih pendek tiga byte.
Dennis
@Dennis Dang. Kenapa aku tidak memikirkan ini? Apakah Anda ingin mempostingnya?
Jakube 2-15
1
Jika Anda menganggapnya cukup berbeda dari pendekatan Anda, tentu saja.
Dennis
6

Pyth, 7 byte

XQSQSvz

Ini adalah program lengkap yang mengharapkan representasi string dari s dan p pada dua baris. Cobalah online.

Bagaimana itu bekerja

           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.
Dennis
sumber
5

Python 2, 51

lambda s,p,a=sorted:[a(s)[a(p).index(x)]for x in p]
feersum
sumber
Saya bingung: mengapa ada tiga parameter?
Peter Taylor
@PeterTaylor Parameter ketiga memiliki nilai default, sehingga dapat dipanggil dengan hanya 2.
feersum
@PeterTaylor Menambahkan baris terpisah a=sortedakan memiliki efek yang sama.
xnor
Aaaaaah! Saya salah menguraikan, dan berpikir bahwa tubuh mulai di =.
Peter Taylor
5

Mathematica 56 43 30 29 byte

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

Ordering@#2mengembalikan urutan angka dalam pola. Ordering@Ordering@#2memberikan posisi yang harus ditempati oleh elemen yang diurutkan dalam sumber.

Sort[#][[o@o@#2]]& mengembalikan sumber dalam posisi yang diperlukan, yaitu, mereka yang memiliki urutan relatif sama dengan daftar pola.

Pengujian

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}

DavidC
sumber
5

CJam, 8 byte

{_$@$er}

Ini adalah fungsi anonim yang mengharapkan s dan p (paling atas) pada stack dan mendorong s yang disusun ulang sebagai balasannya. Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

_      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.
Dennis
sumber
4

J, 13 byte

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

Saya masih kesulitan membungkus kepala saya di sekitar komposisi kata kerja J, jadi saya merasa seperti itu @dan []mungkin tidak perlu. Jika beberapa pengguna J yang lebih berpengalaman dapat memberi tahu saya jika ini dapat dikompresi, itu akan bagus. :)

Kata kerjanya dapat digunakan sebagai berikut:

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

Penjelasan

/:@/:@[{/:~@] 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.
Martin Ender
sumber
Anda dapat menggunakan diad /:untuk menghilangkan {dan @, untuk 11 byte:/:~@]/:/:@[
Dennis
@Dennis Terima kasih, Zgarb telah menemukan solusi 11-byte sementara yang hanya membutuhkan dua /:, tapi saya belum sempat memperbarui jawabannya ( ({~/:)&/:{[).
Martin Ender
4

APL, 17 12 byte

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

Berkat @ Dennis, ini sekarang sangat elegan.

Inilah solusi 14 byte yang bagus yang tidak menggunakan pengindeksan ganda:

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

Sayangnya, kami tidak dapat mengindeks array dari dalam kereta di APL.

lirtosiast
sumber
4

Python 2, 48

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

Gumpalan fungsi yang besar. Ini menggunakan pendekatan terjemahan elemen dari banyak jawaban lain menggunakan kamus.

Input yang *lberkilau bintangnya mengharapkan pola dan sumber dalam urutan itu, dan mengubahnya menjadi daftar l.

Memetakan sortedmengurutkan kedua daftar, dan dict(zip(_))mengubah sepasang daftar menjadi kamus dengan kunci dari daftar pertama cocok dengan nilai-nilai di urutan kedua, dalam urutan menaik. Jadi, hasilnya adalah bahwa ielemen terbesar ke-2 dari pola tersebut cocok dengan ielemen ke-terbesar dari sumber.

Akhirnya, kami mengubah pola ( l[0]) melalui kamus ini dengan memetakan .getmetodenya.

Tidak
sumber
3

Bash + coreutils, 55

nl $2|sort -nk2|paste <(sort -n $1) -|sort -nk2|cut -f1

Input diambil sebagai dua nama file, masing-masing untuk sumber dan pola:

$ ./imitord.sh source.txt pattern.txt 
11  
-5  
4   
-6  
9   
0   
13  
$ 
Trauma Digital
sumber
3

R, 38 byte

function(s,p)sort(s)[match(p,sort(p))]
flodel
sumber
Ini pendekatan yang bagus. Tidak akan terpikir untuk menggunakan match.
Alex A.
3

Ruby, 51 byte

->s,p{s.map{|x|s.sort[p.sort.index(p[s.index x])]}}
daniero
sumber
2

Haskell, 65 byte

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

Contoh penggunaan: [-5,9,4,13,11,-6,0] # [7,-4,1,-8,4,-3,12]-> [11,-5,4,-6,9,0,13].

Bagaimana itu bekerja:

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

R, 37 byte

function(s,p,o=order)s[o(s)][o(o(p))]
aPaULT
sumber
2

TeaScript, 15 byte

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

Ini mengambil input sebagai array. Penerjemah sedang down karena saya memasang penerjemah baru yang mewah

Penjelasan

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
  ]
)
Downgoat
sumber
Entah saya salah paham penjelasan, atau ini tidak berhasil ... Saya mengkodekannya di Pip sesuai dengan apa yang saya pikirkan, dan mendapatkan 13 9 -6 4 11 -5 0input sampel. ??
DLosc
2

Jelly , 6 byte, tantangan tanggal kiriman bahasa

Œ¿œ?Ṣ}

Cobalah online!

Ini mengambil pola, diikuti oleh sumber, sebagai dua argumen terpisah.

Penjelasan

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

sumber
1

Haskell, 56 byte

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

Menentukan fungsi biner %. Setiap entri masuk pditransformasikan menjadi entri sdengan statistik urutan yang sama, yaitu peringkat relatif dalam daftar. Statistik urutan xin pditemukan dengan menghitung elemen-elemen yang lebih kecil dari itu ( sort p!!xmenghasilkan yang menjengkelkan Maybe). Hasilnya diindeks menjadisort s .

Sebuah zip/lookupsolusi adalah sama panjang, kecuali memberikan Justnomor.

import Data.List
p%s=[lookup x$zip(sort p)(sort s)|x<-p]
Tidak
sumber