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
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
整数演算(100,000,000): 495ms
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
正規表現(10,000,000): 2,592ms