第二回 オフラインリアルタイムどう書くの問題をDartで解いてみました。
問題はこちら http://nabetani.sakura.ne.jp/hena/ord2/
import "dart:math" show pow, log;
main () {
test("ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06");
test("01", "00");
test("00", "00");
test("7a-4e", "0c-02");
test("56-b6", "08-14");
test("12-12-12", "00-00-00");
test("de-ff-7b", "0a-0f-05");
test("95-be-d0", "05-1e-20");
test("7c-b0-bb", "1c-20-2b");
test("7a-b6-31-6a", "3a-56-11-2a");
test("32-0e-23-82", "18-06-11-40");
test("ff-7f-bf-df-ef", "0f-07-0b-0d-0e");
test("75-df-dc-6e-42", "35-5f-5c-2e-02");
test("62-51-ef-c7-f8", "22-11-6f-47-78");
test("0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b");
test("aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f");
test("ff-55-d5-75-5d-57", "0f-00-08-04-02-01");
test("fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f");
test("fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f");
test("d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e");
test("38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a");
test("fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f");
print("ok");
}
test(String input, String expect) {
assert(tetris(input) == expect);
}
String tetris(String input) {
Iterable<int> fields = input.split("-")
.map((hex) => int.parse(hex, radix: 16));
List<int> deleteLine = new Iterable.generate(8, (x) => pow(2, 7 - x))
.where((x) => fields.every((f) => (f & x) != 0)).toList();
return fields.map((int field) {
for(int line in deleteLine) {
int lowmask = line - 1;
int highmask = (~lowmask) - line;
field = (field & lowmask) + ((field & highmask) >> 1);
}
return "0${field.toRadixString(16)}".slice(-2);
}).join("-");
}
文字列のpadding用のメソッドがほしいなぁ。