Cálculo rápido do Topswops

11

Do AZSPCS :

Suponha que você tenha um baralho contendo n cards. Cada cartão contém um número de 1 a n, e cada número aparece em exatamente um cartão. Você olha para o número no cartão superior - digamos que seja k - e depois inverte a ordem dos k cartões superiores. Você continua esse procedimento - lendo o número superior e depois revertendo o número correspondente de cartões - até que o cartão superior seja 1.

Escreva o programa mais rápido para calcular o número de reversões para um determinado baralho. Observe que, se você estiver participando do concurso, não poderá publicar seu código (e, portanto, ainda não publicarei meu código).

Alexandru
fonte
Qual é o modelo de entrada / saída? Alguma restrição de idioma? Como você determinará a velocidade de cada entrada?
aaaaaaaaaaaa 28/01
Poderia haver uma Stackexchange dedicado para azspcs;)
Eelvex
Então, podemos publicar soluções ou não?
AShelly
Sim. O concurso terminou.
Alexandru
O link para azspcs direciona para uma página que está com defeito. E parece uma meta tag, que não descreve o quebra-cabeça. A etiqueta deve, talvez, ser removida.
usuário desconhecido

Respostas:

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}

Você passa pelo baralho, assim:

f([3, 2, 1]) // 1
f([2, 3, 1]) // 2
f([1, 2, 3]) // 0
Ry-
fonte
Então você é o vencedor! :)
usuário desconhecido
3

Scala: (Este não é um golfe - é?)

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)

Aplicação completa com caixa de teste e cronômetro, incluindo o embaralhamento do baralho:

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

contagem: 1000 tamanho: 100 duração: 1614 msecs máquina: único Pentium M 2Ghz

Usuário desconhecido
fonte
2

Python, 84 caracteres

Golfe de qualquer maneira ... Estou usando os números de 0 a n-1. Supondo que a matriz esteja armazenada em uma variável x, são necessários 84 caracteres do Python.

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

No entanto, o desempenho é muito ruim devido ao abuso de memória.

boothby
fonte
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é um ponteiro para uma matriz inteira representando os decks. né o número dos cartões. Obviamente, a segurança da memória é tarefa do chamador.

Provavelmente, está se aproximando do algoritmo mais rápido em computadores recentes e em uma linguagem de alto nível. Somente com truques de nível ASM, isso poderia ser feito mais rapidamente, mas não muito mesmo com eles.

peterh - Restabelecer Monica
fonte