新しくプログラミング言語を~10の練習問題をJavaで作ってみた

はてなブックマークでとても人気を集めていた記事です。

新しくプログラミング言語を覚えたいときに行うべき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<string> lines = IOUtils.readLines(System.in);
Collections.sort(lines, new Comparator<string>(){
	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<string, Integer> ret = (Map<string, Integer>)client.execute(
    "bookmark.getCount", new String[]{url});

FirstProg09.java

10問目

ある名前とある名前を入れると相性診断を10段階で出してくれるプログラム。診断結果は適当でもいいけど、同じ組み合わせだったら同じ数値が必ずでないといけないように。

ラスト!診断方法としては、二人の名前のchar全部の文字コードを加算した結果の剰余+1。これで10パターンの結果が出るし。名前が同じならば同じ数値になるし、二人の順番を入れ替えても同じ結果になる。
FirstProg10.java

というわけでなんとか全部実装できました。ライブラリ使いまくりなのはちょっと手抜きだけど。

全部のソースコードが同梱されたファイルはこちらから。

Ruby版はこちらの方が実装しています。
新しくプログラミング言語を覚えたいときに行うべき10の練習問題をRubyで – chaperattaの日記


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)