高速トップスウォップ計算


11

AZSPCSから:

n枚のカードを含むデッキがあるとします。各カードには1〜nの数字が含まれており、各数字は1枚のカードにのみ表示されます。一番上のカードの番号を見て(kだとしましょう)、一番上のkのカードの順序を逆にします。一番上のカードが1になるまで、この手順を続けます。

特定のデッキの反転回数を計算するための最速のプログラムを作成します。コンテストに参加している場合、コードを投稿することはできません(したがって、まだコードを投稿しません)。


入出力モデルとは何ですか?言語制限はありますか?各エントリの速さをどのように決定しますか?
aaaaaaaaaaaa

azspcs専用のスタックエクスチェンジがあるかもしれません;)
Eelvex

ソリューションを投稿することはできますか?
AShelly

はい。コンテストは終了しました。
アレクサンドル

azspcsへのリンクは、故障しているページにリンクしています。そして、それはパズルを説明していないメタタグのようです。タグはおそらく削除する必要があります。
ユーザー不明

回答:


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}

次のように、デッキに渡します。

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

あなたが勝者です!:)
ユーザー不明

3

Scala:(これはゴルフではありません-そうですか?)

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)

デッキのシャッフルを含む、テストケースとストップウォッチを使用した完全なアプリケーション:

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

カウント:1000サイズ:100継続時間:1614ミリ秒マシン:シングルPentium M 2Ghz


2

Python、84文字

とにかくゴルフ...私は0からn-1までの数字を使用しています。配列が変数xに格納されていると仮定すると、84文字のPythonが必要です。

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

ただし、メモリの乱用によりパフォーマンスはかなり低下します。


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デッキを表す整数配列へのポインターです。nカードの数です。明らかに、メモリの安全性は呼び出し側のタスクです。

おそらく、最近のコンピューターと高水準言語で最速のアルゴリズムに近づいているでしょう。asmレベルのトリックを使用した場合のみ、高速化できますが、それらを使用してもそれほど重くはなりません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.