순열 번호 매기기


9

도전

주어진 n 개의 정수 세트에 대해 사전 색인을 출력하는 프로그램을 작성하십시오.

규칙

  • 입력은 공백으로 구분 된 고유 한 음이 아닌 정수 집합이어야합니다.
  • 순열의 사전 색인 (0에서 n! -1까지의 범위)을 출력해야합니다.
  • 순열 라이브러리 또는 순열 내장 기능을 사용할 수 없습니다.
  • 색인을 찾는 데 도움이되도록 일련의 순열 또는 순열의 일부를 생성 할 수 없습니다.
  • 주어진 순열을 다음 / 이전 (사전 순서) 순열로 늘리거나 줄일 수도 없습니다.
  • 계승을 사용하지 않고이를 완료 할 수있는 방법을 찾으면 보너스 포인트 (-10 바이트)입니다.
  • n = 100 인 경우 런타임은 1 분 미만이어야합니다.
  • 바이트 수로 가장 짧은 코드 승리
  • 수상자 화요일 (2014 년 7 월 22 일)

순열에 대한 추가 정보

0 1 2 --> 0
0 2 1 --> 1
1 0 2 --> 2
1 2 0 --> 3
2 0 1 --> 4
2 1 0 --> 5
0 1 2 3 4 5 6 7 --> 0
0 1 2 3 4 5 7 6 --> 1
0 1 2 3 4 6 5 7 --> 2
1 3 5 17        --> 0
781 780 779 13  --> 23
81 62 19 12 11 8 2 0 --> 40319
195 124 719 1 51 6 3 --> 4181

1
승자가 선택 될 때까지 더 많은 시간을 가질 수 있습니까? 3 일은 너무 적은 시간입니다.
xnor

답변:


4

GolfScript, 12 (22 자-10 보너스)

~]0\.,{.,@*\.(@$?@+\}*

계승을 사용하지 않는 보너스 포인트. 질문에 명시된 형식으로 STDIN에 입력해야합니다. 온라인으로 코드를 시험해 볼 수 있습니다 .


Haha는 "계승을 사용하지 않고"라고 말했을 때 찾고 있던 것이 아니지만, 그것이 중요하다고 생각합니다. Kudos
Kyle McCormick

4

CJam, 31, 계승

q~]{__(f<0+:+\,,(;1+:**\(;}h]:+

왜 여전히 투표를 받고 있습니까? GolfScript 답변은 CJam에서 23 자로 만 다시 쓸 수 있습니다.
jimmy23013

6
사람들이 당신의 대답을 좋아하기 때문입니다.
seequ

1

파이썬 2 (77 = 87-10)

p=map(int,raw_input().split())
s=0
while p:s=s*len(p)+sorted(p).index(p.pop(0))
print s

읽을 수 있습니다. 많은 내장. 와.

우리는 순열의 사전 식 색인이 해당 요소 위의 반전 수 (요소 뒤에 있지만 그 아래의 값)에 요소 수의 계승을 곱한 값의 순열 요소에 대한 합이라는 사실을 사용합니다. 용어로이 다항식과 유사한 표현을 평가하는 대신 Horner의 방법 과 비슷한 것을 사용합니다 .

배열 인덱스를 반복하는 대신 목록의 첫 번째 요소를 반복적으로 제거하고 나머지 요소를 처리합니다. 이 식은 sorted(p).index(p.pop(0))정렬 된 목록에서 해당 위치를 가져 가면서 동시에 제거를 수행하여 첫 번째 인덱스 이후의 반전 수를 계산합니다.

안타깝게도 Python 3에서는 목록 작업을 지원하지 않는 map 객체를 생성 하기 때문에 Python 2를 사용하고 4 개 이상의 문자를 raw_input가져와야했습니다 (-1은 print~) map(int,...).


1

피스 (13 = 23-10)

JVPwdWJ=Z+*ZlJXovNJ;J)Z

내 파이썬 답변 의 포트 .

파이썬 번역 (관련이없는 것들이 필터링 됨) :

Z=0
J=rev(split(input()," "))
while J:
 Z=plus(times(Z,len(J)),index(order(lambda N:eval(N),J),J.pop()))
print(Z)

입력 숫자는 문자열을 유지하지만 eval을 키로 사용하여 정수로 정렬됩니다. 목록은 pop뒤가 아니라 앞 을 차지 하도록 반대로 바뀝니다 .


1

코브라-202

분명히 코브라는 이것에서 실제로 경쟁하지 않습니다.

class P
    var n=0
    var t=CobraCore.commandLineArgs[1:]
    def main
        .f(.t[0:0])
    def f(l as List<of String>)
        if.t.count==l.count,print if(.t<>l,'',.n+=1)
        else,for i in.t.sorted,if i not in l,.f(l+[i])

0

J, 5 바이트 (15-10)

#\.#.+/@(<{.)\.

이것은 O ( n 2 ) 시간에 실행되며 n = 100을 쉽게 처리 할 수 있습니다.

용법

   f =: #\.#.+/@(<{.)\.
   f 0 1 2
0
   f 0 2 1
1
   f 1 0 2
2
   f 1 2 0
3
   f 2 0 1
4
   f 2 1 0
5
   f 0 1 2 3 4 5 6 7
0
   f 0 1 2 3 4 5 7 6
1
   f 0 1 2 3 4 6 5 7
2
   f 1 3 5 17
0
   f 781 780 779 13
23
   f 81 62 19 12 11 8 2 0
40319
   f 195 124 719 1 51 6 3
4181
   NB. A. is the builtin for permutation indexing
   timex 'r =: f 927 A. i. 100'
0.000161
   r
927

설명

#\.#.+/@(<{.)\.  Input: array P
             \.  For each suffix of P
          {.       Take the head
         <         Test if it is greater than each of that suffix
     +/@           Sum, count the number of times it is greater
#\.              Get the length of each suffix of P
   #.            Convert to decimal using a mixed radix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.