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

…まぁ、正攻法で片付けるとこうなるわな。gcc-3.4.4 使用。

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

#define MIN_GOD_NAME_LEN  7
#define MAX_GOD_NAME_LEN  9

char g_name[ MAX_GOD_NAME_LEN + 1 ];
long long g_count;  /* int や long じゃ足りんw */

void namesofgod (FILE * fp, int len) 
{
  int c, pre;
  if(len >= MAX_GOD_NAME_LEN) return;

  pre = -1;
  if(len >= 2) {
    if(g_name[len - 2] == g_name[len - 1]) 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';
      fprintf (fp, "%10lld %s\n", g_count, g_name);
      g_count++;
    }
    namesofgod (fp, len + 1);
  }
}

int main (int argc, char **argv) 
{
  char buf[MAX_GOD_NAME_LEN + 1];
  FILE * fp;

  if(NULL == (fp = fopen("result.log", "w"))) {
    fprintf(stderr, "ログ開けへんがな。\n");
    return EXIT_FAILURE;
  }

  g_count = 0;
  namesofgod (fp, 0); 

  fclose(fp);

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