Naśladuj zamówienie

24

Biorąc pod uwagę dwie listy liczb, źródło i wzór , należy zmienić kolejność źródła, aby dopasować względną kolejność wzoru. Wszelkie dwa wpisy uporządkowanego źródła powinny być porównywane w taki sam sposób jak wpisy w tych samych pozycjach wzorca.

Na przykład dane wejściowe

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

powinien dać wynik

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

Porównując pierwszą i ostatnią pozycję, wynik ma 11<13, który pasuje 7<12do wzorca.

Dane wejściowe: Dwie niepuste listy liczb całkowitych o jednakowej długości. Każda lista nie będzie się powtarzać. Od Ciebie zależy, czy źródło czy wzór zostanie podany jako pierwszy.

Dane wyjściowe: lista, która przestawia numery źródłowe w taki sam względny sposób, jak numery wzorców.

Tabela liderów:

xnor
źródło
Czy musi to być funkcja / program, czy może wystarczy wyrażenie / fragment?
Adám
@NBZ O ile wyzwanie nie zastępuje tego, domyślnie dozwolone są tylko funkcje i programy . Funkcje nienazwane są jednak dozwolone .
Martin Ender

Odpowiedzi:

10

CJam, 12 10 bajtów

{_$f#\$f=}

Jest to anonimowa funkcja, która pobiera s pstos i pozostawia wynik na stosie. Demo online

Z podziękowaniami dla Martina Büttnera za 2 bajty.

Sekcja

{         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
źródło
{_$@$er}jest dwa bajty krótszy.
Dennis,
@Dennis, to wystarczająco inne, aby być osobną odpowiedzią
Peter Taylor
Jeśli tak uważasz, opublikuję to jako odpowiedź.
Dennis
10

J, 9 bajtów

/:^:2~/:~

Jest to dwójkowym czasownik że zajmuje p i s jako argumenty lewych i prawych. Spróbuj go online z J.js .

Testowe uruchomienie

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

Jak to działa

Powiedzmy, że zdefiniowaliśmy przypisane lewe i prawe wejście z przykładu przez

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

Następnie:

  • Pociąg /:^:2~/:~jest hakiem czasowników /:^:2~i /:~, tak woła

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

    wykonuje

    p /:^:2~ /:~ s
    
  • Przysłówek ~w /:~to refleksyjny , ponieważ /:służy monadically. Tak więc dzwoniąc

    /:~ s
    

    wykonuje

    s /: s
    
  • Przysłówek ~w /:^:2~jest pasywny , ponieważ czasownik /:^:2stosuje się dyadically. Tak więc dzwoniąc

    p /:^:2~ y
    

    wykonuje

    y /:^:2 p
    
  • Przysłówek ^:to potęga . Tak więc dzwoniąc

    y /:^:2 p
    

    wykonuje

    y /: y /: p
    

Składając to wszystko razem, dzwoniąc

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

wykonuje

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

Jak to działa

Dyadic /:jest oceniany za pomocą , tzn. x /:yZwraca elementy x , posortowane według odpowiednich wartości y.

  • s /: spo prostu sortuje elementy s .

  • (s /: s) /: psortuje (posortowane) elementy s zgodnie z odpowiednimi wartościami p .

  • Dwukrotne podwyższenie zasadniczo oblicza liczby porządkowe swojego słusznego argumentu.

    W ten sposób (s /: s) /: (s /: s) /: psortuje (posortowane) elementy s , imitując kolejność elementów p .

Dennis
źródło
9

Mathematica, 32 27 bajtów

Sort@#~Permute~Ordering@#2&

Przykładowe użycie:

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

Poprzednia próba:

Sort[#][[Ordering@Ordering@#2]]&
2012 rcampion
źródło
@DavidCarraher Naprawiono!
2012rcampion
1
+1 Odkryłem to samo rozwiązanie 4 minuty po tobie! Możesz zapisać kilka bajtów:o = Ordering; (Sort@#)[[o@o@#2]] &
DavidC
Cudowne nowe rozwiązanie przez Permute! Bardzo przydatne użycie permutacji.
DavidC,
7

J, 17 bajtów

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

Odnosi się to do czasownika dynamicznego (czyli binarnego). Można go wywołać w następujący sposób:

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

Wyjaśnienie

To może nie być najkrótsze możliwe rozwiązanie J, ale jest to nowatorskie podejście.

                   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
źródło
6

Pyth, 10 bajtów

@LSvzxLSQQ

Wypróbuj online: demonstracja

Wyjaśnienie

@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
źródło
XQSQSvzjest trzy bajty krótszy.
Dennis
@Dennis Dang. Dlaczego tego nie myślałem? Czy chcesz to opublikować?
Jakube,
1
Jeśli uważasz, że to wystarczająco różni się od twojego podejścia, na pewno.
Dennis
6

Pyth, 7 bajtów

XQSQSvz

Jest to pełny program, który oczekuje reprezentacji ciągu s i pw dwóch wierszach. Wypróbuj online.

Jak to działa

           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
źródło
5

Python 2, 51

lambda s,p,a=sorted:[a(s)[a(p).index(x)]for x in p]
feersum
źródło
Jestem zdezorientowany: dlaczego są trzy parametry?
Peter Taylor,
@PeterTaylor Trzeci parametr ma wartość domyślną, więc można go wywołać tylko z 2.
feersum
@PeterTaylor Dodanie osobnego wiersza a=sortedmiałoby ten sam efekt.
xnor
Aaaaaah! Błędnie analizowałem i pomyślałem, że ciało zaczęło się od =.
Peter Taylor,
5

Mathematica 56 43 30 29 bajtów

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

Ordering@#2zwraca kolejność liczb we wzorcu. Ordering@Ordering@#2podaje pozycje, które powinny zajmować posortowane elementy w źródle.

Sort[#][[o@o@#2]]& zwraca źródło w wymaganych pozycjach, a mianowicie tych, które mają takie samo uporządkowanie względne jak lista wzorców.

Testowanie

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
źródło
5

CJam, 8 bajtów

{_$@$er}

To anonimowe funkcje, które oczekują s i p (najwyższa pozycja) na stosie i wypychają ponownie zamienione s w zamian. Wypróbuj online w interpretatorze CJam .

Jak to działa

_      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
źródło
4

J, 13 bajtów

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

Nadal mam problemy z owinięciem głowy kompozycją czasownika J, więc czuję się trochę z nich @i []może być niepotrzebna. Gdyby jakiś bardziej doświadczony użytkownik J mógł dać mi znać, czy można to skompresować, byłoby świetnie. :)

Czasownik może być używany w następujący sposób:

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

Wyjaśnienie

/:@/:@[{/:~@] 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
źródło
Możesz użyć Diadic, /:aby się pozbyć, {i @, dla 11 bajtów:/:~@]/:/:@[
Dennis
@Dennis Dzięki, Zgarb znalazł w międzyczasie kolejne 11-bajtowe rozwiązanie, które potrzebuje tylko dwóch /:, ale nie mam jeszcze ochoty na aktualizację odpowiedzi ( ({~/:)&/:{[).
Martin Ender
4

APL, 17 12 bajtów

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

Dzięki @Dennis jest to teraz bardzo eleganckie.

Oto ładne 14-bajtowe rozwiązanie, które nie korzysta z podwójnego indeksowania:

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

Niestety nie możemy indeksować tablic z pociągów w APL.

lirtosiast
źródło
4

Python 2, 48

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

Duży glob funkcji. Wykorzystuje to tłumaczenie elementarne wielu innych odpowiedzi przy użyciu słownika.

Oznaczone gwiazdką dane wejściowe *loczekują wzorców i źródła w tej kolejności i zamieniają je w listę l.

Mapowanie sortedsortuje obie listy i dict(zip(_))zamienia parę list w słownik z kluczami z pierwszej listy dopasowanymi do wartości w drugiej, w porządku rosnącym. W rezultacie ten i-ty co do wielkości element wzorca jest dopasowany do i-tego co do wielkości elementu źródła.

Na koniec przekształcamy wzorzec ( l[0]) za pomocą tego słownika, odwzorowując jego .getmetodę.

xnor
źródło
3

Bash + coreutils, 55

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

Dane wejściowe są traktowane jako dwie nazwy plików, odpowiednio dla źródła i wzorca:

$ ./imitord.sh source.txt pattern.txt 
11  
-5  
4   
-6  
9   
0   
13  
$ 
Cyfrowa trauma
źródło
3

R, 38 bajtów

function(s,p)sort(s)[match(p,sort(p))]
flodel
źródło
To miłe podejście. Nie pomyślałbym użyć match.
Alex A.
3

Rubinowy, 51 bajtów

->s,p{s.map{|x|s.sort[p.sort.index(p[s.index x])]}}
daniero
źródło
2

Haskell, 65 bajtów

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

Przykład użycia: [-5,9,4,13,11,-6,0] # [7,-4,1,-8,4,-3,12]-> [11,-5,4,-6,9,0,13].

Jak to działa:

           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
źródło
2

R, 37 bajtów

function(s,p,o=order)s[o(s)][o(o(p))]
PAULT
źródło
2

TeaScript, 15 bajtów

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

Pobiera to dane wejściowe jako tablicę. Tłumacz jest obecnie nieczynny, ponieważ wystawiam nowego, fantazyjnego tłumacza

Wyjaśnienie

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
źródło
Albo źle rozumiem wyjaśnienie, albo to nie działa ... Zakodowałem to w Pip zgodnie z tym, co myślę, że działa, i dostałem 13 9 -6 4 11 -5 0próbkę. ??
DLosc
2

Galaretka , 6 bajtów, wyzwanie dla postdate języka

Œ¿œ?Ṣ}

Wypróbuj online!

To bierze wzorzec, po którym następuje źródło, jako dwa osobne argumenty.

Wyjaśnienie

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

źródło
1

Haskell, 56 bajtów

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

Definiuje funkcję binarną %. Każda pozycja w pjest przekształcana na pozycję sz tą samą statystyką rzędu, tj. Relatywną pozycją na liście. Statystyka rzędu xw pjest obliczana poprzez zliczenie mniejszych elementów ( sort p!!xtworzy denerwujące Maybe). Wynik jest indeksowany do sort s.

zip/lookupRozwiązaniem jest tej samej długości, chyba że daje Justliczb.

import Data.List
p%s=[lookup x$zip(sort p)(sort s)|x<-p]
xnor
źródło