[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/09 21:47 / Filesize : 118 KB / Number-of Response : 352
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C,C++】 ちょっと問題解いて行け 【勉強】



1 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:16:00 ]
他人のソースを読むことは非常に勉強になります。
と言うわけで、初心者〜プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。
問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。

解答ソースを貼る人用テンプレ
【C言語歴】 (例)4年
【レベル】 (例)初心者、プロ、学校で習った程度 など
【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など
【コメント】 (例)みっくみくにしてやんよ。など、有れば

長すぎるソースはこちらへ
ttp://codepad.org/

宿題は C/C++の宿題片付けます 130代目へ
pc12.2ch.net/test/read.cgi/tech/1250204272/
相談は C言語なら俺に聞け(入門篇)Part54などへ
pc12.2ch.net/test/read.cgi/tech/1254829314/

82 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 15:50:26 ]
[1] 授業単元:
[2] 問題文(含コード&リンク):

一次方程式y=a*x+bにおいて、A[x1,y1]とB[x2,y2]が与えられた時、
方程式の係数a,bを求めよ。
x1 y1: 450 454.4
x2 y2: 452 454.8
y=0.2*x+364.4

[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (Visual C++)
 [3.3] 言語: (C++/CLI C/Win32API C++/MFC いづれか)
[4] 期限: ( なし )
[5] その他の制限: ( GUIまたはgetc()で終わること)

83 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:41:01 ]
>>82
宿題はスレ違い

84 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 08:23:12 ]
#include <malloc.h>
#define MAXSIZE 20
typedef double WORD;
main(){
WORD (*b)[100];
WORD *a[2];
int i=1,j=1;

b = malloc(sizeof(WORD)*MAXSIZE*2);
a[0] = malloc(sizeof(WORD)*MAXSIZE);
a[1] = malloc(sizeof(WORD)*MAXSIZE);

b[i][j] = 0;
a[i][j] = 0;
/* [と]を使わない方法は?*/
b[i][j] = 0;
a[i][j] = 0;
}

85 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 17:47:41 ]
>>84
b??(i??)??(j??) = 0;
a??(i??)??(j??) = 0;

86 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 19:14:14 ]
b<:i:><:j:> = 0;
a<:i:><:j:> = 0;

87 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 03:08:44 ]
>>86
すげー、ほんとにコンパイル通る。
それなんて名前なの?記号だけなのでググりようがない。

88 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:31:16 ]
memset() すりゃいいんでないの?w


89 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 09:47:49 ]
0で初期化したいんならcalloc()でいいだろw

*(*(b + i) + j) = 0;
*(*(a + i) + j) = 0;

90 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:52:47 ]
>>87
ダイグラフ



91 名前:84 mailto:sage [2010/03/04(木) 23:36:37 ]
>>89
WORD (*b)[2]; // まちがえた

92 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:46:41 ]
>>90
とんくす
日本語じゃ情報少ないのな。英語だとWikipediaにのってるが

93 名前:84 mailto:sage [2010/03/07(日) 08:18:53 ]
Trigraph
× トリグラフ
○ トライグラフ
dic.yahoo.co.jp/dsearch?p=trigraph&dtype=1

94 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 09:38:47 ]
コンパイラ名とバージョン: (Visual C++)

作業用フォルダの所は空白、ソースと同じフォルダにショートカットは有ります。
ショートカット「Visual Studio 2005」
から cl xxx.cpp するのが面倒な場合はどのようにするのでしょうか。
PATHをずらっと並べるのは無しで.batのみで可能でしょうか?

95 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 01:04:08 ]
>>94
まず、ここは質問スレじゃない。
さらに、それはC/C++の問題ではない。

96 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 10:09:52 ]
C#, C♯, C#相談室 Part55
>>95 返信サンキュこちらで聞いてきます。

97 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 21:58:00 ]
>>2
【C++言語歴】 15時間
【レベル】 超ド素人
【コンセプト】 えっ・・と・・・
【コメント】 参照?ポインタ?構造体?クラス?イミフ

#include <iostream>
using namespace std;

int main() {
double a, b, c, d, e, sum;

cout << "5つの数の合計と平均値を出力します。" << endl;
cin >> a >> b >> c >> d >> e;

sum = a + b + c + d + e;

cout << "合計は" << sum << "で、平均は" << sum/5 << "です。" << endl;
}

