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


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

いろんな言語で宿題スレ 第三編



1 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 09:57:19 ]
第二編も512Kbyte越えで終了しました。
前スレで未解決な課題は順次このスレにコピーします。

101 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:06:03 ]
>>100
焦ってしまって、精神的にコメントを入れてる余裕がなくなるw
人に見られないうちに書き換えようって。
ところで、findall/3は奇妙な仕様になっていて、
  findall(_残高,残高(複利,30,_元金,_複利の利率,_,_残高),L1),
  findall(_残高,残高(単利,30,_元金,_単利の利率,_,_残高),L2),
でも通ってしまう。
この目標が終了する時にこの中で使われている変数の束縛を解いてしまう。
好ましい表現ではないと思うから、避けるようにしているけど。

102 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:24:51 ]
# [1] 授業単元:Prolog基礎
# [2] 問題文(含コード&リンク):カラムとして、電話番号と氏名を持つ
# 電話帳テーブルがある。この中で同姓同名が最も多い氏名を探せ。


103 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 09:17:55 ]
>>102
% Prolog
'カラムとして、電話番号と氏名を持つ電話帳テーブルがある。この中で同姓同名が最も多い氏名'(_氏名ならび) :-
  findall(_氏名,clause(電話帳(_,_氏名),_),_氏名ならび),
quicksort(_氏名ならび,_整列された氏名ならび),
同姓同名が最も多いもの(_整列された氏名ならび,0,[],_氏名ならび).

同姓同名が最も多いもの(_整列された氏名ならび,_これまでの最大数,_氏名ならび1,_氏名ならび).
整列された氏名ならび=[A|R1],
要素の連続数(1,A,R1,X,R2),
最大値は(A,X,_これまでの最大値,_更新された最大値,_氏名ならび1,_氏名ならび2),
同姓同名が最も多いもの(R2,_更新された最大値,_氏名ならび2,_氏名ならび),!.
同姓同名が最も多いもの(_,_,_氏名ならび,_氏名ならび).

最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名]) :- X @> _これまでの最大値,!.
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名|_氏名ならび]) :- X = _これまでの最大値,!.
最大値は(_,_,_これまでの最大値,_これまでの最大値,_氏名ならび,_氏名ならび).

要素の連続数(X,A,[],X,[]) :- !.
要素の連続数(X,A,[B|R],X,[B|R]) :- \+(A==B),!.
要素の連続数(M,A,[A|R1],X,R) :- M2 is M + 1,要素の連続数(M2,A,R1,X,R).

104 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 09:20:30 ]
>>102 書き直し。
% Prolog
'カラムとして、電話番号と氏名を持つ電話帳テーブルがある。この中で同姓同名が最も多い氏名'(_氏名ならび) :-
  findall(_氏名,clause(電話帳(_,_氏名),_),_氏名ならび),
  quicksort(_氏名ならび,_整列された氏名ならび),
  同姓同名が最も多いもの(_整列された氏名ならび,0,[],_氏名ならび).

同姓同名が最も多いもの(_整列された氏名ならび,_これまでの最大数,_氏名ならび1,_氏名ならび).
  整列された氏名ならび=[A|R1],
  要素の連続数(1,A,R1,X,R2),
  最大値は(A,X,_これまでの最大値,_更新された最大値,_氏名ならび1,_氏名ならび2),
  同姓同名が最も多いもの(R2,_更新された最大値,_氏名ならび2,_氏名ならび),!.
同姓同名が最も多いもの(_,_,_氏名ならび,_氏名ならび).

最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名]) :- X @> _これまでの最大値,!.
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名|_氏名ならび]) :- X = _これまでの最大値,!.
最大値は(_,_,_これまでの最大値,_これまでの最大値,_氏名ならび,_氏名ならび).

要素の連続数(X,A,[],X,[]) :- !.
要素の連続数(X,A,[B|R],X,[B|R]) :- \+(A==B),!.
要素の連続数(M,A,[A|R1],X,R) :- M2 is M + 1,要素の連続数(M2,A,R1,X,R).


105 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 09:32:12 ]
>>104
ふたつ気になることがあります。
一つは、テーブルからの取得をclause/2で行っていること。本体(条件)を
殺しているのですが、電話番号による種別の判定など意味のあるケースも
想定できると思います。
二つめは、同一人が複数の回線を持つのは普通のことだから、カラムに
住所まで加えて、それも氏名+住所をキーにしなくてはいけないのではないか。
これは問題の不備ということになります。


106 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 09:43:09 ]
>>105
問題がテーブルとありますから、やはり単位節のみと考えるべきなんでしょうね。
いきなり、条件部の記述によって自動発信してしまうケースなどを懼れました。
それから時刻を調べて週末だけはこの電話とか。

107 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 11:46:20 ]
>>35  使用言語: 十進BASIC
FOR o=1 TO 9
FOR s=0 TO 9
IF o<>s THEN
FOR a=0 TO 9
IF o<>a AND s<>a THEN
FOR k=0 TO 9
IF o<>k AND s<>k AND a<>k THEN
FOR y=0 TO 9
IF o<>y AND s<>y AND a<>y AND k<>y THEN
FOR t=0 TO 9
IF o<>t AND s<>t AND a<>t AND k<>t AND y<>t THEN
IF (o+k)*10000+(s+y)*1000+(a+o)*100+(k+t)*10+a+o=t*10000+o*1000+k*100+y*10+o THEN
PRINT USING "# # # # # + # # # # # = # # # # #":o,s,a,k,a,k,y,o,t,o,t,o,k,y,o
END IF
END IF
NEXT T
END IF
NEXT Y
END IF
NEXT K
END IF
NEXT A
END IF
NEXT S
NEXT O
END
実行結果
3 2 0 4 0 + 4 1 3 7 3 = 7 3 4 1 3

108 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 12:06:26 ]
>>37 (>>35) 訂正追加。
% Prolog 定義を一節増やします。

加算表の一(A,B,1,D) :- 加算表(1,A,1,E),加算表(E,B,_,D).
加算表の一(A,B,C,D) :- 加算表(1,A,0,E),加算表(E,B,C,D).


109 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 14:40:16 ]
# [1] 授業単元:Prolog基礎
# A社の組織として営業部、総務部があります。営業部は営業一課、営業二課にわかれています。
# 総務部も人事課と経理課にわかれています。管理情報として所属テーブル、給与テーブルがあります。
# [所属テーブル]
# 部,  課,   ,社員名
# 営業部,営業一課,岡部
# 営業部,営業二課,小野
# 営業部,営業二課,鹿戸
# 営業部,営業二課,小泉
# 総務部,人事課,大崎
# 総務部,経理課,嶋田
# 総務部,経理課,宮田
# [給与テーブル]
# 社員名,給与
# 岡部,300000
# 小野,250000
# 鹿戸,280000
# 小泉,350000
# 大崎,200000
# 嶋田,400000
# 宮田,200000
# [問題] 部・課、部をそれぞれキーとして給与額を集約して合計した
# 部・課集約テーブル、部集約テーブルを作り出す述語を定義しなさい。



