はじめに
本記事は、char型文字を数字として扱うテクニックに慣れるのに良い問題をCodeWarsで発見したので、紹介させていただきます。
※CodeWarsは2019/10/30時点で日本語対応しておりません。ご了承ください。
問題URL
要約:ある文字列を規則にのっとって変換するプロセスの逆操作をコーディングする問題です。(要約できているか怪しいですが…)
ACコード
class Decode {
public static String decode(String r) {
int numkey = 0;
String subs = "";
for(int i = 0;i < r.length();i++) {
if(r.charAt(i)-'a'>=0) {
numkey = Integer.parseInt(r.substring(0,i));
subs = r.substring(i);
break;
}
}
char[] ch = subs.toCharArray();
StringBuilder sb = new StringBuilder();
for(int i = 0;i < ch.length;i++) {
for(int j = 0;j < 26;j++) {
if(j*numkey%26==ch[i]-'a') {
sb.append((char)(j+'a'));
}
}
}
if(sb.length() != ch.length) {
sb.delete(0, sb.length());
sb.append("Impossible to decode");
}
return sb.toString();
}
}
解説
まず、変換キーとなる数字部分(
numkey
)と、変換後文字列(subs
)を分割する。この際、(アラビア数字の文字コード番号)<(アルファベットの文字コード番号)であることを利用している。0~25(アルファベットの数)の範囲で
subs
1字毎に探索し、条件に合った数字にaの文字コードを足してcharキャストすることで文字にする。
(文字コードはaから順に1ずつ増えていくため、ヒットしたjにaの文字コード数を足せば、jに該当する文字を復元することが出来る。
ex. aの文字コード:0097 j=2 ならば、j+'a'=0099 → 'c' )順次文字を結合していき、decodeした文字列長が元の文字列長と一致しない場合「Impossible to decode」を代入する。
(※数字キーが2の倍数か13の倍数の時、一致しなくなる。)
以上操作が正しく動き、ACを取ることが出来ました。
あとがき
文字を扱うテクニックを複数学べた点で、この問題はcharの扱いに慣れるのに良い教材かなと思いました。「もっとスマートにできるよ!」や、「こんなやり方もあるね!」などあれば、コメントお願いします。