98 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 08:36:40 ]
>>2
【レベル】 プロ
#include <iostream>
using namespace std;
struct Average {
  int count;
  double total;
  Average() : count(0), total(0.0) {}
};
int main(){
  Average a;
  double data;

  for(int i=0; i<5; i++){
    cout << "Input Number:";
    cin >> data;
    a.total += data;
    a.count++;
  }
  cout << "total=" << a.total << endl;
  cout << "average=" << a.total/a.count << endl;
}

99 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:21:22 ]
次の問題は>>100

100 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 10:53:12 ]
【問題】
点A、点B、点Cがあり、点Aと点C、点Cと点Bがそれぞれ線分ac、線分bcで結ばれている。
点A、点Bの座標(Pa(xa, ya), Pb(xb, yb))と線分の長さ(Lac, Lbc)が与えられたとき、点Cの座標を求めよ。
但し、解は一つとは限らない。
また、与えられた座標または長さが不適切で求められない場合はそれと判るようにすること。
# 作図的には点A、点Bからそれぞれ半径Lac、Lbcの円を書いて交点を求めればいいが……



101 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 15:59:04 ]
もっとゆとりでも解けるような問題が欲しいよ

102 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:14:25 ]
ユークリッド平面でいいの?

103 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:41:57 ]
>>101
それじゃ、次の制約でどうぞ。
・ya == yb, Lac == Lbc

>>102
非ユークリッド平面だと私自身がついていけないからパスw

104 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:45:45 ]
要は三角不等式と2円の交点でしょ?

105 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 18:16:54 ]
2つの球の交線(円)かもしれん

106 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 01:39:29 ]
これってA点を (0,0) に移動して
計算するとわりと簡単?


107 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 14:41:15 ]
いや計算量は変わらん

むしろ座標系を回転して >>103 が正解(ry

108 名前:デフォルトの名無しさん [2010/04/13(火) 22:08:11 ]
>>26のさ

for(i=0; i<MAX_NUM; i++){
// printf("何かの数:");
if(scanf("%lf", &data ) != 1) break;  ←この文
// printf("%g\n", data);
sum += data;
}

ifの中身がよくわからんないんだけどどうなってんの?

109 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:10:05 ]
>>108
if(!(scanf("%lf", &data))) break;

if(!(scanf("%lf", &data))!=0) break;
と変形した後に
if(scanf("%lf", &data)==0) break;
と変形するのが正しい
※論理否定は必ず否定が掛かっている方の真偽を逆にする
と言っても、cinの定義なんか覚えてないから
単純に戻り値をscanf()に置き換えて良いかは知らんので
そこら変は他の人にまかせる

110 名前:109 mailto:sage [2010/04/14(水) 00:15:40 ]
※論理否定は必ず否定が掛かっている方の真偽を逆にする
って書いたけど、何か違うな…
正確には、偽で比較するって言うか、真で比較しては駄目っての言うのが正しいのか?




111 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:20:39 ]
そもそも>>108が分からないのがifの何なのかが俺には分からない。

112 名前:デフォルトの名無しさん [2010/04/14(水) 00:27:56 ]
>>109-110
ごめんよくわかんない

>>111
if文の()の中身の
scanf("%lf", &data ) != 1
ってどういうこと?って意味

113 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:46:00 ]
>>112
scanfの戻り値が1でない場合真

int scanf(const char* format, ...);
scanfの戻り値は"formatで指定された型に従って代入に成功した要素数"

scanf("%lf", &data )
↑でdataに代入成功すれば1が返る 失敗すれば多分0(scanfなんて使わないから分からない)

114 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:57:19 ]
>>112
今回の要素数は1個なので>>118のように変形しても大丈夫だが
2以上の数値が変える場合、変形には気をつけないとね

NG例
!(2) != 0
両辺に論理否定をかけて
!(!(2)) != !(0)
左辺の二回の論理否定を打ち消すと
2 != !(1)
さらに変形すると
2 != 1
真になってしまう

OK例
!(2) != 0
両辺に論理否定をかけて
!(!(2)) != !(0)
変形すると
!(0) != 1
さらに変形すると
1 != 1
よって偽になる(これが正解)

115 名前:114 mailto:sage [2010/04/14(水) 01:00:30 ]
>>118に期待しよう…orz
まあ、こんな感じで、ミスを避けるために、
数値の真偽を問う場合は、必ずfalse(0)と比較するってのが良く使われる。

116 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 01:17:26 ]
>>100
答えの数までは簡単に出せるが、その先が思いつかん…
何か、結構単純な解き方になる気もするのだが…