110 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 16:42:37 ]
>>109
% Prolog (その一) 一般化できる部分のみ。集約データの収集/3,_述語/_アリティに対応する述語定義
% データベースの項目に関する情報述語と集約項目に関する述語が別に必要。

集約述語の生成(_述語/_アリティ,_集約述語ならび) :-
  findall(_集約キー,集約キーの生成(_述語/_アリティ,_集約キー),_集約キーならび),
  集約述語の生成(_述語/_アリティ,_集約キーならび,_集約述語ならび).

集約述語の生成(_述語/_アリティ,[],[]) :- !.
集約述語の生成(_述語/_アリティ,[_集約キー|R1],[_集約述語名/_アリティ2|R2]) :-
  concat_atom(_集約キー,'・',_集約述語名),
  length([_|_集約キー],_アリティ2),
  集約データの収集(_述語/_アリティ,_集約キー,_集約データならび),
  集約データの定義(_集約述語名,_集約データならび),
  集約述語の生成(_述語/_アリティ,R1,R2).

集約データの定義(_,[]) :- !.
集約データの定義(_集約述語名,[_集約データ|R]) :-
  P =.. [_集約述語名|_集約データ],
  assertz(P),
  集約データの定義(_集約述語名,R).

集約キーの生成(_述語/_アリティ,_集約キー) :-
  集約項目(_述語/_アリティ,L),
  append(L1,_,L),
  \+(L1=[]).

111 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 17:04:52 ]
>>102 使用言語: J
data=:noun define
0123456789 山田一郎
1234567890 鈴木二郎
2345678901 伊藤三郎
3456789012 山田一郎
4567890123 伊藤一郎
5678901234 山田一郎
)
]a=:cutopen<;._2 data
+----------+------------+
|0123456789|山田一郎|
+----------+------------+
|1234567890|鈴木二郎|
+----------+------------+
|2345678901|伊藤三郎|
+----------+------------+
|3456789012|山田一郎|
+----------+------------+
|4567890123|伊藤一郎|
+----------+------------+
|5678901234|山田一郎|
+----------+------------+
f=:0{(~.\:#/.~)
f 1{"1 a
+------------+
|山田一郎|
+------------+
f >1{"1 a
山田一郎

112 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:08:14 ]
>>110 (>>109)
% Prolog (その二) 具体的なテーブルを。あと、集約データの収集述語定義をすればよい。

所属(営業部,営業一課,岡部).
所属(営業部,営業二課,小野).
所属(営業部,営業二課,鹿戸).
所属(営業部,営業二課,小泉).
所属(総務部,人事課,大崎).
所属(総務部,経理課,嶋田).
所属(総務部,経理課,宮田).

給与(岡部,300000).
給与(小野,250000).
給与(鹿戸,280000).
給与(小泉,350000).
給与(大崎,200000).
給与(嶋田,400000).
給与(宮田,200000).

集約項目(所属/3,[部,課]).

述語構造(所属/3,1,部).
述語構造(所属/3,2,課).
述語構造(所属/3,3,社員名).
述語構造(給与/2,1,社員名).
述語構造(給与/2,2,給与).

113 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:08:07 ]
>>19
使用言語: J

f=:monad def'((":y),'' = '',":@{.,'' * '',":@}.)"1~./:~"1|:(,:y&%)>:I.0=y|~>:i.y'
f 120
120 = 1 * 120
120 = 2 * 60
120 = 3 * 40
120 = 4 * 30
120 = 5 * 24
120 = 6 * 20
120 = 8 * 15
120 = 10 * 12

114 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:03:04 ]
パズルでもやってみる?

2,0,1,0 の4個の数字をこの順番で1回だけ使い、0から99の数字を作れ。
演算子、関数の使用は自由。



201^0 -> 1

115 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:34:04 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/486
# [1] 授業単元:C言語プログラミング
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10312.txt
# ソケットを用いて,課題1のプログラムを以下のように改良する.
#
# サーバとクライアントに分割し,ユーザーはクライアントを用いて操作内容を入力し,その内容をサーバに送信する.
# それを受信したサーバは,その内容を基にファイルを操作する.必要であれば,サーバは結果をクライアントに送信し,クライアントはそれを受信して表示する.
# 機能ルーチンはサーバ側に実装し,課題1で作成した関数を改良し用いること
#


116 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:45:07 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/487
# [1] 授業単元:計算機入門及び演習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10311.txt
#
以下の問題を解くプログラムをC言語を用いて作成しなさい.

AさんとBさんは点数が書かれたカードを何枚か持っている. AさんのカードとBさんのカ
ードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つカード合計点数が
等しくなるようにしたい.
このときどのカードとどのカードを交換したらよいか.ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする.

入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられる.
n m
s1
s2
...
sn
sn+1
sn+2
...
sn+m
各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, n はAさんのカードの枚数,m はBさんのカードの枚数を表す.続く n+m 行には,各カードの
点数が 1 行にひとつずつ並ぶ.最初の n 個の点数 (s1 から sn まで) はAさんのカードの点数,残りの m 個の点数 (sn+1 から sn+m まで) はBさんのカードの点数を表す.
n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする.入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される.

各データセットに対し,Aさん,Bさんの交換前のすべてのカードと交換すべき2つのカードを出力すること.形式は特に問わない(実行例を参考にすること).
なお,合計を等しくするようなカードの交換の方法が複数ある場合は,交換するカードの点数の和が最小となるもののみを出力すること.
また,カードの点数の合計を等しくするような交換が存在しない場合はその旨を出力すること.

117 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:41:33 ]
>>114
使用言語: maxima
15までできたけど、結構、大変。

0 201*0;
1 2-0-1-0;
2 20/10;
3 2+0+1+0;
4 fix(sqrt(20.10));
5 ceiling(sqrt(20.10));
6 fix(sqrt(20.10));
7 fix(exp(2.010));
8 ceiling(exp(2.010));
9 ceiling(exp(2.0)+1.0);
10 fix(exp(2.0)+exp(1.0));
11 ceiling(exp(2.0)+exp(1.0));
12 2+0+10;
13 ceiling(exp(sin(2.0))+10);
14 fix(sqrt(201.0));
15 ceiling(sqrt(201.0));

118 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 15:12:17 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/489
# [1] 授業単元:
# 画像解析
# [2] 問題文(含コード&リンク):
# 画像を、好きな倍率で大きくしたり小さくしたりするプログラムを作成してください


