/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
// we want mostly 3 letters per key..... except PQRS
// so, set the span for each letter to 1/3 of the full span, less a small
// amount so that there can actually be 4 in some keys.
private static final double SPAN = (1.0 / 3.0) - (1.0 / 260.0);
// and we want those 4 letters to happen on key 7 - 15 letters in.
private static final double OFFSET = 7.0 - (SPAN * 15);
public static final char charForKey(final char letter) {
final int comp
= Character.
toUpperCase(letter
) - 'A'; if (comp < 0 || comp >= 26) {
return letter;
}
char key = (char)('0' + OFFSET + comp * SPAN);
// correct Z overflow to 10.
return key > '9' ? '9' : key;
}
StringBuilder sb = new StringBuilder(input.length());
input.chars().forEach(c -> sb.append(charForKey((char)c)));
return sb.toString();
}
public static void main
(String[] args
) { for (int ch = ' '; ch < 125; ch++) {
System.
out.
printf("Char '%s' > %s\n",
(char)ch, charForKey
((char)ch
)); }
String[] inputs
= {"1-800-Got-Junk",
"Java Rocks!!!"}; System.
out.
printf("%s -> %s\n", input, keysFromNumber
(input
)); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIAogICAgLy8gd2Ugd2FudCBtb3N0bHkgMyBsZXR0ZXJzIHBlciBrZXkuLi4uLiBleGNlcHQgUFFSUwogICAgLy8gc28sIHNldCB0aGUgc3BhbiBmb3IgZWFjaCBsZXR0ZXIgdG8gMS8zIG9mIHRoZSBmdWxsIHNwYW4sIGxlc3MgYSBzbWFsbAogICAgLy8gYW1vdW50IHNvIHRoYXQgdGhlcmUgY2FuIGFjdHVhbGx5IGJlIDQgaW4gc29tZSBrZXlzLiAKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBTUEFOID0gKDEuMCAvIDMuMCkgLSAoMS4wIC8gMjYwLjApOwogICAgLy8gYW5kIHdlIHdhbnQgdGhvc2UgNCBsZXR0ZXJzIHRvIGhhcHBlbiBvbiBrZXkgNyAtIDE1IGxldHRlcnMgaW4uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgT0ZGU0VUID0gNy4wIC0gKFNQQU4gKiAxNSk7CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBjaGFyRm9yS2V5KGZpbmFsIGNoYXIgbGV0dGVyKSB7CiAgICAgICAgZmluYWwgaW50IGNvbXAgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UobGV0dGVyKSAtICdBJzsKICAgICAgICBpZiAoY29tcCA8IDAgfHwgY29tcCA+PSAyNikgewogICAgICAgICAgICByZXR1cm4gbGV0dGVyOwogICAgICAgIH0KICAgICAgICBjaGFyIGtleSA9IChjaGFyKSgnMCcgKyBPRkZTRVQgKyBjb21wICogU1BBTik7CiAgICAgICAgLy8gY29ycmVjdCBaIG92ZXJmbG93IHRvIDEwLgogICAgICAgIHJldHVybiBrZXkgPiAnOScgPyAnOScgOiBrZXk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGtleXNGcm9tTnVtYmVyKFN0cmluZyBpbnB1dCkgewogICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihpbnB1dC5sZW5ndGgoKSk7CiAgICAgICAgaW5wdXQuY2hhcnMoKS5mb3JFYWNoKGMgLT4gc2IuYXBwZW5kKGNoYXJGb3JLZXkoKGNoYXIpYykpKTsKICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGZvciAoaW50IGNoID0gJyAnOyBjaCA8IDEyNTsgY2grKykgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQ2hhciAnJXMnID4gJXNcbiIsIChjaGFyKWNoLCBjaGFyRm9yS2V5KChjaGFyKWNoKSk7CiAgICAgICAgfQogICAgICAgIFN0cmluZ1tdIGlucHV0cyA9IHsiMS04MDAtR290LUp1bmsiLCAiSmF2YSBSb2NrcyEhISJ9OwogICAgICAgIGZvciAoU3RyaW5nIGlucHV0IDogaW5wdXRzKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlcyAtPiAlc1xuIiwgaW5wdXQsIGtleXNGcm9tTnVtYmVyKGlucHV0KSk7CiAgICAgICAgfQogICAgfQoKfQ==