トップページ⇒tech
44コメント14KB

最小行で逝ってみる。(C言語)

■ このスレッドは過去ログ倉庫に格納されています
0001稲垣事故"朗NGNG
<お題:小町算>
1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
これらの数の間に+、−、何も入れないという演算子をいれて、計算
する。そして、計算結果が100になる組み合わせを、すべて表示する
プログラムを作成せよ。100になるのは、12とうりのはず。
(夏休みの課題だ。今のところ27行。)
<注意>
1行に2文以上書かない。
ヘッダー、DLL,COM,など、ソースレベルおよびバイナリレベルの外部ルーチン
は禁止する。
ソースコードは、すべてカウントする。(コメント、ヘッダなど)
プログラムは、コンソールアプリケーションとする。
入出力は、ストリーム入出力を使用する。

誰かたすけて〜。小町算中毒に・・・
0002デフォルトの名無しさんNGNG
君なりに27行で書けたならそれで良いじゃないか。
課題なんだし自分でやったのを胸を張って提出すれば?
0003デフォルトの名無しさんNGNG
>>1
>何も入れないという演算子

ごめん、それなに?
2 3 だったら二十三ということ?
0004デフォルトの名無しさんNGNG
>入出力は、ストリーム入出力を使用する。

これだとタイトルの(C言語)というのはウソになるね・・・。
0005デフォルトの名無しさんNGNG
>>4
演算部はCで実装しろってことじゃない?
何の意味があるのかわからないが。
0006旧態依然NGNG
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int i, s, sign[10];
 long n, x;
 for (i = 1; i <= 9; i++) sign[i] = -1;
 do {
  x = n = 0; s = 1;
  for (i = 1; i <= 9; i++)
   if (sign[i] == 0) n = 10 * n + i;
   else {
    x += s * n; s = sign[i]; n = i;
   }
  x += s * n;
  if (x == 100) {
   for (i = 1; i <= 9; i++) {
    if (sign[i] == 1) printf(" + ");
    else if (sign[i] == -1) printf(" - ");
    printf("%d", i);
   }
   printf(" = 100\n");
  }
  i = 9; s = sign[i] + 1;
  while (s > 1) {
   sign[i] = -1; i--; s = sign[i] + 1;
  }
  sign[i] = s;
 } while (sign[1] < 1);
 return EXIT_SUCCESS;
}
0007デフォルトの名無しさんNGNG
[1] 1+2+3+4+5+6+7+8*9 = 100
[2] 1+2+3-4+5+6+78+9 = 100
[3] 1+2+3-4*5+6*7+8*9 = 100

[99] 123-4-5-6-7+8-9 = 100
[100] 123+45-67+8-9 = 100
[101] 123-45-67+89 = 100
0008デフォルトの名無しさんNGNG
Googleで検索したらわんさかでてくるな。2chで聞かないでも
どうにでもなる話なんじゃないのか?
0009デフォルトの名無しさんNGNG
>>1
12通りじゃ幾らなんでも少なすぎでしょ。正解が出てこそナンボ、
不正解プログラムが短くても意味無いと思う。

>これらの数の間に+、−、何も入れないという演算子をいれて

