Szybka kalkulacja Topswops

11

Z AZSPCS :

Załóżmy, że masz talię zawierającą n kart. Każda karta zawiera liczbę od 1 do n, a każda liczba pojawia się na dokładnie jednej karcie. Patrzysz na liczbę na górnej karcie - powiedzmy, że to k - a następnie odwracasz kolejność najlepszych k kart. Kontynuujesz tę procedurę - odczytując najwyższy numer, a następnie odwracając odpowiednią liczbę kart - aż górna karta wyniesie 1.

Napisz najszybszy program do obliczenia liczby przewrotów dla danej talii. Pamiętaj, że jeśli bierzesz udział w konkursie, nie możesz opublikować swojego kodu (a zatem nie opublikuję jeszcze mojego kodu).

Alexandru
źródło
Jaki jest model wejścia / wyjścia? Jakieś ograniczenia językowe? Jak określisz szybkość każdego wpisu?
aaaaaaaaaaaa
Może istnieć dedykowana wymiana stosów dla azspcs;)
Eelvex 30.01.11
Czy możemy publikować rozwiązania, czy nie?
AShelly
Tak. Konkurs się zakończył.
Alexandru
Link do azspcs prowadzi do strony, która jest nieczynna. I wygląda na metatag, który nie opisuje układanki. Być może tag powinien zostać usunięty.
użytkownik nieznany

Odpowiedzi:

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}

Zdajesz go na pokład, tak:

f([3, 2, 1]) // 1
f([2, 3, 1]) // 2
f([1, 2, 3]) // 0
Ry-
źródło
Więc jesteś zwycięzcą! :)
użytkownik nieznany
3

Scala: (To nie jest golf - prawda?)

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)

Kompletna aplikacja z walizką testową i stoperem, w tym tasowanie talii:

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

ilość: 1000 rozmiar: 100 czas trwania: 1614 ms maszyna: Single Pentium M 2Ghz

nieznany użytkownik
źródło
2

Python, 84 znaków

W każdym razie gra w golfa ... Używam liczb od 0 do n-1. Zakładając, że tablica jest przechowywana w zmiennej x, zajmuje mi 84 znaki Pythona.

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

Jednak wydajność jest dość zła z powodu nadużywania pamięci.

boothby
źródło
0

do

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

deckjest wskaźnikiem do tablicy liczb całkowitych reprezentujących pokłady. nto liczba kart. Oczywiście bezpieczeństwo pamięci jest zadaniem osoby dzwoniącej.

Prawdopodobnie zbliża się do najszybszego algorytmu na najnowszych komputerach i w języku wysokiego poziomu. Tylko dzięki sztuczkom na poziomie asm można to zrobić szybciej, ale nie ciężko nawet przy nich.

peterh - Przywróć Monikę
źródło