テトリススタックの高さプロファイルを最も効率的に計算するにはどうすればよいですか?

ziggystar

問題文

stack長さの整数配列が与えられますheightwidthほとんどのことを教えてくれるwidthの各エントリの-lowestビットがxsセットされています。

with:-番目のビットを設定最大になるようなprofile長さの配列計算します。widthprofile[i] == max_imax_istack[max_i]i

以下よりも効率的な方法でこれを達成するにはどうすればよいですか?

現在の解決策

現在、列を調べて、各ビットを個別にチェックしています。

以下は、Scalaでの現在の実装を示しています。しかし、私は主にアルゴリズムの部分(現在のCPU用に最適化されている)に興味があるので、他の言語(Java、C、C ++)で自由に答えてください。

Scalaコード:

def tetrisProfile(stack: Array[Int]): Array[Int] = {
  var col = 0
  val profile = new Array[Int](width)
  while(col < width){
    var row = 0
    var max = 0
    while(row < height){
      if(((stack(row) >> col) & 1) == 1)
        max = row + 1
      row += 1
    }
    profile(col) = max
    col += 1
  }
  return profile
}

典型的な値

  • 配列サイズheightは22です
  • widthは10です

ベンチマークコードの要点

ここでコードを見つけてください。

現在の結果:

original:    2.070s,        2.044s,        1.973s,        1.973s,        1.973s
maxihatop:   0.492s,        0.483s,        0.490s,        0.490s,        0.489s
olegarch

私はCでソリューションを作成しました。アルゴリズムをJavaまたはScalaに移植できることを願っています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WIDTH  10
#define HEIGHT 22

// Convert (1 << n) to n for n == 0-10
static char bit2ndx[11] = {-1, 0, 1, 8, 2, 4, 9, 7, 3, 6, 5};
int *tetrisProfile(int *input) {
  int row;
  // allocate memory and set everything to -1 - default rc value,
  // returned if no any result for this column
  int *rc = (int *)malloc(WIDTH * sizeof(int));
  memset(rc, ~0, WIDTH * sizeof(int));
  // create bitset for columns for check
  int testbits = (1 << WIDTH) - 1;
  // Iterate rows from up to bottom, and while exist columns for check
  for(row = HEIGHT - 1; row >= 0 && testbits != 0; row--) {
    int rowtestbits = testbits & input[row];
    while(rowtestbits != 0) {
      // extract lowest bit_1 from bitset rowtestbits
      int curbit = rowtestbits & -rowtestbits;
      rc[bit2ndx[curbit % 11]] = row;
      rowtestbits ^= curbit;
      testbits    ^= curbit;
    }
  }
  return rc;
}

int stack[HEIGHT] = {0x01, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
                       0,   0,   0,   0,    0,    0,    0,    0,     0,     0,
                       0,   0};


