Nachahmung einer Bestellung

24

Ordnen Sie die Quelle anhand von zwei Zahlenlisten, einer Quelle und einem Muster , neu an, sodass sie der relativen Reihenfolge des Musters entspricht. Zwei beliebige Einträge der neu geordneten Quelle sollten auf dieselbe Weise verglichen werden wie die Einträge an denselben Positionen des Musters.

Zum Beispiel die Eingabe

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

sollte das Ergebnis produzieren

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

Vergleicht man die erste und letzte Position, so ergibt sich 11<13, welche 7<12im Muster übereinstimmt .

Eingabe: Zwei gleich lange, nicht leere Listen mit ganzen Zahlen. Jede Liste wird keine Wiederholungen haben. Es liegt an Ihnen, ob die Quelle oder das Muster zuerst angegeben wird.

Ausgabe: Eine Liste, die die Quellennummern so neu anordnet, dass sie die gleiche relative Reihenfolge wie die Musternummern haben.

Bestenliste:

xnor
quelle
Muss es eine Funktion / Programm sein, oder ist ein Ausdruck / Snippet genug?
Adám

Antworten:

10

CJam, 12 10 Bytes

{_$f#\$f=}

Dies ist eine anonyme Funktion, die nimmt s pauf dem Stapel und läßt das Ergebnis auf dem Stapel. Online-Demo

Mit Dank an Martin Büttner für 2 Bytes.

Präparation

{         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
quelle
{_$@$er}ist zwei Bytes kürzer.
Dennis
@ Dennis, die anders genug , eine separate Antwort zu sein
Peter Taylor
Wenn Sie so denken, werde ich es als Antwort posten.
Dennis
10

J 9 Bytes

/:^:2~/:~

Dies ist ein dyadisches Verb , das nimmt p und s wie linke und rechte Argumente. Versuchen Sie es online mit J.js .

Testlauf

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

Wie das geht

Sprich definierten wir die linken und rechten Eingang von dem Beispiel zugeordnet über

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

Dann:

  • Der Zug /:^:2~/:~ist ein Haken der Verben /:^:2~und /:~ruft so

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

    ausführt

    p /:^:2~ /:~ s
    
  • Das Adverb ~in /:~ist reflexiv , da /:es monadisch verwendet wird. Also anrufen

    /:~ s
    

    ausführt

    s /: s
    
  • Das Adverb ~in /:^:2~ist passiv , da das Verb /:^:2dyadisch verwendet wird. So rufen

    p /:^:2~ y
    

    ausführt

    y /:^:2 p
    
  • Das Adverb ^:ist Macht . Also anrufen

    y /:^:2 p
    

    ausführt

    y /: y /: p
    

Dass sie alle zusammen, rufen

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

ausführt

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

Wie , dass Werke

Dyadic /:wird mit bewertet , dh es werden x /:ydie Elemente von x zurückgegeben , sortiert nach den entsprechenden Werten von y.

  • s /: ssortiert einfach die Elemente von s .

  • (s /: s) /: psortiert die (sortierten) Elemente von s nach den entsprechenden Werten von p .

  • Grading bis berechnet zweimal im Wesentlichen die ordinals seines rechten Arguments.

    Somit (s /: s) /: (s /: s) /: psortiert die (sortiert) Elemente s , um die Reihenfolge der Elemente nachahmt p .

Dennis
quelle
9

Mathematica, 32 27 Bytes

Sort@#~Permute~Ordering@#2&

Anwendungsbeispiel:

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

Zurück Versuch:

Sort[#][[Ordering@Ordering@#2]]&
2012rcampion
quelle
@DavidCarraher Fest!
2012rcampion
1
+1 entdeckte ich diese sehr gleiche Lösung , die 4 Minuten , nachdem Sie! Sie können ein paar Bytes speichern:o = Ordering; (Sort@#)[[o@o@#2]] &
DavidC
Schöne neue Lösung über Permute! Sehr nützlich Verwendung von Permutationen.
DavidC
7

J, 17 Bytes

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

Dies ergibt ein dyadisches (dh binäres) Verb. Es kann wie folgt hervorgerufen werden:

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

Erläuterung

Dies ist möglicherweise nicht die kürzest mögliche Lösung, aber es ist ein neuartiger Ansatz.

                   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
quelle
6

Pyth, 10 Bytes

@LSvzxLSQQ

Probieren Sie es online aus: Demonstration

Erläuterung

@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
quelle
XQSQSvzdrei Bytes ist kürzer.
Dennis
@ Dennis Dang. Warum habe ich nicht daran gedacht? Möchten Sie es veröffentlichen?
Jakube
1
Wenn man bedenkt , es von Ihrem Ansatz hinreichend verschieden, sicher.
Dennis
6

Pyth, 7 Bytes

XQSQSvz

Dies ist ein komplettes Programm , die String - Darstellungen erwartet s und p auf zwei Linien. Probieren Sie es online aus.

Wie es funktioniert

           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
quelle
5

Python 2, 51

lambda s,p,a=sorted:[a(s)[a(p).index(x)]for x in p]
Feersum
quelle
Ich bin verwirrt: Warum gibt es drei Parameter?
Peter Taylor
@PeterTaylor Der dritte Parameter hat einen Standardwert, so dass er nur mit 2.
feersum
@PeterTaylor eine separate Zeile hinzufügen a=sortedwürde die gleiche Wirkung haben.
Xnor
Aaaaaah! Ich war misparsing, und dachte , dass der Körper an die begann =.
Peter Taylor
5

Mathematica 56 43 30 29 Bytes

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

Ordering@#2Gibt die Reihenfolge der Zahlen im Muster zurück. Ordering@Ordering@#2gibt die Positionen an, die die sortierten Elemente in der Quelle einnehmen sollen.

Sort[#][[o@o@#2]]& gibt die Quelle in den erforderlichen Positionen, nämlich diejenigen, die die gleiche relative Reihenfolge wie die Musterliste.

Testen

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
quelle
5

CJam, 8 Bytes

{_$@$er}

Dies ist eine anonyme Funktion, die s und p (ganz oben) auf dem Stapel erwartet und die neu geordneten s zurückgibt. Versuchen Sie es online in dem CJam Dolmetscher .

Wie es funktioniert

_      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
quelle
4

J, 13 Bytes

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

Ich habe immer noch Probleme damit, Js Verbkomposition in den Kopf zu stecken, also fühle ich mich wie einige von denen @und []könnte unnötig sein. Wenn ein erfahrener J-Benutzer mich wissen lassen könnte, ob dies komprimiert werden kann, wäre das großartig. :)

Das Verb kann wie folgt verwendet werden:

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

Erläuterung

/:@/:@[{/:~@] 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
quelle
Sie können dyadic verwenden /:, um {a @für 11 Bytes zu entfernen:/:~@]/:/:@[
Dennis
@Dennis Danke, Zgarb hat in der Zwischenzeit eine weitere 11-Byte-Lösung gefunden, die nur zwei benötigt /:, aber ich bin noch nicht dazu gekommen, die Antwort zu aktualisieren ( ({~/:)&/:{[).
Martin Ender
4

APL, 17-12 Bytes

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

Dank @Dennis ist das jetzt sehr elegant.

Hier ist eine schöne 14-Byte-Lösung, die keine doppelte Indizierung verwendet:

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

Leider können wir Arrays in Zügen in APL nicht indizieren.

Lirtosiast
quelle
4

Python 2, 48

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

Ein großer Funktionsumfang. Hierbei wird der Elementübersetzungsansatz vieler anderer Antworten mithilfe eines Wörterbuchs verwendet.

Die markierte Eingabe *lerwartet die Muster und die Quelle in dieser Reihenfolge und wandelt sie in eine Liste um l.

Die Zuordnung sortedsortiert beide Listen und dict(zip(_))wandelt ein Listenpaar in ein Wörterbuch mit Schlüsseln aus der ersten Liste um, die mit den Werten in der zweiten Liste in aufsteigender Reihenfolge übereinstimmen. Das Ergebnis ist also, dass das i-th größte Element des Musters mit dem i-th größten Element der Quelle übereinstimmt .

Schließlich transformieren wir das pattern ( l[0]) über dieses Wörterbuch, indem wir seine .getMethode zuordnen.

xnor
quelle
3

Bash + Coreutils, 55

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

Die Eingabe erfolgt als zwei Dateinamen für die Quelle bzw. das Muster:

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

R, 38 Bytes

function(s,p)sort(s)[match(p,sort(p))]
Flodel
quelle
Das ist ein schöner Ansatz. Hätte nicht gedacht zu benutzen match.
Alex A.
3

Ruby, 51 Bytes

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

Haskell, 65 Bytes

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

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

Wie es funktioniert:

           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
quelle
2

R, 37 Bytes

function(s,p,o=order)s[o(s)][o(o(p))]
aPaulT
quelle
2

TeaScript, 15 Bytes

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

Dies nimmt die Eingabe als Array an. Der Dolmetscher ist momentan nicht verfügbar, weil ich den neuen Dolmetscher einsetze

Erläuterung

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
quelle
Entweder verstehe ich die Erklärung schlecht oder das funktioniert nicht ... Ich habe es in Pip entsprechend meiner Meinung codiert und 13 9 -6 4 11 -5 0für die Sample-Eingabe erhalten. ??
DLosc
2

Jelly , 6 Bytes, Sprachnachstellung

Œ¿œ?Ṣ}

Probieren Sie es online!

Dies nimmt das Muster, gefolgt von der Quelle, als zwei separate Argumente.

Erläuterung

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

quelle
1

Haskell, 56 Bytes

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

Definiert eine Binärfunktion %. Jeder Eintrag in pwird in den Eintrag smit der gleichen Ordnungsstatistik, dh dem relativen Rang in seiner Liste, umgewandelt. Die Ordnungsstatistik von xin pwird durch Zählen der Elemente ermittelt, die kleiner sind als sie (was sort p!!xärgerlich ist Maybe). Das Ergebnis wird in indiziert sort s.

Eine zip/lookupLösung hat die gleiche Länge, außer dass sie JustZahlen enthält.

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