Lab = sqrt( fabs( pow( xa - xb, 2.0 ) + pow( ya - yb, 2.0 ) ) )
ans = 0;
if( ( Lac + Lbc == Lab ) || ( Lab == fabs( Lac - Lbc ) ) ) ans = 1;
if( ( Lac + Lbc < Lab ) && ( Lab < fabs( Lac - Lbc ) ) ) ans = 2;


117 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:11:52 ]
Cが2コ存在する場合要するに三角形が出来る場合
正解かどうかも分からんし考えながら起こしたのでもの凄い汚い点に注意。

double Len_AB, Len_AC, Len_BC;
double Pnt_XA, Pnt_XB, Pnt_XC1, Pnt_XC2, Pnt_YA, Pnt_YB, Pnt_YC1, Pnt_YC2;
double angle;
double Pnt_XB1, Pnt_YB1;

/*
入力部分は面倒なんで省略
値が入力されるのはLen_AC, Len_BC, Pnt_XA, Pnt_YA, Pnt_XB, Pnt_YB

Aを(0,0)に移動するとBの座標が変化する
Bの新座標は元の座標からAの座標を引けば良いので
*/
Pnt_XB1 = Pnt_XB - Pnt_XA;
Pnt_YB1 = Pnt_YB - Pnt_YA;

/*
(0,0)に移動後のAを中心にBを回転させ、Bの座標を(0,X)にする
回転させる角度は正接から出せる(tanX=Pnt_YB1/Pnt_XB1)
ついでにABの長さ(Len_AB)も出しておく
*/
angle = atan(Pnt_YB1/Pnt_XB1);
Len_AB = sqrt(pow(Pnt_XB1, 2) + pow(Pnt_YB1, 2));

/*
回転後のBのX座標は長さそのもの
*/
Pnt_XB1 = Len_AB;


118 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:15:16 ]
つ*づ*き
sqrt,pow,sin,cos,atan等使ったこと無いので何か使い方間違ってるかも

/*
Cの座標を(a,b)と仮定すると、三平方の定理から
a^2 + b^2 = Len_AC^2
また、CからX軸に垂線を下ろして、交差したところをpとすると、
pの座標は(a,0)になり、更に
(Len_AB - a)^2 + b^2 = Len_BC^2
になるので、この連立式を解く

a^2 + b^2 = Len_AC^2
Len_AB^2 - ( 2 * Len_AB * a ) + a^2 + b^2 = Len_BC^2

上の式から下の式を引くと

-Len_AB^2 + ( 2 * Len_AB * a ) = Len_AC^2 - Len_BC^2
2 * Len_AC * a = Len_AC^2 - Len_BC^2 + Len_AB^2
a = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC

となる
*/
Pnt_XC = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC;

/*
CのX座標が分かったので、後は三平方の定理からCのY座標を出せる
Len_AB^2 = Pnt_XC^2 + Pnt_YC^2
*/
Pnt_YC1 = sqrt(pow(Len_AB, 2) - pow(Pnt_XC, 2));



119 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:17:42 ]
お*わ*り
数学なんざやるの久々だから正しい保証はない

/*
CのY座標は負値もある
*/
Pnt_YC2 = Pnt_YC1 * -1;

/*
CのXY座標が分かったので、回転させて戻す
*/
Pnt_YC1 = Len_AB * sin(angle) + Len_BC * cos(angle) + Pnt_YA;
Pnt_XC1 = Len_AB * cos(angle) - Len_BC * sin(angle) + Pnt_XA;
Pnt_YC2 = Len_AB * sin(angle) - Len_BC * cos(angle) + Pnt_YA;
Pnt_XC2 = Len_AB * cos(angle) + Len_BC * sin(angle) + Pnt_XA;


120 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:00:40 ]
cからabを通る直線上に垂線を下ろしたときの交点をdとすると垂線の長さhの2乗は
h*h = Lac*Lac - Xd*(Xd + 2*Xa) - Xa*Xa - Yd*(Yd + 2*Ya) - Ya*Ya
かつ
h*h = Lbc*Lbc - Xd*(Xd + 2*Xb) - Xb*Xb - Yd*(Yd + 2*Yb) - Yb*Yb

ここでXn = Xa - Xb、Yn = Ya - Ybとすると
a,b,dは同じ直線上にあるので、あるkに対して
Xd = Xa + k*Xn、Yd = Ya + k*Xn
が成立する