119 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:18:38 ]
>>30  使用言語: 十進BASIC
FUNCTION 組合せの数(n,r)
LET a=1
LET b=n
FOR i=2 TO r
LET a=a*i
LET b=b*(n-i+1)
NEXT I
LET 組合せの数=b/a
END FUNCTION

PRINT 組合せの数(35,3)*組合せの数(15,2)/組合せの数(50,5)
PRINT 組合せの数(35,4)*組合せの数(15,1)/組合せの数(50,5)
PRINT 組合せの数(35,2)*組合せの数(15,3)/組合せの数(50,5)
PRINT "組み込み関数combを使った場合"
PRINT comb(35,3)*comb(15,2)/comb(50,5)
PRINT comb(35,4)*comb(15,1)/comb(50,5)
PRINT comb(35,2)*comb(15,3)/comb(50,5)
END

実行結果
.324352451433858
.370688515924409
.127775208140611
組み込み関数combを使った場合
.324352451433858
.370688515924409
.127775208140611



120 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:28:47 ]
>>114
使用言語: maxima

(%i182) makelist(i,i,fix(sin(%pi)),fix(apply("^",reverse([2.0,10]))+cos(%pi)));
(%o182) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99]

121 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:03:28 ]
>>114
使用言語: 十進BASIC

DEF f(n)=n*n-n/n
FOR i=z TO f(20-10)
PRINT i
NEXT I
END

122 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 01:44:55 ]
>>114
使用言語: Arc

arc> (apply range (map [-(* _ _)(/ _ _)] (list(expt 2 0) 10)))
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99)

123 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 02:02:20 ]
>>114
使用言語: J

i. ,~ 20 - 10
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99

124 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 08:55:53 ]
>>114
使用言語: Haskell

Prelude> init $ (\[a,b]->[a..b]) $ map(^2)[0,10]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,
29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,
55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]

125 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 11:03:55 ]
pc12.2ch.net/test/read.cgi/tech/1258320456/79
# Windows XP上で、
# まず 同じディレクトリにあるsetting.iniを読み込んで
# その1行目, 2行目, 3行目を
# 文字列p, regex, aftに格納する。
# pをパスとして調べ、
# 1.実在するディレクトリだったらそのディレクトリの名前とサブディレクトリの名前と、
# それらの中にあるファイルの名前、およびファイルの中身に以下の置換作業を実行する。
# > 前からみて順に正規表現regexにマッチする文字列を全てaftに置換する。
# 2.実在しないディレクトリでなかったらエラーメッセージを標準出力に出力する。

126 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 11:25:43 ]
>>114
使用言語: Scilab

-->a=2;[0:(10^a-a/a)]

127 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:48:55 ]
>>125
% Prolog では正規表現は使わないので、その代わり以下のような述語を作っておく。

探索目標を真とする副文字列を置換文字列に置換(_文字列,_対象文字ならび,_探索目標,_置換文字列,X) :-
  findall(S,探索目標を真とする副文字列を置換文字列に置換の一(_文字列,_対象文字ならび,_探索目標,_置換文字列,S),X).

探索目標を真とする副文字列を置換文字列に置換の一(_文字列,_対象文字ならび,_探索目標,_置換文字列,S) :-
  atom_chars(_文字列,Chars),
  探索目標を真とする文字ならびを得る(Chars,L1,_対象文字ならび,_探索目標,L3),
  atom_chars(A1,L1),
  atom_chars(A3,L3),
  concat_atom([A1,_置換文字列,A3],S).

探索目標を真とする文字ならびを得る([],L1,L2,_探索目標,L3) :- !,fail.
探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,L3) :-
  append(L1,L2,L3,L),
  _探索目標.
探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,X) :-
  変数指定項複写(_探索目標,_探索目標2,[L2],[L4]),
  append(L11,L2,31,L),
  _探索目標,
  探索目標を真とする文字ならびを得る(L31,L1,L4,_探索目標2,X).

128 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:29:25 ]
>>114
使用言語: Io

Io> list(2-0,10)reduce(a,b,b**a)repeat(v, v println)

129 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 01:18:56 ]
>>114
使用言語: Io

Io> (20-10)squared repeat(v, v println)



130 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 06:12:33 ]
>>127 (>>125) かなりの大間違い。訂正。
% Prolog では正規表現は使わないので、その代わり以下のような述語を作っておく。L1,L3が加わり、益々意味不明になってきた。

探索目標を真とする副文字列を置換文字列に置換(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,X) :-
  findall(S,探索目標を真とする副文字列を置換文字列に置換の一(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,S),X).

探索目標を真とする副文字列を置換文字列に置換の一(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,S) :-
  atom_chars(_文字列,Chars),
  探索目標を真とする文字ならびを得る(Chars,L1,_対象文字ならび,_探索目標,L3),
  atom_chars(A1,L1),
  atom_chars(A3,L3),
  concat_atom([A1,_置換文字列,A3],S).

探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,L3) :-
  append(L1,L2,L3,L),
  _探索目標.

131 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 06:32:32 ]
>>130 使い方の例。
% 行頭に「私は」を挿入。
?- 探索目標を真とする副文字列を置換文字列に置換(嘘を申しません,[],[],L3,true,私は,X).
L3 = _141192,
X = ['私は嘘を申しません']

% "d.f" を"aaa"に置換
?- 探索目標を真とする副文字列を置換文字列に置換(abcdefgdufz,_,[d,_,f],_,true,aaa,X).
_ = _141192,
_ = _141193,
_ = _141200,
X = [abcaaagdufz,abcdefgaaaz]

% "b"と"f"の間にありその中に"d"を2つ含む文字列をaaaに置換
?- 探索目標を真とする副文字列を置換文字列に置換(abcdefgdufz,_,L2,_,(append([b],LY,[f],L2),count(member(d,LY),2)),baaaf,X).
_ = _141192,
L2 = _141193,
_ = _141194,
LY = _141197,
X = [abaaafz]

132 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:22:02 ]
>>131
Prologでは実際にこんな述語を呼び出して検索や置換を行うものですか?


133 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:57:48 ]
>>132
一般にどうかはわからない。私の場合はcall/1を使って汎用述語を作ることは
絶対と言っていいほどしない。したがってここでは課題として書いてみたが、
>>130のような定義述語を利用することはない。少々煩わしくても、検索が必要に
なった時に一つ述語を定義する。
このスレでは、一度に書き込める行数に制限があるので、何度も使用された
述語を「汎用」のものとみなして定義なしに、呼び出している場合も多い。
これはやむを得ずそうしているのであって、それが模倣すべきプログラムスタイルだ
などと考えないでほしい。

