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


11

От AZSPCS :

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

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


Что такое модель ввода / вывода? Есть ли языковые ограничения? Как вы будете определять скорость каждой записи?
aaaaaaaaaaaa

Там может быть выделенный стек обмена для azspcs;)
Eelvex

Так мы можем публиковать решения или нет?
AShelly

Да. Конкурс завершен.
Александру

Ссылка на azspcs ссылается на страницу, которая вышла из строя. И это похоже на метатег, который не описывает загадку. Тег, возможно, должен быть удален.
пользователь неизвестен

Ответы:



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 это можно сделать быстрее, но не сильно даже с ними.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.