Ranking (as of 2015-03-11): 14 out of 161
Language: C++
/* UVa 449 - Majoring in Scales To build using Visual Studio 2012: cl -EHsc -O2 UVa_449_Majoring_in_Scales.cpp */ #include <cstdio> #include <cstring> const int nr_keys = 12, nr_notes = 7, nr_intervals = 7; const char* major_keys[nr_keys][nr_notes] = { {"C", "D", "E", "F", "G", "A", "B"}, {"Db", "Eb", "F", "Gb", "Ab", "Bb", "C"}, {"D", "E", "F#", "G", "A", "B", "C#"}, {"Eb", "F", "G", "Ab", "Bb", "C", "D"}, {"E", "F#", "G#", "A", "B", "C#", "D#"}, {"F", "G", "A", "Bb", "C", "D", "E"}, {"Gb", "Ab", "Bb", "Cb", "Db", "Eb", "F"}, {"G", "A", "B", "C", "D", "E", "F#"}, {"Ab", "Bb", "C", "Db", "Eb", "F", "G"}, {"A", "B", "C#", "D", "E", "F#", "G#"}, {"Bb", "C", "D", "Eb", "F", "G", "A"}, {"B", "C#", "D#", "E", "F#", "G#", "A#"} }; const char* intervals[nr_intervals] = { "OCTAVE", "SECOND", "THIRD", "FOURTH", "FIFTH", "SIXTH", "SEVENTH" }; int main() { int i, n; char scale[4]; while (scanf("%s", scale) != EOF) { const char* (*pkey)[nr_notes]; for (i = 0; i < nr_keys; i++) if (!strcmp(scale, major_keys[i][0])) { pkey = &major_keys[i]; break; } printf("Key of %s\n", scale); char note[4], dir[8], interval[16]; scanf("%s %s %s", note, dir, interval); while (true) { char* p = strchr(interval, ';'); bool next = false; if (p) { *p = '\0'; next = true; } for (n = 0; n < nr_notes; n++) if (!strcmp(note, (*pkey)[n])) break; if (n == nr_notes) printf("%s: invalid note for this key\n", note); else { for (i = 0; i < nr_intervals; i++) if (!strcmp(interval, intervals[i])) break; if (dir[0] == 'U') { n += i; if (n >= nr_notes) n -= nr_notes; } else { n -= i; if (n < 0) n += nr_notes; } printf("%s: %s %s > %s\n", note, dir, interval, (*pkey)[n]); } if (next) { strcpy(note, p + 1); scanf("%s %s", dir, interval); } else break; } putchar('\n'); } return 0; }
No comments:
Post a Comment