Імітуйте замовлення


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

Відповіді:


10

CJam, 12 10 байт

{_$f#\$f=}

Це анонімна функція, яка бере s pна себе стек і залишає результат у стеку. Демонстрація в Інтернеті

З подякою Мартіну Бюттнеру за 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}на два байти коротше.
Денніс

@ Денніс, це досить різне, щоб бути окремою відповіддю
Пітер Тейлор

Якщо ви так вважаєте, я опублікую це як відповідь.
Денніс

10

J, 9 байт

/:^:2~/:~

Це дієслово з діадією, яке сприймає 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використовується двійковій. Таким чином, дзвоніть

    p /:^:2~ y
    

    виконує

    y /:^:2 p
    
  • Прислівник ^:- сила . Таким чином, дзвоніть

    y /:^:2 p
    

    виконує

    y /: y /: p
    

Збираємо все це разом, дзвонимо

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

виконує

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

Як це працює

Діадик /:оцінюється за допомогою , тобто x /:yповертає елементи x , відсортовані відповідно до відповідних значень y.

  • s /: sпросто сортує елементи s .

  • (s /: s) /: pсортує (відсортовані) елементи s за відповідними значеннями p .

  • Класифікація двічі по суті обчислює порядки правильного аргументу.

    Таким чином, (s /: s) /: (s /: s) /: pсортуємо (відсортовані) елементи s , імітуючи порядок елементів p .


9

Математика, 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 Виправлено!
2012рcampion

1
+1 Я знайшов це саме рішення через 4 хвилини після вас! Ви можете зберегти пару байтів:o = Ordering; (Sort@#)[[o@o@#2]] &
DavidC

Прекрасне нове рішення через Permute! Дуже корисне використання перестановок.
DavidC

7

J, 17 байт

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

Це оцінюється на дієслово діадічне (що означає бінарне). Це можна викликати наступним чином:

  _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. Чому я цього не зробив? Ви хочете опублікувати його?
Якубе

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

Пітон 2, 51

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

Я розгублений: чому існують три параметри?
Пітер Тейлор

@PeterTaylor Третій параметр має значення за замовчуванням, тому його можна викликати лише 2.
feersum

@PeterTaylor Додавання окремого рядка a=sortedматиме такий же ефект.
xnor

Аааааа! Я був misparsing, і подумав , що тіло стало на =.
Пітер Тейлор

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, тому я відчуваю, що деякі з них @і []можуть бути непотрібними. Якщо хтось більш досвідчений користувач 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.

Ви можете використовувати діадик, /:щоб позбутися {і а @, для 11 байт:/:~@]/:/:@[
Dennis

@Dennis Спасибі, Zgarb тим часом знайшов ще одне 11-байтове рішення, якому потрібні лише два /:, але я ще не обійшов питання щодо оновлення відповіді ( ({~/:)&/:{[).
Мартін Ендер

4

APL, 17 12 байт

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

Завдяки @Dennis, це зараз дуже елегантно.

Ось приємне 14-байтове рішення, яке не використовує подвійну індексацію:

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

На жаль, ми не можемо індексувати масиви в поїздах APL.


4

Пітон 2, 48

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

Великий глобус функцій. Тут використовується підхід до перекладу елементів у багатьох інших відповідях за допомогою словника.

Зоряне введення *lочікує шаблони та джерело у такому порядку та перетворює їх у список l.

Картографування sortedсортує обидва списки та dict(zip(_))перетворює пару списків у словник із ключами першого списку, зіставленими зі значеннями другого, у порядку зростання. Отже, результат полягає в тому, що той i-й найбільший елемент візерунка узгоджується з i-м найбільшим елементом джерела.

Нарешті, ми перетворюємо шаблон ( l[0]) за допомогою цього словника, відображаючи його .getметод.


3

Bash + coreutils, 55

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

Вхідні дані приймаються як дві назви файлів відповідно до джерела та шаблону:

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



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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.