서로 옆에 두 개의 연속 정수가없는 순열을 제공하십시오.


18

도전

n ≥ 4 의 정수가 주어지면 두 개의 연속 정수 (절대 차이가 1 인 정수)가 나란하지 않은 속성으로 정수 [0, n-1] 의 순열을 출력합니다 .

  • 4[1, 3, 0, 2]
  • 5[0, 2, 4, 1, 3]
  • 6[0, 2, 4, 1, 3, 5]
  • 7[0, 2, 4, 1, 5, 3, 6]

대신 1- 인덱싱을 사용할 수 있습니다 ( [0, n-1] 대신 정수 [1, n] 사용 ).

코드는 n의 다항식 시간으로 실행되어야 하므로 모든 순열을 시도하고 각각을 테스트 할 수는 없습니다.


"순열 출력"이라고 말할 때 목록으로 의미합니까? 또는 순열 매핑 자체를 구현하는 함수를 생성 할 수 있습니까?
xnor

@xnor 사람이 읽을 수있는 형태로 출력되어야합니다. 나는 정확히 어떻게 신경 쓰지 않는다.
Anush

싶은 [[1,3],[0,2]]허용 가능한 출력 포맷이 될?
Shaggy

@Shaggy 그것은 좋지 않습니다. 1,3,0,2를 의미합니까?
Anush

답변:


31

젤리 , 3 2 바이트

ḂÞ

[1, ..., n] 의 정수를 LSB 별로 정렬합니다 .

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


와! 놀랍습니다.
Anush

2
"LSB로 정렬"은 다른 모든 사람이 처음으로 이동한다는 것을 의미하지만 젤리의 정의에 따라 각 반의 숫자가 원래 순서대로 유지되어야합니까? 그렇지 않은 경우 100 (4)은 101 (5) 옆에있을 수 있으며 여전히 "LSB에 의해 정렬"될 수 있습니다. 코드에 결함이 없지만 설명 주석이 완료되지 않았습니까?
WGroleau

1
@WGroleau 그렇습니다. Þ안정적인 정렬 파이썬 sorted함수를 사용하여 구현 되었으므로 안정적 입니다.
user202729

3
이 알고리즘은 영리한 크기보다 작은 크기보다 인상적입니다. 비트 순서를 바꾸고 정렬 한 다음 되돌릴 수도 있습니다.
WGroleau

4
65536 개의 서로 다른 2 바이트 젤리 프로그램 만있을 수 있습니다. 그것은이다 놀라운 사람들의 많은 ppcg 문제에 대한 답변으로 판명 있도록.
Anush




6

하스켈, 22 바이트

f는 적절하게 정렬 된 목록을 반환하는 n의 함수입니다. 1 인덱싱 옵션을 사용하고 있습니다.

f n=[2,4..n]++[1,3..n]

6

옥타브 , 17 바이트

@(x)[2:2:x,1:2:x]

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

이것은 다른 많은 것과 같은 접근 방식을 사용합니다. 포함 범위 2 ... x의 모든 짝수 번호와 포함 범위 1 ... x 의 모든 홀수 번호를 갖는 두 벡터를 연결하십시오 . 구문은 매우 분명해야하므로 설명하지 않겠습니다.


1
아닌가요 32서로의 옆에 f(4)?
pajonk

죄송합니다. 동일한 바이트 수 :-)
Stewie Griffin

5

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

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

편집 : @ Arnauld 덕분에 1 바이트가 절약되었습니다.


5

Gaia , 2 바이트

r∫

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

이것은 단순히 (안정된) 범위의 정수 ORTS [1 입력] 자신의 PA에 의해 R의 성만.


젤리와 같은 의견 : 알고리즘 또는 언어 정의는 두 개의 반쪽이 각각 원래 순서대로 유지되도록 보장합니까?
WGroleau

@WGroleau 네, Gaia에서는 정렬 메타 연산자가 안정적입니다.
Mr. Xcoder

