ヒットアンドブロウって、何行(1行1命令)でつくれる?
別に宿題でもなんでもないんだが…
ちなみに俺のコード。長すぎるんだよ。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 標準マクロ、関数定義ここから */
#define TRUE 1
#define FALSE 0
void randmize(void){
srand( time(NULL) );
}
/* 標準マクロ、関数定義ここまで */
void number_to_array(int source, int *array){
array[0] = source / 1000;
array[1] = source % 1000 / 100;
array[2] = source % 100 / 10;
array[3] = source % 10;
}
void create_question(int *array){
int i;
for (i=0;i<4;i++)
array[i]=rand()%10;
}
void input_answer(int *answer){
int n;
do{
printf("4桁の数字を入力(頭のゼロを省略しないように) > ");
scanf("%d",&n);
}while ( n >= 10000);
number_to_array(n, answer);
}
4 :
デフォルトの名無しさん:01/10/28 13:37
続き
void judge(int *computer, int *answer, int *hit, int *blow){
int i,j;
int hit_flag[4]={0,0,0,0};
*hit = 0;
*blow = 0;
for (i=0; i<4; i++)
if ( computer[i] == answer[i]){
(*hit)++;
hit_flag[i] = TRUE;
}
for (i=0; i<4-1; i++)
for (j=i+1; j<4; j++)
if ( (!hit_flag[i]) && (computer[i] == answer[j]) )
(*blow)++;
}
void play(void){
int computer[4], player[4], hit, blow;
create_question( computer );
do{
input_answer( player );
judge( computer, player, &hit, &blow );
printf("[%d]Hit [%d]Blow _ %d%d%d%d\n", hit, blow,computer[0],computer[1],computer[2],computer[3]);
}while ( hit != 4);
return;
}
void main()
{
randmize();
play();
}
7 :
デフォルトの名無しさん:01/10/28 23:11
age
いや、空でゲーム作れるやつには尊敬するよ>1
空白に対して
nbsp;
と半角で書くとインデントできるよ>1
↓例
voidnbsp;number_to_array(intnbsp;source,nbsp;intnbsp;*array){
nbsp;nbsp;nbsp;nbsp;array[0]nbsp;=nbsp;sourcenbsp;/nbsp;1000;
nbsp;nbsp;nbsp;nbsp;array[1]nbsp;=nbsp;sourcenbsp;%nbsp;1000nbsp;/nbsp;100;
nbsp;nbsp;nbsp;nbsp;array[2]nbsp;=nbsp;sourcenbsp;%nbsp;100nbsp;/nbsp;10;
nbsp;nbsp;nbsp;nbsp;array[3]nbsp;=nbsp;sourcenbsp;%nbsp;10;
}nbsp;
あり?
&nbsp;
だった。
void number_to_array(int source, int *array){
array[0] = source / 1000;
array[1] = source % 1000 / 100;
array[2] = source % 100 / 10;
array[3] = source % 10;
}
12 :
デフォルトの名無しさん:01/10/28 23:32
>>9 かちゅーしゃで見たとき死ねるんだよなー
全角スペースでいいじゃん。
一応動作報告。
TurboC++1.01でそのまま動いたよ
tcc handb.c
15 :
デフォルトの名無しさん:01/10/29 00:47
7行プログラムはエレガントでもなんでもないじゃん。
単にトリッキーなコードで短かくしてるだけじゃん。
17 :
デフォルトの名無しさん:01/10/29 10:49
あげ
ヒットアンドブロウってなに?
19 :
デフォルトの名無しさん:01/11/03 23:58
昔のCのソース引っ張り出してきて眺めたら綺麗だった。
OOPLは駄目だな。
20 :
デフォルトの名無しさん:01/11/04 00:18
>>18 >>18 数当てゲーム。
4桁以上の数字をヒントを参考にして何回めかで当てる。
掛け金でも無いと、ちっともおもしろくないが。
4桁の場合、
最初はなにも掲示されず、参加者は適当な数字を4つ選ぶ。
この時点で当てられる事は無いに等しいから、高額商品が並ぶ。
2回目。最初に選んだ数字に対して、どれだけ近いのか、
ヒントをもらえる。
例えば、正解が1234にたいして、参加者が出した解答が0132
だとすると、×△○△となる。
・×はどの桁にも含まれない数。
・△はどれかの桁に含まれる数。
・○は正解。桁と数が一致している。
という意味。
これをすべて○になるか、一定回数繰り返す。
>>20 それなんか違うゲームじゃ。
1234に対して0132なら1hit 2blow。
hit=数字も場所もあっているものの数
blow=数字はあっているが場所が違うものの数
また、数字は重複しては使われないという条件もつく。
とりあえずCで「命令」という言葉を使わないでクレ
なんかキショい
いえ。重複も可能にしてあります。
0045 に対して…
1034 ならば 1 hit 1 blow
0102 ならば 1 hit 2 blow というように。
>>23 hit と blowは同じ値を共有することがあるってこと?
>>23の例だと
0045に対して0102は
最上位のの0がhitで、どっちも0が2こあるから2blow
ってこと?
・・・仕様がはっきりしなけりゃプログラムできん。
0123に対して0000は1hit3blow?
好きなように作ればいいじゃん
ごめん間違えた。
>>23 0045 に対しての 0102 は、一番左の 0 が 1hit, もう一つの 0 が 1blow で、1hit 1blow です。
0123 に対しての 0000 は 1 hit 0 blow.
0103に対しての0010は1hit1blow?
29 :
デフォルトの名無しさん:01/11/04 14:03
0103 に対しての
0010 は 1 hit 2 blow です。何故か?
まず、一番左の 0 に対してヒット。
すると、ヒットを除外すると以下のようになる。
*103 に対しての
*010 は 2 blow です。
1 で 1 blow,
0 で 1 blow.
故に、1HIT 2BLOW
30 :
デフォルトの名無しさん:01/11/04 14:26
おにぎり探偵団?とかいうこんな感じのあったな
コードブレーカー?
Hit and Blowねえ...
エレガントも何も、工夫の余地が無い気がするが。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int digit(int n, int number)
{
while (n-- > 0)
number /= 10;
return number % 10;
}
int main()
{
int q, a, hit, blow, i, j;
srand(time(NULL));
q = rand() % 10000;
do {
do {
printf("input 4 digits: ");
fflush(stdout);
scanf("%d", &a);
} while (a < 0 || a > 9999);
for (i = 0, hit = blow = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (digit(i, q) == digit(j, a))
if (i == j)
hit++;
else
blow++;
printf("%d hits, %d blow.\n", hit, blow);
} while (hit < 4);
return 0;
}
とか言いつつ間違えてやんの>俺
これで完璧。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void number_to_array(int source, int *array)
{
int i;
for (i = 0; i < 4; i++) {
array[i] = source % 10;
source /= 10;
}
}
int main()
{
int q, a, hit, blow, i, j;
int qs[5], as[5];
srand(time(NULL));
q = rand() % 10000;
q = 103;
number_to_array(q, qs);
do {
do {
printf("input 4 digits: ");
fflush(stdout);
scanf("%d", &a);
} while (a < 0 || a > 9999);
number_to_array(a, as);
for (i = 0, hit = blow = 0; i < 4; i++)
if (qs[i] == as[i]) {
hit++;
as[i] = -1;
} else
for (j = 0; j < 4; j++)
if (qs[i] == as[j]) {
blow++;
as[j] = -1;
break;
}
printf("%d hits, %d blow.\n", hit, blow);
} while (hit < 4);
return 0;
}
じゃ、次。
Hit and Blowを解くプログラム作ろうぜ。
平均してもっとも短い手順で解けたやつが勝ち。
ただし、「最初は0123、次は4567」なんていう定石をプログラミング
するのは無し。毎回同じアルゴリズムで答を返すこと。
関数の仕様:
struct result { int ans; int hits; int blows };
int solve(int n, struct result history[]);
呼び出すと、n回目の答(n = 0, 1, 2, ...)を整数で返す。
(0012なら10進数の12を返す。)history[]には、n-1回目
までに自分が返した答と、それに対する反応(hitとblowの数)
が入っている。
35 :
デフォルトの名無しさん:01/11/16 23:09
プログラムのコード自体ががCという形になっているコードがあったと思ったが。
至高の芸術作品。でもURL忘れた。
知っている人教えて。
36 :
デフォルトの名無しさん:01/11/16 23:17
>>34 1回質問するにあたっての時間制限とかはつけなくていい?
37 :
デフォルトの名無しさん:01/11/16 23:30
#include<stdio.h>
int main(void){
printf("象");
return 0;
}
エレファントなプログラムです。
ブロウジョブなら詳しいですが、何か?
39 :
デフォルトの名無しさん:01/11/17 01:03
40 :
デフォルトの名無しさん:01/11/17 07:27
41 :
デフォルトの名無しさん: