2012年9月6日木曜日

FizzBuzzの亜種問題を解く

White scenery @showyouに掲載されていた問題を解いてみることにしました。

邪法なのでこれから解こうという人の参考にはならないと思います。



問1の解答
function show_leap_year() {
var textarea = document.forms["form"].elements["textarea"];
textarea.value = "";
var regex = /^\d{0,2}(0[48]|[2468][048]|[13579][26])$|^([02468][048]|[13579][26])00$/;
for (var i = 1900; i <= 2010; ++i) {
textarea.value += i + "年は" + (regex.test(i) ? 366 : 365) + "日です。\n";
}
}


JavaScriptで解きました。

この手の問題では手垢のついた方法ですが、
正規表現を使っています。

4の倍数、100の倍数、400の倍数は、
実は正規表現に有利だったりします。
※おそらく最悪なのは7の倍数とかかな?

しかし通常の方法とは違い、
4桁年までしかサポートしていない欠点を持っています。

まあ頑張ればそこも直せるでしょうけど、
もうめどいんでいいです。



問2の解答
package org.mericle;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
public class JapaneseDayCounter {
public static void main(String[] args) {
ArrayList<String> messages = new ArrayList<String>();
// JRE標準の和暦を使う
Locale locale = new Locale("ja", "JP", "JP");
DateFormat format = new SimpleDateFormat("GGGGyy年", locale);
Calendar calendar = Calendar.getInstance(locale);
for (calendar.set(24, 11, 31) // 平成24年12月31日
; calendar.get(Calendar.ERA) != 0
; calendar.set(Calendar.DAY_OF_YEAR, 1),
calendar.add(Calendar.DAY_OF_YEAR, -1)) {
messages.add(format.format(calendar.getTime())
+ "は"
+ calendar.get(Calendar.DAY_OF_YEAR)
+ "日です。");
}
// 平成~明治の順を明治~平成に直して出力する
for (int i = messages.size() - 1; i >= 0; --i) {
System.out.println(messages.get(i));
}
}
}


Javaで解きました。

Java6から和暦をサポートしているので、
それさえ知っていれば赤子の手をひねるようなものです。

と言っても、
これはバージョン2だったりします。

最初のバージョンは日単位でループさせていたのですが、
デバッグ中にDAY_OF_YEARの仕様に気がついて年単位に修正しました。

その結果、
なんとif文が登場しないソースコードになりました。

え、卑怯?
車輪の再発明を防いだと言ってくださいよ。



こういう風にプライベートでも前向きにプログラミングに望める人なら、
才能は無くても上達できる可能性はあると思います。

…それが3分なのか3000時間なのかは分かりませんけどね。


0 件のコメント:

コメントを投稿