以上から変数k以外しか含まない2次方程式ができるから、解いたらkが求まる。
(kが求まらないときは三角形になっていない)
kがわかれば、dの位置が確定するから、adとcdが直角(=内積が0)、bdとcdが直角
で連立して解けばいいじゃないって… どこがプログラミングの問題だよw




121 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:02:15 ]
>>120 訂正
×Yd = Ya + k*Xn ○Yd = Ya + k*Yn

122 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:09:26 ]
あ、内積じゃなくて高さ求めるのかw ごめん。
でadと直角な単位ベクトルにhと-hをかけて二つ答えだしておしまいだ。

123 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:23:40 ]
>>113-114
サンクス
数字だと1をかえしてそれ以外だと0かえして
ブレイクしてやんお!
ってことだよねと、わかったかんじだ

124 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 23:48:04 ]
>>103の条件(ya == ybのみでも可)であれば、三角形ABCの三辺の長さから
ヘロンの公式で面積Sを求めて、底辺を辺Labとする高さh(座標yc)を求め
その高さと、辺Lac、辺Lbcのどちらかと、三平方の定理で座標yxcを求めて終わり
ただ>>100の条件では、やっぱり分からんわ…

double Lab, Lac, Lbc, xa, ya, xb, yb, xc, yc1, yc2, s, S, h, w;
// xa = xxx, ya = xxx, xb = xxx, yb = xxx, Lac = xxx, Lbc = xxx;
// → 解が2点となるような点であること
Lab = fabs( xa - xb );
// ヘロンの公式から三角形ABCの面積Sを求める
s = ( Lab + Lac + Lbc ) / 2;
S = sqrt( s * ( s - Lab ) * ( s - Lac ) * ( s - Lbc ) );
// → Sの計算でエラーが発生した場合解なし
//  → 解が一つの場合の処理も省略しているので、解無しの処理も省略
// 面積Sから辺Labを底辺とした三角形の高さhを求める
h = S / Lab * 2;
// 三角形ABCの高さhから、座標 yc1, yc2 を求める
yc1 = ya + h;
yc2 = ya - h;
// 三角形ABCの頂点Cから垂直に降ろした点をOとする(線分COは高さhに等しい)
// 三角形ACOの垂辺CO(高さh)と斜辺Lacから底辺AOの長さwを求める
w = sqrt( pow( Lac, 2.0 ) - pow( h, 2.0 ) );
// 三角形ACOの底辺AOの長さwから座標xcを求める
// → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w;



125 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 23:53:11 ]
プログラマは数学出来ない人多いんだなと驚いた

126 名前:124 mailto:sage [2010/04/16(金) 00:04:59 ]
> // → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
> xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w;
最後間違えてるな…

// → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
xc = xa + ( xa > xb ? 1 : - 1 ) * ( pow( Lac, 2.0 ) < ( pow( Lab, 2.0 ) + pow( h, 2.0 ) ) ? 1 : -1 ) * w;


127 名前:デフォルトの名無しさん [2010/04/24(土) 01:34:54 ]
100の出題者はそろそろ解答書くべきじゃないの。
それに問題複数あった方がつまらない問題無視できるからいいと思う。

128 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 01:38:20 ]
【問題1:時計】
現在時刻をアスキーアートで表示せよ

【表示例】
●●○○○●○○○○○○●○●○○●●
○○●○●○●○○●○○●○●○●○○
○●●○●○●○○○○○●●●○●●●
●○○○●○●○○●○○○○●○●○●
●●●○○●○○○○○○○○●○●●●

【難易度】
40分で初級


129 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 01:44:05 ]
適当に作ったので面白いかどうかはしらないけれど
こんな感じの問題名、解答時間、難易度つきテンプレ希望

130 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:17:18 ]
できたが、俺にはAA作りの才能がないことが分かったのと、codepadじゃ時間取得系関数動かねぇ。
codepad.org/E9sGRiit

ローカルでの実行結果。
○●○○●●●○○○○○○●○○○●●
●○●○●○●○○●○○●●○○●○○
●○●○●●●○○○○○○●○○●●●
●○●○○○●○○●○○○●○○●○●
○●○○●●○○○○○○●●●○●●●



131 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:37:15 ]
>>129
所要時間: 25分
感想: 文字盤を作るのが面倒…orz
問題の品質: △(文字盤を作るのがメインになってしまうので…)

