Schnelle Topswops-Berechnung


11

Von AZSPCS :

Angenommen, Sie haben ein Deck mit n Karten. Jede Karte enthält eine Zahl von 1 bis n, und jede Zahl erscheint auf genau einer Karte. Sie sehen sich die Zahl auf der obersten Karte an - sagen wir, es ist k - und kehren dann die Reihenfolge der obersten k Karten um. Sie setzen diesen Vorgang fort - lesen Sie die oberste Zahl und kehren Sie dann die entsprechende Anzahl von Karten um - bis die oberste Karte 1 ist.

Schreiben Sie das schnellste Programm, um die Anzahl der Umkehrungen für ein bestimmtes Deck zu berechnen. Beachten Sie, dass Sie Ihren Code nicht veröffentlichen dürfen, wenn Sie am Wettbewerb teilnehmen (und ich meinen Code daher noch nicht veröffentlichen werde).


Was ist das Eingabe- / Ausgabemodell? Irgendwelche Sprachbeschränkungen? Wie bestimmen Sie, wie schnell jeder Eintrag ist?
aaaaaaaaaaa

Es könnte einen dedizierten Stack-Austausch für Azspcs geben;)
Eelvex

Dürfen wir also Lösungen posten oder nicht?
AShelly

Ja. Der Wettbewerb ist beendet.
Alexandru

Der Link zu azspcs verweist auf eine Seite, die nicht in Ordnung ist. Und es scheint ein Meta-Tag zu sein, das das Rätsel nicht beschreibt. Das Tag sollte möglicherweise entfernt werden.
Benutzer unbekannt

Antworten:


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}

Sie übergeben es dem Deck, wie folgt:

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

Du bist also der Gewinner! :)
Benutzer unbekannt

3

Scala: (Dies ist kein Golf - oder?)

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)

Komplette Anwendung mit Testfall und Stoppuhr, einschließlich des Mischens des Decks:

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

Anzahl: 1000 Größe: 100 Dauer: 1614 ms Maschine: Single Pentium M 2Ghz


2

Python, 84 Zeichen

Golfen sowieso ... Ich benutze die Zahlen 0 bis n-1. Angenommen, das Array ist in einer Variablen x gespeichert, benötige ich 84 Zeichen Python.

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

Die Leistung ist jedoch aufgrund von Speichermissbrauch ziemlich schlecht.


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

deckist ein Zeiger auf ein Integer-Array, das die Decks darstellt. nist die Anzahl der Karten. Offensichtlich ist die Speichersicherheit die Aufgabe des Anrufers.

Es nähert sich wahrscheinlich dem schnellsten Algorithmus auf neueren Computern und in einer Hochsprache. Nur mit Tricks auf Asm-Level konnte es schneller gemacht werden, aber auch mit ihnen nicht schwer.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.