Entries

スポンサーサイト (この記事を編集する[管理者用])

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1288-f2e3e453
この記事にトラックバックする(FC2ブログユーザー)

Open 2010 Qual. 3 MEDIUM - WhatsThisChord (この記事を編集する[管理者用])

Source

TopCoder Open 2010 Algorithm Qualification Round 3 MEDIUM (500pt)
Problem Statement
TopCoderニコ生オープン 第2回 自分の参加記録

問題概要

6本の弦のあるギターがある.
それぞれの弦を抑えずにそのまま引くと鳴る音が問題文中で与えられている.
実際に押さえた場所が与えられて,6本の弦に対して,それぞれ,何も押さない時と比べて,i_k×半音だけ高い音が出る.
鳴らさない弦もあるかもしれない.
MajorとMinorしか考えないとして,コードを求める問題.
コードは,3つの音色からなる集合.

解法

実装問題.
ちょうど3つの音が鳴っているかどうか調べて,3つの音なら,該当する和音が存在するかどうかを全部調べる.

C++によるスパゲッティなソースコード
// #includeとusing namespace std;は略

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

/* C major に使われる音 */
int ca[12]={1,0,1,0,1,1,0,1,0,1,0,1};

/* int to char */
char *mn[12]={"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
char *mm[12]={"C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B"};

/* char to int */
int merody2int(char c[]){
  int r=0;
  if(c[1]=='#') r=1;
  if(c[1]=='b') r=-1;
  if(c[0]=='C') return (12+r)%12;
  if(c[0]=='D') return 2+r;
  if(c[0]=='E') return 4+r;
  if(c[0]=='F') return 5+r;
  if(c[0]=='G') return 7+r;
  if(c[0]=='A') return 9+r;
  if(c[0]=='B') return 11+r;
  return -1;
}

class WhatsThisChord {
public:
string classify(vector <int> chord) {
  int i,j,k;
  string res;
  char *init[6]={"E","A","D","G","B","E"};
  int in[12];
  int ok[24];

  rep(i,12) in[i]=0;
  rep(i,6) if(chord[i]>=0) in[(merody2int(init[i]) + chord[i])%12] = 1;

  rep(i,24) ok[i]=0;
  rep(i,12) if(in[i] && in[(i+4)%12] && in[(i+7)%12]) ok[i]++;
  rep(i,12) if(in[i] && in[(i+3)%12] && in[(i+7)%12]) ok[i+12]++;

  k=0; rep(i,12) k+=in[i];
  if(k!=3) return "";

  rep(i,24) if(ok[i]){
    if(i<12) return (string)mn[i]+" Major";
    return (string)mn[i-12]+" Minor";
  }
  return "";
}

};

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1288-f2e3e453
この記事にトラックバックする(FC2ブログユーザー)

Appendix

Recent Articles

ブログ内検索

Ads


(プライバシーポリシー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。