#include <stdio.h>
#include <time.h>
#define artrow 5
#define artcol 7
int main() {
int i, j, idx[artrow]; time_t timer; struct tm *t_st;
char art[][artrow][artcol] = {
{ "○●○", "●○●", "●○●", "●○●", "○●○", },
{ "○○●", "○○●", "○○●", "○○●", "○○●", },
{ "●●○", "○○●", "○●●", "●○○", "●●●", },
{ "●●○", "○○●", "●●○", "○○●", "●●○", },
{ "●○●", "●○●", "●●●", "○○●", "○○●", },
{ "●●●", "●○○", "●●●", "○○●", "●●○", },
{ "○●●", "●○○", "●●●", "●○●", "●●●", },
{ "●●●", "○○●", "○○●", "○●○", "●○○", },
{ "●●●", "●○●", "●●●", "●○●", "●●●", },
{ "●●●", "●○●", "●●●", "○○●", "●●○", },
{ "○○○", "○●○", "○○○", "○●○", "○○○", },
};
time(&timer); t_st = localtime(&timer);
idx[0] = t_st->tm_hour / 10; idx[1] = t_st->tm_hour % 10; idx[2] = 10;
idx[3] = t_st->tm_min /10 ; idx[4] = t_st->tm_min % 10;
for( i=0; i<artrow; i++ ) for( j=0; j<5; j++ )
printf( "%s%s", art[idx[j]][i], j == 4 ? "\n" : "○" );
return 0;
}


132 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:46:00 ]
○があると読みにくいので
スペースに置き換えてください
ずれないように注意出来たら二段

133 名前:130 mailto:sage [2010/04/24(土) 10:10:14 ]
うげぇ、配列サイズ足りてねぇorz

134 名前:131 mailto:sage [2010/04/24(土) 11:20:02 ]
変数名等、全体の見通しを良くして、さらにAAを>>130から借用。

#include <stdio.h>
#include <time.h>
#define FIELD_ROW_SIZE 5
#define FIELD_COL_SIZE 5
#define ART_KIND_COUNT 11
#define COLON_IDX 10
int main() {
int row, idx, cols[FIELD_COL_SIZE];
time_t timer;
struct tm *t_st;
char *art_ptr[FIELD_ROW_SIZE][ART_KIND_COUNT] = {
{ "○●○", "○●○", "●●○", "●●○", "●○●", "●●●", "○●●", "●●●", "●●●", "●●●", "○○○" },
{ "●○●", "●●○", "○○●", "○○●", "●○●", "●○○", "●○○", "●○●", "●○●", "●○●", "○●○" },
{ "●○●", "○●○", "○●●", "●●○", "●●●", "●●○", "●●●", "○○●", "○●○", "●●●", "○○○" },
{ "●○●", "○●○", "●○○", "○○●", "○○●", "○○●", "●○●", "○○●", "●○●", "○○●", "○●○" },
{ "○●○", "●●●", "●●●", "●●○", "○○●", "●●○", "●●●", "○○●", "●●●", "●●○", "○○○" },
}, *field_sep[FIELD_COL_SIZE] = { "○", "○", "○", "○", "\n"} ;
time(&timer);
t_st = localtime(&timer);
cols[0] = t_st->tm_hour / 10;
cols[1] = t_st->tm_hour % 10;
cols[2] = COLON_IDX;
cols[3] = t_st->tm_min / 10;
cols[4] = t_st->tm_min % 10;
for( row=0; row<FIELD_ROW_SIZE; row++ ) for( idx=0; idx<FIELD_COL_SIZE; idx++ )
printf( "%s%s", art_ptr[row][cols[idx]], field_sep[idx] );
return 0;
}

135 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 13:58:53 ]
// UTF-8 SJIS EUC 対応してたらちょっと時間掛かった
#include <stdio.h>
#include <time.h>
#define COLON_IDX 10
#define DOT "●"
char *cout(char *b, unsigned int s, int n, int r){
  unsigned short art[] = { 0x56d4, 0xe934, 0xe746, 0x71c6, 0x93da, 0x719e, 0xf79c, 0x925e, 0xf55e, 0x73de, 0x0820 };
  unsigned short i, j, c, d;
  --s;
  for(i = 0, c = art[n]; i < r; ++i) c >>= 3;
  for(i = 0; i < 3 * s; i += s)
    for(j = 0, d = (c >>= 1); j < s; ++j)
      b[i + j] = d & 1 ? "●"[j] : "○"[j];
  b[i] = 0;
  return b;
}
int main(int ac, char **av){
  time_t timer;
  struct tm *t;
  char b[sizeof(DOT) * 3];
  int i;
  time(&timer);
  t = localtime(&timer);
  for(i = 0; i < 5; ++i){
    printf("%s○", cout(b, sizeof(DOT), t->tm_hour / 10, i));
    printf("%s○", cout(b, sizeof(DOT), t->tm_hour % 10, i));
    printf("%s○", cout(b, sizeof(DOT), COLON_IDX, i));
    printf("%s○", cout(b, sizeof(DOT), t->tm_min / 10, i));
    printf("%s\n", cout(b, sizeof(DOT), t->tm_min % 10, i));
  }
  return 0;
}

