Швидкий розрахунок вершини


11

Від AZSPCS :

Припустимо, у вас є колода, що містить n карток. Кожна карта містить число від 1 до n, і кожне число відображається саме на одній картці. Ви дивитеся на номер на верхній карті - скажімо, це k -, а потім зворотно змінюєте порядок подальших карт k. Ви продовжуєте цю процедуру - читаючи верхній номер і потім обертаючи відповідну кількість карток - до тих пір, поки верхня карта не дорівнює 1.

Напишіть найшвидшу програму для обчислення кількості реверсів для даної колоди. Зауважте, що якщо ви берете участь у конкурсі, вам заборонено публікувати свій код (і, отже, я ще не розміщую свій код).


Що таке модель вводу / виводу? Будь-які мовні обмеження? Як ви визначите, наскільки швидко кожен запис?
aaaaaaaaaaaa

Могла бути спеціальна зміна стакшів для azspcs;)
Ельвекс

То чи дозволяється нам розміщувати рішення чи ні?
AShelly

Так. Конкурс закінчився.
Олександру

Посилання на azspcs посилається на сторінку, яка вийшла з ладу. І здається метатег, який не описує головоломки. Тег, можливо, повинен бути видалений.
користувач невідомий

Відповіді:


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}

Ви передаєте йому колоду, як-от так:

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 мсек Машина: одномісний Pentium M 2 ГГц


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- номер картки. Очевидно, що безпека пам’яті є завданням абонента.

Ймовірно, наближається до найшвидшого алгоритму на останніх комп’ютерах та на мові високого рівня. Тільки за допомогою трюків на рівні золи можна зробити це швидше, але не дуже навіть з ними.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.