134 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:15:59 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/496
# [1] 授業単元: C++実習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10313.txt
# 問題2
# 個々のオブジェクトにint型の識別番号を与える(全オブジェクトに異なる整数値を与える)ように以下のクラスを書き換えよ。
# また書き換えたクラスがテストできる適切なmain関数も作成せよ。
# class Account {
# string name; //口座名義
# string no; //口座番号
# long balance; //預金額
# Date open; //口座開設日
#
# public:
# Account(string n, string num, long z, Date op);
#
# void Deposit(long k); //預ける
# void Withdraw(long k); //おろす
#     string GetName() const { return name; } //口座名義を調べる
# string GetNo() const { return no; } //口座番号を調べる
# long CheckBalance() const { return balance; } //預金額を調べる
#     Date OpeningDate() const { return open; } //口座開設日を調べる
# }


135 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 04:05:03 ]
pc12.2ch.net/test/read.cgi/tech/1235561034/679
# [授業単元] : Prolog
# 知恵を貸してください。
# 今宿題で嫉妬深い恋人たちの問題をやっていて
# 初期状態とゴール状態をそれぞれ
# initial_state(jealousy, jealousy(left,[1,2,3],[1,2,3],[ ],[ ])).
# final_state(jealousy(right,[ ],[ ],[1,2,3],[1,2,3])).
# と作って指し手の移動と状態変化についてはかけたのですが
# 状態変化したときの合法性のチェックでつまっています。
# legal(jealousy(right,[[1],[1,2]], [[2,3],[3]]) ×
# legal(jealousy(left,[[2,3],[2,3]], [[1],[1]])  ○
# としたいのですがどうしたらいいのでしょうか?


136 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 04:26:43 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/536
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
#   課題1資料 ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10318.txt
#   課題1    ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10319.txt
#   課題1応用 ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10320.txt
# 京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータ(kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10318.txt)がある。
# 区の名前,人口,面積のデータを格納しなさい。
# 人口についてソートした結果,面積についてソートした結果を出力する。
#
# 区の名前,人口,面積のてデータを格納し,格納したデータを調べて以下の情報を出力するプログラムを作成しなさい。
# 人口が最大の区と最小の区の、名前と人口。
# 面積が最大の区と最小の区の、名前と面積。
# 人口密度が最大の区と最小の区の、名前と人口密度。
# Kita 124306 94.92
# Kamigyo 83082 7.11
# Sakyo 168133 246.88
# Nakagyo 100145 7.38
# Higashiyama 41659 7.46
# Yamashina 136769 28.78
# Shimogyo 74897 6.82
# Minami 97877 15.78
# Ukyo 201819 291.95
# Nishikyo 155973 59.20
# Fushimi 284812 61.62

137 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 06:56:21 ]
>>136
% Prolog
'京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'('ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10318.txt').

区の名前,人口,面積のデータを格納する :-
  '京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'(_ウェブサイト),
  get_split_lines(_ウェブサイト,[' '],Lines),
  member([_区の名前,_人口,_面積],Lines),
  assertz('京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積)),
  fail.
区の名前,人口,面積のデータを格納する.

人口についてソートする(_整列されたデータならび) :-
  findall([_人口,_区の名前,_人口,_面積],'京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),L),
  sort(L,L1),
  降順に並べ直しながら鍵項目の削除する(L1,[],_整列されたデータならび).

面積についてソートする(_整列されたデータならび) :-
  findall([_面積,_区の名前,_人口,_面積],'京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),L),
  sort(L,L1),
  降順に並べ直しながら鍵項目の削除する(L1,[],_整列されたデータならび).

降順に並べ直しながら鍵項目を削除する([],X,X) :- !.
降順に並べ直しながら鍵項目を削除する([[_|L]|R],Y,X) :-
  降順に並べ直しながら鍵項目を削除する(R,[L|Y],X).

138 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 06:58:38 ]
>>137 (>>136) 改行してはいけないところで折り返してしまった。
% Prolog

'京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'('ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10318.txt').


139 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 07:00:53 ]
>>138
どうしても、ダメだね。勝手に改行が入ってしまう。"ある"の後の改行は
ないことにして下さい。



140 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 07:14:48 ]
>>137 訂正
% Prolog Lines -> _区の名前・人口・面積ならび

区の名前,人口,面積のデータを格納する :-
  '京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'(_ウェブサイト),
  get_split_lines(_ウェブサイト,[' '],_区の名前・人口・面積ならび),
  member([_区の名前,_人口,_面積],_区の名前・人口・面積ならび),
  assertz('京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積)),
  fail.
区の名前,人口,面積のデータを格納する.


141 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 08:14:28 ]
>>136
% Prolog

