빠른 Topswops 계산


11

에서 AZSPCS :

n 개의 카드가 들어있는 데크가 있다고 가정합니다. 각 카드에는 1에서 n까지의 숫자가 포함되며 각 숫자는 정확히 하나의 카드에 나타납니다. 상단 카드의 숫자를보고 k라고 말한 다음 상단 k 카드의 순서를 반대로 바꿉니다. 맨 위의 카드가 1이 될 때까지 맨 위 번호를 읽은 다음 해당하는 카드 수를 반대로하여이 절차를 계속합니다.

주어진 데크에 대한 반전 횟수를 계산하는 가장 빠른 프로그램을 작성하십시오. 컨테스트에 참여하는 경우 코드를 게시 할 수 없으므로 코드를 아직 게시하지 않습니다.


입력 / 출력 모델은 무엇입니까? 언어 제한이 있습니까? 각 출품작이 얼마나 빠른지 어떻게 알 수 있습니까?
aaaaaaaaaaaa

azspcs 전용 스택 교환이있을 수 있습니다;)
Eelvex

솔루션을 게시 할 수 있습니까?
AShelly

예. 컨테스트가 완료되었습니다.
Alexandru

azspcs에 대한 링크가 고장난 페이지에 링크됩니다. 그리고 그것은 퍼즐을 묘사하지 않는 메타 태그처럼 보입니다. 아마도 태그를 제거해야합니다.
사용자 알 수 없음

답변:


5

자바 스크립트

function(d){for(t=0;x=(n=d[0])-1;t++)for(i=0;i<n/2;i++){m=d[x-i];d[x-i]=d[i];d[i]=m}return t}

다음과 같이 갑판에 전달합니다.

f([3, 2, 1]) // 1
f([2, 3, 1]) // 2
f([1, 2, 3]) // 0

그래서 당신은 승자입니다! :)
사용자가 알 수 없음

3

스칼라 : (이것은 골프가 아니다-그렇지?)

def transform (l: List[Int], sofar: Int = 0) : Int =
  if (l(0) == 1) sofar else transform (l.take (l(0)).reverse ::: l.drop (l(0)), sofar + 1)

데크 셔플 링을 포함하여 테스트 케이스 및 스톱워치가 포함 된 완벽한 응용 프로그램 :

object DeckReverse extends Application {

  def transform (l: List[Int], sofar: Int = 0) : Int = 
    if (l(0) == 1) sofar else transform (l.take (l(0)).reverse ::: l.drop (l(0)), sofar + 1)

  def stopwatch (count: Int, size: Int) = {
    val li = (1 until size).toList 
    val r = util.Random 

    val start = System.currentTimeMillis ()
    (0 until count).foreach (_ => transform (r.shuffle (li)))
    val stop = System.currentTimeMillis ()

    println ("count: " + count + "\tsize: " + size + "\tduration: " + (stop - start) + " msecs") 
  }

  stopwatch (1000, 100)
}

카운트 : 1000 크기 : 100 지속 시간 : 1614 msecs 머신 : 싱글 펜티엄 M 2Ghz


2

파이썬, 84 자

어쨌든 골프 ... 0에서 n-1까지의 숫자를 사용하고 있습니다. 배열이 변수 x에 저장되어 있다고 가정하면 84 문자의 Python이 필요합니다.

while x[0]:x[:x[0]+1]=x[x[0]::-1]

그러나 메모리 남용으로 인해 성능이 상당히 떨어집니다.


0

int revno(int* deck, int n) {
  int k,j,r=0;
  for(;;) {
    k=*deck;
    if (k==1) {
      return r;
    }
    for (j=0; j<k/2; j++) {
      int tmp=deck[j];
      deck[j]=deck[k-j];
      deck[k-j]=tmp;
    }
    r++;
  }
}

deck 데크를 나타내는 정수 배열에 대한 포인터입니다. n카드 수입니다. 분명히 메모리 안전은 호출자의 임무입니다.

아마도 최근 컴퓨터와 고급 언어에서 가장 빠른 알고리즘에 가깝습니다. asm 수준의 트릭만으로도 더 빨라질 수는 있지만 심하게 할 수는 없습니다.


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