136 名前:デフォルトの名無しさん [2010/04/24(土) 14:12:24 ]
www2.ezbbs.net/24/techside/img/1266584278_1.jpg

このパズルを解くプログラム

137 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:19:04 ]
>>136
すまんがシラミツブシは興味ないんよ
それより論理的にさ
ここに1を置いたら絶対全部の合計は等しく出来ないから
1はこっちかこっちにしか置けない
っていう風に考えたい訳


138 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 16:38:16 ]
>>136程度だと総当たりでも十分速いだろなぁ。
それ書くくらいならナンプレの答え探すプログラムの方がいいんじゃね?

139 名前:デフォルトの名無しさん [2010/04/24(土) 18:04:37 ]
>>136がわからない
なにこれどうすんの?

140 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:33:55 ]
総和が5の倍数であることを利用するとあまる数字の組み合わせを何個かに限定できるかな



141 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:49:23 ]
1~10の総和は55
和がすべて等しいので
和の値は55/5=11
4個の和で11になる組み合わせを選ぶ



142 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:59:23 ]
え?

143 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:04:15 ]
>>141
それで解けたら1億やるよw

144 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:09:01 ]
>>141でやるとかむずいな

145 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:10:17 ]
むずいとかじゃなくて、解がない

146 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:18:42 ]
4個の和が11じゃねーだろw
全ての位置は2回数えられるから2倍にして4個の和が22になる組み合わせを選ぶ。

まあ、それでも解はないんだけどねw

147 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:22:28 ]
>>136
7-11いい気分

148 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:26:21 ]
>>147
プログラムお願いします

149 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:27:16 ]
宿題スレのでも見とけ

150 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:55:56 ]
数学の問題にも著作権はあるんだからパクリはいくない



151 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:22:00 ]
問題
ジョーカーを除いたトランプ1組(52枚)で下記のルールで神経衰弱を行った場合、
最大何手必要なのかを求めるプログラム。
※但しコンピュータは最善の手を実行するものとする。

1. 52枚を適当にシャッフルしカードを伏せる(ことにする)
2. カードを2枚めくる(この行為を1手と数える)
2-1. 同じ数字であれば表にする(ことにする)
2-2. 異なる数字であれば、それらの数字を覚えて裏に戻す(ことにする)
3. 全てのカードが表になった(ことになった)ら終了


152 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:51:13 ]
>>151
それも数学の問題。プログラミングできないなら無理に出題しないでいいよ。
答えは全てのカードを覚えるのにかかる回数26回と
全てのカードを取るのにかかる回数26回の合わせて52回。

153 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:02:36 ]
>>152
不正解
覚えるのは25回で十分

154 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:16:41 ]
いや26回だ

155 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:21:08 ]
>>154
指摘してやってるのに分からんいなんてアホなのか?
25回覚えて、取り始めは、残った2枚のうちの1枚から始めれば良い。
(1枚取った時点で全てのカードが把握できる)

156 名前:152 mailto:sage [2010/04/25(日) 00:31:34 ]
>>155
言われみればそうだね。でも154はおれじゃねえ。

157 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:44:56 ]
いや合わせて50回だ

158 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:50:12 ]
そうだorz

159 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:51:41 ]
>>157
>いや合わせて50回だ
何を合わせるんだ?

160 名前:157 mailto:sage [2010/04/25(日) 01:23:37 ]
最大40手 50回は間違い



161 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 01:24:10 ]
最大52回

162 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 01:32:21 ]
↓の26回を2回繰り返す
A-2 3-4 5-6 7-8 9-10 J-Q K-A
A-A 2-3 2-2 3-3 4-5 4-4 5-5 6-7 6-6 7-7
8-9 8-8 9-9 10-J 10-10 J-J Q-K Q-Q K-K