人口が最大の区と最小の区の、名前と人口(_人口が最大の区の名前,_人口が最大の区の人口,_人口が最小の区の名前,_人口が最小の区の人口) :-
  findmax([_人口,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_人口,_),[_人口が最大の区の人口,_人口が最大の区の名前),
  findmin([_人口,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_人口,_),[_人口が最小の区の人口,_人口が最小の区の名前).

面積が最大の区と最小の区の、名前と面積(_面積が最大の区の名前,_面積が最大の区の面積,_面積が最小の区の名前,_面積が最小の区の面積) :-
  findmax([_面積,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_,_面積),[_面積が最大の区の面積,_面積が最大の区の名前),
  findmin([_面積,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_,_面積),[_面積が最小の区の面積,_面積が最小の区の名前).

人口密度が最大の区と最小の区の、名前と人口密度(_人口密度が最大の区の名前,_人口密度が最大の区の人口密度,_人口密度が最小の区の名前,_人口密度が最小の区の人口密度) :-
  findmax([_人口密度,_区の名前],(京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),_人口密度 is _人口 / _面積),[_人口密度が最大の区の人口密度,_人口密度が最大の区の名前),
  findmin([_人口密度,_区の名前],(京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),_人口密度 is _人口 / _面積),[_人口密度が最小の区の人口密度,_人口密度が最小の区の名前).

142 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 08:38:12 ]
>>141
ほとんどの場合これで済ませてしまいますが、本当は正しくない。
これだと、同一の人口、面積、人口密度が生じた時、名前の小さいまたは大きいもの
が採られてしまいます。正しい処理は、

人口が最大の区と最小の区の、名前と人口(_人口が最大の区の名前,_人口が最大の区の人口,_人口が最小の区の名前,_人口が最小の区の人口) :-
  findmax(_人口,京都市の区ごとの人口と面積のデータ(_,_人口,_),_最大の人口),
  findall([_区の名前,_最大の人口],京都市の区ごとの人口と面積のデータ(_区の名前,_最大の人口,_),L1),
  findmin(_人口,京都市の区ごとの人口と面積のデータ(_,_人口,_),_最小の人口),
  findall([_区の名前,_最小の人口],京都市の区ごとの人口と面積のデータ(_区の名前,_最小の人口,_),L2),
  member([_人口が最大の区の名前,_人口が最大の区の人口],L1),
  member([_人口が最小の区の名前,_人口が最小の区の人口],L2).

% なら、人口が同一の区があっても正しく解が得られます。




143 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 13:54:46 ]
pc12.2ch.net/test/read.cgi/tech/1197620454/553
# (問題)
# 社員データを一元管理するためのサーバークライアントシステムを作れ
# 要求仕様)
# 管理するデータは社員番号、氏名、所属、入社年月日
# クライアントから追加、削除、修正が行えること
# 管理データはCSV形式で保存すること


144 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 22:13:02 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/557
# [1] 授業単元: 情報数学
# [2] 問題文(含コード&リンク):
# オイラー級数を用いて、πの近似値を求めよ。

145 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 22:21:57 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/545
# [1] 授業単元:基礎プログラミング実習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.j
p/cgi-bin/joyful/img/10325.txt
# Step 3. 不偏分散を求める次の関数を定義する.
# float variance(float data[], int n) .この関数は,data[]配列に入っている
# n個のデータの不偏分散を求め,関数値としてその不偏分散値を返す.
# なお,不偏分散の計算に必要な平均値は,関数average()を呼び出して求めること.


146 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 22:24:19 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/546
# [1] 授業単元: プログラミング応用
# [2] 問題文(含コード&リンク):
# 任意の奇数n(nは15以下)を入力しn×nの魔方陣を出力する。
# そして、作成した魔方陣の縦、横、斜めの合計値も同時に出力せよ。
# ただし、1は必ず一番左の列の真ん中に置くこと。
# (例)
# n=3の時
#           15
#   6  7  2 15
#   1  5  9 15
#   8  3  4 15
#  15 15 15 15



147 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 06:34:05 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/547
# [1] 授業単元: 情報数学
# [2] 問題文(含コード&リンク):
#
# 問)同時整数関係を見つけるプログラムを考えなさい。
# 整数の解を求めるプログラムと、複素数の解を求めるプログラムを考え、
#  それを組み合わせることで両方の解を同時に求め示すプログラムについて考えなさい。


148 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 06:39:51 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/545
# [1] 授業単元:基礎プログラミング実習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10325.txt
# 一問目
#
# Step 1. scanf()を用いてfloat型の値を入力し,それを順番にdata[]配列に格納する.
# このdata[]配列は関数の呼び出し側で宣言するものとし,宣言した配列の要素数(入力可能なデータの最大個数)をmaxとして関数を呼び出すものとする.
# また,この関数は,データ入力数が最大のmax個に達するか,負値が入力されるまでデータ入力を繰り返すものとする.

149 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 06:43:39 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/545
# [1] 授業単元:基礎プログラミング実習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10325.txt
# Step 2. 平均値を求める次の関数を定義する. float average(float data[], int n)
# この関数は, data[]配列に入っているn個のデータの平均値を求め,関数値としてその平均値を返す.



150 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 07:01:06 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/692
# 【 課題 】キーワードからクロスワードを完成させる
# ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/867.zip
# 【 形態 】Javaアプリケーション(main()で開始
# <template>
#
# ■2□■■
# 1■□□□
# □□□■■
# 4■□□■
# ■□□3□
#
# <縦のかぎワード>
# コオリ
# ニホンカミ
# モモ
#
# <横のかぎワード>
# ウニ
# オデン
# ホクロ
# アミモノ
# カモ

151 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 07:45:45 ]
pc11.2ch.net/test/read.cgi/db/1252492296/381
# 弁護士の名前(name)とその人の所属法律事務所の名称(ofic)から成るテーブルがあるとして、
# 法律事務所は弁護士がひとりしかいないところから300人以上いるところまでさまざまなので、
# 「所属する弁護士の数が多い事務所トップ10」 の事務所名と人数を select一発で表示させるには
# どうすればいい?
#


152 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 19:57:09 ]
>>151
% Prolog は集約は得意としない。その場でこの述語を考えるのは負担が大きいので、
% 以下のような準備が必要だろう。SQLのcount(*)を解決する処理だが。

集約_数_逆順ならび([],L,L) :- !.
集約_数_逆順ならび([A|R1],L1,L) :-
  \+(member([_,A],L1)),
  集約_数_計測(A,R1,L2,1,Count),
  逆順整列([Count,A],L1,L3),
  集約_数_逆順ならび(L2,L3,L),!.

集約_数_計測(_,[],[],Count,Count) :- !.
集約_数_計測(A,[A|R1],L2,Count1,Count) :-
  Count2 is Count1 + 1,
  集約_数_計測(A,R1,L2,Count2,Count),!.
集約_数_計測(A,[B|R1],[B|R2],Count1,Count) :-
  \+(A = B),
  集約_数_計測(A,R1,R2,Count1,Count),!.

逆順整列(L,[],[L]) :- !.
逆順整列(L,[L1|R1],[L,L1|R1]) :-
  L @>= L1,!.
逆順整列(L,[L1|R1],[L1|R2]) :-
  逆順整列(L,R1,R2).

153 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:45:33 ]
>>151
使用言語:J
ofic=:;:'b a b b a a c d g h c x r t a d c g j u y w q'
]ofic=:ofic,;:'g v c f g v a d e x n u y t y r t a s w'
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|b|a|b|b|a|a|c|d|g|h|c|x|r|t|a|d|c|g|j|u|y|w|q|g|v|c|f|g|v|a|d|e|x|n|u|y|t|y|r|t|a|s|w|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10{.\:~(~.,.~<@#/.~)ofic
+-+-+
|6|a|
+-+-+
|4|g|
+-+-+
|4|c|
+-+-+
|3|y|
+-+-+
|3|t|
+-+-+
|3|d|
+-+-+
|3|b|
+-+-+
|2|x|
+-+-+
|2|w|
+-+-+
|2|v|
+-+-+

154 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 05:15:18 ]
>>152 (>>151)
% Prolog 逆順ではなかった。降順だね。

集約_数_降順ならび([],L,L) :- !.
集約_数_降順ならび([A|R1],L1,L) :-
  \+(member([_,A],L1)),
  集約_数_計測(A,R1,L2,1,Count),
  降順整列([Count,A],L1,L3),
  集約_数_降順ならび(L2,L3,L),!.

集約_数_計測(_,[],[],Count,Count) :- !.
集約_数_計測(A,[A|R1],L2,Count1,Count) :-
  Count2 is Count1 + 1,
  集約_数_計測(A,R1,L2,Count2,Count),!.
集約_数_計測(A,[B|R1],[B|R2],Count1,Count) :-
  \+(A = B),
  集約_数_計測(A,R1,R2,Count1,Count),!.

降順整列(L,[],[L]) :- !.
降順整列(L,[L1|R1],[L,L1|R1]) :-
  L @>= L1,!.
降順整列(L,[L1|R1],[L1|R2]) :-
  降順整列(L,R1,R2).

155 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 05:37:34 ]
>>151
% Prolog

所属する弁護士の数が多い事務所トップ10(L) :-
  findall(_所属法律事務所,弁護士所属(_弁護士の名前,_所属法律事務所),L1),
  集約_数_降順ならび(L1,[],L2),
  length(L,10),
  append(L,_,L2).


156 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 07:10:58 ]
>>147
同時整数関係 -> 同次整数関係

であるとの訂正が出題スレに載っていました。


157 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 07:18:35 ]
>>151
使用言語:Io

Io> ofic:="b a b b a a c d g h c x r t a d c g j u y w q"
Io> ofic=ofic .. "g v c f g v a d e x n u y t y r t a s w"
Io> ofic=ofic split

Io> ofic uniqueCount sortBy(block(x,y,x at(1)>y at(1)))slice(0,10)
==> list(list("a", 6), list("c", 4), list("b", 3), list("d", 3), list("g", 3),
list("y", 3), list("t", 3), list("v", 2), list("r", 2), list("w", 2))

158 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 07:28:00 ]
>>109
% Prolog 出題から離れますが、2次元のリストの指定された列を取り出すユーティリティは

全ての行に対して位置指定により列を選択する(_,[],[]) :- !.
全ての行に対して位置指定により列を選択する(_選択する列位置ならび,[_行|R1],[L|R2
]) :-
  列の選択(_選択する列位置ならび,_行,L),
  全ての行に対して位置指定により列を選択する(_選択する列位置ならび,R1,R2).

列の選択([],_,[]) :- !.
列の選択([_列位置|R1],_行,[A|R2]) :-
  integer(_列位置),
  list_nth(_列位置,_行,A),
  列の選択(R1,_行,R2),!.
列の選択([A|R1],_行,R2) :-
  \+(integer(A)),
  B は A,
  integer(B),
  列の選択([B|R1],_行,R2),!.
列の選択([A|R1],_行,[B|R2]) :-
  \+(integer(A)),
  B は A,
  \+(integer(B)),
  列の選択(R1,_行,R2),!.

159 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 08:04:41 ]
>>158
list_nthは使わないで、第一引数を先にソートしてからやった方がいいと思う。




160 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 08:08:27 ]
>>159
列の選択の第二・三節で変な事をやっているので、ソートできないw

161 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 08:13:24 ]
そういうことか。それにしても危なっかしい仕様だな。


162 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 09:34:39 ]
>>12
使用言語:Scala

scala> def f1(n:Int):Int={var r=0;var a=n;while(a>0){r=10*r+a%10;a/=10};r}
f1: (Int)Int

scala> f1(987654321)
res72: Int = 123456789

scala> def f2(n:Int):Int={n.toString.reverse.toInt}
f2: (Int)Int

scala> f2(987654321)
res73: Int = 123456789

163 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 11:40:11 ]
>>144
使用言語:J

%:6*+/%2^~>:i.1000000
3.14159

164 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 12:24:50 ]
>>144
使用言語:Io

Io> r:=0;for(i,1,1000000,r=r+1/(i*i));(r*6)sqrt
==> 3.1415916986605086

165 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 16:24:30 ]
>>159
>>160 のような呑気なレスをつけてしまったが、取り出す順序が勝手に変わって
しまっては、後でmember/2などで取り出す時どうすればいいのかな?

166 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 17:10:15 ]
pc11.2ch.net/test/read.cgi/db/1252492296/377
#
# Aテーブル
# aaa|ddd
#
# Bテーブル
# aaa|bbb
#
# Cテーブル
# bbb|ccc
#
# Aテーブルに対して、カラムaaaでBテーブルが紐づき、
# Bテーブルに対して、カラムbbbでCテーブルが紐づくとします。
# (つまり、Aテーブルのレコード1件は、Bテーブルを経由してCテーブルのレコード1件と紐づく)
# ここで、A.ddd = 'X'のとき、C.ccc = 'Y'に更新したいのですが
# 下記の文であってますでしょうか?
# また、もっと効率のいい方法はありますでしょうか?
#
# update C set C.ccc = 'Y' where C.bbb in
# ( select B.bbb from B where B.aaa in
#  ( select A.aaa from A where A.ddd = 'X')
#  ( select A.aaa from A where A.ddd = 'X')
# )

167 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 17:17:02 ]
>>166
% Prolog

?- 'A'(A,'X'),'B'(A,B),(retract('C'(B,_)),fail;assertz('C'(B,'Y'))).

168 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 18:03:23 ]
>>167 (>>166)
% prolog (retract('C'(B,_)),fail;assertz('C'(B,'Y'))) の部分を

update(P,Q) :-
  functor(P,F,A),
  functor(Q,F,A),
  ( retract(P),fail;assertz(Q)).

が定義されているとして、

?- 'A'(A,'X'),'B'(A,B),update('C'(B,_),'C'(B,'Y')).

169 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 19:30:52 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/695
# ime.nu/www1.axfc.net/uploader/Img/so/69253.jpg
# ime.nu/www1.axfc.net/uploader/Img/so/69254jpg
# 問題
# 次の画面のように、サーバとクライアントでの間で文字列を送り合う
# プログラムを作れ(サーバとクライアント両方とも)
#
# 【クライアント】      【サーバ】
# サーバのアドレスは     ポートは
# 202.48.53.27        12345
# ポートは          名前は
# 12345            syou
# 名前は           aikawa>Hello
# aikawa           syou>Hello
# aikawa>Hello
# syou>Hello
# aikawa>
#
# ただし、以下の条件を満たすようにすること
# クライアントでquitが入力された場合、クライアントは接続を切りプログラムを
# 終了し、サーバは接続が切れたら、次のクライアントの接続を待つ。
# サーバでquitが入力された場合、サーバは接続を切り、次のクライアントの
# 接続を待ち、クライアントは接続が切られたらプログラムを終了する
# エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を
# 入力させて、その文字列を送るようにする



170 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 00:05:28 ]
>>144
使用言語:Scilab

-->sqrt(6*sum(1.0 ./((1:1000000)^2)))
ans =

3.1415917

171 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 07:52:32 ]
>>144
使用言語:Haskell

Prelude> sqrt $ 6*(sum[1/(x*x)|x<-[1..1000000]])
*** Exception: stack overflow

Prelude> sqrt $ 6*(sum[1/(x*x)|x<-[1..500000]])
3.141590743731832

172 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 11:56:40 ]
>>151
使用言語:R

> ofic <- "b a b b a a c d g h c x r t a d c g j u y w q"
> ofic <- paste(ofic,"g v c f g v a d e x n u y t y r t a s w")
> ofic <- unlist(strsplit(ofic," "))

