Tính toán Topswops nhanh


11

Từ AZSPCS :

Giả sử bạn có một cỗ bài chứa n thẻ. Mỗi thẻ chứa một số từ 1 đến n và mỗi số xuất hiện trên chính xác một thẻ. Bạn nhìn vào số trên thẻ trên cùng - giả sử đó là k - và sau đó đảo ngược thứ tự của các thẻ k hàng đầu. Bạn tiếp tục quy trình này - đọc số trên cùng và sau đó đảo ngược số lượng thẻ tương ứng - cho đến khi thẻ trên cùng là 1.

Viết chương trình nhanh nhất để tính số lần đảo ngược cho một bộ bài đã cho. Lưu ý rằng nếu bạn đang tham gia cuộc thi, bạn không được phép đăng mã của mình (và do đó tôi sẽ không đăng mã của mình).


Mô hình đầu vào / đầu ra là gì? Bất kỳ hạn chế ngôn ngữ? Làm thế nào bạn sẽ xác định được mỗi mục nhanh như thế nào?
aaaaaaaaaaaa

Có thể có một stackexchange dành riêng cho azspcs;)
Eelvex

Vậy chúng ta có được phép đăng giải pháp hay không?
AShelly

Đúng. Cuộc thi đã kết thúc.
Alexandru

Liên kết đến azspcs liên kết đến một trang không theo thứ tự. Và có vẻ như một thẻ meta, không mô tả câu đố. Thẻ có lẽ nên được gỡ bỏ.
người dùng không xác định

Câu trả lời:


5

JavaScript

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}

Bạn vượt qua nó, giống như vậy:

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

Vì vậy, bạn là người chiến thắng! :)
người dùng không xác định

3

Scala: (Đây không phải là golf - phải không?)

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)

Hoàn thành ứng dụng với testcase và đồng hồ bấm giờ, bao gồm cả việc xáo trộn Deck:

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)
}

số lượng: 1000 kích thước: 100 thời lượng: 1614 msecs máy: Pentium đơn M 2Ghz


2

Python, 84 ký tự

Chơi gôn nào ... Tôi đang sử dụng các số từ 0 đến n-1. Giả sử mảng được lưu trữ trong một biến x, tôi phải mất 84 ký tự Python.

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

Tuy nhiên, hiệu suất khá tệ do lạm dụng bộ nhớ.


0

C

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++;
  }
}

decklà một con trỏ tới một mảng số nguyên biểu thị các sàn. nlà số lượng thẻ. Rõ ràng an toàn bộ nhớ là nhiệm vụ của người gọi.

Nó có lẽ là gần thuật toán nhanh nhất trên các máy tính gần đây và trên một ngôn ngữ cấp cao. Chỉ với các thủ thuật cấp asm, nó có thể được thực hiện nhanh hơn, nhưng không nặng nề ngay cả với chúng.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.