163 名前:157 mailto:sage [2010/04/25(日) 02:07:42 ]
A_1-A_2 A_3-A_4 A_5-A_6 A_7-A_8 A_9-A10 A11-A12 A13-B_1
C_1-D_1 B_2-B_3 C_2-D_2 C_3-D_3 B_4-B_5 C_4-D_4 C_5-D_5 B_6-B_7 C_6-D_6 C_7-D_7
B_8-B_9 C_8-D_8 C_9-D_9 B10-B11 C10-D10 C11-D11 B12-B13 C12-D12 C13-D13
26回中、終わった数は次の13回
C_1-D_1 C_2-D_2 C_3-D_3 C_4-D_4 C_5-D_5 C_6-D_6 C_7-D_7
C_8-D_8 C_9-D_9 C10-D10 C11-D11 C12-D12 C13-D13
ここまでで、A_1からA13 の位置が全て分かっている。
ここまでで、B_1からB13 の位置が全て分かっている。
ここまでで、C_1からC13 の位置が全て分かっている。
ここまでで、D_1からD13 の位置が全て分かっている。
まだ出ていないのは、ない。
残っているのは13回。合計39回。


↓の20回を2回繰り返す
A_1-A_2 A_3-A_4 A_5-A_6 A_7-A_8 A_9-A10 A11-A12 A13-B_1
A_1-B_1 B_2-A_2 B_3-A_3 B_4-A_4 B_5-A_5 B_6-A_6
B_7-A_7 B_8-A_8 B_9-A_9 B10-A10 B11-A11 B12-A12 B13-A13
 …

164 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 04:07:54 ]
1と2だけの8枚のとき6回、1と2と3だけの12枚のとき10回だから、52枚なら50回が正解

165 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 06:15:43 ]
なかなか難しいなw
結局何手が正しいのかわからないが、ネットワーク対戦とか少し面白そうと思ってしまったww

166 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 07:51:20 ]
方法はともかく、トランプの持つ情報量考えたら下限は見えてくるんじゃないかなぁ。
トランプの並べ方は52!/(4!^13) = 249987600 (27.897 bit)

けど、引いたカードをどう考えればいいんだろう。
最初は1/13の確率で引くカードを予言できるから、1枚引くと3.7 bit得られることになるんだが、
2枚目以降は引くカードによって得られる情報量が変わってくる。

167 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 08:47:00 ]
分かった。正解は39回だ。
各々の数に対して、丁度半分の2枚づつの情報が分かればOK。
1枚目は必ず知らない情報のカードをめくる。
そのカードの数の情報が1枚以下しか出てない場合、次に引くカードは知らない情報のカード。
2枚分かっていれば、分かっているカード組み合わせて表にしておく。
これを繰り返していけば、最悪、39回で全てのカードを表にできる。

168 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 08:55:56 ]
>>167
A-2 A-2 3-A 3-A 4-2 4-2 5-3 5-3 6-4 6-4
7-5 7-5 8-6 8-6 9-7 9-7 10-8 10-8 J-9 J-9
Q-10 Q-10 K-J K-J

最初から24手目までこういう風に出たら?

169 名前:167 mailto:sage [2010/04/25(日) 09:05:18 ]
何か少しだけ違う気がするな。
数の種類が奇数だと、+1回になりそうな気もするし、
>>155と組み合わせられる気もするし
無理やり取ってしまえば、上手く行きそうな気もする…。
細かいところまでは分からんが、正解は38〜40回のどれか

170 名前:169 mailto:sage [2010/04/25(日) 09:07:05 ]
>>168
おー、言われてみれば、そうだね。
2枚目が、被る場合も場合もあるのか…。
なかなか、上手くいかんの…



171 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 09:42:23 ]
>なかなか、上手くいかんの…
最大に上手く行かない手をどうぞ。

>>163 の者だけど
A_1-B_2 C_1-D_2 A_3-B_1 C_3-D_1 A_4-C_2 C_4-D_2 A_5-B_3 C_5-D_3 A_6-B_4 C_6-D_4
A_7-B_5 C_7-D_5 A_8-B_6 C_8-D_6 A_9-B_7 C_9-D_7 A10-B_8 C10-D_8 A11-B_9 C11-D_9
A12-B10 C12-D10 A13-B11 C13-D11

