Calcolo veloce di Topswops


11

Da AZSPCS :

Supponiamo di avere un mazzo contenente n carte. Ogni carta contiene un numero da 1 a n e ogni numero appare esattamente su una carta. Guarda il numero sulla prima carta - diciamo che è k - e quindi inverti l'ordine delle prime k carte. Continua questa procedura - leggendo il numero in alto e quindi invertendo il numero corrispondente di carte - fino a quando la carta in alto è 1.

Scrivi il programma più veloce per calcolare il numero di inversioni per un determinato mazzo. Nota che se partecipi al concorso non ti è consentito pubblicare il tuo codice (e quindi non pubblicherò ancora il mio codice).


Qual è il modello di input / output? Qualche restrizione linguistica? Come determinerai la velocità di ciascuna voce?
aaaaaaaaaaaa,

Potrebbe esserci uno scambio di stack dedicato per azspcs;)
Eelvex,

Quindi ci è consentito pubblicare soluzioni o no?
AShelly,

Sì. Il concorso è terminato.
Alexandru,

Il link ad azspcs si collega a una pagina che non funziona. E sembra un meta-tag, che non descrive il puzzle. Il tag dovrebbe, forse, essere rimosso.
utente sconosciuto

Risposte:


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}

Lo passi sul mazzo, in questo modo:

f([3, 2, 1]) // 1
f([2, 3, 1]) // 2
f([1, 2, 3]) // 0

Quindi sei il vincitore! :)
utente sconosciuto

3

Scala: (Questo non è un golf - vero?)

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)

Applicazione completa con testcase e cronometro, incluso lo shuffle del Deck:

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

conteggio: 1000 dimensioni: 100 durata: 1614 msecs macchina: Single Pentium M 2Ghz


2

Python, 84 caratteri

Giocare a golf comunque ... Sto usando i numeri da 0 a n-1. Supponendo che l'array sia archiviato in una variabile x, mi servono 84 caratteri di Python.

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

Tuttavia, le prestazioni sono piuttosto scarse a causa dell'abuso di memoria.


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è un puntatore a un array intero che rappresenta i deck. nè il numero delle carte. Ovviamente la sicurezza della memoria è compito del chiamante.

Probabilmente si avvicina all'algoritmo più veloce sui computer recenti e su un linguaggio di alto livello. Solo con trucchi di livello asm potrebbe essere fatto più velocemente, ma non pesantemente anche con loro.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.