◆◆エレガントプログラミングコンテスト◆◆

このエントリーをはてなブックマークに追加
73デフォルトの名無しさん:02/01/02 13:33
最大の完全数を見つけよう。
もちろん、多倍長計算アルゴリズムを利用して。
最大の完全数を見つけるアルゴリズムと、見つけた数を報告。

ちなみに、約数を全て足すと自分を超えてしまうような数の
出現状況をしらべてみてごらん。75%あたりに漸近するから。
理由はわからないけど、ちょっとおもろかった。
>>72
LISP で数十行で書けたと思う。
昔大学の授業でやった。
>>68
優先度と結合規則とオペレータのテーブル作るやりかたがある。
スタック使うけど。
7668:02/01/03 01:15
>>75
それよさそう
何か配列とかで作ったスタックとループ使って関数1個でできて
規則のデータを用意するだけでいいって感じか・・
イイ・・
7768:02/01/03 01:30
あー使えるーー
うまいフレームワークみたいなのつくればlex,yaccいらずになりそうだ
78デフォルトの名無しさん:02/01/04 01:31
お題希望age
自分で考えろ。
80デフォルトの名無しさん:02/01/04 03:34
>>78
つーか、お題でてませんか?
81デフォルトの名無しさん:02/01/04 04:32
>>68
つーか、lex,yaccに吐かせたコードをフレームワークにすればどー?
82デフォルトの名無しさん:02/01/04 15:22
ttp://harry.cciflorida.com/HTML3/home/work/samplecode/quicksort.html
クイックソートを4行で書くコンテストらしい。
8378:02/01/04 16:14
>>80
すんません・・
今あるお題をもっとがんばってみる・・・
84デフォルトの名無しさん:02/01/05 19:54
個人的にプログラムでエレガントと言えるのはウイルスだと思ってるんだがどうかね?
最小限のソースコードで最大限の効果。これ以上のプログラムは無いだろう。
最小限かどうかは…
あ====
>>84
「効果=余人を驚かせる事」と考えるのは
まさにDQNの発想そのものだと思うが・・・

まともな奴なら「効果」という言葉に
もっと別の意味を見出すものだ。
期待age
89デフォルトの名無しさん:02/02/05 21:06
最初のお題はどうなった?
90デフォルトの名無しさん:02/02/05 22:19
int i;
:
:
if((i & (i - 1)) == 0 && i != 0){
//iは2のべき乗
}else{
//iは2のべき乗でない
}
91デフォルトの名無しさん:02/02/06 17:38
>68の方法キボーン
演算子のトークンを渡してそれで分岐するとか。
93デフォルトの名無しさん:02/04/05 00:48
age
>>68 >>91
アルゴリズムというか、単にステートマップ作って入力に沿って遷移させるだけじゃん。
ふつう演算子ごときで再帰処理しないって。
95デフォルトの名無しさん:02/04/05 06:57
めんどくさいだけで工夫のしようがないお題はいや。
96デフォルトの名無しさん:02/04/05 08:43
>>94
ん? ハードウエアのスタックを使わないって意味なのか?
状態遷移だけではどうあがいても解決できない問題だと思うが。
>>96
LALR勉強してみろ
>>96
定義は再帰的に行うけど、実際の構文解析では再帰はしないぞ
9986:02/04/05 19:35
>>97-98
ハァ? わざわざ「ハードウエアのスタックは」って断り書きをつけたんだけど?
LR解析器も自前のスタックをしっかり使っているだろうが?

電波なのか、読解力が無いのか、はたまた単なる無知なのか・・・
お題はいつも>>1が出すんですか?
そうだとしたら>>1が支配してるみたいで嫌だ!
Sage
101      :02/04/05 21:03
>>100 そんなことないです
102デフォルトの名無しさん:02/04/05 21:59
>>94
だいたいLRとか持ち出す前に,再帰下降ですむならそっちを使うと思うが.
103デフォルトの名無しさん:02/04/05 22:04
じゃぁお題。

「お題を出すプログラムを書け」エレガントな解答を求む
>>103
#include <stdio.h>
main(){printf("お題");}
@echo お題
106>>103:02/04/05 23:04
どっかの雑誌みたいな書き方すんなよ..
107デフォルトの名無しさん:02/04/05 23:07
プログラムのソースコードと全く同じ文を出力するソースを書け.
>>107
そのネタはトリッキーなコードすれで出てたはず。
http://pc.2ch.net/test/read.cgi/tech/983191866/
実際にそういうプログラムはエレガントなのでなくトリッキーなだけだし
このスレのお題には相応しくないと思う。
「エレガントな言語で書くコンテスト」ですか?
110デフォルトの名無しさん:02/04/06 02:16
お題:論理パズル自動解析プログラム