> head(sort(table(ofic),T),10)
ofic
a c g b d t y r u v
6 4 4 3 3 3 3 2 2 2

173 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 10:09:29 ]
>>116
% Prolog データ入力部分は省略

カードの合計が一致するまででたらめにN回以内交換する(0,_,_,_,_,[]) :- !,fail.
カードの合計が一致するまででたらめにN回以内交換する(N,AL,BL,AL,BL,[]) :-
  加算(AL,Sum1),
  加算(BL,Sum2),
  Sum1 = Sum2.
カードの合計が一致するまででたらめにN回以内交換する(N,AL,BL,X,Y,[[A,B,AL,BL]|Z]) :-
  RA is (random mod 3) + 1,
  RB is (random mod 3) + 1,
  ならびの回転(左方向,RA,AL,[A|R1]),
  ならびの回転(左方向,RB,BL,[B|R2]),
  N1 is N - 1,
  カードの合計が一致するまででたらめにN回以内交換する(N1,[B|R1],[A|R2],X,Y,Z).


174 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 15:52:03 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/572
# [1] 授業単元: 5元:プログラミング演習III
# 問題(5)
# 実行するとカラーダイヤログを表示し、選択したカラーをクリップボードに
# 送る処理を記述せよ

175 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 20:05:10 ]
>>174
使用言語:なでしこ

「#{HEX(色選択)}」をコピー

176 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 20:33:14 ]
>>174
使用言語:J

wd 'clipcopy "',(":3{.". wd 'mbcolor'),'"'

177 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 07:18:22 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/575
# [1]C言語入門
# [2]2つの複素数の和と積を計算して表示するプログラムを作成せよ。
# 構造体complexを定義し、和の複素数を返すadd関数、積の複素数を返すmul関数、複素数を表示するprint関数をそれぞれ作成し
# mainでは2つの複素数をキーボードから読み込み、関数を呼ぶ。
# 虚数部にはiを付加せよ。

178 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 07:29:05 ]
pc11.2ch.net/test/read.cgi/db/1252492296/393
# SELECT文について質問です。
# テストデータ
# 名前 |1回目点数|2回目点数|
# ----+--------+--------|
# 田中 | 100    | 90     |
# 鈴木 | 80      | 80     |
#
# 成績マスタ
# 成績 | 点数 |
# ----+-------|
# A   | 100   |
# B   |  90   |
# C   |  80   |
# ・欲しい結果
# 名前 |成績(1回目)|成績(2回目)|
# ----+---------+---------|
# 田中 | A     | B     |
# 鈴木 | C     | C     |
# ・説明 2TABLEを連結してSELECTしたいのですが、テストデータの点数を
# 下に、成績マスタから(1回目)と(2回目)の値をひっぱってくるには
# どう書けばよいでしょうか。


179 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 07:41:15 ]
>>178
% Prolog 引数を順に処理する場合、それぞれ副目標を明示的に立てる。

テストデータ(田中,100,90).
テストデータ(鈴木,80,80).

成績マスタ('A',100).
成績マスタ('B',90).
成績マスタ('C',80).

欲しい結果(_欲しい結果) :-
  findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回目成績),_欲しい結果).

欲しい結果(_氏名,_一回目成績,_二回目成績) :-
  テストデータ(_氏名,_一回目点数,_二回目点数),
  成績マスタ(_一回目成績,_一回目点数),
  成績マスタ(_二回目成績,_二回目点数).



180 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 09:43:07 ]
>>178
% Prolog 元スレでpc11.2ch.net/test/read.cgi/db/1252492296/393
% 成績マスタは以下のような範囲型にしたかったのではないか、との指摘があった。

テストデータ(田中,100,90).
テストデータ(鈴木,80,80).

成績マスタ('A',91,100).
成績マスタ('B',81,90).
成績マスタ('C',71,80).

欲しい結果(_欲しい結果) :-
  findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回
目成績),_欲しい結果).

欲しい結果(_氏名,_一回目成績,_二回目成績) :-
  テストデータ(_氏名,_一回目点数,_二回目点数),
  成績マスタ(_一回目成績,_点数下限1,_点数上限1),
  _一回目成績 >= _点数下限1,
  _一回目成績 =< _点数上限1,
  成績マスタ(_二回目成績,_点数下限2,_点数上限2),
  _二回目成績 >= _点数下限2,
  _二回目成績 =< _点数上限2.

181 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 09:49:26 ]
>>180 (>>178)
% Prolog このような場合、RDBからは遠くなるが、

テストデータ(田中,100,90).
テストデータ(鈴木,80,80).

成績マスタ('A',_点数) :- _点数 >= 91,_点数 =< 100.
成績マスタ('B',_点数) :- _点数 >= 81,_点数 =< 90.
成績マスタ('C',_点数) :- _点数 >= 71,_点数 =< 80.

欲しい結果(_欲しい結果) :-
  findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回目成績),_欲しい結果).

欲しい結果(_氏名,_一回目成績,_二回目成績) :-
  テストデータ(_氏名,_一回目点数,_二回目点数),
  成績マスタ(_一回目成績,_一回目点数),
  成績マスタ(_二回目成績,_二回目点数).

% の方がPrologの特性を生かしたコードといえるだろう。

182 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 13:10:38 ]
>>177
使用言語:J

add=:dyad def 'x+y'
mul=:dyad def '(-/x*y),+/y*|.x'
print=:monad def 'smoutput (":y),''i'' '

a=: 1 2
b=: 3 4

print a add b
4 6i
print a mul b
_5 10i

NB.標準サポートの複素数の場合
datatype 1j2
complex
1j2 + 3j4
4j6
1j2 * 3j4
_5j10

183 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 16:55:46 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/582
# 【質問テンプレ】
# [1] 授業単元:セミナー
# [2] 問題文(含コード&リンク):∫(x=0,4)∫(y=0,3)∫(x=0,2) 4*x^3 + x*y^2 + 5*y + y*z + 6*z dz dy dx
#  を解くプログラムを書け

184 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 18:27:21 ]
>>183
使用言語:maxima

(%i1) integrate(integrate(integrate(4*x^3+x*y^2+5*y+y*z+6*z,z,0,2),y,0,3),x,0,4);
(%o1) 2040

x= が2回出てきますが、2回目のx= は勝手にz= と解釈しました。

185 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 20:30:55 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/588
# [1] 授業単元: 情報プログラム
#
# [2] 問題文(含コード&リンク):
#   次の関数の積分を、台形公式を使って求めたい。
#   ただし、積分区間は(0,2)きざみ幅はh=0.01とする。
#   f(x)=(4-x2)1/2
#
#  ※台形公式は積分区間を(a,b)とすると n=(b-a)/h
# S=h*{1/2(f(a))+f(b))+f(a+h)+f(a+2h)+…+f(a+(n-1)h}となる。
#


186 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 05:28:41 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/604
# [1] 授業単元: 演習チャレンジ問題
# [2] 問題文(含コード&リンク):
# あるint型配列array[256]の中身をランダムシャッフルしたい。
# 0〜127の範囲の値を被らずに出す乱数関数randEx(Seed, i)を作成せよ。(iは0〜127)
# ※Seedを変えることにより、異なるパターンのランダム列が出るようにする。
# ※array[i]とarray[128+randEx(Seed, i)]をスワップすることで並列計算において一気にシャッフルするのが目的です。
# ※「スワップするかしないか」の部分は別なので考えなくて良いです。

187 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 07:53:39 ]
pc11.2ch.net/test/read.cgi/db/1252492296/397
# 基本的なことで申し訳ないんですけど、
# あるテーブルから特定のデータが1件でも存在するかどうかの判断をしたいのですが 、
# COUNT()はテーブル内の全部のレコードを検索してしまうので、もっと高速でスマー トな方法は無いか存じないでしょうか。
#



188 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 08:03:41 ]
>>187
% Prolog (!)に意味があります。

あるテーブルから特定のデータが1件でも存在するかどうかの判断する(Q) :- call(Q),!.

189 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 08:08:37 ]
>>187
% Prolog テーブル名,引数ならびとして与えられたら、

あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび) :-
  Q =.. [_テーブル名|_引数ならび],
  call(Q),!.



190 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 08:14:23 ]
>>187
% Prolog >>189は単位節データベースの自然なコードだが、条件が付加されていて、
% そこに副作用を生じる目標が記述されている懸念がある場合は、clause/2を使う。

あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび) :-
  Q =.. [_テーブル名|_引数ならび],
  clause(Q,_),!.

191 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 08:31:47 ]
>>187
% Prolog >>190にさらに条件を付加したい場合は、_条件として引数の条件、あるいは
% 引数と引数の関係を記述します。

あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび,_条件) :-
  Q =.. [_テーブル名|_引数ならび],
  clause(Q,_),
  call(_条件),!.

192 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 10:54:08 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/606
# プログラミングの問題なんですが、if文と繰り返し(for,whileのいずれか)を利用して次の問題を作成します。
#
# 米ドル紙幣としては次のような紙幣とコインがある。
# 100ドル、50ドル、20ドル、10ドル、5ドル、2ドル、1ドル
# 50セント、25セント、10セント、5セント、1セント
#
# 問題は、キーボードから日本円を入力し、まずドルに変換した後ドルを最適な紙幣とコインに振り分けるプログラムを作成しなさい。但し1ドルを92.69円として換算しなさい。そして、日本円が0円の時にプログラムを終了する。

193 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 11:02:14 ]
>>186
使用言語:J

randEx=:dyad def 'y{?~128[(9!:1)x'
123 randEx 0
126
123 randEx 1
57
8 16 $ 123 randEx i.128
126 57 86 113 124 79 46 115 67 27 101 54 70 4 30 5
62 98 31 121 11 9 119 50 75 89 71 117 68 74 108 81
22 47 34 102 55 3 48 105 96 122 52 110 85 88 14 58
116 84 1 82 118 20 39 44 19 41 28 93 16 78 92 87
17 104 6 123 109 23 40 100 91 73 24 111 106 38 80 94
83 56 60 33 42 15 66 13 72 64 32 8 103 77 29 112
18 76 25 10 125 127 65 51 37 43 97 0 35 36 120 45
2 90 26 12 99 114 21 63 7 95 59 69 61 107 49 53
321 randEx 0
116
321 randEx 1
46
8 16 $ 321 randEx i.128
116 46 112 67 45 53 9 7 106 114 82 3 20 86 77 110
113 42 1 29 117 18 93 58 38 52 90 15 79 97 25 50
99 49 27 51 126 89 111 16 115 119 4 39 19 76 54 118
0 108 65 125 47 55 63 14 88 103 73 48 30 23 59 87
5 33 101 36 91 12 22 95 24 43 74 37 69 26 28 57
68 94 11 32 122 92 100 66 104 34 123 17 75 13 40 2
60 56 70 98 64 62 84 80 109 35 85 121 105 61 102 44
8 71 96 124 107 41 83 21 127 10 120 78 6 31 72 81

194 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 16:35:48 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/620
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):掃き出し法。
#   0,1のみを成分にもつn次正方行列Aが2重リストとしてある。Aにmod2の行基本変形を施して、階段行列に変形するプログラム


195 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 17:20:51 ]
>>183
使用言語:Yacas

In> Integrate(x,0,4)Integrate(y,0,3)Integrate(z,0,2)4*x^3+x*y^2+5*y+y*z+6*z
Out> 2040

196 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 18:26:58 ]
>>183
使用言語:Axiom

(8) -> integrate(integrate(integrate(4*x^3+x*y^2+5*y+y*z+6*z,z=0..2),y=0..3),x=0..4)

(8) 2040

197 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:10:58 ]
>>192
使用言語:J

a=:10000 50000 20000 1000 500 200 100 50 25 10 5 1
b=:<;._1' 100$ 50$ 20$ 10$ 5$ 2$ 1$ 50C 25C 10C 5C 1C'
f=:}:@;@(((}:@>@{.,(0,{.@>@}.)#:{:@>@{.);}.@>@{:)^:(#@>@}.))
g=:3 :'((b#~*),.;/@-.&0)f a;~<.y%0.9269'

g 1980
+---+-+
|10$|2|
+---+-+
|1$ |1|
+---+-+
|25C|1|
+---+-+
|10C|1|
+---+-+
|1C |1|
+---+-+

198 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:18:24 ]
>>197
テーブルのデータ間違えました。訂正します。

> a=:10000 50000 20000 1000 500 200 100 50 25 10 5 1

a=:10000 5000 2000 1000 500 200 100 50 25 10 5 1

199 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:36:00 ]
>>171
foldl' 使えば

Prelude> :m +Data.List
Prelude Data.List> sqrt $ 6*(foldl' (+) 0 [1/(x*x)|x<-[1..1000000]])
3.14159169866051



200 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:09:47 ]
>>199

foldl' というは知らなかったので、調べてみたら、

第9回 Haskellはなぜ遅いと思われているのか - 本物のプログラマはHaskellを使う:ITpro
itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?ST=develop&P=1

に sum でスタックオーバーフローする例がのっていました。
正直、まだよくわかっていません。
どうして sum の定義にこの foldl' の方を使わないのかな。
なんか他に問題がでてくるのかな。

201 名前:デフォルトの名無しさん [2010/01/09(土) 21:09:52 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/633
# [1]授業単元:プログラミング2
# [2]問題文:2つの最大50桁の実数を入力し、その和・差・積を求めるプログラム






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

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

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