09/10/12 01:16:00
他人のソースを読むことは非常に勉強になります。
と言うわけで、初心者~プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。
問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。
解答ソースを貼る人用テンプレ
【C言語歴】 (例)4年
【レベル】 (例)初心者、プロ、学校で習った程度 など
【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など
【コメント】 (例)みっくみくにしてやんよ。など、有れば
長すぎるソースはこちらへ
URLリンク(codepad.org)
宿題は C/C++の宿題片付けます 130代目へ
スレリンク(tech板)
相談は C言語なら俺に聞け(入門篇)Part54などへ
スレリンク(tech板)
2:デフォルトの名無しさん
09/10/12 01:17:21
言い出しっぺの法則
【問題】 5個の数を入力すると合計と平均を計算し出力するプログラムを作成してください。
次の問題は>>50
3:デフォルトの名無しさん
09/10/12 01:20:30
【C言語歴】 1ヶ月
【レベル】 超初心者
【コンセプト】 ちゃんと動くように書くのが精一杯
【コメント】 先月からC言語を勉強しはじめました。一応講義受けてます・・。
#include<stdio.h>
#define BUF_SIZE (16)
#define COUNT (5)
int main(void){
int i;
double sum = 0;
char buf[BUF_SIZE];
printf("%d回、数を入力してください。\n",COUNT);
for(i=0;i<COUNT;i++){
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%lf",&sum);
sum +=sum;
}
printf("合計は%f、平均は%fです。",sum,sum/COUNT);
return (0);
}
4:デフォルトの名無しさん
09/10/12 01:21:48
該当問題をアンカーしたほうがいいですね・・。
5:デフォルトの名無しさん
09/10/12 01:27:15
ちょw
> ∑
6:デフォルトの名無しさん
09/10/12 03:12:57
霊長類研
7:デフォルトの名無しさん
09/10/12 05:39:25
>>2
【C言語歴】 1年 【レベル】 学校で習った 【コンセプト】 普通に
#include <stdio.h>
int main(void)
{
char str[20];
int num1;
int num2;
int num3;
int num4;
int num5;
int sum;
puts( "整数を5回入力して下さい。" );
fgets( str, 20(str), stdin );
sscanf( str, "%d", &num1 );
fgets( str, 22(str), stdin );
sscanf( str, "%d", &num2 );
fgets( str, 24(str), stdin );
sscanf( str, "%d", &num3 );
fgets( str, 26(str), stdin );
sscanf( str, "%d", &num1 );
fgets( str, 28(str), stdin );
sscanf( str, "%d", &num1 );
sum = num1 + num2 + num3 + num4+ num5;
printf( "合計: %d\n", sum );
printf( "平均: %d\n", sum / 5 );
return 0;
}
これでどうですか?
8:デフォルトの名無しさん
09/10/12 07:50:45
>7
わざと()にしたのかなアセンブリじゃないんだから[]使わないとだめだよ
20[str]みたいにね、と思ったがfgets(, size_t, )だったなぁ
脳内lintには引っかかったが、脳内コンパイルできなかった
9:デフォルトの名無しさん
09/10/12 14:32:38
【C言語歴】 1ヶ月
【レベル】 超初心者
【コンセプト】 なし
【コメント】 なし
#include <stdio.h>
int main(){
int a[5];
scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]);
int b=a[0]+a[1]+a[2]+a[3]+a[4];
printf("%d\n%g\n",b,(float)b/5);
return 0;
}
10:デフォルトの名無しさん
09/10/12 14:42:32
>>9
bが宣言されてなくない?
あとその書き方だと数が多いと大変
11:デフォルトの名無しさん
09/10/12 14:43:28
おっと、b見落としてた
12:デフォルトの名無しさん
09/10/12 19:45:13
ageて置きますね(^^;)
13:デフォルトの名無しさん
09/10/12 21:52:38
>>2
【C言語歴】 5~6年
【レベル】 けど初心者
【コンセプト】 stl で書いてみた
【コメント】 プログラムがうまくなりたーい
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main()
{
std::vector<int> arr;
std::cout<< "整数を5回入力してね。"<<std::endl;
for( int i = 0; i < 5; ++i)
{
int input_tmp;
std::cin >> input_tmp;
arr.push_back( input_tmp );
}
int sum = std::accumulate(arr.begin(), arr.end(), 0);
std::cout << "Sum:" << sum <<std::endl;
std::cout << "Mean:"<< (double)sum/arr.size() << std::endl;
return 0;
}
14: ◆yic3X9PxrE
09/10/13 00:29:00
>3
・buf は for の中で宣言しても良いかも。(その方が後で改造しやすい)
・sscanf は「scanできた数」を返すから、それできちんと入力されたかチェックした方が好ましい。
※ >3だと空入力とかも1回とカウントされてしまう。
・%lfでsscanfしてるんだから、 printfも %lf で出力した方が好ましい。
>7,9
・個別に書く事は得になし。
>13
・c++なんだからキャストは static_cast の方が好ましい。
(というか出題は整数限定じゃないのだから、double型にしときゃ良い気が。)
総評:
・初期化を書くクセを突けた方が良いと思われ。
・コンパイルが通るのを確認してから書いた方が良いと思われ。
今やWindowsでもコンパイラはタダなのだし。
15:デフォルトの名無しさん
09/10/13 02:48:58
>・%lfでsscanfしてるんだから、 printfも %lf で出力した方が好ましい。
これは論外。何故論外なのか判らないならprintf()とscanf()のマニュアルペー
ジを読め。
それでも判らないなら、人に物を教えようなどと言う烏滸がましいことは金輪際
止めた方がいい。
16:デフォルトの名無しさん
09/10/13 06:42:17
っ C99
17:デフォルトの名無しさん
09/10/13 07:34:01
shortだったらどうするんだろう……
18:普通の名無しさん
09/10/13 16:10:40
/*
【C言語歴】 22年 ソースにコメントされても、多分返事は無い
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 C++ は入出力がスマートで便利
*/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
const int MAX_COUNT = 5;
int main(void) {
double data[5];
double total = 0.0;
int i;
for(i=0; i<MAX_COUNT; i++) {
cout << "何かの数:";
cin >> data[i]; cout << data[i] <<endl;
total += data[i];
}
cout << "合計:" << total <<endl;
cout << "平均:" << total/MAX_COUNT <<endl;
}
19:別に返事は要らん
09/10/13 16:50:31
通常、標準入力はエコーバックされていると言う前提だから、入力直後の出力は冗長だね。
一方、標準出力はバッファリングされている可能性があるからフラッシュしないと折角のプロンプト出力が無駄になる。
20:デフォルトの名無しさん
09/10/13 19:16:48
const int MAX_COUNT = 5;
・
・
・
double data[5];
さすがプロ
つーか、配列の意味無し
21:デフォルトの名無しさん
09/10/13 20:32:55
>>20
ありがちなミスだなw
というお前さんも問題解いて行ってくれよ?
22: ◆yic3X9PxrE
09/10/14 00:45:18
>15
失敬。そしてわざわざ指摘をありがとう。(思いっきり勘違いしてますねこりゃ。)
そして>13さんごめんなさい。
>18
先輩、忘れ物です。
つ return 0;
>19
一応どのように読み取ったかを確認できるので、冗長ではあるけど意味はあるかと。
(例えば 1,2 などと入力すると…)
23:デフォルトの名無しさん
09/10/14 06:24:20
>>7 コンパイル済み
#include <stdio.h>
int main(void)
{
char str[20];
int num1;
int num2;
int num3;
int num4;
int num5;
int sum;
puts( "整数を5回入力して下さい。" );
fgets( str, 20, stdin );
sscanf( str, "%d", &num1 );
fgets( str, 20, stdin );
sscanf( str, "%d", &num2 );
fgets( str, 20, stdin );
sscanf( str, "%d", &num3 );
fgets( str, 20, stdin );
sscanf( str, "%d", &num4 );
fgets( str, 20, stdin );
sscanf( str, "%d", &num5 );
sum = num1 + num2 + num3 + num4+ num5;
printf( "合計: %d\n", sum );
printf( "平均: %d\n", sum / 5 );
return 0;
}
24:デフォルトの名無しさん
09/10/14 09:33:04
こういうのはイディオムとして覚えておこうよ。
fgets(str, sizeof(str), stdin);
25:デフォルトの名無しさん
09/10/14 10:12:37
よう、友達じゃないんだから。
26:普通の名無しさん
09/10/15 17:35:50
/*
【C言語歴】 22年 ソースにコメントされても、返事は期待しないように
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 途中で数字以外を入れるとそこまでで計算を終わる
*/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
const int MAX_COUNT = 5;
int main(void) {
double data, sum=0.0;
int i;
for(i=0; i<MAX_COUNT; i++) {
// cout << "何かの数:";
if(!(cin >> data)) break;
// cout << data <<endl;
sum += data;
}
cout << "合計:" << sum <<endl;
cout << "平均:" << sum/i <<endl;
}
27:普通の名無しさん
09/10/15 17:36:35
/*
【C言語歴】 22年 ソースにコメントされても、返事は期待しないように
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 途中で数字以外を入れるとそこまでで計算を終わる
*/
#include <stdio.h>
#define MAX_NUM 5
int main(){
double data, sum=0.0;
int i;
for(i=0; i<MAX_NUM; i++){
// printf("何かの数:");
if(scanf("%lf", &data ) != 1) break;
// printf("%g\n", data);
sum += data;
}
printf( "合計:%g\n", sum);
printf( "平均:%g\n", sum/i);
return 0;
}
28:デフォルトの名無しさん
09/10/15 17:54:24
/*
【C言語歴】 沢山
【レベル】 プロ
【コンセプト】 即興
【コメント】 >27に準拠、0件にも対応
*/
#include <stdio.h>
static const int MaxNum = 5;
int main()
{
double sumData = 0;
int ic;
for (ic = 0; ic < MaxNum; ++ic) {
double data;
fprintf(stderr, "Input a number:");
if (scanf("%lf", & data) != 1) break;
sumData += data;
}
if (ic) {
printf("Summation:%g\nAverage:%g\n", sumData, sumData / ic);
} else {
printf("There are no numbers.\n");
}
return 0;
}
29:デフォルトの名無しさん
09/10/16 00:02:18
// 【C言語歴】 10年くらい
// 【レ ベ ル】 底辺SIerのPG
// 【コンセプト】 C++で。例外処理は省略。
// 【コメント】ベースは>18
#include <iostream>
#include <vector>
#include <numeric>
int main ( void )
{
const int MAX_COUNT = 5;
std::vector<double> buf;
std::cout << MAX_COUNT << "個の数値を入力してください。" << std::endl;
for( int count = 0; count < MAX_COUNT; ) {
double tmp = 0.0;
std::cin >> tmp;
if ( std::cin.fail() ) {
std::cin.clear(); // エラーを消す
std::cin.ignore(); // エラーとなった文字を読み飛ばす
}
else {
buf.push_back( tmp );
++count;
}
}
double sum = std::accumulate( buf.begin(), buf.end() , 0.0);
std::cout << "合計:" << sum << std::endl;
std::cout << "平均:" << (sum / MAX_COUNT) << std::endl;
return 0;
}
30:デフォルトの名無しさん
09/10/16 09:53:42
int main( /**/ void /**/ )
31:デフォルトの名無しさん
09/10/18 18:22:00
次の問題に行かずに沈みそうなのでage....
ゆ っ く り と い て い っ て ね
32:デフォルトの名無しさん
09/10/18 21:44:24
>>24
カッコつけんなボケ
33:デフォルトの名無しさん
09/10/19 10:02:18
別に格好悪いわけじゃないからいいじゃん。
34:デフォルトの名無しさん
09/10/19 17:18:01
そろそろ次の問題行かないと間が持たないな
35:デフォルトの名無しさん
09/10/19 21:35:57
では少し早いですが問題を・・。
【問題】 100個の数字をランダムに並べ替えて出力するプログラムを作成してください。
※同じ数は出力しない。毎回違った実行結果を表示する。
アルゴニズムと処理の違いが楽しみです。
次の問題は 一応50レス先の >>85
スレが停滞したらまたその時。。
36:デフォルトの名無しさん
09/10/19 21:45:20
>>35
問題訂正・・。
【問題】 1~100までの数字をランダムに並べ替えて出力するプログラムを作成してください。
※同じ数は出力しない。毎回違った実行結果を表示する。
37:デフォルトの名無しさん
09/10/19 21:53:52
$ cat a.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t;
t = time(0);
srandom(t);
int a[100];
for (int i = 0; i < 100; ++i) a[i] = i;
for (int i = 0; i < 100; ++i) {
int k = i + random() % (100 - i);
printf("%d\n", 1 + a[k]);
a[k] = a[i];
}
return 0;
}
C99ってことで
38:37
09/10/19 21:58:41
乱数は考えるのがめんどくさかったので、 random() でごまかした。
random()の剰余で求める範囲の値を取り出すのは、ほんとはよい習慣ではない。
割り算を使うほうがいい。
39:37
09/10/19 22:00:23
いちおうテンプレ
【C言語歴】 かなり長い
【レベル】 プロ
【コンセプト】 KISS
【コメント】 たたき台ってことで、よろしく。
40:デフォルトの名無しさん
09/10/19 22:27:31
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MIN (1)
#define MAX (100)
#define LENGTH (MAX - MIN + 1)
int main()
{
int data[LENGTH];
// データの初期化
for(int i = MIN; i <= MAX; i++)
{
data[i - MIN] = i;
}
// データの並べ替え
srand(time(NULL));
for(int i = 0; i < LENGTH; i++)
{
int temp;
temp = data[i];
int selected_index = rand() % (MAX - i) + i;
data[i] = data[selected_index];
data[selected_index] = temp;
}
// 出力
for(int i = 0; i < LENGTH; i++)
{
printf("%d\n", data[i]);
}
return 0;
}
41:デフォルトの名無しさん
09/10/19 22:28:29
>>37
はえー・・・・
さすがプロ・・。
問題作った言い出しっぺが作れてません。
コンパイル通るのに動かないょ。
42:40
09/10/19 22:32:14
【C言語歴】 ほとんど書いたことない
【レベル】 Cは初級
【コンセプト】 変化を考慮
【コメント】 書き方などご指摘がありましたらよろしくお願いします。
43:デフォルトの名無しさん
09/10/19 23:20:43
【C言語歴】 6年 【レベル】 仕事で使用 【コンセプト】 擬似乱数 【コメント】 PCは書き込み規制・・・
#include <stdio.h>
#include <string.h>
#include <time.h>
void main(){
char map[100];
time_t timer;
int a, b, p, q, i = 0;
memset(map, 0x02, sizeof(map)); time(&timer);
a=timer%100000; p=(timer/7)%1000; q=(timer/3)%1000;
while(1){
a=(((a*p+q)/10)%100000); b=a/1000;
if(0<map[b]){
printf("%3d ",b); map[b]--; i++;
}else{
while(1){
if(b<99) b++;
else b = 0;
if(0<map[b]){
printf("%3d ", b); map[b]--; i++; break;
}
}
}
if(i>=200) break;
}
}
44:デフォルトの名無しさん
09/10/19 23:23:36
【C言語歴】 1ヶ月 【レベル】 超初心者 【コンセプト】 ちゃんと動くように書くのが精一杯
【コメント】 先月からC言語を勉強しはじめました。無限ループから抜け出せない。。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NUM (100)
int main (void){
int rnd[MAX_NUM] = {0};
int i, j, temp;
MORE:
for(i = 0; i < MAX_NUM; ){
temp = 0;
srand((unsigned)time(NULL));
temp = rand () % MAX_NUM;
if (0 < temp && temp < MAX_NUM){
for (j = 0; j = i; j++){
if (rnd[j] != temp){
rnd[i] = temp;
i++;
}else
goto MORE;
}
}else
goto MORE;
}
for ( i = 0; i <= MAX_NUM - 1 ; i++){
printf ("%d\n", rnd[i]);
}
return (0);
}
45:43
09/10/19 23:25:35
100*2で出力になってる…
memsetは1でi>=100でbreak
これだと発生しにくい数が出るけど…
46:デフォルトの名無しさん
09/10/19 23:36:03
>>37氏
目から鱗が・・。
コンパイル通りませんでしたが。
コピペだからでしょうか。
そのアルゴいただきます。
47: ◆yic3X9PxrE
09/10/19 23:49:20
>37
これは良いお手本。
>40
レベル考えりゃ上出来。叩き台にはむしろこちらが相応しい。
敢えてツッコミ入れるなら、
・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。
・並べ替えの部分は↓を先頭に持ってきて、swap処理を固めた方が好ましいかと。
int selected_index = rand() % (MAX - i) + i;
48: ◆yic3X9PxrE
09/10/20 00:42:15
>43
・if(i>=100) break; は while の条件に書けば良いような。(効率気にするならdo~while)
・1で初期化し-1するより、0で初期化し、1代入の方が良い気が。
(「配列全体を0で初期化」なら char map[100] = {0}; のように書けるので。)
・アルゴリズムは中々凝ってるような。(一部良く分からないけど…)
>44
・まづはgoto使うのを止めれ。ループとかブロック脱出に使うのは絶対ダメ。
・else ケースに括弧を付けるべき。括弧の対応が分かり辛く、フローも追い難い。
ちなみに無限ループに陥るのは、i がMOREにジャンプする度リセットされるから。
かつ内側のforループ内でほぼ確実にMOREにジャンプする。
49:デフォルトの名無しさん
09/10/21 05:29:42
この問題じゃ工夫の余地が無いよな。
50:デフォルトの名無しさん
09/10/21 06:10:06
>> // データの並べ替え
>> srand(time(NULL));
>> for(int i = 0; i < LENGTH; i++)
>> >40
>> ・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。
for(int i = 0; i < LENGTH-1; i++)
51: ◆yic3X9PxrE
09/10/21 23:21:31
>50
それだけでは不足。
selected_index の範囲も要修正。
>46
>コンパイル通りませんでしたが。
c99対応のコンパイラ(gccなど)が必要。
52:デフォルトの名無しさん
09/10/22 00:59:05
良う修正せん。どう修正する。
53:デフォルトの名無しさん
09/10/22 10:49:43
>>52
何を?
54:デフォルトの名無しさん
09/10/22 11:09:17
>>51
55:デフォルトの名無しさん
09/10/22 11:17:13
>>54
どっちを?
56:デフォルトの名無しさん
09/10/22 11:23:14
selected_index を修正する?
57:デフォルトの名無しさん
09/10/23 00:54:03
>40
>int selected_index = rand() % (MAX - i) + i;
selected_index ⇒ i ~ MAX-1
58:デフォルトの名無しさん
09/10/23 01:49:52
>40
int selected_index = rand() % (LENGTH - i) + i;
URLリンク(kansai2channeler.hp.infoseek.co.jp)
59:58
09/10/24 13:54:06
これをtemp省略前の状態にリバース!
スレリンク(tech板:229番)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, k, n, *p, temp;
srand(time(0));
scanf("%d", &n);
p = malloc(n * sizeof(int));
if(!p) return 1;
for(i=0; i<n; i++) {
p[i] = i;
k = rand() % (i + 1);
temp = p[i]; p[i] = p[k]; p[k] = temp;
}
printf("[");
for(i=0; i<n; i++) printf(" %d", p[i]);
printf(" ]\n");
free(p);
return 0;
}
60:>>1
09/11/08 09:10:38
C/C++/STL/MFC/CLI 共通問題
【問題】 10進数を入力して2進数を表示する。
※入力は1回のみで、繰返しはしない。数字以外は入力しない。
※正数は先頭の0は表示しない。負数は32ビットを表示する、間に空白などは埋めない。
※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。
次の問題は 40 レス先の >>100
61:デフォルトの名無しさん
09/11/08 10:47:38
頭の0を取るのは正規表現でも使ってください
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void dmp(unsigned char *b, int len)
{
int i;
for(i = len; --i >= 0; ){
int j;
/* printf(" %02x ", b[i]); */
for(j = 256; (j >>= 1) > 0; ){
printf("%d", (b[i] & j) ? 1 : 0);
}
}
printf("\n");
}
62:デフォルトの名無しさん
09/11/08 10:49:27
int main(int ac, char **av)
{
char buf[4096];
int i, f;
printf("input: (123, 0.5, 3.4e-6, etc...) > ");
fgets(buf, sizeof(buf), stdin);
printf(buf);
f = 0;
for(i = 0; i < strlen(buf); i++){
char c = buf[i];
if((c == '.') || (c == 'E') || (c == 'e')){
f = 1;
break;
}
}
if(f){
double d;
sscanf(buf, "%lf", &d);
printf("%.16f\n", d);
dmp((unsigned char *)&d, sizeof(d) / sizeof(char));
}else{
sscanf(buf, "%d", &i);
printf("%d\n", i);
dmp((unsigned char *)&i, sizeof(i) / sizeof(char));
}
return 0;
}
63:デフォルトの名無しさん
09/11/08 11:27:06
>>61
リトルエンディアンとビックリエンディアンの判別くらいしないといけないね
>>60
ここの人か
スレリンク(tech板:442番)
64:60
09/11/08 16:10:15
>>61
リトルエンディアンとビックリエンディアンの判別くらいしないといけないね
C++ でコンパイルしてください。ビックリ→ビッグ。ワーニング→ウォーニング
bool is_little_endian(unsigned char *b)
{
return b[0] ? true : false;
}
void dmp(unsigned char *b, int len, bool fill)
{
int i, j; bool zero = false;
if(i=1, is_little_endian( (unsigned char *)&i )){
for(i = len; --i >= 0; )
for(j = 256; (j >>= 1) > 0; ) {
if(b[i] & j) zero = true;
if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0);
}
} else {
for(i = -1; ++i < len; )
for(j = 256; (j >>= 1) > 0; ) {
if(b[i] & j) zero = true;
if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0);
}
}
printf("\n");
}
65:デフォルトの名無しさん
09/11/09 14:52:05
>>60
> ※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。
整数はなんとなくわかるが、浮動小数点数の仕様がわからない。
具体例をあげてくれ。
0.0 =>
1.0 =>
0.1 =>
1E2 =>
1E-1 =>
ところで、回答してるやつはちゃんとテストしている?
0 => 0
1 => 1
-1 => 11111111111111111111111111111111 (1が32個)
65535 => 11111111111111 (1が16個)
-65536 => 111111111111110000000000000000 (1が16個と0が16個)
2147483647 => 1111111111111111111111111111111 (1が31個)
-2147483648 => 10000000000000000000000000000000 (1が1個、0が31個)
特にエンディアンがどうこう言ってるやつは、リトルエンディアンとビッグエンディアンの両方でテストしている?
66:デフォルトの名無しさん
09/11/10 15:56:34
input: (123, 0.5, 3.4e-6, etc...) > 0.0
0
00000000000000000000000000000000
0
0000000000000000000000000000000000000000000000000000000000000000
input: (123, 0.5, 3.4e-6, etc...) > 1.0
1
00111111100000000000000000000000
1
0011111111110000000000000000000000000000000000000000000000000000
input: (123, 0.5, 3.4e-6, etc...) > 0.1
0.1000000014901161
00111101110011001100110011001101
0.1
0011111110111001100110011001100110011001100110011001100110011010
input: (123, 0.5, 3.4e-6, etc...) > 1E2
100
01000010110010000000000000000000
100
0100000001011001000000000000000000000000000000000000000000000000
input: (123, 0.5, 3.4e-6, etc...) > 1E-1
0.1000000014901161
00111101110011001100110011001101
0.1
0011111110111001100110011001100110011001100110011001100110011010
67:デフォルトの名無しさん
09/11/10 16:18:26
>>66
>【問題】 10進数を入力して2進数を表示する。
題意にそえば、10進数の0.5は2進数では0.1になるはずだが。
0.75(decimal)ならば0.11(binary)
68:デフォルトの名無しさん
09/11/10 20:00:57
IEEEの仕様があるのは知ってるか?
69:デフォルトの名無しさん
09/11/10 23:00:40
>>67
それはただの少数であって浮動小数点数ではないから題意に添わない
70:デフォルトの名無しさん
09/11/10 23:25:18
参考資料
URLリンク(ja.wikipedia.org)
71:デフォルトの名無しさん
09/11/10 23:31:45
>>67
しったか乙
72:デフォルトの名無しさん
09/11/11 01:56:45
>>69
基の問題文は、浮動小数点数と明記していないから、67のような捉え方もできると思う。
もっとも、その後の※を読めば浮動小数点数なのだろうとは考えられるけど。
73:デフォルトの名無しさん
09/11/23 00:53:29
捕手
74:デフォルトの名無しさん
09/12/06 07:57:49
次のようなデータがテキストファイルで1ギガ程度あり、これを数値順にソートしたいです。
どのようにすればいいですか。
文字列 タブ文字1個 数値
・・・・・・・・・・ ・・
・・・・・ ・・
[参考]文字列は可変長です、文字列にタブは含みません。
数値範囲は32ビットunsigned intの整数です。
課題の要点ではないので、ソートはqsort等ライブラリを使用して下さい。
速度の為、malloc, newを使うなら、1024個を1回にとか、まとめてして下さい。
75:74
09/12/06 07:59:40
次のレス番は>100くらい
76:74
09/12/06 12:08:24
> 文字列は可変長です、文字列にタブは含みません。
文字列の長さは固定長の間違いでした。
77:デフォルトの名無しさん
09/12/06 13:00:12
> 文字列の長さは固定長
そんなら OS で用意されている sort 使うよw
※"文字列は可変長"でも sort 使うが
78:デフォルトの名無しさん
09/12/06 13:53:38
sort -n +1
79:デフォルトの名無しさん
09/12/26 08:34:04
題目:宝くじの「還元率計算」
入力:標準ストリーム(テキストファイル)
1行目 1枚の金額 "," 発売総枚数
2行目以降 順位 "," 当選金額 "," 当選本数
最終行 改行
出力:標準ストリーム
タイトル行
入力データ、各行毎の期待値
合計期待値、還元率
ヒント:当選確率*当選金額=期待値(予想配当額)
期待値/1枚の金額=還元率
CUI/GUIどちらでも可
次スレは>>100あたり
80:デフォルトの名無しさん
09/12/26 10:00:24
宝くじって売り切れる訳じゃないんだろ
売れ残った部分に当りくじがあったら
還元率は大幅に下がるんじゃね?
81:デフォルトの名無しさん
09/12/26 10:13:23
>>80
あなた、いつ議員に「当選」したんだ?
82:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/20 15:41:01
>>82
宿題はスレ違い
84:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/28 17:47:41
>>84
b??(i??)??(j??) = 0;
a??(i??)??(j??) = 0;
86:デフォルトの名無しさん
10/02/28 19:14:14
b<:i:><:j:> = 0;
a<:i:><:j:> = 0;
87:デフォルトの名無しさん
10/03/03 03:08:44
>>86
すげー、ほんとにコンパイル通る。
それなんて名前なの?記号だけなのでググりようがない。
88:デフォルトの名無しさん
10/03/03 22:31:16
memset() すりゃいいんでないの?w
89:デフォルトの名無しさん
10/03/04 09:47:49
0で初期化したいんならcalloc()でいいだろw
*(*(b + i) + j) = 0;
*(*(a + i) + j) = 0;
90:デフォルトの名無しさん
10/03/04 20:52:47
>>87
ダイグラフ
91:84
10/03/04 23:36:37
>>89
WORD (*b)[2]; // まちがえた
92:デフォルトの名無しさん
10/03/07 02:46:41
>>90
とんくす
日本語じゃ情報少ないのな。英語だとWikipediaにのってるが
93:84
10/03/07 08:18:53
Trigraph
× トリグラフ
○ トライグラフ
URLリンク(dic.yahoo.co.jp)
94:デフォルトの名無しさん
10/03/22 09:38:47
コンパイラ名とバージョン: (Visual C++)
作業用フォルダの所は空白、ソースと同じフォルダにショートカットは有ります。
ショートカット「Visual Studio 2005」
から cl xxx.cpp するのが面倒な場合はどのようにするのでしょうか。
PATHをずらっと並べるのは無しで.batのみで可能でしょうか?
95:デフォルトの名無しさん
10/03/23 01:04:08
>>94
まず、ここは質問スレじゃない。
さらに、それはC/C++の問題ではない。
96:デフォルトの名無しさん
10/03/23 10:09:52
C#, C♯, C#相談室 Part55
>>95 返信サンキュこちらで聞いてきます。
97:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/28 17:21:22
次の問題は>>100
100:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/29 15:59:04
もっとゆとりでも解けるような問題が欲しいよ
102:デフォルトの名無しさん
10/03/29 16:14:25
ユークリッド平面でいいの?
103:デフォルトの名無しさん
10/03/29 16:41:57
>>101
それじゃ、次の制約でどうぞ。
・ya == yb, Lac == Lbc
>>102
非ユークリッド平面だと私自身がついていけないからパスw
104:デフォルトの名無しさん
10/03/29 16:45:45
要は三角不等式と2円の交点でしょ?
105:デフォルトの名無しさん
10/03/29 18:16:54
2つの球の交線(円)かもしれん
106:デフォルトの名無しさん
10/03/30 01:39:29
これってA点を (0,0) に移動して
計算するとわりと簡単?
107:デフォルトの名無しさん
10/03/30 14:41:15
いや計算量は変わらん
むしろ座標系を回転して >>103 が正解(ry
108:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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
10/04/14 00:15:40
※論理否定は必ず否定が掛かっている方の真偽を逆にする
って書いたけど、何か違うな…
正確には、偽で比較するって言うか、真で比較しては駄目っての言うのが正しいのか?
111:デフォルトの名無しさん
10/04/14 00:20:39
そもそも>>108が分からないのがifの何なのかが俺には分からない。
112:デフォルトの名無しさん
10/04/14 00:27:56
>>109-110
ごめんよくわかんない
>>111
if文の()の中身の
scanf("%lf", &data ) != 1
ってどういうこと?って意味
113:デフォルトの名無しさん
10/04/14 00:46:00
>>112
scanfの戻り値が1でない場合真
int scanf(const char* format, ...);
scanfの戻り値は"formatで指定された型に従って代入に成功した要素数"
scanf("%lf", &data )
↑でdataに代入成功すれば1が返る 失敗すれば多分0(scanfなんて使わないから分からない)
114:デフォルトの名無しさん
10/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
10/04/14 01:00:30
>>118に期待しよう…orz
まあ、こんな感じで、ミスを避けるために、
数値の真偽を問う場合は、必ずfalse(0)と比較するってのが良く使われる。
116:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/15 02:02:15
>>120 訂正
×Yd = Ya + k*Xn ○Yd = Ya + k*Yn
122:デフォルトの名無しさん
10/04/15 02:09:26
あ、内積じゃなくて高さ求めるのかw ごめん。
でadと直角な単位ベクトルにhと-hをかけて二つ答えだしておしまいだ。
123:デフォルトの名無しさん
10/04/15 22:23:40
>>113-114
サンクス
数字だと1をかえしてそれ以外だと0かえして
ブレイクしてやんお!
ってことだよねと、わかったかんじだ
124:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/15 23:53:11
プログラマは数学出来ない人多いんだなと驚いた
126:124
10/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:デフォルトの名無しさん
10/04/24 01:34:54
100の出題者はそろそろ解答書くべきじゃないの。
それに問題複数あった方がつまらない問題無視できるからいいと思う。
128:デフォルトの名無しさん
10/04/24 01:38:20
【問題1:時計】
現在時刻をアスキーアートで表示せよ
【表示例】
●●○○○●○○○○○○●○●○○●●
○○●○●○●○○●○○●○●○●○○
○●●○●○●○○○○○●●●○●●●
●○○○●○●○○●○○○○●○●○●
●●●○○●○○○○○○○○●○●●●
【難易度】
40分で初級
129:デフォルトの名無しさん
10/04/24 01:44:05
適当に作ったので面白いかどうかはしらないけれど
こんな感じの問題名、解答時間、難易度つきテンプレ希望
130:デフォルトの名無しさん
10/04/24 09:17:18
できたが、俺にはAA作りの才能がないことが分かったのと、codepadじゃ時間取得系関数動かねぇ。
URLリンク(codepad.org)
ローカルでの実行結果。
○●○○●●●○○○○○○●○○○●●
●○●○●○●○○●○○●●○○●○○
●○●○●●●○○○○○○●○○●●●
●○●○○○●○○●○○○●○○●○●
○●○○●●○○○○○○●●●○●●●
131:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/24 09:46:00
○があると読みにくいので
スペースに置き換えてください
ずれないように注意出来たら二段
133:130
10/04/24 10:10:14
うげぇ、配列サイズ足りてねぇorz
134:131
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/24 14:12:24
URLリンク(www2.ezbbs.net)
このパズルを解くプログラム
137:デフォルトの名無しさん
10/04/24 14:19:04
>>136
すまんがシラミツブシは興味ないんよ
それより論理的にさ
ここに1を置いたら絶対全部の合計は等しく出来ないから
1はこっちかこっちにしか置けない
っていう風に考えたい訳
138:デフォルトの名無しさん
10/04/24 16:38:16
>>136程度だと総当たりでも十分速いだろなぁ。
それ書くくらいならナンプレの答え探すプログラムの方がいいんじゃね?
139:デフォルトの名無しさん
10/04/24 18:04:37
>>136がわからない
なにこれどうすんの?
140:デフォルトの名無しさん
10/04/24 18:33:55
総和が5の倍数であることを利用するとあまる数字の組み合わせを何個かに限定できるかな
141:デフォルトの名無しさん
10/04/24 18:49:23
1~10の総和は55
和がすべて等しいので
和の値は55/5=11
4個の和で11になる組み合わせを選ぶ
142:デフォルトの名無しさん
10/04/24 18:59:23
え?
143:デフォルトの名無しさん
10/04/24 19:04:15
>>141
それで解けたら1億やるよw
144:デフォルトの名無しさん
10/04/24 19:09:01
>>141でやるとかむずいな
145:デフォルトの名無しさん
10/04/24 19:10:17
むずいとかじゃなくて、解がない
146:デフォルトの名無しさん
10/04/24 19:18:42
4個の和が11じゃねーだろw
全ての位置は2回数えられるから2倍にして4個の和が22になる組み合わせを選ぶ。
まあ、それでも解はないんだけどねw
147:デフォルトの名無しさん
10/04/24 19:22:28
>>136
7-11いい気分
148:デフォルトの名無しさん
10/04/24 19:26:21
>>147
プログラムお願いします
149:デフォルトの名無しさん
10/04/24 19:27:16
宿題スレのでも見とけ
150:デフォルトの名無しさん
10/04/24 19:55:56
数学の問題にも著作権はあるんだからパクリはいくない
151:デフォルトの名無しさん
10/04/24 23:22:00
問題
ジョーカーを除いたトランプ1組(52枚)で下記のルールで神経衰弱を行った場合、
最大何手必要なのかを求めるプログラム。
※但しコンピュータは最善の手を実行するものとする。
1. 52枚を適当にシャッフルしカードを伏せる(ことにする)
2. カードを2枚めくる(この行為を1手と数える)
2-1. 同じ数字であれば表にする(ことにする)
2-2. 異なる数字であれば、それらの数字を覚えて裏に戻す(ことにする)
3. 全てのカードが表になった(ことになった)ら終了
152:デフォルトの名無しさん
10/04/24 23:51:13
>>151
それも数学の問題。プログラミングできないなら無理に出題しないでいいよ。
答えは全てのカードを覚えるのにかかる回数26回と
全てのカードを取るのにかかる回数26回の合わせて52回。
153:デフォルトの名無しさん
10/04/25 00:02:36
>>152
不正解
覚えるのは25回で十分
154:デフォルトの名無しさん
10/04/25 00:16:41
いや26回だ
155:デフォルトの名無しさん
10/04/25 00:21:08
>>154
指摘してやってるのに分からんいなんてアホなのか?
25回覚えて、取り始めは、残った2枚のうちの1枚から始めれば良い。
(1枚取った時点で全てのカードが把握できる)
156:152
10/04/25 00:31:34
>>155
言われみればそうだね。でも154はおれじゃねえ。
157:デフォルトの名無しさん
10/04/25 00:44:56
いや合わせて50回だ
158:デフォルトの名無しさん
10/04/25 00:50:12
そうだorz
159:デフォルトの名無しさん
10/04/25 00:51:41
>>157
>いや合わせて50回だ
何を合わせるんだ?
160:157
10/04/25 01:23:37
最大40手 50回は間違い
161:デフォルトの名無しさん
10/04/25 01:24:10
最大52回
162:デフォルトの名無しさん
10/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
10/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:デフォルトの名無しさん
10/04/25 04:07:54
1と2だけの8枚のとき6回、1と2と3だけの12枚のとき10回だから、52枚なら50回が正解
165:デフォルトの名無しさん
10/04/25 06:15:43
なかなか難しいなw
結局何手が正しいのかわからないが、ネットワーク対戦とか少し面白そうと思ってしまったww
166:デフォルトの名無しさん
10/04/25 07:51:20
方法はともかく、トランプの持つ情報量考えたら下限は見えてくるんじゃないかなぁ。
トランプの並べ方は52!/(4!^13) = 249987600 (27.897 bit)
けど、引いたカードをどう考えればいいんだろう。
最初は1/13の確率で引くカードを予言できるから、1枚引くと3.7 bit得られることになるんだが、
2枚目以降は引くカードによって得られる情報量が変わってくる。
167:デフォルトの名無しさん
10/04/25 08:47:00
分かった。正解は39回だ。
各々の数に対して、丁度半分の2枚づつの情報が分かればOK。
1枚目は必ず知らない情報のカードをめくる。
そのカードの数の情報が1枚以下しか出てない場合、次に引くカードは知らない情報のカード。
2枚分かっていれば、分かっているカード組み合わせて表にしておく。
これを繰り返していけば、最悪、39回で全てのカードを表にできる。
168:デフォルトの名無しさん
10/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
10/04/25 09:05:18
何か少しだけ違う気がするな。
数の種類が奇数だと、+1回になりそうな気もするし、
>>155と組み合わせられる気もするし
無理やり取ってしまえば、上手く行きそうな気もする…。
細かいところまでは分からんが、正解は38~40回のどれか
170:169
10/04/25 09:07:05
>>168
おー、言われてみれば、そうだね。
2枚目が、被る場合も場合もあるのか…。
なかなか、上手くいかんの…
171:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/25 10:08:20
>>171
つまり、あれか?
情報がなんちゃらかんちゃら考えずに
分かってる組み合わせで取ってくのが最善手ってことか?
173:デフォルトの名無しさん
10/04/25 10:12:51
取れるカード開いたときにとらないのはどう考えても開く回数の無駄だし。
174:デフォルトの名無しさん
10/04/25 10:33:12
1枚目開いて知ってるのが出てきたときは、取らないと損。
2枚目で知ってるのが出たときは、取らなくてよい(取ったら損する場合があるが、取って得する場合はない)
175:デフォルトの名無しさん
10/04/25 10:43:38
>>171
> しかし、同じ開く順番なら
> A_1-B_2 C_1-A_1 D_2-B_2 clear3
これは3手目以降が変わっていくのでは?
176:デフォルトの名無しさん
10/04/25 13:06:56
[最悪のケース]
裏がえしのカードをめくると既に見たことのある数字がでまくる
(なければどれでも同じ)
ただし裏がえしのカードを二枚同時にめくったときは
二枚目は一枚目と違う数字の中から既に見たことのある数字がでまくる
(なければ一枚目と違う数字ならどれでも同じ)
最後の裏がえし4枚は同じ数字なのでめくると同時にとれる
だから52-2で50回だっつーの、とっくに結論でてるだろ
いい加減スレ違いなんだから終わりにしろよ
177:デフォルトの名無しさん
10/04/25 13:20:30
2枚同時じゃなきゃにめくれないのか。onz
178:デフォルトの名無しさん
10/04/25 13:34:31
どうしても理解できない人は、まだ開けたことのない所のカードをめくると
1 2 1 2 1 2 1 2 3 4 3 4 3 4 3 4 …
の順番にでてくる神経衰弱のプログラムを作ってみればいいんじゃない
50回だからw
179:デフォルトの名無しさん
10/04/25 13:44:16
神経衰弱に2枚同時なんてルールはねーだろw
180:デフォルトの名無しさん
10/04/25 14:00:57
ごめん39だわ…
181:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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回 )
183:デフォルトの名無しさん
10/04/25 14:47:51
182で正解のような気がするが
184:デフォルトの名無しさん
10/04/25 15:01:48
マスターマインドというゲームがあります
4つの中身が不明な箱と
そのなかに4色のボールが入っていて
(同じ色は何度でも使えます)
中身を知らない方の人が4つ箱に入っているボールの色を予想して
中身を知っている方の人が
1.色だけがあっている数
2.色と場所があっている数
を教えます(ウソはつかないものとします)
正解を出すのに最低何回質問をすればよいでしょうか?
185:160
10/04/25 15:04:02
A_1-A13, A_2-B13, A_3-C13, A_4-D13, A_5-A12, A_6-B12, A_7-C12, A_8-D12, A_9-A11, A10-B11 (ここまで10回 0組)
B_1-A_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 (ここまで20回10組)
C_1-C11, C_2-D11, C_3-C10, C_4-D10, C_5-D_9, C_6-C_9, C_7-C_8 (ここまで27回10組)
ここまでで場所の分かっているカードは
A_1~A10,A11,A12,A13
B_1~B10,B11,B12,B13
C_1~C_8,C_9,C10,C11,C12,C13
D_9,D10,D11,D12,D13
場所の分かっていないカードはD_1~D_8 の8枚。残りの組は16組。27+16=43
186:デフォルトの名無しさん
10/04/25 15:08:16
数学
URLリンク(science6.2ch.net)
よし、とりあえず板移動w
187:GAME
10/04/25 15:20:18
ロよッもテ動かせ
URLリンク(i-libro.net)
188:デフォルトの名無しさん
10/04/25 15:22:01
1 2 3 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 3 12 4 13 4 5 6 7 8 9 10 11 12 13 5 4 6 7 6 8 7 9 8 10 9 11 10 12 11 13
189:160
10/04/25 16:21:37
A_1-A_2 A_3-B_1 A_4-C_1 A_5-D_1 A_6-B_2 A_7-C_2 A_8-D_2
A_9-B_3 A10-C_3 A11-D_3 A12-B_4 A13-C_4
B_5-B_6 B_7-B_8 B_9-B10 B11-B12 B13-C_5
D_4-C_6 C_7-D_6 C_8-D_7 C_9-D_8 C10-D_9 C11-D10 C12-D11 C13
ここまでで、25回。
場所の分かっているカードは、
A_1~A13
B_1~B13
C_1~C13
D_1~D_4,===,D_6~D11,===,===
場所の分かっていないカードは、D_5,D12,D13
すでに出来ているペアはC13-*13の1組、残りは25組。25+25=50
しかし、同じ開く順番なら
(A_1)-(A_2) (A_3)-(B_1) (A_1-B_1) (A_4)-(C_1) (A_5)-(D_1) (C_1-D_1)
(A_6)-(B_2) (A_2-B_2) (A_7)-(C_2) (A_8)-(D_2) (C_2-D_2) (A_9)-(B_3) (A_3-B_3)
(A10)-(C_3) (A11)-(D_3) (C_3-D_3) (A12)-(B_4) (A_4-B_4) (A13)-(C_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) C_5-(D_4) (C_4-D_4) (C_6)-(C_7) (D_6-C_6)
(C_8)-(D_7) (C_7-D_7) (C_9)-(D_8) (C_8-D_8) (C10)-(D_9) (C_9-D_9)
(C11)-(D10) (C10-D10) C12-(D11) (C11-D11) C13
ここまでで、42回とC13
場所の分かっていないカードは、D_5,D12,D13
まだペアにならなくて、場所の分かっているカードはC_5,C12,C13
残りは3組。42+3=45
190:デフォルトの名無しさん
10/04/25 16:26:40
質問するスレ間違えたようなので引っ越します
191:デフォルトの名無しさん
10/04/25 16:59:55
バイバーイ
192:デフォルトの名無しさん
10/04/25 17:16:29
46回?
1234567890JQK11223344556677889900JJQQKK1234567890JQK
これを左から2枚ずつ引いていき、
覚えているのがあったら新しいのと覚えているのを引く。
12 34 56 78 90 JQ K1 11 12 22
23 33 34 44 45 55 56 66 67 77
78 88 89 99 90 00 0J JJ JQ QQ
QK KK K1 11 22 33 44 55 66 77
88 99 00 JJ QQ KK
193:デフォルトの名無しさん
10/04/25 21:50:26
>>184
最低だと、1でいいんじゃないのか?
194:デフォルトの名無しさん
10/04/25 21:55:38
バカがいるw
195:デフォルトの名無しさん
10/04/25 22:40:43
>>194
いや、そのくらい軽くこなさないとマインドシーカーはクリアできないよ。
つーか終盤になると質問すら出来んレベル
196:デフォルトの名無しさん
10/04/25 23:07:26
>>194
ん?1回目で当たったら1になるんじゃないのかい?
問題の不備だとは思うが。
197:デフォルトの名無しさん
10/04/26 00:04:50
>>152
42回が正解
URLリンク(codepad.org)
198:デフォルトの名無しさん
10/04/26 01:04:46
>>130
仕事はやいですね
cpyすっごいならんでるよ
>>131
品質△ (悲
次はもっといい問題作ってきます
作者の自己解答上げておきます
URLリンク(codepad.org)
199:160
10/04/26 01:31:28
>>197
40回?
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK
A2 3A AA 4A 5A AA 62 22 72 82
22 93 33 03 J3 33 Q4 K4 44 44
55 56 66 55 66 77 78 88 77 88
99 00 99 00 JJ QQ JJ QQ KK KK
(A)(2) (3)(A) (AA) (4)(A) (5)(A) (AA) (6)(2) (22) (7)(2)
(8)(2) (22) (9)(3) (33) (0)(3) (J)(3) (33) (Q)(4) (K)(4)
(44) ((4)4) ((5)5) (5)(6) (66) ((5)5) ((6)(6)) ((7)7) (7)(8)
(88) ((7)7) ((8)(8)) ((9)(9)) ((0)0) ((9)9) ((0)(0)) ((J)(J)) ((Q)Q)
((J)J) ((Q)(Q)) ((K)(K)) ((K)K)
200:160
10/04/26 02:14:09
>>197
もとい!42回。
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK
A2 3A AA 4A 5A AA 62 22 72 82
22 93 33 03 J3 33 Q4 44 K4 44
55 56 66 55 66 77 78 88 77 88
99 90 00 99 00 JJ JQ QQ JJ QQ
KK KK
(A)(2) (3)(A) (AA) (4)(A) (5)(A) (AA) (6)(2) (22) (7)(2) (8)(2) (22)
(9)(3) (33) (0)(3) (J)(3) (33) (Q)(4) (44) (K)(4) ((4)4) ((5)5) (5)(6) (66)
((5)5) ((6)(6)) ((7)7) (7)(8) (88) ((7)7) ((8)(8)) ((9)9) (9)(0) (00)
((9)9) ((0)(0)) ((J)J) (J)(Q) (QQ) ((J)J) ((Q)(Q)) ((K)K) ((K)(K))
201:192
10/04/26 03:19:16
やっぱ46回になる。
URLリンク(codepad.org)
また、「カードの総数 - 数字の数 / マークの数」
みたいな式でもあらわせるかも。
202:デフォルトの名無しさん
10/04/26 04:13:55
>>201
8手目に+A-Aで取らないという選択肢
+A+2 +3+4 +5+6 +7+8 +9+0 +J+Q +K-A *A+A -2*2 -3*3 #10手03組
-4*4 -5*5 -6*6 -7*7 -8*8 -9*9 -0*0 -J*J -Q*Q -K*K #20手13組
/A-A /2+2 /3+3 /4+4 /5+5 /6+6 /7+7 /8+8 /9+9 /0+0 #30手23組
/J+J /Q+Q /K+K
203:192
10/04/26 07:42:45
>>202
それは、後に出てくるのが分かっている上での最善の手の気もする。
>>151に↓と書いてあるけど、この解釈の仕方により変わるので難しいが。
※但しコンピュータは最善の手を実行するものとする。
作者さんの答えきぼん。
204:デフォルトの名無しさん
10/04/26 08:07:04
2回目のめくりである札の2枚目がわかったときに、
次の手でその2枚を取るのはどう考えても悪手。
205:189
10/04/26 09:30:20
45.5 というか やっぱり 46回だ。
>>188なら>>204の作戦にも強い。ID無いのが残念。
206:デフォルトの名無しさん
10/04/26 09:46:02
>>205
A01-A02 A03-B01 A04-C01 A05-D01 A06-B02 A07-C02 A08-D02 A09-B03 A10-C03 A11-D03
A12-B04 A13-C04 B05-B06 B07-B08 B09-B10 B11-B12 B13-C05
ここまで17手 0/26組
これで1-13が2組出ているんだから後は消していくだけじゃね?
C06-C13 がでたら A06-A13を取る
D04-D13 がでたら B04-B13を取る
ここまで35手 18/26組
記憶している残りのカードを取る
A01-05 & C01-05
B01-03 & D01-03
ここまで43手 26/26組
207:デフォルトの名無しさん
10/04/26 09:53:03
>>189で言うと (A_4-B_4) これが悪手
208:デフォルトの名無しさん
10/04/26 10:04:01
207は忘れてくれww
209:デフォルトの名無しさん
10/04/26 10:10:00
悪手は悪手だよ。
C_4とD_4が2回目のめくりで出てるから回数には影響しないってだけで。
210:デフォルトの名無しさん
10/04/26 10:58:00
もうトランプの話題はいいだろ。
最大値は計算するまでもないわけだから、
期待値とかどう?
211:デフォルトの名無しさん
10/04/26 11:25:44
>>210 最大値は43だろ。
212:デフォルトの名無しさん
10/04/26 14:57:10
She never eats NONI.
213:192
10/04/26 17:46:05
>>204
分かったかも。
覚えるのに2ターン、取るのに1ターンの3ターンかかり無駄という感じか。
2枚目で覚えているのを取れば、覚えるのに1ターン、取るのに1ターンにできる。
厳密には、覚えたのが1枚残るから、3-1=2、2-0.5=1.5ターンという感じか。
214:デフォルトの名無しさん
10/04/26 18:12:45
>>189
開いてないC13を分かってるカードに分類しちゃだめだろw
215:100
10/04/26 18:33:16
アク禁その他で遅くなりました。
私の作った関数はこんな感じ。
--
using namespace std;
typedef complex<double> coordinate;
static vector<coordinate> func(coordinate const pa, coordinate const pb, double lac, double lbc)
{
double lab = abs(pb - pa);
double s = (lac + lbc + lab) / 2;
double s2abc = s * (s - lac) * (s - lbc) * (s - lab);
vector<coordinate> rtn;
if (s2abc < 0) return rtn;
double lcd = sqrt(s2abc) / lab * 2;
double lad = sqrt(lac * lac - lcd * lcd);
double lbd = sqrt(lbc * lbc - lcd * lcd);
double k = (lbd > lab ? -lad / (lbd - lad) :
lad > lab ? lad / (lad - lbd) :
lad / (lad + lbd));
coordinate pd = pa + k * (pb - pa);
if (lcd > 0) {
rtn.push_back(coordinate(pd.real() - lcd / lab * (pb.imag() - pa.imag()),
pd.imag() + lcd / lab * (pb.real() - pa.real())));
}
rtn.push_back(coordinate(pd.real() + lcd / lab * (pb.imag() - pa.imag()),
pd.imag() - lcd / lab * (pb.real() - pa.real())));
return rtn;
}
--
考え方はヘロンの公式で面積を求めてからCからの垂線を延ばすという意味で>124とほぼ同じ。>120もそうかな。
後は水平だろうとそうでなかろうと、垂線の足の位置はLadとLbdの比で決まる。どっち側かは兎も角。
最後に足から両側に垂線を延ばせば両方の点Cが求まる。
# 一点しかないとき(=面積が0)のときはもっとLcdを求める必要もないんだけど、そこは横着w
216:デフォルトの名無しさん
10/04/26 18:43:33
円の方程式を二つつくる
引く
ax + by = cができる
円の方程式の片方に代入して解の公式を使う
解がある場合にax + by = cに代入すれば座標が求まる
217:デフォルトの名無しさん
10/04/26 23:48:45
>>198
なるほど、printfに%.8sなんて使い方あったのですか。目から鱗。
218:デフォルトの名無しさん
10/04/27 02:28:28
>>184
面白い。
最初はバラバラに予想して何色存在するかを見るのがいいのかな。
219:デフォルトの名無しさん
10/04/29 09:21:04
>>184
たぶん4回。
1回目は0123の一手。
それでHit0、Blow3の時が一番難しいと思うが、
2回目は0122とかと1箇所を変えて入れ、
H0B2、H0B3、H1B1、H1B2のどれになるかで予想を変える。
2回目の結果で一番難しいのは、多分H0B2とBlowが減ってしまうやつ。
それでも、色の種類が3、2は1つ以下、3は1つ以上という事から、
答えを15種類ぐらいにしぼれる。
3回目はその15種類のうちのひとつの3200とかにすると、
その結果によって、4回目になりうる入力は1つに絞られるはず。
ただ、これはプログラムの問題というより、数学の問題だな。
ランダムで生成された問題を100回解いて、
平均回数を少なくするプログラムを作れとかの方が面白いかも。
220:デフォルトの名無しさん
10/04/29 11:32:36
正しく(もっとも効率よく)質問をするプログラムを作るのも難しくて面白いと思われ
221:デフォルトの名無しさん
10/05/01 03:15:57
>>203 も言っているように、後で出てくるカードが分かっていなかったら。
12 31 41 51 62 72 82 93 03 J3
Q4 K4 55 66 77 88 99 00 JJ QQ
KK 54 67 66 87 98 09 J0 QJ K5
QQ KK 11 22 33 44 11 22 33 44
55 77 88 99 00 JJ
46回
222:デフォルトの名無しさん
10/05/01 06:22:15
>>221
なんで13~21手の所でペア取っちゃうんだ?
223:デフォルトの名無しさん
10/05/01 06:24:43
そうじゃないと手数が増えるからだろw
224:デフォルトの名無しさん
10/05/01 06:34:35
残しておいて3枚目引いたときに取った方が手数減ると思うが
225:デフォルトの名無しさん
10/05/01 06:37:06
2枚目をめくった時に3枚目を引いたら、4枚目が出るまでスルーな
226:デフォルトの名無しさん
10/05/01 06:39:47
3枚目、4枚目がめくりの2枚目に出る可能性がある以上、
一回目のめくりで2枚目が出たら次に1枚目をめくるのが正しい。
227:デフォルトの名無しさん
10/05/01 06:42:23
>>226
13種類の絵柄で、めくりの2枚目で3枚目4枚目を出せるのは何種類だ?
228:デフォルトの名無しさん
10/05/01 06:46:20
何種類とか関係意味わかんねーよw
だいたい、とっておいてもその場でめくるよりめくる回数増える可能性こそあれ、
減る可能性は全くないのにw
229:デフォルトの名無しさん
10/05/01 06:49:11
>>228
じゃあ言い方を変えるわ。
>>224-225の取り方で最大何手になるよ
230:デフォルトの名無しさん
10/05/01 06:51:17
残した方が手数が減るって主張してるのはお前だろ?
46手より小さい手をお前が示さなきゃだめだろw
231:デフォルトの名無しさん
10/05/01 06:59:47
>>230
>>206
232:デフォルトの名無しさん
10/05/01 07:16:16
そういう並びに強いってだけだしなあ。
>>224-225で
1 2 1 2 3 2 3 2 4 3 4 3 5 4 5 4 6 5 6 5 7 6 7 6 8 7 8 7 9 8 9 8 10 9 10 9 11 10 11 10 12 11 12 11 13 12 13 12 1 1 13 13
これやってみろよ
233:デフォルトの名無しさん
10/05/01 07:30:51
50手か
234:デフォルトの名無しさん
10/05/01 07:33:58
結局並びかたによって2枚目の時点でとるか、3枚目まで待つかどっちがいいか
一概には言えないってことか。
235:デフォルトの名無しさん
10/05/01 10:54:01
>>234
3枚目まで待った方がいい。そしてそれは>>174が既に指摘してる。
待っても待たなくても同じか、待った方が手数減るかのどっちかで
待たない方が手数減るパターンは有り得ないのだから、待った方がいい。
引いた時点で、待っても得しないと分かりきっている場合は引いてしまってもいいが、別に引くメリットはない。
236:デフォルトの名無しさん
10/05/01 11:18:12
>>235
お前はちょっと前の>>232すら見えないのか?
237:デフォルトの名無しさん
10/05/01 11:36:01
>>236
一概には言えないなんてとぼけたこと抜かしてるから、
常にとらなければいいと言ってるだけ。
238:デフォルトの名無しさん
10/05/01 11:40:07
A01 A02 B01 B02 A03 C02 B03 D02 A04 C03 B04 D03 A05
C04 B05 D04 A06 C05 B06 D05 A07 C06 B07 D06 A08 C07
B08 D07 A09 C08 B09 D08 A10 C09 B10 D09 A11 C10 B11
D10 A12 C11 B12 D11 A13 C12 B13 D12 C01 D01 C13 D13
同じ数字が3回目に出てから取る場合。
(A01)-A02 (B01)-B02 A03-C02 B03-D02 A04-C03 B04-D03 A05-C04 B05-D04 A06-C05 B06-D05
A07-C06 B07-D06 A08-C07 B08-D07 A09-C08 B09-D08 A10-C09 B10-D09 A11-C10 B11-D10
A12-C11 B12-D11 (A13)-C12 (B13)-D12 C01-A01 D01-B01 C13-A13 D13-B13
ここまでで28回
すでに取れたのは4ペア、残り22ペアなので、22回。28+22=50
同じ数字が2回目に出てから取る場合。
(A01)-(A02) (B01-A01) (B02-A02) (A03)-(C02) (B03-A03) (D02-C02) (A04)-(C03) (B04-A04) (D03-C03) (A05)-(C04)
(B05-A05) (D04-C04) (A06)-(C05) (B06-A06) (D05-C05) (A07)-(C06) (B07-A07) (D06-C06) (A08)-(C07) (B08-A08)
(D07-C07) (A09)-(C08) (B09-A09) (D08-C08) (A10)-(C09) (B10-A10) (D09-C09) (A11)-(C10) (B11-A11) (D10-C10)
(A12)-(C11) (B12-A12) (D11-C11) (A13)-(C12) (B13-A13) (D12-C12) (C01-D01) (C13-D13)
38回
239:デフォルトの名無しさん
10/05/01 11:44:13
はぁ?
>>232は3枚目まで待った場合に2枚目で取る場合より手数が増えるパターンなんだけど?
240:238
10/05/01 11:47:35
同意
241:デフォルトの名無しさん
10/05/01 11:49:47
わかってると思うけど>>239は>>235=>>237へのレスね
242:デフォルトの名無しさん
10/05/01 11:56:36
>>188の並びなら2枚目が一回目にめくられても3枚目以降に取っておいた方が、
その場で1・2枚目を取るよりも手数が少なくなる。
>>232の並びなら2枚目が一回目にめくられたら2回目で1枚目をめくって取ったほうが、
3枚目以降に取っておくより手数が少なくなる。
片方のやり方がもう一方のやり方より絶対少ないとはいいきれないので、
一概には言えないってのは正しい。
243:デフォルトの名無しさん
10/05/01 15:12:27
>>239
3枚目まで待つってどういう場合想定してる?
(1 2), (3 1)と引いたときに次に(1 1)を引くのは無駄だと言ってるだけで、
(1 2)の後に1引いたのに3枚目の1出るまで待てなんて気違いはいないぞ。
244:デフォルトの名無しさん
10/05/01 15:23:48
>>243
>>224-225はお前が言う気違いのやり方のことだし、
そのパターンで手数が減るのが>>188の並びなんだよw
理解してないならしゃしゃり出てくんなよ
245:デフォルトの名無しさん
10/05/01 15:53:22
def func(cards){
unknown = cards # まだ引いてない未知のカード
known = [] # 引いたので既知だがまだとってないカード
i = 1
while(unknown, knownがともになくなる){
if(unknownがまだある){
card1 = unknownから1枚引く
if(card1 と同じ数がknownにある){
card2 = knownからcard1と同じ数を取り出す
print '%2d: (%2d* %2d)' % (i, card1, card2)
}
else{
card2 = unknownから1枚引く
if(card1 != card2){
knownにcard1を追加
knownにcard2を追加
}
print '%2d: (%2d* %2d*)' % (i, card1, card2)
}
else{ # unknownがもうない
card1 = knownから1枚取り出す
card2 = knownからcard1と同じ数を取り出す
print '%2d: (%2d %2d)' % (i, card1, card2)
}
i += 1
}
}
C/C++コードじゃなく擬似コードだが、カード引く順番はこれよりも効率よくやる方法ある?
246:デフォルトの名無しさん
10/05/01 16:00:57
>>244
すまない。そんなバカがいることに気づかず>>174を出してしまった。
>>188のカードが3枚足りないことに気づかなかった君と同じくらいドジで申し訳ない。
247:デフォルトの名無しさん
10/05/01 16:03:42
上手く揚げ足とったつもりだろうけど、3枚どう追加してもかわんねーんだよw
248:デフォルトの名無しさん
10/05/01 16:09:25
ていうか、あんまり真面目によんでなかったけど、ほんとに>>224-225はそうやりたかったの?
読み直したら
225 名前:デフォルトの名無しさん [sage]: 2010/05/01(土) 06:37:06
2枚目をめくった時に3枚目を引いたら、4枚目が出るまでスルーな
での2枚目は、めくりの2枚目だから>>225は分かってるように思えるんだが。
めくりの1枚目とめくりの2枚目の区別をつけて、めくりの2枚目で引いたときに引き直さなくていいと言ってるなら
>>174やら>>235, >>237と同じ意見。
249:デフォルトの名無しさん
10/05/01 16:13:42
読んでないなら口出すなよ、頼むから。
>>222読めば>>224-225の意味はわかるだろ。
一々バカに説明する身にもなってくれ。
250:デフォルトの名無しさん
10/05/01 16:15:33
>>247
じゃあ、3枚追加したら何回になる?
>>188のカードに足りない5 12 13を追加して
君の方法で
1 2 3 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 3 12 4 13 4 5 6 7 8 9 10 11 12 13 5 4 6 7 6 8 7 9 8 10 9 11 10 12 11 13 5 12 13
を、46回よりも少なくできたのなら、俺が間違いだったことになる。
251:デフォルトの名無しさん
10/05/01 16:22:39
>>206
252:デフォルトの名無しさん
10/05/01 16:26:20
>>249
>>222は読みようがない。それまで話の流れ的に使われていた
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK
を使っていたとすれば、Q4 K4の後に5はこない。
253:デフォルトの名無しさん
10/05/01 16:34:02
(1 2) (3 1) (4 1) (5 1) [1 1] [1 1] (6 2) (7 2) (8 2) [2 2]
[2 2] (9 3) (10 3) (11 3) [3 3] [3 3] (12 4) (13 4) (5 6) (7 8)
(9 10) (11 12) (13 5) (4 4] [4 4] (6 6] (7 7] (6 6] (8 8] (7 7]
(9 9] (8 8] (10 10] (9 9] (11 11] (10 10] (12 12] (11 11] (13 13] (5 5]
(12 12] (13 13] [5 5]
>>252
これだから読解力のないバカは困る。
>>221の13~21手目は一回目にめくったときに一枚位置がわかってるものを取ってる。
それに対して否定してるんだから>>222=>>224-225の意図が>>174とかと別なのは明白。
254:デフォルトの名無しさん
10/05/01 17:28:05
>>253
うむ。俺の負けだな。ごめんよ。
255:デフォルトの名無しさん
10/05/01 18:05:01
なーんだ、前もって並びを知らない前提だと、常に最短の手を返すアルゴリズムは存在しないんだ。
KKKKQQQQJJJJ00009999888877776666555544443322 12 113312
KKKKQQQQJJJJ00009999888877776666555544443322 12 121133
この2つは残りの6枚までは、前から順にとりつづける他にない。
残り8枚のところから考えると
1 2 1 1 3 3 1 2
(1 2) (1 1] (1 3) (3 3] (1 1] (2 2] ←負けた人の戦略
(1 2) (1 1) (3 3) (1 1] (2 2] ←勝った人の戦略
1 2 1 2 1 1 3 3
(1 2) (1 1] (2 2] (1 1) (3 3) ←負けた人の戦略
(1 2) (1 2) [2 2] (1 1) [1 1] (3 3) ←勝った人の戦略
(1 2)の後の1引いた時点で残りの並び順をエスパーしないと、最短手は得られない。
256:デフォルトの名無しさん
10/05/01 18:10:56
探しているのは常に最短ではなく、(自分にとって)最悪なカードを引き続けた場合の最短…だよね?
257:デフォルトの名無しさん
10/05/01 19:29:32
>>256
そうなのだが、個人的にはなんだかつまらない。
258:デフォルトの名無しさん
10/05/01 20:19:00
初期配置は13*13*13*13*12*12*12*12* ... *2*2*2*2パターンか?
それを全部解かせるのは無理なので、
100回とかをシャッフルしたのを解いて、
平均手数の少なさを勝負?するとかは。
259:デフォルトの名無しさん
10/05/01 20:31:17
}else{ # unknownがもうない
4*4*4*4*3*3*3*3*2*2*2*2*1*1*1*1=331,776
unknownがもうないフラグを追加すれば動くと思う。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
260:デフォルトの名無しさん
10/05/02 15:59:01
>>151
シャッフルしたのを解き続けてみると43回っぽい。
1引き目からすぐにそろっているのを引くと46回が最大になる。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
261:デフォルトの名無しさん
10/05/02 17:59:26
>>188 の並びでやると、最大値が変わる
static int Num[]={0,1,2,0,3,0,4,0,5,1,6,1,7,1,8,2,9,2,10,2,11,3,12,3,4,5,6,7,8,9,10,11,12,4,3,5,6,5,7,6,8,7,9,8,10,9,11,10,12,4,11,12};
static int Mark[]={0,0,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,1,1,1,1,1,1,1,1,1,2,3,2,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,3};
r = Mark[c] * NUM_SUU + Num[c];
/* r = rand() % CARD_SUU;
if(make[r])
continue;
*/
[46回 平均46.00回 最大46回] (1枚目からそろいを取らない)
[46回 平均46.00回 最大46回] (1枚目からそろいを取る)
262:sage
10/05/02 22:09:28
>>261
ほんとそうなるね。
いくつかの数値の1つ目を1手目、2つ目以降を2手目で取らせて
4つを取れる事なく覚えてしまい、
1つ目に覚えているのを取らせているのか。(+→-とゲットしているターン)
だとやはり正解は46回なのかな。
それかアルゴリズムで工夫する余地があるのか。
263:デフォルトの名無しさん
10/05/02 23:40:09
46回より小さい回数(43回)で>>188の並びを解く手順が>>253にあるけど、
それをアルゴリズムとして定式化したときに、他のも46回未満で解けるかどうか。
試してみたところ、>>188は43回で出来たが他のは下手すりゃ50回越えたりした。
もっとアルゴリズムを改善すればできるのかもしれないが、できないかもしれない。
この問題を解くアプローチとしては、次のどちらか
・どんな札でも46回よりも少なく解ける取り方のアルゴリズムを開発してみる
・プレイヤーと、いじわるな運命の神様の2人プレイのゲームとみなして、
プレイヤーの行動に対し、常に最悪なカードを返しつづける神様のアルゴリズムを開発する
(最初から札を固定で与えるのじゃなくて、プレイヤーの行動によって次に出すカードを選ぶ)
になると思う。
264:デフォルトの名無しさん
10/05/03 01:07:35
>>263
>>253の技がよく分からん・・
そのアプローチは両方面白いな、試して見る。
265:デフォルトの名無しさん
10/05/03 08:43:31
問題、ドラクエのまんたんを実装せよ。
MP、回復量はホイミ2:20、ベホイミ5:75、ベホマ8:全快、ベホマラー15:75(全体)。
回復量に誤差はなし(難しくなるので)。
MPぱパーティー共通の物とし、少ないMPで全快させる。
表示のさせ方などは自由。
キャラの能力例
勇者/300 戦士/350 僧侶/250 魔法使い/200 (←キャラの名前、最大HP)
(↓現在HP)
1、250 350 210 200
2、210 350 150 200
3、250 300 200 150
4、280 300 050 150
次の問題は>>280
266:デフォルトの名無しさん
10/05/03 08:53:21
ナップサック問題?
267:デフォルトの名無しさん
10/05/03 09:35:14
ベホマラーを使うかどうかを最初に判断。
後は個別に一番MP消費の少ない魔法を選ぶ。
268:デフォルトの名無しさん
10/05/03 10:30:09
ベホマラーを2回の使ったほうがいい場合は?
269:デフォルトの名無しさん
10/05/03 10:42:54
まず、ベホマラーなしでの最小MP消費を考える。
次に、ベホマラー1回での最小MP消費を考える。
次に、ベホマラー2回での最小MP消費を考える。
この中で最小のものを答えとする。
なお、ベホマラー3回以上はありえない(ベホマ*4の方が少なくなるから)
270:デフォルトの名無しさん
10/05/03 10:46:06
ベホマラー1回のときのMPがベホマラーなしのときのMPより多くて
ベホマラー2回がベホマラーなしよりMPすくなくなる場合なんてあんの?
271:268
10/05/03 11:32:43
>>270 (↓現在HP)
150 200 100 50
272:デフォルトの名無しさん
10/05/03 20:57:29
>>265
URLリンク(kansai2channeler.hp.infoseek.co.jp)
使い勝手の悪いところがあります。直せる方は教えてください。
273:デフォルトの名無しさん
10/05/04 01:19:30
>>272
問題は正解!
ベホマラー3回は無い事や、ベホマよりベホイミ+ホイミ
の方がMPが少ない事も考慮されててgood。
使いにくくはなかったけど、HP入力ボックスの右か下に
/300とかと最大HPを表示するといいかも。
後、結果がメインウィンドウとMsgBox両方に表示されるが、
メインウィンドウの方は表示が途中できれてしまう。
274:272
10/05/04 14:39:51
(修正しました)タブキーで移動したいのですが、やり方をご存知の方居ませんか?
URLリンク(kansai2channeler.hp.infoseek.co.jp)
275:デフォルトの名無しさん
10/05/04 21:17:15
以下 loopyなループ
=== 開始 ===
276:デフォルトの名無しさん
10/05/05 03:20:55
She never eats NONI.
277:デフォルトの名無しさん
10/05/05 07:52:30
loopy goopy
278: ◆5yaOF3KA5w
10/05/05 17:45:05
うむ
279:デフォルトの名無しさん
10/05/06 04:04:32
五月病の季節
280:デフォルトの名無しさん
10/05/06 10:43:13
亀だが>>1やってみた
【C言語歴】 2年
【レベル】 ゲーム製作やってるぐらい
【コンセプト】 慣れた方法で。
#include <iostream>
#include <vector>
const static int NUM_SIZE = 5;
void main()
{
std::vector<int> intContiner;
int temp = 0;
int sum = 0;
std::cout << "5つ数を入力して下さい。" << std::endl;
for( int i = 0 ; i < NUM_SIZE ; ++i )
{
std::cout << i + 1 << "番目入力" << std::endl;
std::cin >> temp;
intContiner.push_back( temp );
}
std::cout << "5つ数の合計" << std::endl;
std::vector<int>::iterator itr = intContiner.begin();
for( ; itr != intContiner.end() ; ++itr )
{
sum += (*itr);
}
std::cout << sum << std::endl;
std::cout << "5つ数の平均" << std::endl;
std::cout << sum / NUM_SIZE << std::endl;
}
281:デフォルトの名無しさん
10/05/06 12:44:44
>>280
tempは入力ループでしか使わないのだから、関数の先頭で宣言するのはバグの元。
sumは計算ループ以降でしか使わないのだから、関数の先頭で宣言するより直前で宣言した方が見通しがいい。
C流でやると言うのなら別に止めはしないが、iの宣言だけはポリシーに反することになるので美しくない。
あと、void main()よりもint main()の方が一般的だ。
↓以下main()の戻り値の型についてのいつもの議論w
282:デフォルトの名無しさん
10/05/06 12:48:54
>>281
イテレータの宣言位置が変態なのは指摘漏れ?w
処で、>280は切り捨てられた平均値なんだね。小数点以下一桁まで欲しくね?
283:デフォルトの名無しさん
10/05/07 22:53:42
なんで const static int で宣言するんだ?
メモリ無駄だろ。
しかも表示のところは 5 決め打ちだし。
284:デフォルトの名無しさん
10/05/08 01:06:15
> メモリ無駄だろ。
アホか?
285:デフォルトの名無しさん
10/05/08 02:29:33
>>283
知らないなら書かなくていいんだよ。
286:デフォルトの名無しさん
10/05/08 16:45:35
>>283
流石にワロタ
287:デフォルトの名無しさん
10/05/08 21:53:40
>>283の人気に嫉妬
というかどうみても釣り
288:デフォルトの名無しさん
10/05/11 06:01:52
>>274
ここのでできるかも。
URLリンク(www.sm.rim.or.jp)
289:デフォルトの名無しさん
10/05/13 21:04:22
>>283の前半はアレだけど、後半は同意する。
290:デフォルトの名無しさん
10/05/13 21:23:42
なんでお前ら揃って悪意に解釈してんだ?
俺は>>283じゃないけどさ
すぐ揚げ足とって茶化すのだけは得意だな
もうちょっと意味、意図を汲み取る努力しろよ
お前らみたいなのと仕事したくないな正直
291:デフォルトの名無しさん
10/05/13 21:25:52
私女だけどコンソールのちょっとしたプログラムなのに
「メモリが無駄(キリッ」とか言ってる男の人って恥ずかしいと思う。
いつの時代のPC使ってるんだろ?きもーい
292:デフォルトの名無しさん
10/05/13 22:28:22
お前みたいなのがこうやって死んで会社や社会に迷惑掛けるんだよ
スレリンク(newsplus板)
スレリンク(newsplus板)
293:デフォルトの名無しさん
10/05/14 01:17:43
>>290
悪意に解釈もなにも、メモリ無駄にならないのになるって書いてあるんだもん。
294:デフォルトの名無しさん
10/05/14 02:42:33
>>291
あんたの方がよっぽどきもい。
295:デフォルトの名無しさん
10/05/14 09:25:57
拙者の彼女をプログラムしてくれでござる
296:デフォルトの名無しさん
10/05/15 11:26:35
> iの宣言だけはポリシーに反することになるので美しくない。
どゆこと?
297:デフォルトの名無しさん
10/05/15 12:57:01
>>296
また古いものをw
>280では、以下の例外を除く変数は全て関数の先頭で宣言している。
但し、ループ制御のiだけはC99やC++でしか通用しない宣言を使っている。
また、>282でも指摘されているが、イタレータもブロックの途中で宣言している。
こういうのをポリシーがないというのだろ。
298:デフォルトの名無しさん
10/05/18 21:33:58
うちも今更>>2をやってみる
【C++言語歴】約10年。
【レベル】いわゆるサンデープログラマ。主にフリーソフト制作等。
【コンセプト】 シンプルに。
【コメント】STLコンテナは簡潔に表記する為にある。本題でvector使うのは逆効果。
#include <iostream>
#include <iterator>
int main()
{
using namespace std;
const int numberOfNumbers = 5;
// 入力
cout << "数字を" << numberOfNumbers << "個入力" << endl;
istream_iterator<double> it(cin);
double sum = *it;
for (int i = 1; i < numberOfNumbers; ++i) sum += *++it;
double average = sum / numberOfNumbers;
// 出力
cout << "合計: " << sum << endl;
cout << "平均: " << average << endl;
// 終わり
return 0;
}
299:デフォルトの名無しさん
10/05/18 21:36:56
【問題2:ワード覆面算】
入力された任意の8文字以内の単語2つからワード覆面算を作成せよ
入力された単語に含まれない文字は適当な記号を用いて表示すること
ただしそれぞれの覆面算は単一の解を持つものとし"浮き"は認めない
【難易度】
80分で中級
【入力例】
バナナ
バナナ
【出力例】
バナナ+バナナ=ナナ◎ [ 499+499=998 ]
バナナ+バナナ=○ナナナ [ 500+500=1000 ]
バナナ+バナナ=△△バ◇ [ 577+577=1154 ]
バナナ+バナナ=△△ナ◎ [ 599+599=1198 ]
バナナ+バナナ=ナ△△△ [ 611+611=1222 ]
バナナ+バナナ=△▽※バ [ 688+688=1376 ]
バナナ+バナナ=△ナ△○ [ 755+755=1510 ]
バナナ+バナナ=△☆バ※ [ 788+788=1576 ]
バナナ+バナナ=△ナ☆◇ [ 877+877=1754 ]
バナナ+バナナ=△◎ナバ [ 899+899=1798 ]
バナナ+バナナ=△バ△○ [ 955+955=1910 ]
【補足】
上記はWikipediaの例"バナナ+バナナ=シナモン"に合わせただけであり
入力される単語2つが同じとは限らない
300:デフォルトの名無しさん
10/05/18 21:42:41
かなりの良スレの予感がするけど自分にはついてけないぜ・・・
301:298
10/05/18 22:01:47
覆面算を解く問題はたまに見かけるのでちょっとひねって作成のほうにしてみました。
前回の出題よりは品質あげたつもりなんですがどうでしょう。
80分は作者が実際に解くのにかかった時間が基準なので異論は認めません。
302:デフォルトの名無しさん
10/05/21 03:07:45
using namespace std;
ヒェー。
303:デフォルトの名無しさん
10/05/21 05:47:06
>>302
それを使うことの弊害を知りつつ使ってるのなら、無駄に恐れることはない。
おまじないのように付けてるのならタダのバカだけど、
おまじないのように避けてる人とそう変わらんよ。
304:デフォルトの名無しさん
10/05/21 12:43:18
>>302
標準ライブラリ以外のライブラリは使っていないのだから
故意にcoutという変数を定義するようなことをしない限り名前は衝突しない
#include <iostream>してるんだから構文解析はそこで終わっていて
std名前空間にcoutの定義を探しにいっても追加のコストはほどんどない
と考えて記述が短くなる方を選んでるんだけど何か問題ありますか
305:デフォルトの名無しさん
10/05/21 13:16:46
nothing
306:デフォルトの名無しさん
10/05/21 15:38:45
おまじないのように付けてるタダの馬鹿ですんません・・・
307:デフォルトの名無しさん
10/05/22 15:39:29
>>299
バナナ+バナナ
099+099=198(○ナ○)
100+100=200(○ナナ)
とかは不成立?