배열의 단일 스왑


19

에서 영감 에서 촬영 스택 오버플로에서 질문 .

도전

정수가 주어지면 n>1배열에서 정확히 두 항목을 교환하여 얻을 수있는 모든 배열을 출력합니다 [1, 2, ..., n].

어레이는 임의의 순서로 제조 될 수있다.

(1 [0, 1, ..., n-1]기반) 대신 (0 기반)을 일관되게 사용할 수 있습니다 [1, 2, ..., n].

추가 규칙

테스트 사례

입력 2은 출력을 제공합니다 (1 기반으로 가정)

2 1

입력 3은 출력을 제공합니다 (세 개의 배열은 임의 순서로 정렬 될 수 있음)

1 3 2
2 1 3
3 2 1

입력 4은 출력을 제공합니다

1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1

입력 7은 출력을 제공합니다

1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1

길이가 n 인 모든 순열의 사전 순으로 정렬 된 목록에서 oeis.org/A211369 에서 제공 한 색인 에 1을 더한 값 (0 인덱싱 인 경우 2)을 입력합니다.
Jonathan Allan

5
나는의 유연성에 감사 [0 ... n-1]대를 [1 ... n]! 1+J 인덱스가 0이기 때문에 항상 짜증을 내야 합니다.
cole

답변:


3

젤리 , 11 8 바이트

ŒcżU$y€R

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

작동 원리

ŒcżU$y€R  Main link. Argument: n

Œc        Take all 2-combinations of [1, ..., n].
  żU$     Zip the result with the reversed pairs.
       R  Range; yield [1, ..., n].
     y€   For each [[i, j], [j, i]] in the result to the left, yield the result to
          the right, with i replaced by j and vice versa. 

정확히 무엇을 y합니까? 그것은 항상 나에게 약간의 미스터리였습니다.
caird coinheringaahing

