プログラミングに自信があるやつこい!!
Amebaでブログを始めよう!

更新できない!!

更新できないんだけど、どないなっとんねん!!

更新です。ちょっとだけ。

なんか、アメブロの調子が悪いようでさっきUPしたものがUPされてない。。。。なんでやねん!!まじ腹立つ。
とりあえず、最近は忙しいので2週間後からどんどん問題UPしていきますので、よろしこ。

とりあえず、更新。

最近、めっちゃ忙しくてほったらかしになってました。が、知らないうちにコメントとトラックバックが!!
すごくうれしいです。あと2週間したらすべてのテストがおわるのでそしたらどんどんあたらしい問題UPしていきますので、また参加してみてください。おもしろそうな問題PICKしてあるので楽しみに待っていてください。みんなで一緒にスキルUPしましょう。

Linux Ubuntu と C++

最近、宿題におわれてTOPCODERに参加できてなかったのでとりあえず、更新しときます。
C++をはじめて2ヶ月くらいがたったのですが、

この一年間JAVAばかりやっていたおれに"ぬるま湯につかるな”とばかりに

segmentation faultがでてきます。。。Cをやっていたころはしょっちゅうもらってたこのメッセージ。。ふたたび、体にひびきます。

たまにJAVAとC++は似ているというのを聞いていたのですが、はっきりいってぜんぜん似ていない。。すごく混乱です。デザインレベルでは同じように考えていくことができるのですが、コーディングとなると”ポインターを使わずにリファレンスを”というのがなかなかできません。

JAVAは基本的にすべてがポインターなので同じようにしてしまう傾向になっているようです。

しかし、C++でかっこいいコードをみるとすごくかっこいいですよね。TOPCODERでもトップレベルのひとたちはC++使いがおおいです。すごくトリッキーすぎておれには理解ができないコードがたくさんあります。

おれもあんなのが書けるようになりたい!と思い、毎日がんばっています。でも、ほんとにC++究めてる人のコードはマジでわかりません。会社にはいってああいうコードを書いてたら逆にきらわれてしまうのでは、とも思ってみたりもします。

とにかくC++は本当に自由度が高い言語ですよね。もっとはやくからやっとけばよかったと最近よく思います。

最近、UbuntuというLINUXにREDHATから乗り換えました。これ、すごくいいです。使いたいソフトはクリックひとつでインターネットからダウンロードして勝手にインストールしてくれます。
日本語化も簡単にできます。基本的にdebianベースらしいのですが、debianももしかしたらいいのかも?

では、今日はこのへんで。次は問題UPします。

10分でコーディング

昨日の問題、一番早く終わったひとは3分以内でした。


すごすぎます。タイピングだけでも3分くらいかかりそうなのに。


今日の問題はかなり簡単です。


できるだけ早い時間でエレガントなコードを書きましょう。


あまりに簡単なので制限時間を10分としてやってみてください。


これ以上かかった人は




自分はかなりプログラミングができない。




とつらい事実を認識しましょう。


そして、これからすごくなりましょう。



では、10分だけこの問題に付き合ってみてください。



スタート!!


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

難易度 激簡単 目標時間10分以内


あなたはこれからトランプを配っていきます。


あなたにはトランプを配る人数、


そしてトランプが渡されます。


今回はとても簡単なので例題で説明します。


例)


2つの引数がもらえます。


3
"123123123"


最初の3はプレイヤーの人数を示しています。


"123123123" はトランプの並びを示しています。あなたはこのなかのトランプを
配っていかなければなりません。


この場合、あなたのプログラムは


{"111","222","333"}


を返さなければなりません。

"111"は一番めのプレイヤーが受け取るトランプです。
"222"が2番目のプレイヤーが受け取るトランプです。
"333"が2番目のプレイヤーが受け取るトランプです。


ところが、以下のような場合もあります。


すべてのプレイヤーは同じ数だけのトランプを受け取らなければなりません。
ですので


4
"123123123"


この場合、あなたのプログラムは

{"12","23","31","12"}

を返さなければなりません。


{"123","23","31","12"} は駄目です。



では、以下にもうすこし例をのせます。


例1)


6
"012345012345012345"
Returns: {"000", "111", "222", "333", "444", "555" }


例2)


4
"111122223333"
Returns: {"123", "123", "123", "123" }



例3)



1
"012345012345012345"
Returns: {"012345012345012345" }



例4)

6
"01234"
Returns: {"", "", "", "", "", "" }




例5)


2
""
Returns: {"", "" }




クラス名、などは以下のとおりです。

Class:          Cards
Method:         deal
Parameters:       int, String
Returns:         String[]
Method signature: String[] deal(int numPlayers, String deck)























おれのプログラムです。
public class Cards{
  public String[] deal(int numPlayers, String deck){
     String[] cards = new String[numPlayers];
     for(int i=0,len=cards.length; i<len; i++){
        cards[i] = "";
     }
     if (numPlayers > deck.length()) return cards;
        int index,total;
        index = total = 0;
        for(int i=0; i<deck.length(); i++){
           cards[index++] += deck.charAt(i);
           total++;
           if (index == numPlayers){
              if (deck.length() - total < numPlayers) break;
              else index = 0;
           }
        }
        return cards;
  }
}

JAVA5.0でGO!!

「おれSTRUTS使ってWEBアプリつくれる」



とかそんなのはできて当たり前のことである。



