주문 모방


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스택 을 가져와 결과를 스택에 남겨 둡니다.온라인 데모

덕분에 2 바이트의 Martin Büttner .

해부

{         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}2 바이트 더 짧습니다.
Dennis

@Dennis, 그것은 별도의 답변이 될 정도로 다릅니다
Peter Taylor

그렇게 생각하면 답변으로 게시하겠습니다.
Dennis

10

J, 9 바이트

/:^:2~/:~

이 인수 는 ps 를 왼쪽과 오른쪽 인수로 사용 하는 이완 동사입니다 . 온라인으로 사용해보십시오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 /:을 사용하여 등급을 매 깁니다 . 즉 xx /:y 의 요소를 해당 값에 따라 정렬 하여 반환합니다 .y

  • s /: s단순히 s 의 요소를 정렬합니다 .

  • (s /: s) /: pp 의 해당 값에 따라 s 의 (정렬 된) 요소를 정렬 합니다.

  • 두 번 등급을 매기는 것은 본질적으로 올바른 주장의 서수를 계산합니다.

    따라서 s(s /: s) /: (s /: s) /: p 의 (정렬 된) 요소를 정렬 하여 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 수정되었습니다!
2012rcampion

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

XQSQSvz3 바이트 더 짧습니다.
Dennis

@Dennis Dang. 내가 왜이 말을하지 않았습니까? 게시 하시겠습니까?
Jakube

1
접근 방식과 충분히 다른 것으로 생각되면 반드시 확인하십시오.
Dennis

6

Pyth, 7 바이트

XQSQSvz

이것은 두 줄에 sp 문자열 표현을 기대하는 완전한 프로그램입니다 . 온라인으로 사용해보십시오.

작동 원리

           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

아 아아아! 나는 잘못 해석했고 몸이에서 시작되었다고 생각했다 =.
피터 테일러

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}

이것은 스택에서 sp (맨 위) 를 기대 하고 다시 정렬 된 익명 함수입니다. 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 감사합니다. Zgarb는 그 동안 2 개만 필요한 또 다른 11 바이트 솔루션을 찾았 /:지만 아직 답변을 업데이트하지는 않았습니다 ( ({~/:)&/:{[).
Martin Ender

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

배쉬 + 코어 유틸리티, 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  
$ 

3

R, 38 바이트

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

이것은 좋은 접근 방법입니다. 사용하지 않았을 것 match입니다.
Alex A.

3

루비, 51 바이트

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

2

하스켈, 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

R, 37 바이트

function(s,p,o=order)s[o(s)][o(o(p))]

2

티 스크립트, 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

하스켈, 56 바이트

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

이진 함수를 정의합니다 %. 의 각 항목 은 동일한 순서 통계, 즉 목록의 상대 순위 ps가진 항목으로 변환됩니다 . 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.