忍者ブログ
洋書や映画で出会った英語特有の美しい表現から、プログラミング、日々の雑記まで幅広く。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

どーも!
自分のプログラミングの力量の無さを世界に知らしめようと
勢いでTopCorderに登録してしまったPrisonerです。
後悔はしていない。

(TopCorder:世界中のプログラマーが腕を競い合うオンラインコンテスト。
レーティングによりDivision2,Division1,Yellow Corder, Red Corderに分類される。
Red Corderは世界中に数百人しかおらず、プログラマにとって羨望の的である。)

月2回程コンテストをやっているようです。
幾つか部門に分かれているみたいですが、一番人気が有るのはアルゴリズム部門。

昔から数学がどうにも苦手だった自分にとって、
アルゴリズムはまさに鬼門。。
数学が得意な人が心からうらやましい。

RedCorderとして有名なchokudai君の記事を読んで、凄く刺激を受けた。
彼は若干20歳、プログラミング暦2年にしてImagin Cup アルゴリズム部門で世界第三位に入賞した。正直、その有り余る才能が羨ましいけれど、それ以上に同じ日本人として凄く嬉しい気持ちになった。

そしてchokudai君をtwitterにてフォローしてみたところ、
ありがたくリフォローしてくれました^^
これで数学の難問にぶつかっても彼におんぶにだっこ
コミュニケーションツールの発達は素晴らしいですね。

最近は数学界において若い世代の日本が実力を取り戻してきている感じで頼もしい。
数学オリンピックとかもメダルを取っていたしね。

さて、今日はせっかくモチベーションがあがっていたので

プログラミングに自信があるやつこい!!

の問題を1つやってみた。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
(難易度 超簡単, 目標時間 10分以内)


与えられた英語の大文字で構成された文字列の中の文字を、与えられた数字の分だけ左にシフトさせなさい。たとえば、’C’を2つ左にシフトさせると’A’、’Z’を2つ左にシフトさせると’X’。
与えられる英語の文字列はAからZで、Aの次はZにシフトさせるものとする。

例1)

"VQREQFGT"
2
Returns: "TOPCODER"

例2)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
10
Returns: "QRSTUVWXYZABCDEFGHIJKLMNOP"

例3)

"TOPCODER"
0
Returns: "TOPCODER"

例4)

"LIPPSASVPH"
4
"HELLOWORLD"



クラス名: CCipher
メソッド名: decode
メソッドの引数: String , int
リターン: String
メソッド: String decode(String ciphertest, int shift)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

目標時間10分の問題に40分もかかってしまった上、
できあがったソースがお好み焼きにかけて食べてしまいたいくらい残念なあたり(面白くない)
自分の今の実力がいかに低いかってことだな~。

以下、恥を忍んで公開。
public class CCipher {
    public static String decode(String cipheretest,int shift){
        char[] charArray=cipheretest.toCharArray();
        char[] ansCharArray=new char[cipheretest.length()];
        int[] intArray=new int[charArray.length];
        for(int i=0;i<charArray.length;i++){
            intArray[i]=(int)(charArray[i]);
            if(intArray[i]-shift<65){
                ansCharArray[i]=(char)(intArray[i]-shift+26);
            }else{
                ansCharArray[i]=(char)(intArray[i]-shift);
            }
        }
        return String.valueOf(ansCharArray);
    }
}
 
なんで40分も時間がかかってしまったかというと、アルファベットを数値化することにとらわれていて、
ASCIIコード値を確認したり、アルファベットを数値化するための関数をJavaAPIで探したりしていたため。
(結果変換はキャストするだけでよかったのだが)

自分のコードを見直して改めて思う事は、無駄な配列の使用が多い点。
それからこの問題ではシフト処理が肝なんだけれど、
そこを自分はif-elseで思考停止して処理してしまっている。(太字で示したところ)

その点、引用元のブログ筆者による発想は実に面白い。以下引用。
public class CCipher {
 public String decode(String chipher, int shift){
      char[] chs = chipher.toCharArray();
      for(int i=0,len=chs.length; i<len; i++){
          for(int j=shift; j>0; j--){
     if (chs[i] == 'A') chs[i] = 'Z';
        else chs[i] = (char)((int)chs[i] - 1);
      }
    }     return new String(chs);   }
}

この例では、いきなりshiftの値だけ動かすのではなく、
for文の中で一文字ずつシフトするようにしている。
こうすることで、ASCIIコードがわからなくてもコードを書く事が可能。
この発想は無かった!

ってことで今日は固い技術系のお話でした!
それではまた♪

拍手[0回]

PR
この記事にコメントする
name
title
color
mail
URL
comment
pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (チェックを入れると管理人だけに表示できます)
この記事へのトラックバック
この記事にトラックバックする:
ブログの効用   *HOME*   AutoHotkey
カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
mak
性別:
非公開
趣味:
英語、読書、インテリア
バーコード
ブログ内検索
P R
カウンター
アクセス解析
ATOM  
ATOM 
RSS  
RSS 
Copyright ©   Before The Day Breaks...   All Rights Reserved
Design by MMIT / TemplateB2  Powered by NINJA TOOLS
忍者ブログ [PR]