と"数の間"いうことは、数式先頭のマイナス符号は無効なのかね?
その場合101通り。先頭のマイナスを認めれば162通りか。
0010デフォルトの名無しさんNGNG
>>9
符号は正負だけらしいよ・・・(笑
0011デフォルトの名無しさんNGNG
6 はgcc だと通らない。
0012デフォルトの名無しさんNGNG
>これらの数の間に+、−、何も入れないという演算子をいれて
「数の間」が課題なら、答えは11通りだね。先頭の単項演算を考慮して12通り。
>>1の出題内容と自己の解はアンマッチ。
00131です。NGNG
先頭の単項演算を考慮して12通りでした。
あと、何も入れないとは78とか123とかです。
説明不足でもうしわけありません。
私は6さんの考え方に近いです。
「自分でやれ!」という意見もあるかと思いますが、ごもっともです。
考え込んで2週間がたちました。27行から減りません。
夏休みもあとわずかになりました。どうかお力を貸してください。
よろしくお願い致します。
0014デフォルトの名無しさん01/08/26 22:43ID:.2cACfus
>>13
なんか>>2と同じことを書くけど、何行だかしらんがとにかく
自分で書けたなら、それで十分じゃないかと思うのだが。
0015デフォルトの名無しさん01/08/27 17:01ID:NEa0N4C6
そう。そして、自分の実力はこの程度なのだと実感し、
さらに精進に励むのだ。
0016デフォルトの名無しさん01/08/27 17:54ID:cXXJEOdY
7行スレで訊いてみては如何
0017デフォルトの名無しさん01/08/27 18:09ID:q21zzpHo
>>161
7行スレで聞いておいだされたんじゃなかったっけ?
0018デフォルトの名無しさん01/08/27 18:23ID:cXXJEOdY
>>17 そんなこととはつゆ知らず失礼
0019デフォルトの名無しさん01/08/28 01:14ID:WV78peY2
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void){
  long i,j,k,flag,sum,temp,n = 0;
  char sz[128];
  for(i=0;i<(long)pow((double)3,(double)9);i++){
    flag = sum = temp = *sz = 0;
    for(j=0;j<9;j++){
      k = i / (long)pow((double)3,(double)j) % 3 - 2;
      if(j==0 && k==0) break;
      sum = (k==-1) ? sum : (sum + temp * (flag + 1));
      flag = (k==-1) ? flag : k;
      temp = (k==-1) ?(temp * 10 + (j + 1)) : (j + 1);
      *(long *)(sz + strlen(sz)) = (k==-1) ? ('1' + j) : (0x2B - k) + ('1' + j) * 0x100;
    }
    if((sum + temp * (flag + 1))==100) printf("%04d %s = 100\n",++n,sz);
  }
  return 0;
}
0020芥01/08/28 01:40ID:MUWorKro
#include<stdio.h>
char s[]=" 1 2 3 4 5 6 7 8 9 =100";
int p=0;
void S(int d, int e, int a, char x)
{
  s[(d-1)*2]=x;
  if(++d>9){
    if(e+a==100)printf("[%2d]%s\n",++p,s);
    return;
  }
  S(d, e+a, d, '+');
  S(d, e+a, -d, '-');
  S(d, e, 10*a+(a>0?d:-d), ' ');
}
int main()
{
  S(1, 0, 1, ' ');
  S(1, 0,-1, '-');
  return 0;
}
00211です。01/08/28 17:00ID:mSc.uT8s
19さん、20さん、すごいですね。
僕はこういうやり方はまったく思いつきませんでした。
なぜ、このようなやり方でできるのか、どうすれば問題が解決するのか
など大変勉強になります。自分もお二人のプログラムを参考にして、
自分のアルゴリズム能力を向上させていきたいです。
それにしてもすごいですね!!
0022デフォルトの名無しさん01/08/28 18:51ID:QKtRe60g

>>20
FreeBSDのgccではできない