5

R , 39 36 35 바이트

function(x)c(seq(2,x,2),seq(1,x,2))

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


홀수에 대한 후행 NA가 있습니다.
JayCe


아내의 잘못. 내가 고치기 전에 우리는 자전거 타기를해야만했다. 그러나 당신은 약간의 바이트도 면도했습니다.
ngm

예, 바이트를 추가하도록 요청하는 것이 좋지 않아 일부를 제거하는 방법을 찾아야했습니다 ... 잘 작동했습니다.
JayCe



4

apt, 4 바이트

또한 대체 할 수 uv다른 순서를 얻을 수 있습니다.

õ ñu

시도 해봐

또는 2 개의 배열을 출력 할 수 있다면 :

õ ó

시도 해봐


기술적으로 두 번째는 쉼표로 구분 된 숫자 목록을 출력합니다. ;-) 4불행히도 둘 다 실패합니다 . 당신은 변경하여 첫 번째 해결할 수 uvo에를 õ.
ETHproductions

3

Mathematica, 50-> 47-> 42 바이트

p = Join[Range[2, #, 2], Range[1, #, 2]] &

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

Flatten []에 대한 2 가지 최적화 가능성 Join []을 지적하고 순수한 함수를 사용하는 user202729에게 감사드립니다.

두 가지 말을 추가하고 싶습니다.

1) 요청에 따라 n> = 4에 대해 연속적인 하락 또는 상승이없는 특정 순열을 구성하는 것은 매우 간단합니다.

두 개의 연속 된 목록으로 구성됩니다.

n도 짝수입니다 :
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

홀수 n의 경우 :
list1 = (2,4, ..., Floor [n / 2])
list2 = (1,3, ..., Floor [n / 2])

이 "알고리즘"의 경우 단 하나의 결정 (n 짝수 또는 홀수) 만 내려야하며 나머지는 n 개의 숫자 만 적습니다.

가능한 Mathematica 솔루션이 맨 위에 제공됩니다.

2) 관련된 질문은 n의 함수로서 그러한 퍼뮤 테이션이 얼마나 많은가입니다.

매스 매 티카, 124 바이트

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

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

예:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

이러한 순열의 수를 세는 것은 표준 문제입니다.

n = 4 인 경우 2 : {{2,4,1,3}, {3,1,4,2}}가 있습니다

n = 5의 경우 14가 있습니다 : {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4,2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

이 순열의 수 a (n)은 빠르게 증가합니다. 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

큰 n의 경우 비율 a (n) / n! 한계 1 / e ^ 2 = 0.135335에 도달 한 것 같습니다 ... 엄격한 증거는 없지만 수치 적 증거로 추측 할 수 있습니다. 프로그램을 온라인으로 실행하여이를 테스트 할 수 있습니다.

위의 프로그램 (아래 주어진 기준에 따라)은이 숫자를 계산합니다.

OEIS : A002464 에서 관련 시퀀스에서 자세한 정보를 찾을 수 있습니다 . Hertzsprung의 문제 : n x n 보드에 n 개의 비 공격 왕을 배치하는 방법, 각 행과 열에 1이 있습니다. 또한 연속적인 증가 또는 감소없이 길이 n의 순열 수입니다.


@ Stewie Griffin 여기에 새로 왔을 때의 의미에 대해 자세히 설명하십시오. 첫 번째 말에서 나는 다항식 시간에서 문제를 해결하는 알고리즘과 코드를 제공했습니다. 따라서 도전에 대한 해결책으로 간주되어야합니다. 두 번째 부분은 흥미로운 문제를 확장합니다. 따라서 주석으로 간주해야합니다.
Dr. Wolfgang Hintze

Mathematica 코드가 맨 위에 오도록 제출 내용을 약간 수정하는 자유를 얻었습니다. 코드 골프 문제가 발생하면 실제 코드 (가장 짧은)를 제공해야합니다. 내가 그것을 형식화 한 방식은 아마도 의도 한대로 Mathematica 답변이되며 여전히 아래에 원래 설명이 있습니다. 빠진 것이 있거나 초기 답변을 잘못 편집 한 경우 자유롭게 다시 편집하십시오. PPCG에 오신 것을 환영합니다! :)
Kevin Cruijssen

