역 삽입 정렬


19

객관적인

삽입 정렬정렬 을 수행 하는 동작에서 원래 스크램블 목록을 생성하십시오 . 원본 목록 에는 입력의 크기 인 모든 숫자가 포함 0됩니다 N-1(포함) N.

입력

목록을 정렬하는 데 필요한 이동이 포함 된 목록입니다. 각 값은 원래 (스크램블 된) 숫자로 대체 된 슬롯의 양이 올바른 위치에 있음을 나타냅니다.이 프로세스는 왼쪽에서 오른쪽입니다. 입력 목록
에서 (0 인덱스) 위치의 값은 i사이 0i포함됩니다.
유효하지 않은 입력을 처리 할 필요가 없습니다.이 경우 어떤 동작도 허용됩니다 (충돌, 무한 루프 등).

산출

스크램블 목록

움직임을 생성하는 단계별

Scrambled List | Moves to sort
[4,0,2,1,3,5]  | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5]  | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5]  | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5]  | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5]  | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5]  | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]

따라서 입력 [0,1,1,2,1,0]하려면 프로그램을 출력해야합니다 [4,0,2,1,3,5].
움직임은 (최종) 정렬 목록의 위치가 아니라 정렬 된 세그먼트 (굵은 부분)의 위치에 있음을 명심하십시오.

테스트 사례

[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]

승리

이것은 이므로 가장 짧은 답변이 이깁니다.

code-golf  array-manipulation  code-golf  code-golf  animation  code-golf  restricted-source  code-golf  java  code-golf  decision-problem  graph-theory  code-golf  conversion  electrical-engineering  code-golf  ascii-art  code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

1
프로그램이 목록의 길이를 입력으로 사용할 수 있습니까?
mbomb007

@ mbomb007 아뇨.
Rod

대신 (n-1) 단계를 사용할 수 있습니까? 첫 번째는 항상 0이므로 불필요합니다.
GB

@GB 물론, 출력이 옳다면 어떤 알고리즘이든 사용할 수 있습니다
Rod

답변:


14

젤리 , 12 바이트

L!_UÆ¡$œ?J’U

온라인으로 사용해보십시오!

설명

기본적으로 두 목록 (입력 및 출력)을 정수 인코딩으로 볼 수 있습니다. 입력은 계승 기준으로 정수를 인코딩하고 출력은 정수를 순열로 인코딩합니다. 운 좋게도 Jelly는 이미이 두 인코딩에 매우 가까운 내장 기능을 가지고 있으므로 정수로 변환 한 다음 다른 인코딩으로 다시 변환하기 위해 작은 코드 조각을 작성하면됩니다.

L!_UÆ¡$œ?J’U
   U           Reverse {the input}
    Æ¡         and convert from base factorial to integer;
  _   $        subtract that from
L!             the factorial of the length of {the input};
       œ?      then take the nth permutation of
         J     [1,2,...,l], where l is the length of {the input},
          ’    subtract 1 from every elevent,
           U   and reverse it

기본 계승의 경우 목록의 첫 번째 요소는 0, 두 번째는 0 또는 1, 세 번째는 0/1/2 등이어야 함을 알 수 있습니다. 따라서 기본 변환을 위해 해당 요소를 일반 쓰기 순서로 가져 오려면 입력을 반대로해야합니다.

또한, 계승 변환과 순열 변환의 상대적 순서가 삽입 정렬이 사용하는 연산과 일치하도록 두 가지 조정을 수행해야합니다. 순열 순서를 반대로하고 출력 목록의 순서를 반대로합니다. 출력 목록을 반전시키는 U것은 프로그램 끝 부분에 필요한 것만으로도 충분 합니다. 순열 순서를 반대로 바꾸려면 입력 길이의 계승을 뺍니다 (기본 계승은 0에서 (길이! -1) 범위의 숫자를 생성하기 때문에 작동하지만 순열은 1에서 길이까지 젤리로 번호가 매겨집니다! , 계승에서 순열 지수를 뺄 때 일반적으로 얻을 수있는 단위를 취소하는 암시 적 단위를 생성합니다.

@JonathanAllan과 공동으로 Jelly , 9 바이트

UÆ¡Nœ?J’U

이 버전의 프로그램은 매우 유사하지만 순열 순서를 바꾸는 다른 방법을 사용합니다. 단순히 입력을 부정하면 순서를 반대로 처리하기에 N충분합니다 œ?. 그 외에도 이전 프로그램과 동일하게 작동합니다.

온라인으로 사용해보십시오!


4
O_O 무엇의 마법이 있다 이?
DLosc

좋은 아 - 내가 알고 Æ¡œ?원자이 작동 것이다 (이미 이전이 도전을 위해 그들을 사용하려고 시작했다 - 나는 너무 가까이, 단지를 필요했다 L!거기에).
Jonathan Allan

훌륭한 코드!
Greg Martin

1
실제로, 모듈 (Jelly 목록을 사용하는 것처럼)으로 모듈 식으로 작동하고 구현하기 때문에 9 바이트로 수행 할 수 있습니다 . 음의 값을 갖는 단지 인덱스. 참고 : 나는 변경 했습니다 -이것은 숫자가 주어지면 어쨌든 범위를 벗어난 것입니다). UÆ¡Nœ?L’Uœ?NJL
Jonathan Allan

6

수학, 92 바이트

