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


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

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


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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.