import java.util.function.IntPredicate;
/*
プログラミングのお題スレ Part15
//mevius.5ch.net/test/read.cgi/tech/1564310397/245
245 名前:デフォルトの名無しさん[sage] 投稿日:2019/08/31(土) 08:45:29.92 ID:h26kuCJS
お題
>>228 を求めることができる
特に最適化を施さないナイーブな実装(例えば>>238 )を書いて
その実行にかかる時間(ミリ秒、秒等)を計測し出力してください
なお遅い言語処理系で1億以下が無理な場合は1千万以下でも構いません
> 228 名前:デフォルトの名無しさん[] 投稿日:2019/08/30(金) 06:09:58.43 ID:N+Bub+CM
> お題
> 1億以下の同じ数字でできている数(1,22,777など)をすべて表示する
> 238 名前:デフォルトの名無しさん[sage] 投稿日:2019/08/30(金) 16:39:32.33 ID:BnHn7wdj
> 遅いけど perl5
> for (1..100_000_000) { print if s{\A (.) \1* \z}{$& }x }
> 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999
> 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666
> 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999
> 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111
> 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999
*/
class Ideone
{
public static void main
(String[] args
) {
// Intel Pentium G6950@2.8GHzでの1億以下での結果
// 整数演算: 1,073ms
// 正規表現: 46,450ms
test("整数演算", 1_0000_0000, Ideone::hoge);
test("正規表現", 1000_0000, Ideone::hage);
}
static void test
(String s,
int n, IntPredicate predicate
) {
long st
= System.
currentTimeMillis(); for (int i = 1; i <= n; i++)
{
if (predicate.
test(i
)) System.
out.
println(i
); }
long et
= System.
currentTimeMillis(); System.
out.
printf("%s(%,d): %,dms%n", s, n, et
- st
); }
static boolean hoge(int i)
{
for (int n = i % 10; i != 0; i /= 10)
if (i % 10 != n) return false;
return true;
}
static boolean hage(int i)
{
return Integer.
toString(i
).
matches("(.)\\1*"); }
}
aW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRQcmVkaWNhdGU7CgovKgrjg5fjg63jgrDjg6njg5/jg7PjgrDjga7jgYrpoYzjgrnjg6wgUGFydDE1IAovL21ldml1cy41Y2gubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xNTY0MzEwMzk3LzI0NQoKMjQ1IOWQjeWJje+8muODh+ODleOCqeODq+ODiOOBruWQjeeEoeOBl+OBleOCk1tzYWdlXSDmipXnqL/ml6XvvJoyMDE5LzA4LzMxKOWcnykgMDg6NDU6MjkuOTIgSUQ6aDI2a3VDSlMK44GK6aGMCj4+MjI4IOOCkuaxguOCgeOCi+OBk+OBqOOBjOOBp+OBjeOCiwrnibnjgavmnIDpganljJbjgpLmlr3jgZXjgarjgYTjg4rjgqTjg7zjg5bjgarlrp/oo4XvvIjkvovjgYjjgbA+PjIzOCDvvInjgpLmm7jjgYTjgaYK44Gd44Gu5a6f6KGM44Gr44GL44GL44KL5pmC6ZaT77yI44Of44Oq56eS44CB56eS562J77yJ44KS6KiI5ris44GX5Ye65Yqb44GX44Gm44GP44Gg44GV44GECgrjgarjgYrpgYXjgYToqIDoqp7lh6bnkIbns7vjgafvvJHlhITku6XkuIvjgYznhKHnkIbjgarloLTlkIjjga/vvJHljYPkuIfku6XkuIvjgafjgoLmp4vjgYTjgb7jgZvjgpMKCgo+IDIyOCDlkI3liY3vvJrjg4fjg5Xjgqnjg6vjg4jjga7lkI3nhKHjgZfjgZXjgpNbXSDmipXnqL/ml6XvvJoyMDE5LzA4LzMwKOmHkSkgMDY6MDk6NTguNDMgSUQ6TitCdWIrQ00KPiDjgYrpoYwKPiAx5YSE5Lul5LiL44Gu5ZCM44GY5pWw5a2X44Gn44Gn44GN44Gm44GE44KL5pWwKDEsMjIsNzc344Gq44GpKeOCkuOBmeOBueOBpuihqOekuuOBmeOCiwoKCj4gMjM4IOWQjeWJje+8muODh+ODleOCqeODq+ODiOOBruWQjeeEoeOBl+OBleOCk1tzYWdlXSDmipXnqL/ml6XvvJoyMDE5LzA4LzMwKOmHkSkgMTY6Mzk6MzIuMzMgSUQ6Qm5Ibjd3ZGoKPiDpgYXjgYTjgZHjgakgcGVybDUKPiBmb3IgKDEuLjEwMF8wMDBfMDAwKSB7IHByaW50IGlmIHN7XEEgKC4pIFwxKiBcen17JCYgfXggfQo+IDEgMiAzIDQgNSA2IDcgOCA5IDExIDIyIDMzIDQ0IDU1IDY2IDc3IDg4IDk5IDExMSAyMjIgMzMzIDQ0NCA1NTUgNjY2IDc3NyA4ODggOTk5Cj4gMTExMSAyMjIyIDMzMzMgNDQ0NCA1NTU1IDY2NjYgNzc3NyA4ODg4IDk5OTkgMTExMTEgMjIyMjIgMzMzMzMgNDQ0NDQgNTU1NTUgNjY2NjYKPiA3Nzc3NyA4ODg4OCA5OTk5OSAxMTExMTEgMjIyMjIyIDMzMzMzMyA0NDQ0NDQgNTU1NTU1IDY2NjY2NiA3Nzc3NzcgODg4ODg4IDk5OTk5OQo+IDExMTExMTEgMjIyMjIyMiAzMzMzMzMzIDQ0NDQ0NDQgNTU1NTU1NSA2NjY2NjY2IDc3Nzc3NzcgODg4ODg4OCA5OTk5OTk5IDExMTExMTExCj4gMjIyMjIyMjIgMzMzMzMzMzMgNDQ0NDQ0NDQgNTU1NTU1NTUgNjY2NjY2NjYgNzc3Nzc3NzcgODg4ODg4ODggOTk5OTk5OTkKICovCmNsYXNzIElkZW9uZQp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIC8vIEludGVsIFBlbnRpdW0gRzY5NTBAMi44R0h644Gn44GuMeWEhOS7peS4i+OBp+OBrue1kOaenAogICAgICAgIC8vIOaVtOaVsOa8lOeulzogMSwwNzNtcwogICAgICAgIC8vIOato+imj+ihqOePvjogNDYsNDUwbXMKICAgICAgICAKICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOwogICAgICAgIHRlc3QoIuaVtOaVsOa8lOeulyIsIDFfMDAwMF8wMDAwLCBJZGVvbmU6OmhvZ2UpOwogICAgICAgIHRlc3QoIuato+imj+ihqOePviIsICAgMTAwMF8wMDAwLCBJZGVvbmU6OmhhZ2UpOwogICAgICAgIAogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCB0ZXN0KFN0cmluZyBzLCBpbnQgbiwgSW50UHJlZGljYXRlIHByZWRpY2F0ZSkKICAgIHsKICAgICAgICBsb25nIHN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS50ZXN0KGkpKSBTeXN0ZW0ub3V0LnByaW50bG4oaSk7CiAgICAgICAgfQogICAgICAgIGxvbmcgZXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJXMoJSxkKTogJSxkbXMlbiIsIHMsIG4sIGV0IC0gc3QpOwogICAgfQoKICAgIHN0YXRpYyBib29sZWFuIGhvZ2UoaW50IGkpCiAgICB7CiAgICAgICAgZm9yIChpbnQgbiA9IGkgJSAxMDsgaSAhPSAwOyBpIC89IDEwKQogICAgICAgICAgICBpZiAoaSAlIDEwICE9IG4pIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIAogICAgc3RhdGljIGJvb2xlYW4gaGFnZShpbnQgaSkKICAgIHsKICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpKS5tYXRjaGVzKCIoLilcXDEqIik7CiAgICB9Cn0K