Быстрый расчет Topswops

11

От AZSPCS :

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

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

Александр
источник
Что такое модель ввода / вывода? Есть ли языковые ограничения? Как вы будете определять скорость каждой записи?
aaaaaaaaaaaa
Там может быть выделенный стек обмена для azspcs;)
Eelvex
Так мы можем публиковать решения или нет?
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 мсек Машина: Single 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это количество карт. Очевидно, безопасность памяти является задачей вызывающего абонента.

Вероятно, он приближается к самому быстрому алгоритму на современных компьютерах и на языке высокого уровня. Только с помощью трюков на уровне asm это можно сделать быстрее, но не сильно даже с ними.

Петер - Восстановить Монику
источник