0
0

More than 3 years have passed since last update.

文字⇔数字を扱う

Last updated at Posted at 2019-10-30

はじめに

 本記事は、char型文字を数字として扱うテクニックに慣れるのに良い問題をCodeWarsで発見したので、紹介させていただきます。

※CodeWarsは2019/10/30時点で日本語対応しておりません。ご了承ください。

問題URL

Reversing a Process

 要約:ある文字列を規則にのっとって変換するプロセスの逆操作をコーディングする問題です。(要約できているか怪しいですが…)

ACコード

Decode.java
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(アルファベットの数)の範囲でsubs1字毎に探索し、条件に合った数字にaの文字コードを足してcharキャストすることで文字にする。
    (文字コードはaから順に1ずつ増えていくため、ヒットしたjにaの文字コード数を足せば、jに該当する文字を復元することが出来る。
    ex. aの文字コード:0097 j=2 ならば、j+'a'=0099 → 'c' )

  • 順次文字を結合していき、decodeした文字列長が元の文字列長と一致しない場合「Impossible to decode」を代入する。
    (※数字キーが2の倍数か13の倍数の時、一致しなくなる。)

以上操作が正しく動き、ACを取ることが出来ました。

あとがき

 文字を扱うテクニックを複数学べた点で、この問題はcharの扱いに慣れるのに良い教材かなと思いました。「もっとスマートにできるよ!」や、「こんなやり方もあるね!」などあれば、コメントお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0