• ベストアンサー

プログラミングについて

4個の異なる一桁の数字からなる順列を乱数で生成し、 ターミナルで4個の数字の順列を入力すると、 生成した順列と入力した順列を比較し、 数とその位置があっている場合は「ヒット」 数は合っているがその位置が違う場合は「ブロー」とし、 そのヒット数とブロー数を表示するプログラムを教えてください。 実行するとこんな感じになると思います、 (生成した順列3569) Number?:0123 Hits:0,Blows:1 Number?:0124 Hits:0,Blows:0 Number?:3567 Hits:3,Blows:0 Number?:3569 Hits:4,Blows:0 Trials:4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void Init(int *cpu) { int seed[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,}; int temp, i, j; srand((unsigned)time(NULL)); for(i = 9; i > 0; i --){ j = rand() % (i + 1); temp = seed[i]; seed[i] = seed[j]; seed[j] = temp; } memcpy(cpu, seed, sizeof(int) * 4); return; } int Input(int *player) { char buff[64]; printf("\nNumber?:"); fgets(buff, 64, stdin); if(sscanf(buff, "%d %d %d %d", player, player + 1, player + 2, player + 3) != 4){ return 0; } return 1; } int Compare(int *cpu, int *player, int *hit, int *blow) { int i, j; *hit = 0; *blow = 0; for(i = 0; i < 4; i ++){ *hit += (player[i] == cpu[i]); for(j = 0; j < 4; j ++){ *blow += (player[i] == cpu[j]); } } *blow -= *hit; return *hit != 4; } void Result(int *cpu, int count) { int i; puts("\nCongratulation!"); for(i = 0; i < 4; i ++) printf("%d ", cpu[i]); printf("\nCount:%d\n", count); return; } int main(void) { int cpu[4], player[4], hit, blow, count, flag; Init(cpu); count = 0; do{ if(!Input(player)){ puts("Input Error"); continue; } flag = Compare(cpu, player, &hit, &blow); printf("Hits:%d Blows:%d\n", hit, blow); count ++; }while(flag); Result(cpu, count); return 0; }  

その他の回答 (3)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.3

まず質問者のソースコンパイル通りませんよ randomではなくrandです。(srandomも同様) for (hit=0;hit < 4;hit++); あとこのループ意味ないです。わざわざ無駄に4回まわしてます。 それで、とりあえずその辺修正して、コンパイルできる状態にして下さい。 Hitだけならこれでもいいんじゃないですか? ループ入れれば綺麗になりますが、まず自分でHitだけでも 作ってみればいかがでしょう。 ソースを見る限りそれぐらいはできそうなんですが・・・ というか,Blowsもそれができたらできるとおもうんですけど。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

Perl #!/usr/bin/perl # ランダム文字決定 $num = int(rand(9))+1; $num .= int(rand(9))+1; $num .= int(rand(9))+1; $num .= int(rand(9))+1; print "(生成した順列 $num )\n"; (@num) = split("",$num); $i = 1; while () { $hit = 0; $blow = 0; print "Number?"; $_ = <>; (@num1) = split("",$_); if ($num[0] == $num1[0]) { $hit++; $num1[0] = 'a'; } if ($num[1] == $num1[1]) { $hit++; $num1[1] = 'a'; } if ($num[2] == $num1[2]) { $hit++; $num1[2] = 'a'; } if ($num[3] == $num1[3]) { $hit++; $num1[3] = 'a'; } print "Hits:$hit" .','; foreach $n (@num) { foreach $n1 (@num1) { if ($n == $n1) { $n1 = 'a'; $blow++; last; } } } print "Blwes:$blow\n"; if ($hit == 4) { print "Trials:$i\n"; last; } $i++; }

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

どのプログラミング言語を使用するかも書かず、丸投げ状態の質問では誰も回答してくれません。 自分はここまでやったけど、エラーになったまたは、思った結果と違いました。のような形式に変更しましょう。

blackandfly
質問者

補足

言葉足らずでした、申し訳ありません。 アルゴリズムです。 ここまでやりましたが、行き詰まりました。 宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int x[4],y[4],n0,n1,n2,n3,hit; srandom((unsigned) time(0)); x[0] = random()%10; x[1] = random()%10; x[2] = random()%10; x[3] = random()%10; for (hit=0,hit < 4,hit++); printf("Number?:\n"); scanf("%d,%d,%d,%d",&n0,&n1,&n2,&n3); y[0] = n0; y[1] = n1; y[2] = n2; y[3] = n3; if(x[0] == y[0]){ hit++; } if (x[1] == y[1]) { hit++; } if (x[2] == y[2]) { hit++; } if (x[3] == y[3]) { hit++; } printf("Hits:%d\n",hit); if (hit == 4) { printf("Trials:\n"); }

関連するQ&A