#include <iostream>
#include <string>
#include <cctype> // Untuk isupper, islower, isdigit
// Fungsi untuk menghitung jenis karakter dalam kata sandi
std:: string hitungKarakter( const std:: string & password, int & hurufKapital, int & hurufKecil, int & angka, int & simbol) {
hurufKapital = 0 ;
hurufKecil = 0 ;
angka = 0 ;
simbol = 0 ;
for ( char ch : password) {
if ( std:: isupper ( static_cast < unsigned char > ( ch) ) ) {
hurufKapital++ ;
} else if ( std:: islower ( static_cast < unsigned char > ( ch) ) ) {
hurufKecil++ ;
} else if ( std:: isdigit ( static_cast < unsigned char > ( ch) ) ) {
angka++ ;
} else {
simbol++ ;
}
}
return password; // Return password untuk verifikasi jika diperlukan
}
int main( ) {
std:: string password;
// Membaca input kata sandi (seluruh baris untuk menangani spasi)
std:: cout << "Masukkan kata sandi: " ;
std:: getline ( std:: cin , password) ;
// Hapus spasi ekstra di awal/akhir jika diperlukan (mirip strip() di Python)
size_t start = password.find_first_not_of ( " \t " ) ;
if ( start == std:: string :: npos ) {
password = "" ; // Kosong jika hanya spasi
} else {
size_t end = password.find_last_not_of ( " \t " ) ;
password = password.substr ( start, end - start + 1 ) ;
}
// Hitung karakter
int hurufKapital, hurufKecil, angka, simbol;
hitungKarakter( password, hurufKapital, hurufKecil, angka, simbol) ;
// Cetak hasil
std:: cout << "\n Hasil analisis kata sandi:" << std:: endl ;
std:: cout << "Jumlah huruf kapital (A-Z): " << hurufKapital << std:: endl ;
std:: cout << "Jumlah huruf kecil (a-z): " << hurufKecil << std:: endl ;
std:: cout << "Jumlah angka (0-9): " << angka << std:: endl ;
std:: cout << "Jumlah simbol (lainnya): " << simbol << std:: endl ;
// Opsional: Total karakter
int total = static_cast < int > ( password.length ( ) ) ;
std:: cout << "Total karakter: " << total << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2N0eXBlPiAgLy8gVW50dWsgaXN1cHBlciwgaXNsb3dlciwgaXNkaWdpdAoKLy8gRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgamVuaXMga2FyYWt0ZXIgZGFsYW0ga2F0YSBzYW5kaQpzdGQ6OnN0cmluZyBoaXR1bmdLYXJha3Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsIGludCYgaHVydWZLYXBpdGFsLCBpbnQmIGh1cnVmS2VjaWwsIGludCYgYW5na2EsIGludCYgc2ltYm9sKSB7CiAgICBodXJ1ZkthcGl0YWwgPSAwOwogICAgaHVydWZLZWNpbCA9IDA7CiAgICBhbmdrYSA9IDA7CiAgICBzaW1ib2wgPSAwOwogICAgCiAgICBmb3IgKGNoYXIgY2ggOiBwYXNzd29yZCkgewogICAgICAgIGlmIChzdGQ6OmlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSkgewogICAgICAgICAgICBodXJ1ZkthcGl0YWwrKzsKICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNsb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKSB7CiAgICAgICAgICAgIGh1cnVmS2VjaWwrKzsKICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNkaWdpdChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKSB7CiAgICAgICAgICAgIGFuZ2thKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2ltYm9sKys7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gcGFzc3dvcmQ7ICAvLyBSZXR1cm4gcGFzc3dvcmQgdW50dWsgdmVyaWZpa2FzaSBqaWthIGRpcGVybHVrYW4KfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBwYXNzd29yZDsKICAgIAogICAgLy8gTWVtYmFjYSBpbnB1dCBrYXRhIHNhbmRpIChzZWx1cnVoIGJhcmlzIHVudHVrIG1lbmFuZ2FuaSBzcGFzaSkKICAgIHN0ZDo6Y291dCA8PCAiTWFzdWtrYW4ga2F0YSBzYW5kaTogIjsKICAgIHN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgcGFzc3dvcmQpOwogICAgCiAgICAvLyBIYXB1cyBzcGFzaSBla3N0cmEgZGkgYXdhbC9ha2hpciBqaWthIGRpcGVybHVrYW4gKG1pcmlwIHN0cmlwKCkgZGkgUHl0aG9uKQogICAgc2l6ZV90IHN0YXJ0ID0gcGFzc3dvcmQuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwogICAgaWYgKHN0YXJ0ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgcGFzc3dvcmQgPSAiIjsgIC8vIEtvc29uZyBqaWthIGhhbnlhIHNwYXNpCiAgICB9IGVsc2UgewogICAgICAgIHNpemVfdCBlbmQgPSBwYXNzd29yZC5maW5kX2xhc3Rfbm90X29mKCIgXHQiKTsKICAgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKICAgIH0KICAgIAogICAgLy8gSGl0dW5nIGthcmFrdGVyCiAgICBpbnQgaHVydWZLYXBpdGFsLCBodXJ1ZktlY2lsLCBhbmdrYSwgc2ltYm9sOwogICAgaGl0dW5nS2FyYWt0ZXIocGFzc3dvcmQsIGh1cnVmS2FwaXRhbCwgaHVydWZLZWNpbCwgYW5na2EsIHNpbWJvbCk7CiAgICAKICAgIC8vIENldGFrIGhhc2lsCiAgICBzdGQ6OmNvdXQgPDwgIlxuSGFzaWwgYW5hbGlzaXMga2F0YSBzYW5kaToiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiSnVtbGFoIGh1cnVmIGthcGl0YWwgKEEtWik6ICIgPDwgaHVydWZLYXBpdGFsIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiSnVtbGFoIGh1cnVmIGtlY2lsIChhLXopOiAiIDw8IGh1cnVmS2VjaWwgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJKdW1sYWggYW5na2EgKDAtOSk6ICIgPDwgYW5na2EgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJKdW1sYWggc2ltYm9sIChsYWlubnlhKTogIiA8PCBzaW1ib2wgPDwgc3RkOjplbmRsOwogICAgCiAgICAvLyBPcHNpb25hbDogVG90YWwga2FyYWt0ZXIKICAgIGludCB0b3RhbCA9IHN0YXRpY19jYXN0PGludD4ocGFzc3dvcmQubGVuZ3RoKCkpOwogICAgc3RkOjpjb3V0IDw8ICJUb3RhbCBrYXJha3RlcjogIiA8PCB0b3RhbCA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9