Sunday, January 20, 2013

UVa 10415 - Eb Alto Saxophone Player

Accepted date: 2013-01-20
Ranking (as of 2013-01-20): 42
Language: C++

/*
  UVa 10415 - Eb Alto Saxophone Player

  To build using Visual Studio 2008:
    cl -EHsc -O2 UVa_10415_Eb_Alto_Saxophone_Player.cpp
*/

#include <cstdio>
#include <cstring>
#include <cctype>

const int nr_fingers = 10, nr_notes_max = 200;

int notes[] = {0x006, 0x002, 0x3ce, 0x1ce, 0x0ce, 0x04e, 0x00e};
  // notes[i] is the finger pattern for i - 'a'
int high_notes[] = {0x007, 0x003, 0x004, 0x1cf, 0x0cf, 0x004f, 0x00f};
  // high_notes[i] is the finger pattern for i - 'A'

int main()
{
  int t;
  scanf("%d", &t);
  getchar();
  while (t--) {
    int nr_presses[nr_fingers];
    memset(nr_presses, 0, sizeof(nr_presses));
    char s[nr_notes_max + 1];
    gets(s);
    int finger_pattern = 0;
    for (const char* p = s; *p; p++)
      if (isalpha(*p)) {
        int note = (isupper(*p)) ? high_notes[*p - 'A'] : notes[*p - 'a'];
        int d = finger_pattern ^ note;
        int f = d & note;
        for (int i = 0, b = 1; i < nr_fingers; i++, b <<= 1)
          if (f & b)
            nr_presses[i]++;
        finger_pattern = note;
      }
    for (int i = 0; i < nr_fingers; i++)
      printf("%d%c", nr_presses[i], ((i == nr_fingers - 1) ? '\n' : ' '));
  }
  return 0;
}

No comments:

Post a Comment