% gcc 20.c
20.c: In function `S':
20.c:6: syntax error before character 0241
%
0023デフォルトの名無しさん01/08/28 19:00ID:iPf.P.c2
>>1
行を少なくするというのは
アルゴリズムの本質的な部分と関係ない所の話になってくるので
やっても(無駄とはいわないが)アルゴリズムの勉強にはならないと思う。
0024デフォルトの名無しさん01/08/28 19:49ID:zBr23uZA
>>22
お前はコンパイルエラー読めないのか?
0025デフォルトの名無しさん01/08/29 17:12ID:7WZsAq3s
>>1
おまえH○L性だろ。
教師にちくるぞ
0026デフォルトの名無しさん01/08/29 17:30ID:jrovamws
>>25
H∀L生だな
0027デフォルトの名無しさん01/08/29 18:12ID:7WZsAq3s
>>1は自分で考えろ。卑怯者。
そのまんま出すとバレるぞ。
0028デフォルトの名無しさん01/08/30 23:07ID:RU9JH1Zg
19をちょっと分かりやすくしてみたよ。endianにも非依存。
#include <stdio.h>
#include <string.h>
long s[3] = { 0, 1, -1 };
char sgn[3] = {0, '+', '-'};
int main()
{
 long k, n=0;
 for (k = 0; k < 3*3*3*3*3*3*3*3*3; k++) {
  long i, l, c, x=0, d=0;
  char buf[256], *p = buf;
  for (i = l = 1; i <=9; i++, l *= 3) {
   d = (c = (k/l)%3) ? (x += d, s[c] * i) : (d * 10 + (d < 0 ? -i : i));
    (!c || ( *p++ = sgn[c] )) && (*p++ = ('0'+i)) && (*p=0);
  }
  if ((k%3) && x + d == 100) {
   printf("[%d] %s=%d\n", ++n, buf, x+d);
  }
 }
}
0029デフォルトの名無しさん01/08/31 23:14ID:VrhfaGck
>>27おまえも卑怯だな。(笑)
そのまんま出すわけね〜だろボヶ〜〜〜。
0030デフォルトの名無しさん01/08/31 23:35ID:QT9TNDFg
>>29
変数かえてもアルゴリズムが同じで結局バレ(藁
小町算もわからんようなアホゥには何言っても無駄。
0031パル生01/09/01 00:54ID:oskLLM56
オレもいただきます(w
あまり人にみられたくないのでsage進行でいこうぜ。
0032デフォルトの名無しさん01/09/01 01:15ID:ezoDv4b.
>>30
おいおいアルゴリズムなんざどれだけでもかえれるぜ。
発展させていけばいいんだよ。
変数しか変えれないおまえといっしょにするな。
0033 ◆VWlu9kUo 01/09/01 01:19ID:fASDrxFw
>>32
× 変えれない
○ 変えられない
0034デフォルトの名無しさん01/09/01 01:23ID:ezoDv4b.
おっと。
わりぃ。わりぃ。
0035デフォルトの名無しさん01/09/02 16:59ID:udxJtb/c
俺もいただき。
どうせ大半のやつらはネットに落ちているソースを改造するのだから。
0036デフォルトの名無しさん01/09/02 22:26ID:4dvhJnlM
そのまんま出してバレたとしたら
先生が2ちゃんねらってこともバレますね。
0037デフォルトの名無しさん01/09/02 23:10ID:8MD0AtR2
>>36
もう先生はここ知ってるよ。
0038デフォルトの名無しさん01/09/03 09:10ID:9o60VuWE
#include <con>
0039○岡01/09/04 16:42ID:PtDZjrVA
ちゃんとわかってます。
0040教師01/09/06 12:44ID:7NJjKkl.
今日、生徒に教えられてここに来てみました。
他人のソースプログラムを真似(類似)した生徒は減点対象にします。
もちろんココのソースプログラムも減点対象です。
0041教師01/09/06 12:47ID:7NJjKkl.
インターネットに落ちているソースプログラムも減点対象です。
0042デフォルトの名無しさん01/09/06 16:55ID:H3TaFPTk
どっかの問題集からパクッた問題を出すのも減点じゃ
0043デフォルトの名無しさんNGNG
これって、問題の書き方が悪いのでもっと短くなる。
>1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
>これらの数の間に+、−、何も入れないという演算子をいれて、計算
>する。
はい、机上で計算しましょう。
>そして、計算結果が100になる組み合わせを、すべて表示する
>プログラムを作成せよ。
はい、机上の計算結果を表示するルーチンのみをプログラムで作成
しましょう。
6行でできるぞ。
#include <stdio.h>
int main()
{
  printf("答え(机上で計算した結果を書いてね)\n");
  return 0;
}
あいまいな問題を出したほうが悪いので上記でも正解になるはず。
0044デフォルトの名無しさんNGNG
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=999580349&ls=50

>>43
屁理屈言って楽しいか?
■ このスレッドは過去ログ倉庫に格納されています