th0x0472.log

アクセスカウンタ

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

<<   作成日時 : 2014/01/18 04:53   >>

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

1桁のニコニコ数を組み合わせてニコニコ数の候補を作り、それがホントにニコニコ数かどうか判定する作戦です。

awkでファイル出力&読み出しを初めて使いました。
中級問題は解けるけど、上級問題はムリですね。
中間ファイルでディスクがパンクするし、何番目かのカウントを整数でやっているようではダメです。
中間ファイルは10桁の時点で82MB、11桁の時点で447MBにもなりました・・・。


 1: #!/usr/bin/awk -f
 2: 
 3: BEGIN{
 4:   N1[0]="0"; N1[1]="1"; N1[2]="2"; N1[3]="5"; N1[4]="8";
 5:   system("rm ./niko_num_*");
 6:   OUTFILE="niko_num_1"
 7:   print "1 1"; print "2 8"; NIKO_COUNT=3;
 8:   print "1" >  OUTFILE; print "2" >> OUTFILE;
 9:   print "5" >> OUTFILE; print "8" >> OUTFILE
10: }
11: 
12: {
13:   MAX_KETA=$1;
14:   for (KETA=2; KETA<=MAX_KETA  KETA++){
15:     INFILE="niko_num_" KETA-1; OUTFILE="niko_num_" KETA;
16:     while ((getline pN < INFILE) > 0) {
17:       for (i=0; i<5; i++){
18:         N=pN N1[i]; 
19:         print N >> OUTFILE;
20:         if (substr(N,1,1)!="0" && substr(N,length(N),1)!="0"){
21:           NIKONIKO="YES";
22:         }else{
23:           NIKONIKO="NO";
24:         }
25:         for(j=1; (j<=KETA && NIKONIKO=="YES"); j++){
26:           NC=substr(N,j,1); RC=substr(N,length(N)-j+1,1); 
27:           if (NC=="2" || NC=="5"){
28:             if (NC=="2" && RC!="5") {NIKONIKO="NO";}
29:             if (NC=="5" && RC!="2") {NIKONIKO="NO";}
30:           }else{
31:             if (NC!=RC) NIKONIKO="NO";
32:           }
33:         }
34:         if (NIKONIKO=="YES"){
35:           print NIKO_COUNT,N;
36:           NIKO_COUNT++;
37:         }
38:       }
39:     }
40:     close(INFILE); close(OUTFILE);
41:   }
42: }


実行はこんな感じです。


% echo 4 | ./find_niko2_num.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
31 5252
32 5522
33 5882
34 8008
35 8118
36 8258
37 8528
38 8888



中間ファイルに頼らないでニコニコ数の候補をつくれないとダメですね。
ニコニコ数かどうかの判定はもっと短く出来るはず(半分までチェックすればOKなはず)だと思います。
5個の数字しか登場しないので、1桁は3ビットで表現できるわけで、キリよく1桁4ビットとしても1バイトに2桁。それを考えるとCで頑張るのが良いのか・・・。

でも、もう寝ます。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

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