九〇億の神の御名 (その5)

そういえば、ソースを上げるといいつつすっかり忘れてた。
気がつけば一ヶ月以上経ってるよぉぃw

九〇億の神の御名 (その4)

/*
  from A.C.Clarke's "The Nine Billion Names of God"
*/
#include <stdio.h>
#include <stdlib.h>

#define MAX_GOD_NAME_LEN  9
#define MIN_GOD_NAME_LEN  7

char g_name[ MAX_GOD_NAME_LEN + 1 ];
long long g_count;  /* トータルの件数。 int や long じゃ足りない */

long g_fnum;   /* ファイルを作った際の通し番号 */
long g_fcnt;   /* 1ファイルあたりの件数カウント */
FILE * g_fp;

void names_of_god(int len)
{
  int c, pre;

  if(len >= MAX_GOD_NAME_LEN) return;

  pre = -1;
  if(len >= 2) {
    if(g_name[ len - 1 ] == g_name[ len - 2 ]) pre = g_name[ len - 1 ];
  }

  for(c = 'a'; c <= 'z'; c++) {
    if(c == pre) continue;

    g_name[len] = c;
    if(len >= (MIN_GOD_NAME_LEN - 1)) {
      g_name[len + 1] = '\0';

      if(g_fcnt == 0) {
	char fname[20];

	sprintf(fname, "result%03ld.log", g_fnum);
	if(NULL == (g_fp = fopen(fname, "w"))) {
	  fprintf(stderr, "ログ開けへんがな。(%s)\n", fname);
	  exit(EXIT_FAILURE);
	}
	g_fnum++;
      }

      fprintf(g_fp, "%10lld %s\n", g_count, g_name);
      g_count++; /* 全件カウント */
      g_fcnt++;  /* ファイル内での件数カウント */

      /* 1億件単位でファイルを作りなおす。 */
      if(g_fcnt >= 100000000L) {
	fclose(g_fp);
	g_fcnt = 0;
      }
    }
    names_of_god(len + 1);
  }
}

int main(int argc, char **argv)
{
  g_count = 0;
  g_fcnt = 0;
  g_fnum = 0;

  names_of_god(0);

  /* 最後のファイルは半端であることが予想されるので、ここで閉じる */
  if(g_fcnt > 0) {
    fclose(g_fp);
  }

  /* そして宇宙は終わる */
  return EXIT_SUCCESS;
}

試した環境では、1億件書き出すのに約1.5分程度だから、90億書き出すなら計算上135分程度でおわることに。二時間ちょっとやね。