元ネタ
なんのこっちゃない、元ネタはこちらです。
真ん中あたりの「おまけ」にあります。
結局はFizzBuzz問題ということみたいです。
更新履歴
2022/12/22 コメント読みました。レスポンスうれしいです。現在再作成中。
2022/12/22 zundoko2.cのコードと実行結果を載せました。
2022/12/24 第3版 "doko"が出るのを許さない="zun"×4狙い撃ちバージョン
2022/12/24 第4版 最終版。
初期版
開発環境
開発環境はこちらです。
user:~ % uname -a
FreeBSD xxxxxx 13.1-RELEASE-p3 FreeBSD 13.1-RELEASE-p3 GENERIC i386
生温かい目で見てやってください。
コード
とりあえず、作ってみました。
zundoko.c
/*********
zundoko.c
*********/
#include <stdio.h>
#include <stdlib.h>
#define sZUN " zun"
#define sDOKO " doko"
#define ZUN 0
#define DOKO 1
int main() {
int z1=0, z2=0, z3=0, z4=0, is_zzzd=0;
srand((unsigned int)time(NULL));
while(is_zzzd<4)
{
z1=(int)rand()%2;
z2=(int)rand()%2;
z3=(int)rand()%2;
z4=(int)rand()%2;
if(z1==ZUN && z2==ZUN && z3==ZUN && z4==DOKO)
break;
printf("%s\n\r", z1==0 ? sZUN : sDOKO);
printf("%s\n\r", z2==0 ? sZUN : sDOKO);
printf("%s\n\r", z3==0 ? sZUN : sDOKO);
printf("%s\n\r", z4==0 ? sZUN : sDOKO);
}
printf("%s\n\r", z1==0 ? sZUN : sDOKO);
printf("%s\n\r", z2==0 ? sZUN : sDOKO);
printf("%s\n\r", z3==0 ? sZUN : sDOKO);
printf("%s\n\r", z4==0 ? sZUN : sDOKO);
printf("KI,YO,SHI !!!\n\r");
return 0;
}
コンパイル
こんな感じ。エラー出てるけど、あんまり気にしない。
user:~ % cc -o zd zundoko.c
zundoko.c:16:22: warning: implicit declaration of function 'time' is invalid in C99 [-Wimplicit-function-declaration]
srand((unsigned int)time(NULL));
^
1 warning generated.
実行
走らせてみる。
user:~ % ./zd
zun
doko
zun
doko
doko
doko
doko
doko
zun
doko
doko
doko
doko
doko
zun
doko
zun
doko
zun
zun
doko
doko
zun
zun
doko
zun
zun
doko
doko
zun
zun
doko
doko
zun
zun
doko
zun
doko
zun
zun
zun
doko
doko
zun
zun
doko
doko
zun
zun
zun
doko
zun
doko
doko
zun
zun
doko
zun
doko
zun
zun
doko
zun
zun
zun
zun
doko
zun
zun
doko
zun
zun
zun
doko
zun
doko
zun
zun
doko
zun
zun
zun
zun
doko
KI,YO,SHI !!!
ちゃんと動いてるみたい。
振り返り
- 作ることはできた。実行結果が面白い。
- 4つセットでwhileしてるので、ちゃんと条件がそろっている様に見えても内部処理的に当てはまっていないことがある。これはちゃんと直したい。
- とりあえず作っただけなので、もっとエレガントなコードにしたい。
- 他の言語だとどんなコードになるか試してみたい。ただし、いつになるかは分からない。
その2版
コード
zundoko2.c
/*********
zundoko2.c
*********/
#include <stdio.h>
#include <stdlib.h>
#define sZUN " zun"
#define sDOKO " doko"
#define ZUN 0
#define DOKO 1
int main() {
int z1=0, z2=0, z3=0, z4=0, z5=0;
srand((unsigned int)time(NULL));
while(1)
{
z1=(int)rand()%2;
z2=(int)rand()%2;
z3=(int)rand()%2;
z4=(int)rand()%2;
z5=(int)rand()%2;
if(z1==ZUN && z2==ZUN && z3==ZUN && z4==ZUN && z5==DOKO)
break;
printf("1: %s\n\r", z1==0 ? sZUN : sDOKO);
printf("2: %s\n\r", z2==0 ? sZUN : sDOKO);
printf("3: %s\n\r", z3==0 ? sZUN : sDOKO);
printf("4: %s\n\r", z4==0 ? sZUN : sDOKO);
printf("5: %s\n\r", z5==0 ? sZUN : sDOKO);
}
printf("1: %s\n\r", z1==0 ? sZUN : sDOKO);
printf("2: %s\n\r", z2==0 ? sZUN : sDOKO);
printf("3: %s\n\r", z3==0 ? sZUN : sDOKO);
printf("4: %s\n\r", z4==0 ? sZUN : sDOKO);
printf("5: %s\n\r", z5==0 ? sZUN : sDOKO);
printf("KI,YO,SHI !!!\n\r");
return 0;
}
実行結果
user:~ % ./zd
1: doko
2: zun
3: zun
4: doko
5: zun
1: zun
2: zun
3: zun
4: zun
5: doko
KI,YO,SHI !!!
何回かやってるうちに、2ターンで揃いました!
↑+Enterって、速い。
今日は、ここまでにします。
第3版 前2つよりはマシな版
"doko"が出るのを許さない="zun"×4狙い撃ちバージョン
zundoko3.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int zzz=0;
srand((unsigned int)time(NULL));
while(1) {
if((int)rand()%2 == 0) {
printf(" zun");
zzz++;
}
else
zzz=0;
if(zzz==4) {
if((int)rand()%2 == 1) {
printf(" doko\n\r");
printf("KI YO SHI!!\n\r");
break;
}
else
zzz=0;
}
}
return 0;
}
実行結果3
user:~ % ./zd3
zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun doko
KI YO SHI!!
user:~ % ./zd3
zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun doko
KI YO SHI!!
user:~ % ./zd3
zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun zun doko
KI YO SHI!!
user:~ % ./zd3
zun zun zun zun zun zun zun zun zun doko
KI YO SHI!!
第4版 "doko"も表示してあげる版
zundoko4.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 int main()
6 {
7 int zzzz=0;
8
9 srand((unsigned int)time(NULL));
10
11 while(1) {
12 if((int)rand()%2 == 0) {
13 printf(" zun");
14 zzzz++;
15 }
16 else {
17 printf(" doko");
18 zzzz=0;
19 }
20 if(zzzz==4) {
21 if((int)rand()%2 == 1) {
22 printf(" doko\n\r");
23 printf("KI YO SHI!!\n\r");
24 break;
25 }
26 else
27 zzzz=0;
28 }
29 }
30 return 0;
31 }
17行目を追加しただけです。
あと、stdlib.h, time.hをincludeして、warningを無くしました。
実行結果
user:~ % ./zd4
zun doko doko doko zun zun doko doko doko doko zun zun zun doko zun zun zun zun doko
KI YO SHI!!
user:~ % ./zd4
doko doko doko doko zun doko doko zun zun zun zun zun doko doko doko zun zun zun doko zun zun doko zun zun zun zun doko
KI YO SHI!!
user:~ % ./zd4
doko zun doko zun zun zun zun doko
KI YO SHI!!
あれ?2つめが zun x 4 + doko なのにそこで終わってない。これ、課題。
振り返り
- このネタのTwitterが2016年だった。面白いことがあったんだなと思いました。これの他に面白そうなネタがあったらチャレンジしてみたいです。
- コードが小規模なので、練習問題として取り組むにはちょうど良いと思いました。
- ズンドコ問題に、たくさんの人が取り組んでいることが分かりました。