辿っていったら、必ず同じラインに辿り着くという、役に立たない阿弥陀籤を生成するプログラムです。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
<
---
>