いわゆる「正直者とウソツキ」のパズルです。ただし、本格的にやると
複雑っぽいので、以下の制約を設けます。
・登場人物は3人(A, B, C)。
・標準入力から3行分読み込み、各行を個人の発言とします
  (1行目は A の発言、2行目は B の発言、3行目は C の発言)。
  また、構文は解析の手間を省く為、逆ポーランド記法とします(詳細は以下の通り)。
      発言 -> 主張 '\n'
      主張 -> 論理和 | 論理積 | 否定 | 個人
      論理和 -> 主張 主張 '|'
      論理積 -> 主張 主張 '&'
      否定 -> 主張 '!'
      個人 -> 'A' | 'B' | 'C'
・個人の発言より推論を行い、正直者の名前を出力する事で回答します。
・推論が不可能な場合はその旨を出力します。
・なお、関数型言語の使用は禁止とします。(w

例)
  入力:"A!BC&&B!AC&&|C!AB&&|\nA!AB!C!&&BA!C!&&|CA!B!&&|&\nB\n"
      A:この中で、二人だけが正直者だ。
      B:いや、一人だけだ。
      C:その通り。
  出力:""
      全員ウソツキ
111デフォルトの名無しさん:02/04/06 04:40
面白そうなお題ですが、なんで関数型言語はダメなの?
論理型言語がダメならともかく…。
>>110
試しに作ってみたが、「エレガントさって何?」という
根源的な疑問にぶちあたってしまった‥
push マムコ
push ティムポ
>>113
>>112に対する回答かね?
可読性
>>111 >>110の例だとLisp系の処理系を使えば簡単すぎるからだろ
エレガントというより汗くさいな(w 長いし。

#include <stdio.h>

#define HERROR(s) do {fprintf(stderr,"error: %s\n",(s));exit(1);} while (0)
#define STAT_MAX 256
#define NUM_PERSON 3
#define STACK_MAX 64

typedef char honesty_t ; /* honesty type 0:DISHONEST 1:HONEST */

typedef struct Stack {honesty_t a[STACK_MAX] ; int d ;} Stack ; /* stack */
void Stack_init(Stack *s) { s->d = 0 ; }
int Stack_size(const Stack *s) { return s->d ; }
honesty_t Stack_pop(Stack *s) { return s->a[--(s->d)] ; }
void Stack_push(Stack *s, honesty_t h) { s->a[s->d++] = h ; }

int infer(char (* const stats)[STAT_MAX], const honesty_t *assumption) {
const char *ptr ;
int i ;
Stack stack ;

for (i = 0 ; i < NUM_PERSON ; ++i) {
Stack_init(&stack) ;
for (ptr = stats[i] ; *ptr != '\0' ; ++ptr) {
switch (*ptr) {
case '\r': case '\n': case '\t': case ' ':
break ;
case 'A': case 'B': case 'C':
Stack_push(&stack, assumption[*ptr - 'A']) ; break ;
case '!':
Stack_push(&stack, Stack_pop(&stack) ^ 1) ; break ;
case '|':
Stack_push(&stack, Stack_pop(&stack) | Stack_pop(&stack)) ; break ;
case '&':
Stack_push(&stack, Stack_pop(&stack) & Stack_pop(&stack)) ; break ;
default:
HERROR("unexpected input") ; break ;
}
}
if (Stack_size(&stack) != 1) HERROR("syntax error") ;
else if (Stack_pop(&stack) != assumption[i]) return 0 ;
}
return 1 ;
}
118117の続き:02/04/06 07:01
nt main(int argc, const char **argv) {
char stats[NUM_PERSON][STAT_MAX] ;
honesty_t assumptions[NUM_PERSON] ;
int i, j, answer = -1 ;

for (i = 0 ; i < NUM_PERSON ; ++i) fgets(stats[i], STAT_MAX, stdin) ;
for (i = 0 ; i < (1 << NUM_PERSON) ; ++i) {
for (j = 0 ; j < NUM_PERSON ; ++j) assumptions[j] = ((i >> j) & 1) ;
if (infer(stats, assumptions)) {
if (answer == -1) answer = i ;
else goto INDET ;
}
}
if (answer == -1) goto INDET ;
printf("ans.: ") ;
for (i = 0 ; i < NUM_PERSON ; ++i)
if ((answer >> i) & 1) printf("%c ", 'A' + i) ;
putchar('\n') ;
return 0 ;
INDET:
puts("Indeterminable...") ;
return 0 ;
}

/* 終わり */
>>112
これってA、B、Cの真理値を与えると入力の式の真理値を
計算するスタックマシンを作ったらほぼ出来上がりだと考えていいの?
120112=117:02/04/06 12:05
>>119
112が自分だと気づかなくて放置してしもた、スマソ。
仕様的にはそうだと思う。総当たりで推定して、スタックマシンに検証
させる。ただそこから如何に「エレガント」に味付けしていくかじゃない?
121デフォルトの名無しさん:02/04/06 12:36
レゾリューション期待age
122119
>>120
なるほど。よくわかりました。返答ありがとうございます。
まずは後置表現のスタックマシンによる計算処理をつくって
それから、エレガント化というわけですね。
俺のように脳みそのしわが足りないやつは、とりあえず
スタートラインにならべるかどうかがしりたかっただけです。