/* package whatever; // don't place package name! */
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
class SSE2CohortPredictor {
private static final double UNSIGNED_16_MAX
= Math.
pow(2,
16); private static final String COHORT_SALT
= "ADVANCE_PAYMENT_COHORT_OPEN_RATE"; private static final String SSE2_SALT
= "SUPER_SAVER_EMI_2";
public static void main
(String[] args
) { // ========== QA: CHANGE THESE VALUES ==========
int cohortOpenRate = 90; // CMS: ADVANCE_PAYMENT_COHORT_OPEN_RATE
int sse2OpenRate = 90; // CMS: SSE_V2_OPEN_RATE
// =============================================
double cohortSplit = getSplit(COHORT_SALT, loanId);
boolean isTestGroup = cohortSplit < (cohortOpenRate / 100.0);
System.
out.
println("============================================================"); System.
out.
println("Loan ID : " + loanId
); System.
out.
println("Cohort Split : " + cohortSplit
); System.
out.
println("Cohort Open Rate : " + cohortOpenRate
+ "%"); System.
out.
println("Cohort Group : " + (isTestGroup
? "TEST" : "CONTROL")); System.
out.
println("============================================================");
if (!isTestGroup) {
System.
out.
println("Result : SSE1 (COHORT CONTROL group)"); return;
}
double sse2Split = getSplit(SSE2_SALT, loanId);
boolean isSse2 = sse2Split < (sse2OpenRate / 100.0);
System.
out.
println("SSE2 Split : " + sse2Split
); System.
out.
println("SSE2 Open Rate : " + sse2OpenRate
+ "%"); System.
out.
println("SSE2 Eligible : " + (isSse2
? "YES" : "NO")); System.
out.
println("Result : " + (isSse2
? "SSE2" : "SSE1 (TEST but not SSE2 eligible)")); }
private static double getSplit
(String salt,
String uniqueId
) { try {
byte[] hash
= MessageDigest.
getInstance("SHA-256").
digest((uniqueId
+ salt
).
getBytes()); int value = ((hash[0] & 0xFF) << 8) | (hash[1] & 0xFF);
return value / UNSIGNED_16_MAX;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKICBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKCmNsYXNzIFNTRTJDb2hvcnRQcmVkaWN0b3IgewoKICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFVOU0lHTkVEXzE2X01BWCA9IE1hdGgucG93KDIsIDE2KTsKICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPSE9SVF9TQUxUID0gIkFEVkFOQ0VfUEFZTUVOVF9DT0hPUlRfT1BFTl9SQVRFIjsKICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTRTJfU0FMVCA9ICJTVVBFUl9TQVZFUl9FTUlfMiI7CgogICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgICAvLyA9PT09PT09PT09IFFBOiBDSEFOR0UgVEhFU0UgVkFMVUVTID09PT09PT09PT0KICAgICAgICAgIFN0cmluZyBsb2FuSWQgPSAiNjkxMTEiOwogICAgICAgICAgaW50IGNvaG9ydE9wZW5SYXRlID0gOTA7ICAgLy8gQ01TOiBBRFZBTkNFX1BBWU1FTlRfQ09IT1JUX09QRU5fUkFURQogICAgICAgICAgaW50IHNzZTJPcGVuUmF0ZSA9IDkwOyAgICAgLy8gQ01TOiBTU0VfVjJfT1BFTl9SQVRFCiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAgICAgICBkb3VibGUgY29ob3J0U3BsaXQgPSBnZXRTcGxpdChDT0hPUlRfU0FMVCwgbG9hbklkKTsKICAgICAgICAgIGJvb2xlYW4gaXNUZXN0R3JvdXAgPSBjb2hvcnRTcGxpdCA8IChjb2hvcnRPcGVuUmF0ZSAvIDEwMC4wKTsKCiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FuIElEICAgICAgICAgIDogIiArIGxvYW5JZCk7CiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvaG9ydCBTcGxpdCAgICAgOiAiICsgY29ob3J0U3BsaXQpOwogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb2hvcnQgT3BlbiBSYXRlIDogIiArIGNvaG9ydE9wZW5SYXRlICsgIiUiKTsKICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29ob3J0IEdyb3VwICAgICA6ICIgKyAoaXNUZXN0R3JvdXAgPyAiVEVTVCIgOiAiQ09OVFJPTCIpKTsKICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CgogICAgICAgICAgaWYgKCFpc1Rlc3RHcm91cCkgewogICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0ICAgICAgICAgICA6IFNTRTEgKENPSE9SVCBDT05UUk9MIGdyb3VwKSIpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBkb3VibGUgc3NlMlNwbGl0ID0gZ2V0U3BsaXQoU1NFMl9TQUxULCBsb2FuSWQpOwogICAgICAgICAgYm9vbGVhbiBpc1NzZTIgPSBzc2UyU3BsaXQgPCAoc3NlMk9wZW5SYXRlIC8gMTAwLjApOwoKICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU1NFMiBTcGxpdCAgICAgICA6ICIgKyBzc2UyU3BsaXQpOwogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTU0UyIE9wZW4gUmF0ZSAgIDogIiArIHNzZTJPcGVuUmF0ZSArICIlIik7CiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNTRTIgRWxpZ2libGUgICAgOiAiICsgKGlzU3NlMiA/ICJZRVMiIDogIk5PIikpOwogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgICAgICAgICAgIDogIiArIChpc1NzZTIgPyAiU1NFMiIgOiAiU1NFMSAoVEVTVCBidXQgbm90IFNTRTIgZWxpZ2libGUpIikpOwogICAgICB9CgogICAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgZ2V0U3BsaXQoU3RyaW5nIHNhbHQsIFN0cmluZyB1bmlxdWVJZCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBieXRlW10gaGFzaCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0yNTYiKS5kaWdlc3QoKHVuaXF1ZUlkICsgc2FsdCkuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgaW50IHZhbHVlID0gKChoYXNoWzBdICYgMHhGRikgPDwgOCkgfCAoaGFzaFsxXSAmIDB4RkYpOwogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAvIFVOU0lHTkVEXzE2X01BWDsKICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgICB9CiAgICAgIH0KICB9