Permute[Range[l=Length@#]-1,(c=Cycles@{#}&)@{}©##&@@c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]&

음수가 아닌 정수 목록을 입력으로 사용하고 음이 아닌 정수 목록을 리턴하는 순수 함수. 위의 코드에는 ©잘못된가 포함되어 있습니다. 3 바이트 기호 U + F3DE의 자리 표시 자입니다. Mathematica는 점이있는 원으로 표시되고 순열의 구성을 나타냅니다.

c=Cycles@{#}&정수 목록을 Cycles순열을 나타내는 객체 로 변환하는 함수를 정의합니다 . 예를 들어, c[{3,4}]목록의 전치 교환 요소 3과 4가 있습니다. c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]입력 목록을 가져 와서 삽입 정렬을 취소하는 데 필요한 순열을 생성합니다. 그런 다음 c@{}©##&@@항등 순열부터 시작하여 이러한 순열을 모두 작성합니다 c@{}. 마지막 Permute[Range[l=Length@#]-1,...]으로이 순열을 0으로 색인화 된 적절한 길이의 목록에 적용합니다.


1
내장이 없습니까?! 확실히 ...
Jonathan Allan

3
@{#}&)@{}©##&@@무섭게 보인다.
Yytsi

6

파이썬 2, 79 68 바이트

10 바이트를 절약 한 Krazor에게 감사합니다

1 바이트 절약을위한 TuukkaX에 감사

a=input();b=range(len(a));print[b.pop(j-a[j])for j in b[::-1]][::-1]

움직임을 역으로 생성하여 작동


2
66을 확인하십시오 ! 어떻습니까 : a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]. 이해를 나열하십시오 ftw!
FMaz

1
@Krazor 당신은 전에 제거 할 수있는 공간이 for있으므로 65 라고 생각하십시오 : D
Yytsi

@Krazor 목록 이해력이 효과가 없었지만 b [::-1] 사용 아이디어가 마음에 들었습니다.
math junkie

절대 안돼? 모바일로 댓글을 달았으며, 잘못 입력했을 수 있습니다. 어느 부분이 작동하지 않습니까? 나를 위해 올바르게 해석하고 모든 테스트 사례를 수행했습니다.
FMaz

@Krazor 아, 맞아요. 나는 테스트하는 동안 잘못 입력 한 사람입니다.
math junkie

5

자바 스크립트 (ES6), 69 65 63 바이트

a=>a.reverse(b=[...a.keys()]).map(o=>+b.splice(~o,1)).reverse()

짜증나게 입력과 출력 모두 잘못된 순서입니다. 편집 : @Arnauld 덕분에 4 바이트가 절약되었습니다. @ETHproductions 덕분에 2 바이트를 절약했습니다.


나는 여전히 더 나은 길을 찾으려고 노력했지만 훨씬 더 빨랐다. 좋은 것!
Arnauld

1
당신은 필요 i하지 않습니까?
Arnauld

@Arnauld 분명히 아닙니다. 나는 파이썬의 대답을 이해하려고 시작했고, 나는 그것이 실제로 사용하지 않는다는 것을 알아 차렸다 i.
Neil

1
쉬운 -2 :o=>+b.splice(~o,1)
ETH 프로덕션

3

자바 스크립트 (ES6), 73 71 바이트

ETH 프로덕션 덕분에 2 바이트 절약

m=>(a=m.map((_,i)=>j=i)).map(_=>a.splice(j,0,+a.splice(j-m[j--],1)))&&a

테스트 사례


길이와 범위를 동시에 얻는 좋은 방법. 나는 제안 할 a=m.map(_=>j++,j=0)것이지만, 길이는 같으며 이미 시도해 보았습니다.
ETHproductions

@ETHproductions 당신이 맞아요 : 나는 또한 그것을 시도했습니다. :-) (이것은 동등하지 않다는 점에 주목할 가치가 있습니다 : 이것은 오히려 설정 j되고 요구 될 것입니다 )a.lengtha.length-1a.splice(--j,0,a.splice(j-m[j],1)[0])
Arnauld

Heh, 나도 그렇게 생각했지만 길이가 같기 때문에 언급 할 가치가 없다고 생각했다
ETHproductions

1
쉬운 -2 :+a.splice(j-m[j--],1)
ETH 프로덕션

2

하스켈 , 85 바이트

f x|n<-length x-1=reverse x#[n,n-1..0]
(n:r)#l=r#(take n l++drop(n+1)l)++[l!!n]
x#l=x

온라인으로 사용해보십시오! 사용법 예 : f [0,1,1,2,1,0]yields [4,0,2,1,3,5].

f x#list를 x뒤집고 list로 함수 를 호출합니다 [length x - 1, length x - 2, ... , 0]. (n:r)#l행하는 역 삽입 정렬 재귀 취하여 n밖으로 번째 요소 l여기서 l!!n낳는 nth 요소 및 take n l++drop(n+1)l수율리스트 l함께 n제거 th 요소.


하스켈, 너무 아름다워.
FMaz

1

펄, 61 바이트

@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p

출력은 배열 @o로 끝납니다. 명령 행 인수로 입력 배열이있는 예 :

perl -le'@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p;print@o' 0 1 1 2 1 0
402135

1

루비, 49 바이트

->l{(w=l.size).times{l.insert(l.shift+w-=1,w)};l}

가장 큰 숫자부터 시작하여 목록 내에서 "역 삽입"을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.