@ Kevin Cruijssen 따뜻한 환영과 순진한 제출물을 편집 해 주셔서 감사합니다. 나는 두 번째 발언을 위해 Mathematica 프로그램을 추가했습니다. 어느 것이 합법적 인 예술품이 아닐 수도 있습니다. 무엇보다도 멋진 "온라인으로 시도"링크를 만드는 방법을 모르겠습니다.
Wolfgang Hintze 박사

을 사용하여 모든 링크를 만들 수 있습니다 [some text](the_link). 특히 "온라인으로 시도"링크와 관련하여 자체 @Dennis 에서 호스팅 하는 웹 사이트 https://tio.run/ 에는 모든 종류의 프로그래밍 언어에 대한 링크가 포함되어 있습니다. Wolfram Language (Mathematica)도 그중 하나입니다. 상단에서 재생 버튼을 클릭하여 코드를 실행하거나 하이퍼 링크 버튼을 클릭하여 "온라인으로 시도"를 복사 할 수 있습니다. (마크 업) 링크. 또한 하나 또는 여러 개의 테스트 케이스를 인쇄하기위한 선택적 헤더 / 바닥 글을 사용하여 코드를 실제 "코드"(제출)로 분할 할 수 있습니다.
케빈 크루이 센

다소 둔한 의견에 대한 사과와 그에 대한 답변 부족! 답변이 검토 대기열에 나타 났으며 형식으로 인해 코드를 보지 못했습니다. 새로운 사용자가 실제 답변을 제공하지 않고 도전에 "흥미로운 관찰"을 게시하는 것은 드문 일이 아닙니다. 그것은 선의로 이루어 지지만 사이트의 내용이 아닙니다. 나는 이것이 그런 대답이라고 생각했다. 귀하의 의견에 답변해야했지만 서둘러서 새로운 의견을 작성할 수 없으므로 대신 이전 의견을 삭제했습니다. 사과! 그리고 사이트에 오신 것을 환영합니다! 나는 당신이 주위에 붙어 있기를 바랍니다! :)
Stewie Griffin



2

공백 , 161 바이트

주석 처리되지 않은 공식 제출물은 다음과 같습니다. 온라인으로 사용해보십시오!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



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

프로그램이 오류없이 실행될 수 있도록 몇 바이트를 희생했으며 약 7-8 바이트를 잃을 수 있으며 여전히 올바르게 출력되지만 오류 메시지를 출력하므로 아무도 원하지 않습니다.

전체 바이트 설명 :

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

골프를 타는 것 : 바이트를 절약 push_0, read_STDIN_as_int, push_0, retrieve할 수 있습니다 push_0, duplicate_0, read_STDIN_as_int, retrieve. 그리고 첫 번째 레이블은 NSSN대신 빈 레이블이 될 수 있습니다 NSSSN(그리고 두 번째 레이블은 NSSSN세 번째 NSSTN; 네 번째 가 될 수 있음 NSSSSN). 8 바이트도 절약해야합니다. 또한 이미 오른쪽 아래에 Jump_to_third_label있기 때문에 첫 번째를 제거 할 수 있습니다 Set_third_label. 총계 : 140 바이트 ; (또는 주석이있는 경우 : 온라인으로 시도하십시오 .) NNNexit 를 제거하면 -3 바이트 .
케빈 크루이 센


1

Gol> <> , 14 바이트

FL:2%Z}:3=?$|B

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

전체 프로그램 예 및 작동 방식

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

자바 8, 56 바이트

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

@Neil 의 JavaScript (ES6) 포트 .

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


이전 66 바이트 답변 :

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

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

설명:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

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