การคำนวณ Topswops อย่างรวดเร็ว


11

จากAZSPCS :

สมมติว่าคุณมีดาดฟ้าที่มีการ์ด n การ์ดแต่ละใบมีหมายเลขตั้งแต่ 1 ถึง n และแต่ละหมายเลขจะปรากฏบนการ์ดเดียว คุณดูที่หมายเลขบนการ์ดด้านบน - สมมุติว่ามันคือ k - แล้วเรียงลำดับของไพ่ k อันดับสูงสุดกลับกัน คุณทำขั้นตอนนี้ต่อไป - อ่านหมายเลขบนสุดแล้วย้อนกลับจำนวนบัตรที่เกี่ยวข้อง - จนกว่าการ์ดบนสุดคือ 1

เขียนโปรแกรมที่เร็วที่สุดเพื่อคำนวณจำนวนการพลิกกลับสำหรับเด็คที่กำหนด โปรดทราบว่าหากคุณเข้าร่วมการแข่งขันคุณจะไม่ได้รับอนุญาตให้โพสต์รหัสของคุณ (ดังนั้นฉันจะยังไม่โพสต์รหัสของฉัน)


รูปแบบอินพุต / เอาท์พุตคืออะไร? ข้อ จำกัด ด้านภาษาใด ๆ คุณจะตัดสินว่าแต่ละรายการเร็วแค่ไหน?
aaaaaaaaaaaa

อาจมีการแลกเปลี่ยนสแต็กซ์เฉพาะสำหรับ azspcs;)
Eelvex

เราได้รับอนุญาตให้โพสต์โซลูชั่นหรือไม่?
AShelly

ใช่. การแข่งขันสิ้นสุดลงแล้ว
Alexandru

ลิงก์ไปยังลิงก์ azs ไปยังหน้าเว็บที่ไม่เป็นระเบียบ และดูเหมือนว่าเมตาแท็กซึ่งไม่ได้อธิบายตัวต่อ แท็กควรจะถูกลบออก
ผู้ใช้ที่ไม่รู้จัก

คำตอบ:



3

Scala: (นี่ไม่ใช่กอล์ฟ - ใช่มั้ย)

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)

แอปพลิเคชั่นที่สมบูรณ์พร้อม testcase และนาฬิกาจับเวลารวมถึงการสับของ 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)
}

นับ: 1,000 ขนาด: ระยะเวลา 100: 1614 msecs เครื่อง: Pentium M 2Ghz เดียว


2

Python, 84 Chars

เล่นกอล์ฟต่อไป ... ฉันใช้เลข 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.