#include <iostream>
#include <iomanip>
#include <map>
#include <set>
#include <cmath>
#include <vector>
#include <climits>
#include <string>
#include <algorithm>
#include <sstream>
#include <numeric>
using namespace std;
vector<string> split(string haystack, string needle) {
vector<string> result;
int startPos = 0;
int foundPos = haystack.find(needle, startPos);
while (foundPos != string::npos) {
int count = foundPos - startPos;
string token = haystack.substr(startPos, count);
if (!token.empty()) {
result.push_back(token);
}
startPos = foundPos + needle.length();
foundPos = haystack.find(needle, startPos);
}
string token = haystack.substr(startPos, haystack.length() - startPos);
if (!token.empty()) {
result.push_back(token);
}
return result;
}
string nameConvert(const string& name) {
const string DELIMITER = " ";
stringstream builder;
auto parts = split(name, DELIMITER);
for (auto part : parts) {
part[0] = toupper(part[0]);
transform(part.begin() + 1, part.end(), part.begin() + 1, ::tolower);
builder << part << DELIMITER;
}
return builder.str();
}
string dateConvert(const string& date) {
const string DELIMITER = "/";
stringstream builder;
auto parts = split(date, DELIMITER);
builder << setw(2) << setfill('0') << parts[0] << DELIMITER;
builder << setw(2) << setfill('0') << parts[1] << DELIMITER;
builder << parts[2];
return builder.str();
}
class StudentIDGenerator {
private:
inline static string const PREFIX = "SV";
inline static int const MAX = 3;
inline static int index = 1;
public:
static string generate() {
stringstream builder;
builder << PREFIX << setw(MAX) << setfill('0') << index;
index++;
return builder.str();
}
};
class Student {
private:
string id, name, dob, className;
double gpa;
public:
Student(string name, string dob, string className, double gpa) :
name(name), dob(dob), className(className), gpa(gpa) {
id = StudentIDGenerator::generate();
};
public:
string toString() {
stringstream builder;
builder << id << " " << nameConvert(name) << " " << className << " " << dateConvert(dob) << fixed << setprecision(2) << " " << gpa << endl;
return builder.str();
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;cin >> t;
for (int i = 1;i <= t;i++) {
string name, className, dob;
double gpa;
cin.ignore();
getline(cin, name);
getline(cin, className);
getline(cin, dob);
cin >> gpa;
Student student{ name,dob,className,gpa };
cout << student.toString();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y2xpbWl0cz4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxudW1lcmljPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdmVjdG9yPHN0cmluZz4gc3BsaXQoc3RyaW5nIGhheXN0YWNrLCBzdHJpbmcgbmVlZGxlKSB7CiAgICB2ZWN0b3I8c3RyaW5nPiByZXN1bHQ7CiAgICBpbnQgc3RhcnRQb3MgPSAwOwogICAgaW50IGZvdW5kUG9zID0gaGF5c3RhY2suZmluZChuZWVkbGUsIHN0YXJ0UG9zKTsKICAgIHdoaWxlIChmb3VuZFBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKICAgICAgICBpbnQgY291bnQgPSBmb3VuZFBvcyAtIHN0YXJ0UG9zOwogICAgICAgIHN0cmluZyB0b2tlbiA9IGhheXN0YWNrLnN1YnN0cihzdGFydFBvcywgY291bnQpOwogICAgICAgIGlmICghdG9rZW4uZW1wdHkoKSkgewogICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHRva2VuKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRQb3MgPSBmb3VuZFBvcyArIG5lZWRsZS5sZW5ndGgoKTsKICAgICAgICBmb3VuZFBvcyA9IGhheXN0YWNrLmZpbmQobmVlZGxlLCBzdGFydFBvcyk7CiAgICB9CiAgICBzdHJpbmcgdG9rZW4gPSBoYXlzdGFjay5zdWJzdHIoc3RhcnRQb3MsIGhheXN0YWNrLmxlbmd0aCgpIC0gc3RhcnRQb3MpOwogICAgaWYgKCF0b2tlbi5lbXB0eSgpKSB7CiAgICAgICAgcmVzdWx0LnB1c2hfYmFjayh0b2tlbik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdHJpbmcgbmFtZUNvbnZlcnQoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CiAgICBjb25zdCBzdHJpbmcgREVMSU1JVEVSID0gIiAiOwogICAgc3RyaW5nc3RyZWFtIGJ1aWxkZXI7CiAgICBhdXRvIHBhcnRzID0gc3BsaXQobmFtZSwgREVMSU1JVEVSKTsKICAgIGZvciAoYXV0byBwYXJ0IDogcGFydHMpIHsKICAgICAgICBwYXJ0WzBdID0gdG91cHBlcihwYXJ0WzBdKTsKICAgICAgICB0cmFuc2Zvcm0ocGFydC5iZWdpbigpICsgMSwgcGFydC5lbmQoKSwgcGFydC5iZWdpbigpICsgMSwgOjp0b2xvd2VyKTsKICAgICAgICBidWlsZGVyIDw8IHBhcnQgPDwgREVMSU1JVEVSOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuc3RyKCk7Cn0KCnN0cmluZyBkYXRlQ29udmVydChjb25zdCBzdHJpbmcmIGRhdGUpIHsKICAgIGNvbnN0IHN0cmluZyBERUxJTUlURVIgPSAiLyI7CiAgICBzdHJpbmdzdHJlYW0gYnVpbGRlcjsKICAgIGF1dG8gcGFydHMgPSBzcGxpdChkYXRlLCBERUxJTUlURVIpOwogICAgYnVpbGRlciA8PCBzZXR3KDIpIDw8IHNldGZpbGwoJzAnKSA8PCBwYXJ0c1swXSA8PCBERUxJTUlURVI7CiAgICBidWlsZGVyIDw8IHNldHcoMikgPDwgc2V0ZmlsbCgnMCcpIDw8IHBhcnRzWzFdIDw8IERFTElNSVRFUjsKICAgIGJ1aWxkZXIgPDwgcGFydHNbMl07CiAgICByZXR1cm4gYnVpbGRlci5zdHIoKTsKfQoKY2xhc3MgU3R1ZGVudElER2VuZXJhdG9yIHsKcHJpdmF0ZToKICAgIGlubGluZSBzdGF0aWMgc3RyaW5nIGNvbnN0IFBSRUZJWCA9ICJTViI7CiAgICBpbmxpbmUgc3RhdGljIGludCBjb25zdCBNQVggPSAzOwogICAgaW5saW5lIHN0YXRpYyBpbnQgaW5kZXggPSAxOwoKcHVibGljOgogICAgc3RhdGljIHN0cmluZyBnZW5lcmF0ZSgpIHsKICAgICAgICBzdHJpbmdzdHJlYW0gYnVpbGRlcjsKICAgICAgICBidWlsZGVyIDw8IFBSRUZJWCA8PCBzZXR3KE1BWCkgPDwgc2V0ZmlsbCgnMCcpIDw8IGluZGV4OwogICAgICAgIGluZGV4Kys7CiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuc3RyKCk7CiAgICB9Cn07CgpjbGFzcyBTdHVkZW50IHsKcHJpdmF0ZToKICAgIHN0cmluZyBpZCwgbmFtZSwgZG9iLCBjbGFzc05hbWU7CiAgICBkb3VibGUgZ3BhOwoKcHVibGljOgogICAgU3R1ZGVudChzdHJpbmcgbmFtZSwgc3RyaW5nIGRvYiwgc3RyaW5nIGNsYXNzTmFtZSwgZG91YmxlIGdwYSkgOgogICAgICAgIG5hbWUobmFtZSksIGRvYihkb2IpLCBjbGFzc05hbWUoY2xhc3NOYW1lKSwgZ3BhKGdwYSkgewogICAgICAgIGlkID0gU3R1ZGVudElER2VuZXJhdG9yOjpnZW5lcmF0ZSgpOwogICAgfTsKCnB1YmxpYzoKICAgIHN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICBzdHJpbmdzdHJlYW0gYnVpbGRlcjsKICAgICAgICBidWlsZGVyIDw8IGlkIDw8ICIgIiA8PCBuYW1lQ29udmVydChuYW1lKSA8PCAiICIgPDwgY2xhc3NOYW1lIDw8ICIgIiA8PCBkYXRlQ29udmVydChkb2IpIDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbigyKSA8PCAiICIgPDwgZ3BhIDw8IGVuZGw7CiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuc3RyKCk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKICAgIAogICAgaW50IHQ7Y2luID4+IHQ7CiAgICBmb3IgKGludCBpID0gMTtpIDw9IHQ7aSsrKSB7CiAgICAgICAgc3RyaW5nIG5hbWUsIGNsYXNzTmFtZSwgZG9iOwogICAgICAgIGRvdWJsZSBncGE7CiAgICAgICAgY2luLmlnbm9yZSgpOwoKICAgICAgICBnZXRsaW5lKGNpbiwgbmFtZSk7CiAgICAgICAgZ2V0bGluZShjaW4sIGNsYXNzTmFtZSk7CiAgICAgICAgZ2V0bGluZShjaW4sIGRvYik7CgogICAgICAgIGNpbiA+PiBncGE7CgogICAgICAgIFN0dWRlbnQgc3R1ZGVudHsgbmFtZSxkb2IsY2xhc3NOYW1lLGdwYSB9OwoKICAgICAgICBjb3V0IDw8IHN0dWRlbnQudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==