Hızlı Topswops hesaplaması


11

Gönderen AZSPCS :

Diyelim ki n kart içeren bir desteniz var. Her kart 1'den n'ye kadar bir sayı içerir ve her sayı tam olarak bir kartta görünür. Üst karttaki sayıya bakarsınız - diyelim ki k - ve sonra üst k kartların sırasını tersine çevirin. Bu prosedüre devam edersiniz - en üst numarayı okuyarak ve ardından ilgili kart sayısını ters çevirerek - üst kart 1 oluncaya kadar.

Belirli bir deste için geri dönüş sayısını hesaplamak için en hızlı programı yazın. Yarışmaya katılıyorsanız, kodunuzu yayınlamanıza izin verilmediğini (ve bu nedenle henüz kodumu göndermeyeceğim) unutmayın.


Giriş / çıkış modeli nedir? Dil kısıtlaması var mı? Her bir girişin ne kadar hızlı olduğunu nasıl belirleyeceksiniz?
aaaaaaaaaaaa

Azspcs için özel bir yığın değiş tokuş olabilir;)
Eelvex

Peki, çözüm yollayabilir miyiz?
AShelly

Evet. Yarışma bitti.
Alexandru

Azspcs bağlantısı, bozuk olan bir sayfaya bağlantı verir. Ve bulmacayı tanımlamayan bir meta-etiket gibi görünüyor. Etiket belki kaldırılmalıdır.
kullanıcı bilinmiyor

Yanıtlar:


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}

Güverte geçiyorsun, şöyle:

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

Yani kazanan sizsiniz! :)
kullanıcı bilinmiyor

3

Scala: (Bu bir golf değil - değil mi?)

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)

Güverte karıştırması da dahil olmak üzere testcase ve kronometre ile eksiksiz uygulama:

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

sayı: 1000 boyut: 100 süre: 1614 msn. makine: Tek Pentium M 2Ghz


2

Python, 84 Karakter

Yine de golf ... 0 ile n-1 arasındaki sayıları kullanıyorum. Dizinin x değişkeninde saklandığı varsayılarak, bana 84 karakter Python götürür.

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

Ancak, bellek kötüye kullanımı nedeniyle performans oldukça kötü.


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

deck, güverteleri temsil eden bir tamsayı dizisinin göstergesidir. nkart sayısıdır. Açıkçası, bellek güvenliği arayan kişinin görevidir.

Muhtemelen son bilgisayarlarda ve üst düzey bir dilde en hızlı algoritmaya yaklaşıyor. Sadece asm hileleriyle daha hızlı yapılabilirdi, ancak onlarla bile ağır olamazdı.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.