部品を決まったとうりに組み立てていくだけだからである。


けど、ここでは部品をつかって自分の頭で考えて作っていかなければならない。

 

自信があるなら実際にやってみよう。そんなに時間はかからないはずだ。



>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
難易度 超簡単 目標時間 15分


あなたには3つの文字列の配列があたえられます。

一つ目の配列はユーザー名の配列。


{"usrA","usrB","usrC"}


2つ目の配列はそのユーザーが扱うことのできるデータの文字列の入った配列。扱うことの
できるデータが2個以上ある場合はデータがスペースで区切られています。


{"data1 data3","data2 data4","data3 data5 data6"}


3つ目の配列はデータの配列が入っています。


{"data1"}


あなたは3つ目の配列のなかにあるデータをすべて扱うことのできるユーザを探さなければなりません。


上の例の場合: usrA



クラス名:
ReportAccess

メソッド名:
whoCanSee

引数タイプ:
String[], String[], String[]

リターン:
String[]

メソッド:
String[] whoCanSee(String[] userNames, String[] allowedData, String[] reportData)

定義

1.ユーザーの名前は1から50個までの文字で構成される。
2.ユーザーの名前は1から50、もしくは 'a'から'z'の文字で構成される。
3.allowDataにはユーザーの名前と同じ文字列が含まれるかもしれない。
4.allowDataは'a'から'z'や' 'で構成される文字列である。
5.reportDataは1から50、もしくは'a'から'z'の文字で構成される。


例1)

{"joe", "nick", "ted"}
{"clients products", "products orders", "clients orders"}
{"clients", "products"}

Returns: {"joe" }


例2)

{"kathy", "john", "dan", "steve", "cheryl", "tony"}
{"users data", "data orders", "users permissions", "system users controls", "default", "admin users"}
{"users"}

Returns: {"dan", "kathy", "steve", "tony" }


例3)

{"jim", "scott", "barbara"}
{"users order products", "products shipping", "tracking products orders"}
{"admin"}

Returns: { }

注)この問題はTOPCODER INCが出題していたものをおれが適当に訳したものです。
  著作権はTOPCODER INCにあります。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>














今日はGENERICをつかってみた。


import java.util.ArrayList;
import java.util.LinkedList; import java.util.TreeMap;

public class ReportAccess {   public String[] whoCanSee(String[] user,String[] data, String[] report){    TreeMap<String,LinkedList<String>> m = new TreeMap<String,LinkedList<String>>();    int index = 0;    for(String usrdata: data){     String[] d = usrdata.split(" ");     LinkedList<String> l = new LinkedList<String>();     for(String eachdata: d){      l.add(eachdata);     }     m.put(user[index++],l);    }    ArrayList<String> list = new ArrayList<String>();    for(String usrName: m.keySet()){     LinkedList datalist = (LinkedList)m.get(usrName);     boolean hasAlldata = true;     for(String r: report){      if (!datalist.contains(r)){       hasAlldata = false;       break;      }     }     if (hasAlldata) list.add(usrName);    }    String[] namelist = new String[list.size()];    list.toArray(namelist);    return namelist;   }

}

topcoderの道1

プログラミングをはじめて1年半、誰よりもすごくなってやると思い、いろいろな言語を勉強し、デザインパターン、ネットワークプログラミング、WEBプログラミング、RDBS,XMLなども学習してきた。ある程度の設計もできる自信もついてきた。が、しかし最近すげーものを発見し、ショックをうけた。それは

www.topcoder.com

このサイトでは世界中のやつらがプログラミングの腕を毎週競い合ってる。
制限時間内に与えられた問題のプログラムを一番はやくパーフェクトにできたものが一番という大会である。トップコーダーには賞金もでる。


アルゴリズム大会とソフトウェアデザイン大会の二つがあるのだが、おれはこのアルゴリズム大会にすごくショックをうけた。自分のプログラムがいかにしょぼいかを思い知らされる。


結局、プログラマの腕の見せどころは以下に効率よく、問題を解いていくことなんじゃないかと思いはじめた。

もちろん、プログラムのデザインなどもとても重要なことだとは思う。だが、いくらデザインがよくできていたとしてもそれをコーディングしていくもののスキルがしょぼければ、このアメブロのようなバグだらけのシステムはできてしまう。


このTOPCODERにはすごいやつが世界中からあつまってきている。そして、

このサイトのすごいのは大会が終わった後にはすべての参加者のプログラムを読むことができることだ。
残念ながら問題はすべて英語で出されるから英語ができないと参加することは難しい。

そこでこのブログでは英語なんかできなくても世界でTOPレベルのIT技術を誇る日本のプログラマのひとたちのプログラムを見れるようにできたらと思いつくってみた。

JAVAができるとかC++ができるとかはこのコンペにはほとんど関係ない。求められるのはいかにはやくエレガントなコードをかけるかということだけだ。

おれのようなしょぼい学生プログラマから定年間際の長老プログラマの方、

自分は本当にプログラミングができるのかというのをぜひためしてみてくれ。言語は特に問わないが、できたら、C,C++,JAVAあたりで。

では、今回の問題

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
(難易度 超簡単, 目標時間 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)

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


では、LET'S START!!
下の方におれのしょぼい解答プログラムをはっておく。 
”おれのがすげーぜ” っていうやつはトラックバックもしくはコメントでどんどんはってくれ。


































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);
 }
}