main(int argc, char **argv) {
  int i;
  int *ret = tetrisProfile(stack);
  for(i = 0; i < WIDTH; i++)
      printf("ret[%02d]=%d\n", i, ret[i]);
  free(ret);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テトリススタックの高さプロファイルを最も効率的に計算するにはどうすればよいですか?

分類Dev

バッチスクリプトで特定のファイルのハッシュ値を計算するにはどうすればよいですか?

分類Dev

シェルスクリプトを使用して大きなcsvファイルを効率的に処理し、次のスクリプトよりもパフォーマンスを向上させるにはどうすればよいですか?

分類Dev

このファイルヘッダーからビットマップの幅と高さを計算するにはどうすればよいですか?

分類Dev

最も効率的な方法で最も利益と密度の高い組み合わせを計算するにはどうすればよいですか?

分類Dev

Pythonでsvnコミットのフィルターされたリストを効率的に取得するにはどうすればよいですか?

分類Dev

最も近いポイントのクエリがすばやく計算されるように、ポイントのセット(埋め込み)を格納する最も効率的な方法は何ですか?

分類Dev

Linux Mintのデスクトップでファイルタイプを無効にするにはどうすればよいですか?

分類Dev

ファイルエクスプローラーのタスクバーの右クリックメニューにさらにエントリを表示するようにWindowsに指示するにはどうすればよいですか?

分類Dev

nginx構成ファイルがBashスクリプト内で有効かどうかをテストするにはどうすればよいですか?

分類Dev

ドロップボックスリストファイルがJListに表示されたら、SwingWorkerを停止するにはどうすればよいですか?

分類Dev

テキストファイルのクラスメンバーの平均スコアを計算するにはどうすればよいですか?

分類Dev

テキストファイルのデータをクリップボードにコピーするにはどうすればよいですか?

分類Dev

複数のスレッドから共有ファイルに最も効果的にアクセスするにはどうすればよいですか?

分類Dev

ファイヤーストア参照フィールドのデータに効率的にアクセスするにはどうすればよいですか?

分類Dev

ベクトルの移動平均を(効率的に)計算するにはどうすればよいですか?

分類Dev

スタンドアロンスクリプトファイルをテストするにはどうすればよいですか

分類Dev

ダイスロールの合計を効率的に計算するにはどうすればよいですか?

分類Dev

バッチファイルにドロップされる引数のリストを作成するにはどうすればよいですか?

分類Dev

非公式のタイプスクリプト定義ファイルをプロジェクトに含めるにはどうすればよいですか?

分類Dev

コンテンツスクリプトによって挿入されたスクリプトタグでローカルのJavaScriptファイルを使用するにはどうすればよいですか?

分類Dev

pcfにデプロイされたスプリング統合アプリを使用してS3バケットに保存されている多数のファイルを最適に処理するにはどうすればよいですか?

分類Dev

リストのすべての要素にプレフィックスを効率的に追加するにはどうすればよいですか?

分類Dev

リストのすべての要素にプレフィックスを効率的に追加するにはどうすればよいですか?

分類Dev

シェルスクリプト:ファイルにリストされているものを除いて、ディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?

分類Dev

スクリプトの出力をファイルに保存するにはどうすればよいですか?

分類Dev

スクリプトのターミナルログをファイルにキャプチャするにはどうすればよいですか?

分類Dev

データベースに直接アクセスせずにDMZでホストする場合(ファイアウォールによってブロックされたtcpポート1433)、ASP.NET MVC Webアプリケーションの層を設計するにはどうすればよいですか?

分類Dev

角度タイプスクリプトで特定の名前のファイルをダウンロードするにはどうすればよいですか?

Related 関連記事

  1. 1

    テトリススタックの高さプロファイルを最も効率的に計算するにはどうすればよいですか?

  2. 2

    バッチスクリプトで特定のファイルのハッシュ値を計算するにはどうすればよいですか?

  3. 3

    シェルスクリプトを使用して大きなcsvファイルを効率的に処理し、次のスクリプトよりもパフォーマンスを向上させるにはどうすればよいですか?

  4. 4

    このファイルヘッダーからビットマップの幅と高さを計算するにはどうすればよいですか?

  5. 5

    最も効率的な方法で最も利益と密度の高い組み合わせを計算するにはどうすればよいですか?

  6. 6

    Pythonでsvnコミットのフィルターされたリストを効率的に取得するにはどうすればよいですか?

  7. 7

    最も近いポイントのクエリがすばやく計算されるように、ポイントのセット(埋め込み)を格納する最も効率的な方法は何ですか?

  8. 8

    Linux Mintのデスクトップでファイルタイプを無効にするにはどうすればよいですか?

  9. 9

    ファイルエクスプローラーのタスクバーの右クリックメニューにさらにエントリを表示するようにWindowsに指示するにはどうすればよいですか?

  10. 10

    nginx構成ファイルがBashスクリプト内で有効かどうかをテストするにはどうすればよいですか?

  11. 11

    ドロップボックスリストファイルがJListに表示されたら、SwingWorkerを停止するにはどうすればよいですか?

  12. 12

    テキストファイルのクラスメンバーの平均スコアを計算するにはどうすればよいですか?

  13. 13

    テキストファイルのデータをクリップボードにコピーするにはどうすればよいですか?

  14. 14

    複数のスレッドから共有ファイルに最も効果的にアクセスするにはどうすればよいですか?

  15. 15

    ファイヤーストア参照フィールドのデータに効率的にアクセスするにはどうすればよいですか?

  16. 16

    ベクトルの移動平均を(効率的に)計算するにはどうすればよいですか?

  17. 17

    スタンドアロンスクリプトファイルをテストするにはどうすればよいですか

  18. 18

    ダイスロールの合計を効率的に計算するにはどうすればよいですか?

  19. 19

    バッチファイルにドロップされる引数のリストを作成するにはどうすればよいですか?

  20. 20

    非公式のタイプスクリプト定義ファイルをプロジェクトに含めるにはどうすればよいですか?

  21. 21

    コンテンツスクリプトによって挿入されたスクリプトタグでローカルのJavaScriptファイルを使用するにはどうすればよいですか?

  22. 22

    pcfにデプロイされたスプリング統合アプリを使用してS3バケットに保存されている多数のファイルを最適に処理するにはどうすればよいですか?

  23. 23

    リストのすべての要素にプレフィックスを効率的に追加するにはどうすればよいですか?

  24. 24

    リストのすべての要素にプレフィックスを効率的に追加するにはどうすればよいですか?

  25. 25

    シェルスクリプト:ファイルにリストされているものを除いて、ディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?

  26. 26

    スクリプトの出力をファイルに保存するにはどうすればよいですか?

  27. 27

    スクリプトのターミナルログをファイルにキャプチャするにはどうすればよいですか?

  28. 28

    データベースに直接アクセスせずにDMZでホストする場合(ファイアウォールによってブロックされたtcpポート1433)、ASP.NET MVC Webアプリケーションの層を設計するにはどうすればよいですか?

  29. 29

    角度タイプスクリプトで特定の名前のファイルをダウンロードするにはどうすればよいですか?

ホットタグ

アーカイブ