#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <sstream>
#include <iostream>
void ParseTablature(const std::string& input)
{
using namespace std;
static const char* NoteOrder[] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
istringstream file(input);
if (file)
{
vector<unsigned int> noteBases;
vector<istringstream> lines;
do
{
string line;
getline(file, line);
lines.push_back(istringstream(line));
noteBases.push_back(find(begin(NoteOrder), end(NoteOrder), line.substr(0, 1)) - begin(NoteOrder));
} while (file);
vector<unsigned int> octaves = { 4, 3, 3, 3, 2, 2 };
fill_n(back_inserter(octaves), lines.size() - octaves.size(), 0); // For safety in case we have more than 6 lines (???)
transform(noteBases.begin(), noteBases.end(), octaves.begin(), noteBases.begin(), [](auto noteBase, auto octave)
{
return noteBase + (octave * 12); // Encode base octave
});
while (any_of(lines.begin(), lines.end(), [](const auto& line) { return line.good(); }))
{
unsigned int lineIndex = 0;
for (auto& line : lines)
{
if (line)
{
char first = line.get();
if (isdigit(first))
{
string indexString;
indexString += first;
if (line)
{
char second = line.get();
if (isdigit(second))
{
indexString += second;
}
}
unsigned int noteIndex;
istringstream indexStream(indexString);
indexStream >> noteIndex;
auto absoluteNote = noteIndex + noteBases[lineIndex];
auto octave = absoluteNote / 12;
auto relativeNote = absoluteNote % 12;
cout << NoteOrder[relativeNote] << octave << " ";
}
}
++lineIndex;
}
}
}
}
int main(int argc, const char** argv)
{
std::string input;
std::string line;
std::cin >> line;
while (line != "0")
{
input += line;
input += '\n';
std::cin >> line;
}
ParseTablature(input);
}
I2luY2x1ZGUgPHZlY3Rvcj4KCSNpbmNsdWRlIDxzdHJpbmc+CgkjaW5jbHVkZSA8YWxnb3JpdGhtPgoJI2luY2x1ZGUgPGl0ZXJhdG9yPgoJI2luY2x1ZGUgPGZzdHJlYW0+CgkjaW5jbHVkZSA8c3N0cmVhbT4KCSNpbmNsdWRlIDxpb3N0cmVhbT4KCgoJdm9pZCBQYXJzZVRhYmxhdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpCgl7CgkJdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgkJc3RhdGljIGNvbnN0IGNoYXIqIE5vdGVPcmRlcltdID0geyAiQyIsICJDIyIsICJEIiwgIkQjIiwgIkUiLCAiRiIsICJGIyIsICJHIiwgIkcjIiwgIkEiLCAiQSMiLCAiQiIgfTsKCgkJaXN0cmluZ3N0cmVhbSBmaWxlKGlucHV0KTsKCQlpZiAoZmlsZSkKCQl7CgkJCXZlY3Rvcjx1bnNpZ25lZCBpbnQ+IG5vdGVCYXNlczsKCQkJdmVjdG9yPGlzdHJpbmdzdHJlYW0+IGxpbmVzOwoJCQlkbwoJCQl7CgkJCQlzdHJpbmcgbGluZTsKCQkJCWdldGxpbmUoZmlsZSwgbGluZSk7CgkJCQlsaW5lcy5wdXNoX2JhY2soaXN0cmluZ3N0cmVhbShsaW5lKSk7CgkJCQlub3RlQmFzZXMucHVzaF9iYWNrKGZpbmQoYmVnaW4oTm90ZU9yZGVyKSwgZW5kKE5vdGVPcmRlciksIGxpbmUuc3Vic3RyKDAsIDEpKSAtIGJlZ2luKE5vdGVPcmRlcikpOwoJCQl9IHdoaWxlIChmaWxlKTsKCgkJCXZlY3Rvcjx1bnNpZ25lZCBpbnQ+IG9jdGF2ZXMgPSB7IDQsIDMsIDMsIDMsIDIsIDIgfTsKCQkJZmlsbF9uKGJhY2tfaW5zZXJ0ZXIob2N0YXZlcyksIGxpbmVzLnNpemUoKSAtIG9jdGF2ZXMuc2l6ZSgpLCAwKTsgLy8gRm9yIHNhZmV0eSBpbiBjYXNlIHdlIGhhdmUgbW9yZSB0aGFuIDYgbGluZXMgKD8/PykKCQkJdHJhbnNmb3JtKG5vdGVCYXNlcy5iZWdpbigpLCBub3RlQmFzZXMuZW5kKCksIG9jdGF2ZXMuYmVnaW4oKSwgbm90ZUJhc2VzLmJlZ2luKCksIFtdKGF1dG8gbm90ZUJhc2UsIGF1dG8gb2N0YXZlKQoJCQl7CgkJCQlyZXR1cm4gbm90ZUJhc2UgKyAob2N0YXZlICogMTIpOyAvLyBFbmNvZGUgYmFzZSBvY3RhdmUKCQkJfSk7CgoJCQl3aGlsZSAoYW55X29mKGxpbmVzLmJlZ2luKCksIGxpbmVzLmVuZCgpLCBbXShjb25zdCBhdXRvJiBsaW5lKSB7IHJldHVybiBsaW5lLmdvb2QoKTsgfSkpCgkJCXsKCQkJCXVuc2lnbmVkIGludCBsaW5lSW5kZXggPSAwOwoJCQkJZm9yIChhdXRvJiBsaW5lIDogbGluZXMpCgkJCQl7CgkJCQkJaWYgKGxpbmUpCgkJCQkJewoJCQkJCQljaGFyIGZpcnN0ID0gbGluZS5nZXQoKTsKCQkJCQkJaWYgKGlzZGlnaXQoZmlyc3QpKQoJCQkJCQl7CgkJCQkJCQlzdHJpbmcgaW5kZXhTdHJpbmc7CgkJCQkJCQlpbmRleFN0cmluZyArPSBmaXJzdDsKCQkJCQkJCWlmIChsaW5lKQoJCQkJCQkJewoJCQkJCQkJCWNoYXIgc2Vjb25kID0gbGluZS5nZXQoKTsKCQkJCQkJCQlpZiAoaXNkaWdpdChzZWNvbmQpKQoJCQkJCQkJCXsKCQkJCQkJCQkJaW5kZXhTdHJpbmcgKz0gc2Vjb25kOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQl1bnNpZ25lZCBpbnQgbm90ZUluZGV4OwoJCQkJCQkJaXN0cmluZ3N0cmVhbSBpbmRleFN0cmVhbShpbmRleFN0cmluZyk7CgkJCQkJCQlpbmRleFN0cmVhbSA+PiBub3RlSW5kZXg7CgoJCQkJCQkJYXV0byBhYnNvbHV0ZU5vdGUgPSBub3RlSW5kZXggKyBub3RlQmFzZXNbbGluZUluZGV4XTsKCQkJCQkJCWF1dG8gb2N0YXZlID0gYWJzb2x1dGVOb3RlIC8gMTI7CgkJCQkJCQlhdXRvIHJlbGF0aXZlTm90ZSA9IGFic29sdXRlTm90ZSAlIDEyOwoKCQkJCQkJCWNvdXQgPDwgTm90ZU9yZGVyW3JlbGF0aXZlTm90ZV0gPDwgb2N0YXZlIDw8ICIgIjsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJKytsaW5lSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KQoJewoJCXN0ZDo6c3RyaW5nIGlucHV0OwoJCXN0ZDo6c3RyaW5nIGxpbmU7CgkJc3RkOjpjaW4gPj4gbGluZTsKCQl3aGlsZSAobGluZSAhPSAiMCIpCgkJewoJCQlpbnB1dCArPSBsaW5lOwoJCQlpbnB1dCArPSAnXG4nOwoJCQlzdGQ6OmNpbiA+PiBsaW5lOwoJCX0KCQkKCQlQYXJzZVRhYmxhdHVyZShpbnB1dCk7Cgl9