코드 골프 최고의 순열


14

도전

n ≥ 4 의 정수가 주어지면, 두 개의 연속 된 정수가 나란하지 않은 특성으로 정수 [0, n-1] 의 순열을 출력하십시오 . 순열 값은 모든 인덱스 pi의 합입니다 .abs(pi[i] - i)i

  • (1, 3, 0, 2) 가치가있다 6
  • (0, 2, 4, 1, 3) 가치가있다 6
  • (0, 2, 4, 1, 3, 5) 가치가있다 6
  • (0, 2, 4, 1, 5, 3, 6) 가치가있다 8

답변 점수

답의 점수는 순열 값과 n = 4 .. 14코드에 사용 된 바이트 수의 합입니다 . 점수가 낮을수록 좋습니다. 코드는의 모든 값에 대해 유효한 출력을 제공해야합니다 n.

머신에서 완료하려면 제출을 실행할 수 있어야합니다.

동점 인 경우, 관련 점수를 얻은 마지막 편집 시간이 결정자가됩니다.

이 같은 질문을하지 않습니다 이 하나 ?

연결된 질문에 대한 답변은 순열의 가치를 최적화하려는 노력을하지 않기 때문에이 질문에 대해 경쟁력이 없습니다. 예를 들어 n=10, [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]대부분의 답으로 주어진 순열 은 값을 제공합니다 30. 당신은 그것보다 훨씬 더 잘할 수 있습니다.

문제의 순열 부분의 경우 최적의 전체 값이 최대 120입니다. (@Laikoni에게 감사드립니다.) 이전 질문에 대한 Dennis의 답변은 222 점 입니다. (@ user202729에게 감사합니다.)


4
@JoKing은 모든 답변을 변경하지 않고 이식 할 수 있지만이 도전에서는 끔찍한 점수를받습니다. 이 챌린지에 해당 코드를 게시하는 것은 코드 검토에서 코드 골프 챌린지로 코드를 게시하는 것과 같습니다.
Stewie Griffin

2
점수에서 다른 양을 혼합하는 것은 실제로 문제가 될 수 있습니다. 최상의 알고리즘을 사용하는 답변은 일반적으로 모든 언어로 포팅 될 수 있으며,이 경우 점수는 일반 코드 골프로 줄어 듭니다.
Angs

4
최적의 값은 [6,6,6,8,10,12,12,12,14,16,18]120 점입니다. 흥미롭게도이 패턴은 A078706 에서 찾을 수 있습니다 .
Laikoni

3
좋아, 그것은 다를 시작 A078706으로 n=17점수를 가질 수있는 20.
Laikoni

4
난제를 명확하고 분명하게 이해할 수 있습니다. 동의하지 않고 투표를 마치려면 여기에 의견을 남겨주십시오.
user202729

답변:


7

젤리 , 36 34 33 32 31 30 바이트, 결과 : 120

-1 바이트의 Dennis에게 감사합니다! (묵시적으로 젤리 버그를 수정하여 기능이 문제를 해결하지만)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

새로운 기능 : 누계 ( Ä).

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

1- 인덱싱을 사용하십시오.

선형 시간도 걸립니다.


이 C ++ 프로그램은 그 가정은 전적으로 작은 순열을 생성 | 난 - 페이지에게 난을 | ≤ 폭 (여기서 인 하드 상수) 모든 0 ≤ I <N 에 대한 시간 복잡도 O (폭 2 × 2 × 2 폭 × N) (단이다 ) O (N 고정을 위해 ) : 온라인 체험 !


어떻게?

  1. 문제를 최적으로 해결하려는 C ++ 프로그램을 작성하십시오.
  2. 패턴을 관찰하십시오. 마지막 4 개의 요소를 제외한 모든 요소의 순서는 접두사입니다.

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. 시퀀스의 증분 차이를 계산합니다.

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    마침표 5.

  4. 젤리 구현 :

    • n-4 개의 첫 번째 요소는 위의 순서에서 가져옵니다. O (n) .
    • 들어 4 개 마지막 요소, 바로 짐승의 모든 24 가능성을 강제로 . O (1) .

      (참고 : 더 이상 32 바이트 버전에서 24 가지 가능성을 모두 강제하지 않습니다)


아, 당신은 나에게 다른 접두사로 갔다. 광산은 시작 0 2 4 1 3 5 8 6되고 더 큰 분기 계수를 갖지만 그러한 간단한 패턴은 없습니다.
피터 테일러

7

CJam (60 바이트 + 120 = 180 점)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

통합 스코어링이있는 온라인 테스트 스위트

최대 n = 24의 확장

해부

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

매우 인상적! 당신이 어떻게했는지 알게되기를 기대합니다.
Anush

최대 24까지 최적입니까?
Anush

@Anush 내 프로그램에 따르면 가능할 것입니다.
user202729

@Anush, 나는 그것을 증명하지는 않았지만 가능성이 있다고 생각합니다.
피터 테일러

나는 당신의 알고리즘에 더 흥미가 있습니다!
Anush

6

하스켈 , 146 + 89 점수 + 바이트

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

패턴 [1,3,0,2]를 반복하며 마지막 mod i 4요소는 수동으로 조정됩니다.

이전 알고리즘 (132 + 116) :

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

Brute는 길이 ± 2 또는 ± 3의 정확한 점프 횟수를 강제합니다. 올바른 숫자를 가진 마지막 것을 선택하고 제대로 작동하는 것으로 보이며 점수를 구현하는 것보다 훨씬 저렴합니다. Tio는 마지막 점수 이전의 시간 인 18입니다.

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


2

apt, 120 + 20 = 140

(다른 도전에서 내 솔루션 중 하나를 복사하면 227의 점수를 얻었을 것입니다)

o á k_äa d¥1ÃñxÈaYÃg

시험해 보거나이 버전 을 사용 하여 점수를 확인하십시오. 두 버전 모두 9 시경부터 시작될 수 있습니다.


설명

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
" 귀하의 컴퓨터에서 완성을 위해 제출을 실행할 수 있어야합니다. "질문이 게시 된 후 2 시간 동안 14 개 요소의 87E9 순열을 처리하도록 심각하게 관리 했습니까?
피터 테일러

3
또한 Japt는 Javascript를 기반으로하고 있으며 실제로 87E9 순열을 처리 할 수 ​​있습니까? 이 질문에 따르면 Javascript 배열의 길이는 최대 4E9입니다. Japt가 함수 또는 무언가를 생성합니까? \
user202729

2

루비 , 120 점 + 112106 91 82 바이트

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

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

순서는 기본적으로 (a-2)+(a+2)%5입니다.

n mod 5가 0 또는 1이 아닌 경우 마지막 3 개 또는 4 개의 요소가 다릅니다.

이것은 여전히 ​​하프 하드 코딩되어 있으며 항상 최상의 솔루션을 찾습니다. 아마도 조금 더 골프를 칠 수는 있지만 아이디어가 부족합니다.


1

자바 스크립트 (Node.js) , 148 점 + 109 73 바이트

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

온라인으로 사용해보십시오! 설명 : l마지막으로 생성 된 숫자 m를 추적하고 반대 패리티의 다음 숫자를 추적합니다 l. 일단 l초과 m+2하면 변수가 교환됩니다. 길이가 5의 배수가 아닌 시퀀스는 숫자를 놓치지 않도록 시퀀스의 시작 부분에서 조정이 이루어지며 다른 조정이 수행됩니다.n=4 .

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