ここまでで24回、開いたカードは
A_1 A_2 A_3 A_4 A_5 A_6 A_7 A_8 A_9 A10 A11 A12 A13
B_1 B_2 B_3 B_4 B_5 B_6 B_7 B_8 B_9 B10 B11 B== B==
C_1 C_2 C_3 C_4 C_5 C_6 C_7 C_8 C_9 C10 C11 C12 C13
D_1 D_2 D_3 D_4 D_5 D_6 D_7 D_8 D_9 D10 D11 D== D==
後はどの裏カードから開いても、26回。合計50回

しかし、同じ開く順番なら
A_1-B_2 C_1-A_1 D_2-B_2 clear3
A_3-B_1 C_3-A_3 D_1-B_1 clear6
A_4-C_2 C_4-A_4 D_2-C_2 clear9
A_5-B_3 C_5-A_5 D_3-B_3 clear12
A_6-B_4 C_6-A_6 D_4-B_4 clear15
A_7-B_5 C_7-A_7 D_5-B_5 clear18
A_8-B_6 C_8-A_8 D_6-B_6 clear21
A_9-B_7 C_9-A_9 D_7-B_7 clear24
A10-B_8 C10-A10 D_8-B_8 clear27
A11-B_9 C11-A11 D_9-B_9 clear30
A12-B10 C12-A12 D10-B10 clear33
A13-B11 C13-A13 D11-B11 clear36
*12-*13 *12-*12 *13-*13 clear39
合計39回

172 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:08:20 ]
>>171
つまり、あれか?
情報がなんちゃらかんちゃら考えずに
分かってる組み合わせで取ってくのが最善手ってことか?

173 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:12:51 ]
取れるカード開いたときにとらないのはどう考えても開く回数の無駄だし。

174 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:33:12 ]
1枚目開いて知ってるのが出てきたときは、取らないと損。
2枚目で知ってるのが出たときは、取らなくてよい(取ったら損する場合があるが、取って得する場合はない)

175 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:43:38 ]
>>171
> しかし、同じ開く順番なら
> A_1-B_2 C_1-A_1 D_2-B_2 clear3
これは3手目以降が変わっていくのでは?

176 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 13:06:56 ]
[最悪のケース]
裏がえしのカードをめくると既に見たことのある数字がでまくる
(なければどれでも同じ)
ただし裏がえしのカードを二枚同時にめくったときは
二枚目は一枚目と違う数字の中から既に見たことのある数字がでまくる
(なければ一枚目と違う数字ならどれでも同じ)
最後の裏がえし4枚は同じ数字なのでめくると同時にとれる

だから52-2で50回だっつーの、とっくに結論でてるだろ


いい加減スレ違いなんだから終わりにしろよ

177 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 13:20:30 ]
2枚同時じゃなきゃにめくれないのか。onz

178 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 13:34:31 ]
どうしても理解できない人は、まだ開けたことのない所のカードをめくると
1 2 1 2 1 2 1 2 3 4 3 4 3 4 3 4 …
の順番にでてくる神経衰弱のプログラムを作ってみればいいんじゃない
50回だからw

179 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 13:44:16 ]
神経衰弱に2枚同時なんてルールはねーだろw

180 名前:デフォルトの名無しさん mailto:178 [2010/04/25(日) 14:00:57 ]
ごめん39だわ…



181 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:06:44 ]
>>176==178
最後の裏がえし4枚は同じ数字なのでめくると同時にとれる
なんで、最後の4枚が同じ数字って予言出来るの?
そりゃ、>>1 2 1 2 1 2 1 2 3 4 3 4 3 4 3 4
って並べれば、残るのは全部13だけど、最後がこんなパターンだったら?
11 12, 11 12, 11 13, 11 13, 12 13, 12 13

182 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:22:23 ]
>>157==171?
トランプとしては直感的じゃないけどA->1, 10->A, J->B, Q->C, K->Dで表す。
こんな場合どうなる?(以下、俺の試算)

1-D, 2-D, 3-D, 4-D, 5-C, 6-C, 7-C, 8-C, 9-B, A-B (ここまで10回 0組)
1-1, 2-2, 3-3, 4-4, 5-5, 6-6, 7-7, 8-8, 9-9, A-A (ここまで20回10組)
1-B, 2-B, 3-A, 4-A, 5-9, 6-9, 7-8 (ここまで27回10組)

あとは、見てないもう一枚をみるところから始めれば
全てのカードが把握できるから、残り16回16組 ( 計43回 )








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<118KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef