化石言語での数当てゲームプログラム、削れるところある?

1: 2019/06/20(木) 13:16:18.366 ID:aOQIam04d
俺がどう頑張ってもこれが限界だった

Aが最初に初期の3桁入力
Bが次に3桁入力
EATとBITEを表示する
5回間違えると失敗


a,b,c,x,y,z,t,i;main(e){puts("A =>");scanf("",&a,&b,&c);puts("\nB")
;for
(;i++<5&&e<3;){printf("回目入力 ",i);scanf(" ",&x,&y,&z);e=t=0;a
-x||e++;
b-y||e++;c-z||e++;a-y&&a-z||t++;b-z&&b-x||t++;c-x&&c-y||t++;e<3?printf
(" EAT,BITE\n\n",x,y,z,e,t):puts("正解");}e<3&&puts("失敗");}

2: 2019/06/20(木) 13:16:57.321 ID:aOQIam04d
a,b,c,x,y,z,t,i;main(e){puts("A =>");scanf("",&a,&b,&c);puts("\nB");for
(;i++<5&&e<3;){printf("回目入力 ",i);scanf(" ",&x,&y,&z);e=t=0;a
-x||e++;b-y||e++;c-z||e++;a-y&&a-z||t++;b-z&&b-x||t++;c-x&&c-y||t++;e<3?printf
(" EAT,BITE\n\n",x,y,z,e,t):puts("正解");}e<3&&puts("失敗");}

3: 2019/06/20(木) 13:20:47.725 ID:aOQIam04d
a ,b ,c ,x ,y ,z ,t,i ;

 main(e)
 {

        puts("A =>");
        scanf( "" ,&a ,&b ,&c );
        puts("\nB");

        for(; i++ < 5 && e < 3 ;){

                printf("回目入力 ",i);
                scanf( " " ,&x ,&y ,&z );

                e = t = 0 ;

                a-x||e++;
                b-y||e++;
                c-z||e++;

                a-y&&a-z||t++;
                b-z&&b-x||t++;
                c-x&&c-y||t++;

                e < 3 ? printf(" EAT,BITE\n\n",x ,y ,z ,e ,t) : puts("正解");
        }

        e < 3 && puts("失敗") ;

 }

11: 2019/06/20(木) 13:33:57.267 ID:WWzG1qHM0
e < 3が3箇所もあるのは明らかに無駄

12: 2019/06/20(木) 13:35:21.374 ID:hynLOEx3p
>>11
書き直してあげろよ

13: 2019/06/20(木) 13:44:02.245 ID:aOQIam04d
もう無理だよね
scanfとprintfの部分とかどうにかして省略できないかな

16: 2019/06/20(木) 13:58:16.948 ID:aOQIam04d
printfの文章削った
プログラムと関係ないし邪道だけど
この際どうでもいい


a ,b ,c ,x ,y ,z ,t,i ;

 main(e)
 {

        scanf( "" ,&a ,&b ,&c );

        for(; i++ < 5 && e < 3 ;){

                printf("回目入力 ",i);
                scanf( " " ,&x ,&y ,&z );

                e = t = 0 ;

                a-x||e++;
                b-y||e++;
                c-z||e++;

                a-y&&a-z||t++;
                b-z&&b-x||t++;
                c-x&&c-y||t++;

                e < 3 ? printf(" EAT,BITE\n\n",x ,y ,z ,e ,t) : puts("正解");
        }

        e < 3 && puts("失敗") ;

 }

17: 2019/06/20(木) 14:00:45.336 ID:aOQIam04d
a ,b ,c ,x ,y ,z ,t,i ;

 main(e)
 {

        scanf( "" ,&a ,&b ,&c );

        for(; i++ < 5 && e < 3 ;){

                printf("回目 ",i);
                scanf( " " ,&x ,&y ,&z );

                e = t = 0 ;

                a-x||e++;
                b-y||e++;
                c-z||e++;

                a-y&&a-z||t++;
                b-z&&b-x||t++;
                c-x&&c-y||t++;

                e < 3 ? printf("EAT,BITE\n\n",e ,t) : puts("正解");
        }

        e < 3 && puts("失敗") ;

 }

19: 2019/06/20(木) 14:08:18.302 ID:Hd1qc50+0
e=t=0;a-x||e++;a-y&&a-z||t++;

 ↓

e=!!(a-x);t=a-y&&a-z;

ここまではわかった

21: 2019/06/20(木) 14:08:47.396 ID:aOQIam04d
>>19
ちょっと待っえ試してみる

26: 2019/06/20(木) 14:16:44.043 ID:Hd1qc50+0
>>19はb-yとかb-z&&b-zのとこは変えないぞ

29: 2019/06/20(木) 14:20:58.462 ID:aOQIam04d
>>26
消すのはet=0とa-xe++とa-ya-zt++だけだよね
それでなった

20: 2019/06/20(木) 14:08:27.089 ID:aOQIam04d
あくまで最低限のゲームとしての機能を実装するだけだから良いの
普通にゲームにするならどうしたらいいんだろう、画面消去のコマンドとかあるのか

22: 2019/06/20(木) 14:11:56.566 ID:aOQIam04d
だめだ2回目からEATの値が変になるよ

26: 2019/06/20(木) 14:16:44.043 ID:Hd1qc50+0
>>22はb-yとかb-z&&b-zのとこは変えないぞ

23: 2019/06/20(木) 14:12:38.676 ID:aOQIam04d
BITEの値も変になる

25: 2019/06/20(木) 14:15:24.088 ID:Hd1qc50+0
e=3-!(a-x)-!(b-y)-!(c-z);t=(a-y&&a-z)+(b-z&&b-x)+(c-x&&c-y);

これで-15文字だ

27: 2019/06/20(木) 14:18:36.734 ID:Hd1qc50+0
つーか>>25にするくらいなら、
e=(a==x)+(b==y)+(c==z);
でいいな、これでさらに-2

31: 2019/06/20(木) 14:24:09.151 ID:aOQIam04d
>>27
ふえ…おかしくなるよ…

初123で
456が0E 3B
312が0E 0B
189が1E 3B
になる

31: 2019/06/20(木) 14:24:09.151 ID:aOQIam04d
>>25
ふえ…おかしくなるよ…

初123で
456が0E 3B
312が0E 0B
189が1E 3B
になる

28: 2019/06/20(木) 14:19:16.595 ID:bYln5RQ60
問題の数値は乱数で取得しちゃだめなの?何かこだわりある?

32: 2019/06/20(木) 14:24:11.773 ID:Hd1qc50+0
>>28
「Aが入力する」って仕様を満たしてなくね?

30: 2019/06/20(木) 14:23:10.499 ID:Hd1qc50+0
forループの条件も&&の代わりに&を使って
i++<5&e<3
これでさらに-1

33: 2019/06/20(木) 14:25:07.855 ID:aOQIam04d
>>30
これはできた!

35: 2019/06/20(木) 14:28:47.801 ID:Hd1qc50+0
つーわけでこう

a,b,c,x,y,z,t,i;main(e){puts("A =>");scanf("",&a,&b,&c);puts("\nB")
;
for(;i++<5&e<3;){printf("回目入力 ",i);scanf(" ",&x,&y,&z);

e=(a==x)+(b==y)+(c==z);t=3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y);

e<3?printf(" EAT,BITE\n\n",x,y,z,e,t):puts("正解");}e<3&&puts("失敗");}

36: 2019/06/20(木) 14:31:04.514 ID:aOQIam04d
>>35
できた!!!めっちゃ削れた凄い

37: 2019/06/20(木) 14:35:47.224 ID:Hd1qc50+0
printfのところ、
printf(e<3?" EAT,BITE\n\n":"正解",x,y,z,e,t);
でよくね?

39: 2019/06/20(木) 14:37:25.588 ID:Hd1qc50+0
いや"正解\n"じゃないといかんか
それでも-5

40: 2019/06/20(木) 14:40:04.243 ID:nPaCnYZk0
printfの中で三項演算子使ったほうが短くならね?

42: 2019/06/20(木) 14:40:54.828 ID:Hd1qc50+0
つーかそもそもt要らねえ

a,b,c,x,y,z,i;main(e){puts("A =>");scanf("",&a,&b,&c);puts("\nB");
for(;i++<5&e<3;){printf("回目入力 ",i);scanf(" ",&x,&y,&z);e=(a==x)+(b==y)+(c==z);
printf(e<3?" EAT,BITE\n\n":"正解",x,y,z,e,3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y));}
e<3&&puts("失敗");}

44: 2019/06/20(木) 14:46:13.201 ID:bYln5RQ60
成否出力はfor中ではなく、for後にやっちゃえば?

46: 2019/06/20(木) 14:49:36.206 ID:Hd1qc50+0
puts("\nB")をforの中に入れてセミコロン1文字を削除

a,b,c,x,y,z,i;main(e){puts("A =>");scanf("",&a,&b,&c);
for(puts("\nB");i++<5&e<3;){printf("回目入力 ",i);scanf(" ",&x,&y,&z);
e=(a==x)+(b==y)+(c==z);printf(e<3?" EAT,BITE\n\n":"正解\n",x,y,z,e,3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y));}
e<3&&puts("失敗");}

47: 2019/06/20(木) 14:51:02.834 ID:aOQIam04d
オイオイどんどん短くなっていくんですけど

48: 2019/06/20(木) 14:52:13.879 ID:Hd1qc50+0
printfもforの中に入れちゃっていいよな(さらに-1)

a,b,c,x,y,z,i;main(e){puts("A =>");scanf("",&a,&b,&c);
for(puts("\nB");i++<5&e<3;printf(e<3?" EAT,BITE\n\n":"正解\n",x,y,z,e,3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y))){
printf("回目入力 ",i);scanf(" ",&x,&y,&z);e=(a==x)+(b==y)+(c==z);}
e<3&&puts("失敗");}

49: 2019/06/20(木) 14:56:54.194 ID:Hd1qc50+0
カンマ使えばforの中括弧要らなくね?

a,b,c,x,y,z,i;main(e){puts("A =>");scanf("",&a,&b,&c);
for(puts("\nB");i++<5&e<3;printf(e<3?" EAT,BITE\n\n":"正解\n",x,y,z,e,3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y)))
printf("回目入力 ",i),scanf(" ",&x,&y,&z),e=(a==x)+(b==y)+(c==z);
e<3&&puts("失敗");}

51: 2019/06/20(木) 15:02:21.584 ID:aOQIam04d
追いきれなくなってきた
>>49までキッチリ動いた

52: 2019/06/20(木) 15:12:35.752 ID:Hd1qc50+0
あとはなんかforの終了条件を上手く弄ると最後のputsを兼ねられそうな気もしたけど俺には無理だった
ではさらばだ

53: 2019/06/20(木) 15:14:14.407 ID:aOQIam04d
ありがとう
ID:Hd1qc50+0の功績が大きすぎる

54: 2019/06/20(木) 15:15:50.456 ID:C1VNy4oI0
見やすいやつで
今どんな感じ?

55: 2019/06/20(木) 15:17:49.124 ID:aOQIam04d
今はこんな感じ?



a ,b ,c ,x ,y ,z ,i ; 

main(e){
        scanf("" ,&a ,&b ,&c);

        for( puts("\nB") ; i++ < 5 & e < 3 ;
                printf( e < 3 ? "EAT,BITE\n\n":"正解\n" ,e ,3 -(a-y&&a-z)-(b-z&&b-
x)-(c-x&&c-y)))

                printf("回目 ",i),
                scanf(" ",&x,&y,&z),
                e = (a==x) + (b==y) + (c==z) ;

        e < 3 && puts("失敗");
}

57: 2019/06/20(木) 15:36:15.696 ID:Hd1qc50+0
>>55
puts("\nB");を省略することにしたんなら、代わりに最初のscanfをforの最初に入れればいいんだぜ

58: 2019/06/20(木) 15:39:12.654 ID:C1VNy4oI0
puts("失敗")をループ条件のとこのe<3の右にくっつけられそうな気はする
というか言語がわかってないけどC?

60: 2019/06/20(木) 15:46:43.015 ID:aOQIam04d
こうすればいいのか
また劇的に減った


a ,b ,c ,x ,y ,z ,i ; 

main(e){

        for( scanf("" ,&a ,&b ,&c) ; i++ < 5 & e < 3 ;
                printf( e < 3 ? "EAT,BITE\n\n":"正解\n" ,e ,3 -(a-y&&a-z)-(b-z&&b-
x)-(c-x&&c-y)))

                printf("回目 ",i),
                scanf(" ",&x,&y,&z),
                e = (a==x) + (b==y) + (c==z) ;

        e < 3 && puts("失敗");
}

61: 2019/06/20(木) 15:50:22.738 ID:nPaCnYZk0
whileで良くね?

63: 2019/06/20(木) 16:05:48.329 ID:aOQIam04d
>>61
わからん
どうすればいいんだ

62: 2019/06/20(木) 15:52:58.525 ID:FeNTMJxl0
回目のprintf文も削れるやん

正解じゃないときの後ろにくっつけちゃえよ

63: 2019/06/20(木) 16:05:48.329 ID:aOQIam04d
>>62
やってみたら最初にn回目が表示されなくなった

65: 2019/06/20(木) 17:01:18.429 ID:C1VNy4oI0
2文字減らせた?
a ,b ,c ,x ,y ,z ,i;

main(e){
for(scanf("" ,&a ,&b ,&c) ; i<5&e ; e = (a==x) + (b==y) + (c==z) - 3 , e && printf("EAT,BITE\n\n",e+3,3-(a-y&&a-z)-(b-z&&b-x)-(c-x&&c-y)))
printf("回目 ",++i),scanf(" ",&x,&y,&z);
puts(e?"失敗":"正解\n");
}

69: 2019/06/20(木) 17:30:41.879 ID:Hd1qc50+0
>>65
なるほど、eがargcだから必ず1以上であることを利用して、i=0の時にi<5&eが真になるようにしてるわけか

70: 2019/06/20(木) 17:39:56.914 ID:C1VNy4oI0
>>69
処理系依存かもしれないけどそう

66: 2019/06/20(木) 17:02:14.275 ID:C1VNy4oI0
aかbかcあたりをmainの引数にしたほうが良さげ