교체를 수행합니다. 예를 들어, [1,2],[4,3]y1,2,3각각의 대체 (1) 에서 [1, 2, 34 , 각각 23 .
Dennis

8

R , 54 바이트

function(n)combn(n,2,function(x){z=1:n
z[x]=rev(x)
z})

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

각 열이 순열 인 행렬을 반환합니다.

combn(n,k)klist n또는 size 가 단일 정수인 1:n경우 크기의 모든 조합을 생성합니다 n. 또한 선택적으로 FUN결과 조합에 적용되는 기능 이 필요합니다. 따라서 스왑을 수행하고 스왑 된 목록을 반환하는 함수를 작성합니다. 그런 다음 결과는 모두에 축적됩니다. array이 경우 2 차원이므로 행렬입니다.





5

Wolfram Language (Mathematica) , 43 바이트

r/.{#->#2,#2->#}&@@@Subsets[r=Range@#,{2}]&

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

설명 : 크기가 2 인 Subsets[Range@#,{2}]모든 서브 세트를 생성 {1,2,...,n}한 다음 각 서브 세트 /.에 대해 목록에서이 두 가지를 교체합니다.{1,2,...,n} .

이 접근 방식은 다른 많은 제출물과 실망스럽게 비슷하지만 Mathematica에 더 독창적 인 3 바이트가 더 있습니다.

r~Permute~Cycles@{#}&/@Subsets[r=Range@#,{2}]&

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


2
훨씬 더 관용적 인 Mathematica 솔루션은 다음과 같습니다 ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&. 나는 그것이 얼마나 간단한 지 (또는 어떻게 직접 문제를 인코딩하는지) 좋아하지만 불행히도 패턴 일치 구문은 너무 길어서 57 바이트가됩니다.
Martin Ender

5

하스켈, 62 바이트

g n|b<-[1..n]=[[last$k:[j|k==i]++[i|k==j]|k<-b]|i<-b,j<-b,j<i]

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

i<-b                -- loop 'i' through [1..n]
     j<-b           -- loop 'j' through [1..n]
          j<i       -- consider only cases where j<i 
 [            k<-b] -- make a list by looping 'k' through [1..n] 
  last              -- pick
          [i|k==j]  -- 'i' if k==j
       [j|k==i]     -- 'j' if k==i
     k              -- 'k' else   


4

MATL , 12 바이트

:2XN!"G:@tP(

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

            %implicit input, say, 4
:           %range, stack is {[1,2,3,4]}
2           %push 2
XN          %nchoosek, compute all combinations of [1,2,3,4] taken 2 at a time
            %this results in a matrix where each row is a combination, i.e.,
            %[1, 2;
              1, 3;
              1, 4;
              2, 3;
              2, 4;
              3, 4]
!           %transpose, because "for" iterates over columns
"           %begin for loop
G:          %push input and range, stack is now [1,2,3,4]
@t          %push "for" index (the column), say, [1;2], twice
P           %flip array, so stack is now: {[1,2,3,4],[1;2],[2;1]}
(           %assignment index, sets [1,2,3,4]([1;2])=[2;1],
            %resulting in [2,1,3,4]
            %implicit end of loop, implicit end of program, print the stack implicitly.


1
테스트 케이스를 생성하는 데 사용한 코드보다 2 바이트 더 짧고 더 효율적인 방법 :-)
Luis Mendo

@LuisMendo 테스트 케이스는 어떻게 생성 했습니까? 주문이 동일하지 않아서 내 것이 더 길어질 까 걱정했습니다!
주세페

1
나는 사용했다 :tY@wy=~!s2=Y). rahnema1의 Octave 답변과 동일한 접근 방식,
Luis Mendo



2

자바 스크립트 (ES6), 81 바이트

인덱스가없는 배열을 인쇄합니다.

n=>(a=[...Array(n).keys()]).map(i=>a.map(j=>i>j&&alert(a.map(k=>k-i?k-j?k:i:j))))

데모

alert()로 대체되어 console.log()사용자 편의를위한이 조각에.




2

05AB1E , 15 9 바이트

LœʒD{αĀO<

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

설명

L            # push range [1 ... input]
 œ           # get all permutations
  ʒ          # filter, keep only elements that are true when
     α       # absolute value is taken with
   D{        # a sorted copy
      Ā      # each non-zero value in the resulting array is converted to 1
       O     # the array is summed
        <    # and the sum is decremented

2

껍질 , 9 바이트

!2§kδ#≠Pḣ

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

설명

!2§kδ#≠Pḣ  Input is an integer n.
        ḣ  Range: r=[1,2,..,n]
       P   Permutations of r.
   k       Classify by
     #     number of elements
      ≠    that are different from
  § δ      the corresponding element of r.
!2         Take the second class.

2

루비 , 55 53 바이트

->n{n.times{|x|x.times{|y|(w=*0...n)[w[x]=y]=x;p w}}}

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

0 기반 솔루션

여기서 속임수는 내부 루프가 항상 반복을 "건너 뛰는"것입니다. 처음에는 전혀 실행되지 않고 두 번째 패스에서는 한 번만 실행됩니다.

R 이 54까지 골프를 칠 수 있다는 것을 알 때까지 55 바이트에 만족 했으므로 53으로 가져와야했습니다.


유연한 출력 제약 조건을 매우 영리하게 사용합니다.
Unihedron


1

Pyth, 9 바이트

t{.rLQ*=U

데모

두 값을 바꾸는 가장 쉬운 방법 .r은 Pyth의 회전 변환 함수 인 을 사용 하는 것입니다. .r<list>[A, B]모든 항목 교환 할 AB에서를 list.

따라서 리스트에 다른 숫자의 각 두 요소리스트와 함께 UQ리스트를 0로 변환 함수를 적용 n-1하여 원하는 출력을 생성합니다. Q상기 입력 nU범위 함수이다.

이를 수행하는 쉬운 방법은 다음과 같습니다.

.rLUQ.cUQ2

.cUQ2범위에서 고유 한 요소의 두 요소 조합을 모두 생성하고 해당 요소 와 목록에 함수를 .rLUQ맵핑 .r합니다.UQ .

그러나 10 바이트입니다.

.cUQ2고유 한 순서 쌍 을 만드는 대신 모든 쌍을로 만들 수 있습니다 *=U. 이것은 암시 적으로와 같습니다 *=UQQ. 그것은 덮어 쓰기 시작 Q으로 UQ다음의 직교 제품을 복용 UQ하고 UQ. 이것은 반드시 순서가 다르거 나 구별되는 것은 아닌 범위 내의 모든 숫자 쌍을 제공합니다.

.rLQ각 목록을 사용하여 교환합니다. 리콜 Q지금은 목록에 동일 0n-1하지 n.

쌍이 주문되지 않았으므로 중복이 있습니다. {중복을 제거합니다. 쌍이 서로 다르기 때문에 변경되지 않은 목록이 있습니다. 이 목록은 중복 제거 후에 항상 첫 번째 {입니다. 첫 번째 모양의 순서를 유지하고로 변경하여 변경되지 않은 목록을 생성하기 때문 [0,0]입니다. t원하는 스왑 목록을 제공하여 첫 번째 요소를 제거합니다.


1

Pyth, 11 바이트

fq2snVTUQ.p

온라인으로 시도하십시오
isaacg의 접근 방식만큼 짧지는 않지만 게시하기에 충분히 다릅니다.

설명

fq2snVTUQ.p
         .pQ  Take the permutations of the (implicit) range [0,...,input].
f     T       Filter to get the permutations...
   snV UQ     ... where the number of differences with [0,...,input]...
 q2           ... is 2.



1

루비 , 80 바이트

Unihedron 덕분에 -12 바이트

->n{(r=1..n).map{|x|r.map{|y|r.map{|i|i==x ?y:i==y ?x:i}}}.flatten(1).uniq[1,n]}

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

나는 어떤 이유로 루비로 가장 잘 번역되었다는 것을 명심했다. 그래서 나는 루비조차 모른다.


codegolf.stackexchange.com/a/152652/21830을 능가했습니다 . 죄송합니다!
Unihedron

사과 할 필요가 없습니다! 경쟁이 PPCG를 시원하게 만드는 요소라고 말할 때 대부분의 PPCG 사용자에게 이야기하는 것 같습니다.
완전히 인간적인

1
코드에 관해서는, 1. 할당 할 수 1..n한 문자 변수에과 (개행 또는 세미콜론으로 별도의 문을) 재사용, 2. termary 문에서 괄호없이 수행 i==x ?y:i==y ?x:i(필자는 공백이 메모를 잠재적 인 오두막을 분리해서하기 ) uniq[1,n]대신에 3 uniq[1..-1].
Unihedron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.