はてなブックマークでとても人気を集めていた記事です。
新しくプログラミング言語を覚えたいときに行うべき10の練習問題 | IDEA*IDEA
新しく言語を覚えるときはこの練習問題をしましょうね、という主張です。
さっそくチャレンジしてみましょう。エレガントなコードを書く自信はないんですが、とにかくアウトプットを出してナンボ。中身はともかく実装してみます。
どれぐらいライブラリ使っていいのか。Velocityまで使うのはやりすぎかも。標準ライブラリのみとするべき?
2008/02/10追記:ソースコードへのリンク切れになっていたのを修正しました。
1問目
なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ~ん万円!とか)
いわゆるFizzBuzz問題というやつかな。でも3だけでいいのか。
FirstProg01.java
2問目
現在時刻にあわせてやる気のでるメッセージを出力(例:もうすぐランチ!がんばれ!)。
24通りのswitchを書こうと思ったけど、いや待て。例えば13時~15時まで同じメッセージにしたいときに同じメッセージを書くのは嫌だからそれも考慮してみる。うーん。なんか小ざかしい文字列操作になってしまった。次、次!
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
FirstProg02.java
3問目
複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。
コンソールからの入力は面倒くさいなぁ。コレクションフレームワーク大好き!
List
Collections.sort(lines, new Comparator
public int compare(String o1, String o2) {
return NumberUtils.toInt(o1) - NumberUtils.toInt(o2);
}
});
FirstProg03.java
4問目
簡易電卓。0で割ったときの処理を自分なりに作りこむ。
これは面倒。GUIで作るべきだったんだろうか?数値と演算子を繰り返し入力するコンソールプログラムにしてみた。うまく動いているかちょっと不安。
こんな風に動く。数値はBigDecimalを使用。
数値を入力> 1
演算子を入力(+ - * / =)> +
数値を入力> 2
演算子を入力(+ - * / =)> =
3
FirstProg04.java
5問目
キーワードを入れてYahoo!の検索結果を出力。
スクレイピングしようかと思ったけど、Yahooウェブ検索APIがあったのでそれを使用。(要アプリケーションIDの取得)REST APIばんざい。
XMLの操作はDOMでXPathも使ってみたけど大差なかった。0番目と2番目の子要素をTitle、Urlと決め付けたけどスキーマ定義ではsequenceになっているからこれでいいのかな。
FirstProg05.java
6問目
テキストを入れると語尾が赤ちゃん言葉に(例:ですよ→でちゅよ)。
「ですよ」だけでいいのか?赤ちゃん言葉らしくするという要件をもっと明確に定義しないと。。。とりあえず3つを対象とした。(ですよ→でちゅよ、でしょう→でちょう、した→ちた。)で正規表現置換。
引用:ゲイツ氏が語る「ソフトウェアがすべての中心となる」未来像(前半):インタビュー – CNET Japan
変換後→
Bill Gates:最も重要なステップは、クラウド(Cloud)OSを利用することだと申し上げておきまちょう。音楽を1曲ライセンス購入したり、新しい携帯電話を購入すれば、このOSを必ず利用することになりまちゅ。もちろん、新しいPCを買ったときにもでちゅ。
ぶっ!(笑)
FirstProg06.java
7問目
メールアドレスを入れるとあらかじめ用意されたテンプレートファイルにそのメアドを埋め込んだ上でメール送信(スパムはダメだよ!)。
メール送信はJavaMailで。テンプレートはVelocity使っちゃった。テンプレートエンジンの部分がプログラミングの練習な気もするが。。。
しかもメールアドレス埋め込む意味ないし。これじゃ問題の意図を汲んでないので不正解かな。でもSocketと文字列操作でやるのは大変だよなぁ。
ちなみに試したSMTPサーバの仕様でSMTP AUTHを使っています。JavaMailがやってくれているけど。
FirstProg07.java
8問目
「(名前)が、(場所)で、(アクション)した」がランダムに組み合わされて出てくるプログラム。
テストデータを10件用意して、それぞれをシャッフルして使用。ランダムに抽出よりもシャッフルしたほうが全部使われていい感じ。またしてもコレクションフレームワークありがとう。
Collections.shuffle(actionList);
※データは架空の人名です。
藤巻 利江が北海道でHした。
猪爪 忠一が兵庫県で爆発した。
市村 忠美が宮城県で結婚した。
宮原 寿子が徳島県で転職した。
ぶっ!(笑)
FirstProg08.java
9問目
URLを入れるとそのページのはてなブックマーク数が出てくるプログラム。
はてなブックマーク件数取得APIってのを使う。これはXML-RPCで提供されているっというのでApche XML-RPCを使用。SOAPは使ったことがあったけどXML-RPCは初めて使った。ライブラリ使うほどでもないけど一応あるものは使う。
Map
"bookmark.getCount", new String[]{url});
FirstProg09.java
10問目
ある名前とある名前を入れると相性診断を10段階で出してくれるプログラム。診断結果は適当でもいいけど、同じ組み合わせだったら同じ数値が必ずでないといけないように。
ラスト!診断方法としては、二人の名前のchar全部の文字コードを加算した結果の剰余+1。これで10パターンの結果が出るし。名前が同じならば同じ数値になるし、二人の順番を入れ替えても同じ結果になる。
FirstProg10.java
というわけでなんとか全部実装できました。ライブラリ使いまくりなのはちょっと手抜きだけど。
全部のソースコードが同梱されたファイルはこちらから。
Ruby版はこちらの方が実装しています。
新しくプログラミング言語を覚えたいときに行うべき10の練習問題をRubyで – chaperattaの日記