th0x0472.log

アクセスカウンタ

zoom RSS #cross2014 のdwangoさんの問題にawkで挑戦しました、その2

<<   作成日時 : 2014/01/22 00:01   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

相変わらず awkで挑戦しています。
ニコニコ数をかなり早く求められるようになりましたが、まだ上級問題には到達できません。

問題はこちら: http://p.twipple.jp/L2wTc


2525のように左右反転させて同じ数になる数をニコニコ数と呼ぶ。
0,1,2,5,8を反転させると、それぞれ、0,1,5,2,8となり、
3,4,6,7,9を反転させても正しい数字とはならない。
また、先頭の0は認めない。

ニコニコ数を小さい順に列挙すると、
1,8,11,25,52,88,101,111,181,205... である。
2525は27番目のニコニコ数である。

中級問題
2525番目のニコニコ数を答えよ。

上級問題
25252525252525252525252525252525252525252525252525
(25が25個)番目のニコニコ数を答えよ。



20桁のニコニコ数が7,812,500個ありました。
で、このスクリプトの出力をファイルにリダイレクトしていくと、23桁の時点で3GB突破してますし、50桁の数とかまだ数えられないし、まだまだ上級問題にはほど遠いです。


 1: #!/usr/bin/awk -f
 2: 
 3: BEGIN{
 4:   NIKO2_1[0]="0"; NIKO2_1[1]="1"; NIKO2_1[2]="8"; 
 5:   NIKO2_2[0]="00"; NIKO2_2[1]="11"; NIKO2_2[2]="25"; NIKO2_2[3]="52"; NIKO2_2[4]="88";
 6:   system("rm ./niko_num_*");
 7: }
 8: 
 9: {
10: 
11:   MAX_KETA=$1; C_KETA=1; NIKO_COUNT=1;
12: 
13:   # C_KETA == 1 
14:   if (C_KETA<=MAX_KETA){
15:     OUTFILE="niko_num_" C_KETA;
16:     for (i=1;i<=2;i++){
17:       print NIKO2_1[i] >> OUTFILE;
18:       print NIKO_COUNT, NIKO2_1[i];
19:       NIKO_COUNT++;
20:     }
21:     C_KETA++; close(OUTFILE);
22:   }
23: 
24:   # C_KETA == 2
25:   if (C_KETA<=MAX_KETA){
26:     OUTFILE="niko_num_" C_KETA;
27:     for (i=1;i<5;i++){
28:       print NIKO2_2[i] >> OUTFILE;
29:       print NIKO_COUNT,NIKO2_2[i];
30:       NIKO_COUNT++;
31:     }
32:     C_KETA++; close(OUTFILE);
33:   }
34: 
35:   # C_KETA == 3
36:   if (C_KETA<=MAX_KETA){
37:     OUTFILE="niko_num_" C_KETA;
38:     INFILE="niko_num_" int(C_KETA/2)+1;
39:     while ((getline NIKO < INFILE)>0){
40:       C1=substr(NIKO,1,1); C2=substr(NIKO,2,1);
41:       for (i=0;i<=2;i++){
42:         NEW_NIKO=C1 NIKO2_1[i] C2;
43:         print NEW_NIKO >> OUTFILE;
44:         print NIKO_COUNT, NEW_NIKO;
45:         NIKO_COUNT++;
46:       }
47:     }
48:     C_KETA++; close(OUTFILE); close(INFILE);
49:   }
50: 
51:   #  MAX_KETA => C_KETA > 3
52:   while(C_KETA<=MAX_KETA){
53:     # C_KETA == EVEN
54:     OUTFILE="niko_num_" C_KETA;
55:     INFILE="niko_num_" C_KETA-2;
56:     while((getline NIKO < INFILE)>0){
57:       C1=substr(NIKO,1,length(NIKO)/2); 
58:       C2=substr(NIKO,length(NIKO)/2+1);
59:       for (i=0;i<=4;i++){
60:         NEW_NIKO=C1 NIKO2_2[i] C2;
61:         print NEW_NIKO >> OUTFILE;
62:         print NIKO_COUNT, NEW_NIKO;
63:         NIKO_COUNT++;
64:       }
65:     }
66:     close(OUTFILE); close(INFILE);
67: 
68:     # C_KETA == ODD
69:     INFILE="niko_num_" C_KETA;
70:     C_KETA++;
71:     OUTFILE="niko_num_" C_KETA;
72:     while((getline NIKO < INFILE)>0){
73:       C1=substr(NIKO,1,length(NIKO)/2); 
74:       C2=substr(NIKO,length(NIKO)/2+1);
75:       for (i=0;i<=2;i++){
76:         NEW_NIKO=C1 NIKO2_1[i] C2;
77:         print NEW_NIKO >> OUTFILE;
78:         print NIKO_COUNT, NEW_NIKO;
79:         NIKO_COUNT++;
80:       }
81:     }
82:     C_KETA++; close(OUTFILE); close(INFILE);
83:   }
84: 
85: }


実行するとこんな感じです。


% echo 11 | ./niko2num.awk
1 1
2 8
3 11
4 25
5 52
6 88
7 101
8 111
9 181
10 205
11 215
12 285
13 502
14 512
15 582
16 808
17 818
18 888
19 1001
20 1111
21 1251
22 1521
23 1881
24 2005
25 2115
26 2255
27 2525
28 2885
29 5002
30 5112
---- snip ----
12489 88881818888
12490 88882058888
12491 88882158888
12492 88882858888
12493 88885028888
12494 88885128888
12495 88885828888
12496 88888088888
12497 88888188888
12498 88888888888

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
#cross2014 のdwangoさんの問題にawkで挑戦しました、その2 th0x0472.log/BIGLOBEウェブリブログ
文字サイズ:       閉じる