LoginSignup
0
1

More than 3 years have passed since last update.

非正則恒等置換阿弥陀籤(Ubuntu Terminal)

Last updated at Posted at 2019-04-23

辿っていったら、必ず同じラインに辿り着くという、役に立たない阿弥陀籤を生成するプログラムです。Ubuntu18.04で動作確認しています。

ASCII文字を使ったのとUTF-8記号文字を使ったのと2つ載せておきます。

Cで書かれています。
コンパイルは、
$ cc amida.c -o amidaでして下さい。
実行は、
$ ./amida 12 15とします。最初の12が、縦のライン数、次の15が阿弥陀籤の長さです。
パラメータは、省略することも出来ます。
For ex.
$ ./amida 12 縦のライン数12で阿弥陀籤を作る。
$ ./amida デフォルトのサイズの阿弥陀籤を作る。

アルゴリズムは、ざっと言うと、【阿弥陀籤を鏡に映すと、反対に辿り、同じところに着く】、という原理に基づいています。

utf-8記号文字を使ったソース

amida.c
#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#define SP "  "
#define VL "┃"
#define HL "━━"
#define LB "┫"
#define RB "┣"
#define VLSP (VL SP)
#define LBSP (LB SP)
#define RBHL (RB HL)
#define rnd(x) (rand()%x)
#define XM  300
#define YM  300
static  int bar[XM][YM];

void make_amida(int xmx,int ymx) {
  int i,x,y;

  for(y=0;y<YM;y++)
    for(x=0;x<XM;x++)
      bar[x][y]=0;

  for(i=0;i<xmx*ymx/4;i++) {
    x=rnd(xmx),y=rnd(ymx/2+1);
    if ( (x==0||(x>0&&bar[x-1][y]==0)) &&
       (x==xmx||(x<xmx&&bar[x+1][y]==0)))
      bar[x][y]=bar[x][ymx-y]=1;
  }
}

void extra_line(int xmx,int n) {
  int i,x;
  for(i=0;i<n;i++) {
    for(x=0;x<=xmx;x++)
      printf("%s",VLSP);
    printf("\n");
    }
}

void disp_amida(int xmx,int ymx) {
  int f,x,y;

  extra_line(xmx,3);
  for(y=0;y<ymx;y++) {
    f=0;
    for(x=0;x<xmx+1;x++)
      if (bar[x][y]) printf("%s",RBHL),f=1;
      else printf("%s",f?LBSP:VLSP),f=0;
    printf("\n");
    }
  extra_line(xmx,3);
}

void main(int argc,char **argv) {
  int xmx,ymx;

  srand((unsigned)time(NULL));
  xmx=20,ymx=20;
  switch(argc) {
    case 1:
      break;
    case 2:
      sscanf(argv[1],"%d",&xmx);
      break;
    case 3:
      sscanf(argv[1],"%d",&xmx);
      sscanf(argv[2],"%d",&ymx);
      break;
    }
  if (ymx%2==0) ymx--;
  if (ymx<=14) ymx=15;
  if (xmx<3) xmx=3;
  xmx--;
  make_amida(xmx,ymx);
  disp_amida(xmx,ymx);
  exit(0);
}

ASCII文字(UTF-8曖昧幅文字を使わない)ソース

amida.c
#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#define SP "  "
#define VL "|"
#define HL "--"
#define LB "+"
#define RB "+"
#define VLSP (VL SP)
#define LBSP (LB SP)
#define RBHL (RB HL)
#define rnd(x) (rand()%x)
#define XM  300
#define YM  300
static  int bar[XM][YM];

void make_amida(int xmx,int ymx) {
  int i,x,y;

  for(y=0;y<YM;y++)
    for(x=0;x<XM;x++)
      bar[x][y]=0;

  for(i=0;i<xmx*ymx/4;i++) {
    x=rnd(xmx),y=rnd(ymx/2+1);
    if ( (x==0||(x>0&&bar[x-1][y]==0)) &&
       (x==xmx||(x<xmx&&bar[x+1][y]==0)))
      bar[x][y]=bar[x][ymx-y]=1;
  }
}

void extra_line(int xmx,int n) {
  int i,x;
  for(i=0;i<n;i++) {
    for(x=0;x<=xmx;x++)
      printf("%s",VLSP);
    printf("\n");
    }
}

void disp_amida(int xmx,int ymx) {
  int f,x,y;

  extra_line(xmx,3);
  for(y=0;y<ymx;y++) {
    f=0;
    for(x=0;x<xmx+1;x++)
      if (bar[x][y]) printf("%s",RBHL),f=1;
      else printf("%s",f?LBSP:VLSP),f=0;
    printf("\n");
    }
  extra_line(xmx,3);
}

void main(int argc,char **argv) {
  int xmx,ymx;

  srand((unsigned)time(NULL));
  xmx=20,ymx=20;
  switch(argc) {
    case 1:
      break;
    case 2:
      sscanf(argv[1],"%d",&xmx);
      break;
    case 3:
      sscanf(argv[1],"%d",&xmx);
      sscanf(argv[2],"%d",&ymx);
      break;
    }
  if (ymx%2==0) ymx--;
  if (ymx<=14) ymx=15;
  if (xmx<3) xmx=3;
  xmx--;
  make_amida(xmx,ymx);
  disp_amida(xmx,ymx);
  exit(0);
}

この二つのソースの違い

違いは下記のとおりです。(diffの出力です)

曖昧幅文字を使っているのでは、ソースがちょっと、UTF-8記号文字の定義が違います。
他のプラットホームの人は、適宜、#defineの所の記号文字を変える必要があるかも知れません。

5,8c5,8
< #define VL "┃"
< #define HL "━━"
< #define LB "┫"
< #define RB "┣"
---
> #define VL "|"
> #define HL "--"
> #define LB "+"
> #define RB "+"
31c31
< 
---
>       

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1