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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
最初のスレは512Kbyte越えで終了。
今回は、Prolog,lisp,Haskell,Ocaml,Erlangなどがバランスよく
現れるように配慮して進めます。
2デフォルトの名無しさん:2009/11/02(月) 17:54:37
前スレの題材に使わせていただいたのは、
C/C++の宿題片付けます 131代目
http://pc12.2ch.net/test/read.cgi/tech/1255709298/
★★ Java の宿題ここで答えます Part 68 ★★
http://pc12.2ch.net/test/read.cgi/tech/1248012902/
Python の宿題ここで答えます Part 1
http://pc12.2ch.net/test/read.cgi/tech/1153585095/
Rubyの宿題教えてください。2限目@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1200175247/
BASICの宿題はお前にまかせた@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1136788500/
C#,C#の宿題片付けます。@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1197620454/
などでした。
3デフォルトの名無しさん:2009/11/02(月) 20:29:28
http://pc12.2ch.net/test/read.cgi/tech/1255709298/507
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10044.txt
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10045.txt
# 問題が2つあります。それぞれ違うファイルにしてもらえたならば幸いです。
# 宜しくお願い致します。
# <問題1>
# 自動車クラスCarにデータメンバやメンバ関数を自由に追加せよ
# (ナンバーを表すデータメンバを追加する。燃費を表すデータメンバを追加する,
# 移動による燃料残量の計算に燃費を反映させる,
# タンク容量を表すデータメンバを追加する,給油のためのメンバ関数を追加する等)。
# また追加したものがテストできる main関数も作成し,提出すること。
# <問題2>
# 名前・身長・体重などをメンバとしてもつ人間クラスを自由に定義せよ。
# 作成したクラスがテストできる main関数も作成し,提出すること。
4デフォルトの名無しさん:2009/11/03(火) 02:05:41
http://pc12.2ch.net/test/read.cgi/tech/1255709298/509
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10047.txt
# 課題2
# コンソール入力される算術式の値を計算し、その答えをコンソール出力するプログラムを作成せよ。
# なお、Cプログラミング環境はBorland C++ Compiler 5.5 を使用すること。
#
# 算術式の構成要素          1) 数値(10進数)
#                   2) 四則演算子(加減乗除 +−*/)
#                   3) 括弧(左、右)
#                   4) 等号(=)
#
# 数値                整数部4桁まで、小数部2桁までとする。
#
# 四則演算子と括弧と記号 優先順位  ()> *、/ > +、− > =
#
#
# エラー表示             演算不可能な場合は、エラー表示させること。
#                   例:6+3**  9//  9-5)  8+( 
5デフォルトの名無しさん:2009/11/03(火) 02:08:07
http://pc12.2ch.net/test/read.cgi/tech/1255709298/510
# [1] プログラミング入門
# [2] 文字列sを逆に並べる関数reverse(s) を書け。
# さらにこの関数を使って、入力を行ごとに反転させるプログラムを作成せよ。という問題です。
6デフォルトの名無しさん:2009/11/03(火) 02:43:08
>>5
% Prolog

'reverse(s)'(S,_反転されたS) :-
  atom_chars(S,S1),
  反転(S1,S2),
  atom_chars(S2,_反転されたS).

反転([],[]).
反転([A|R1],R) :-
  反転(R,R2),
  append(R2,[A],R).

入力を行ごとに反転させる(_反転された入力行のならび) :-
  get_line(_行),
  入力を行ごとに反転させる(_行,_反転された入力行のならび).

入力を行ごとに反転させる(end_of_file,[]) :- !.
入力を行ごとに反転させる(_行,[_反転された行|R]) :-
  'reverse(s)'(_行,_反転された行),
  get_line(_次の行),
  入力を行ごとに反転させる(_次の行,R).
7デフォルトの名無しさん:2009/11/03(火) 04:25:21
>>6 間違ってる!
'reverse(s)'(S,_反転されたS) :-
  atom_chars(S,S1),
  反転(S1,S2),
  atom_chars(_反転されたS,S2). が正しい。

そもそもCharsをS*と表現するのは、居心地が悪い。Lに変えよう。(LはlistのL)
'reverse(s)'(S,_反転されたS) :-
  atom_chars(L,L1),
  反転(L1,L2),
  atom_chars(_反転されたS,L2).
8デフォルトの名無しさん:2009/11/03(火) 04:35:38
>>8 またまた間違い。
'reverse(s)'(S,_反転されたS) :-
  atom_chars(S,L1),
  反転(L1,L2),
  atom_chars(_反転されたS,L2).
9デフォルトの名無しさん:2009/11/04(水) 09:52:48
% Prolog 保存サイト nojiriko.asia が故障で今週末までアクセスできないため、
http://prolog.asia/html/prolog/
にコピーを作りました。一部、イメージファイルと.txtファイルに存在しないものがあります。
10デフォルトの名無しさん:2009/11/04(水) 10:30:23
http://pc12.2ch.net/test/read.cgi/tech/1255709298/490
# [1] プログラミング
# [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、
# double型の戻値を持つ関数 absmul() を作成した上で、動作の
# 確認の出来るプログラムとして作成せよ。という問題と
#
# 標準入力からの入力に対して、アルファベットを全て空白文字
# に変更して出力するプログラムを作成せよ
11デフォルトの名無しさん:2009/11/04(水) 10:38:24
>>10
% Prolog 問題(1)
absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :-
  Y is _浮動小数点数_1 * _浮動小数点数_2,
  絶対値(Y,_答え).

絶対値(X,X) :- X >= 0.0.
絶対値(Y,X) :- Y < 0.0,X is -1 * Y.

test_absmul :-
  二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2),
  write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '),
  get_float(_浮動小数点数_3),
  absmul(_浮動小数点数_1,_浮動小数点数_2,_答え),
  test_absmul_診断(_答え,_浮動小数点数_3,_診断),
  write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_
浮動小数点数_3,_答え]),
  write_formatted('ふたつは%t!!\n',[_診断]).

二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :-
  write('浮動小数点数(1) を入れてください : '),
  get_float(_浮動小数点数_1),
  write('浮動小数点数(2) を入れてください : '),
  get_float(_浮動小数点数_2).

test_absmul_診断(F,F,一致しています).
test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2).
12デフォルトの名無しさん:2009/11/04(水) 10:42:23
>>10
% Prolog 問題(2)
アルファベット(尾崎).
アルファベット(u).

標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :-
  'stty raw',
  get_char(A),
  アルファベットを全て空白文字に変更してを出力する(A,''),
  'stty -raw'.

アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :-
  アルファベットとして存在する(B),
  write(' '),!.
アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :-
  \+(アルファベットとして存在する(A)),!.
アルファベットを全て空白文字に変更してを出力する(A,B) :-
  アルファベットとして存在する(B),
  write(' '),
  アルファベットを全て空白文字に変更してを出力する(A,''),!.
アルファベットを全て空白文字に変更してを出力する(A,B) :-
  アルファベットとして存在する(A),
  write(' '),
  get_char(C),
  アルファベットを全て空白文字に変更してを出力する(C,''),!.
アルファベットを全て空白文字に変更してを出力する(A,B) :-
  atom_concat(A,B,C),
  get_char(D),
  アルファベットを全て空白文字に変更してを出力する(D,C).
13デフォルトの名無しさん:2009/11/04(水) 15:11:44
http://pc12.2ch.net/test/read.cgi/tech/1255709298/554
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10056.txt
# 問題
# input.bmpというビットマップファイル(色数は24ビット)を開き、
# その画像の赤の成分だけの画像、緑の成分だけの画像、青の成分だけの画像の三つの
# ファイルを出力するプログラム。
#
# 赤の成分の画像ファイル名(output_red.bmp)
# 青の成分の画像ファイル名(output_blue.bmp)
# 緑の成分の画像ファイル名(output_green.bmp)
# 画像のサイズについては実行時に入力させることとする。例えば、input.bmp
# が200×300の画像であったときに、実行時に以下のように表示し入力を受ける
# 「input.bmpの縦は何ピクセルですか?」200と入力
# 「input.bmpの横は何ピクセルですか?」300と入力
#
# 課題達成条件
# ファイルを開くときは開けたかどうかエラーチェックしている。
# メモリに領域を確保する(malloc)したときは、確保できたかどうかエラーチェックする
# 画像ファイルはペイントというソフトをつかって、jpegからビットマップ(?画素当たり24ビット)に変換したものとする。
14デフォルトの名無しさん:2009/11/05(木) 02:08:06
http://pc12.2ch.net/test/read.cgi/tech/1255709298/561
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10060.txt
15デフォルトの名無しさん:2009/11/05(木) 02:09:22
http://pc12.2ch.net/test/read.cgi/tech/1255709298/562
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10061.txt
16デフォルトの名無しさん:2009/11/05(木) 02:10:20
http://pc12.2ch.net/test/read.cgi/tech/1255709298/563
# [1] 授業単元:ソフトウェア工学
# [2] 問題文(含コード&リンク):
# (π/4) = tan^-1(1) = 1 - (1/3) + (1/5) - … + (-1)^k * (1/(2k+1)) + …
# の公式を用いて、第n項までの多項式近似により円周率を求め、その誤差と計算時間を測定するプログラムを作成せよ。

17デフォルトの名無しさん:2009/11/05(木) 02:15:23
http://pc12.2ch.net/test/read.cgi/tech/1255709298/564
# [1] 授業単元:C言語
# [2] 問題文
# 問題文1
# 整数 n を入力すると 'a' から n個目までのアルファベットを全て表示するプログラムを作成せよ。 (例:n=6 の時 abcdefを表示)
#
# 問題文2
# 整数 n を入力すると1からn までの間で 3の倍数か、
# 5の倍数のどちらかであるような数の和を表示するプログラムを作れ。
# (例:n=10 の時 3+5+6+9+10=33)
#
# 問題文3
# 次のプログラムの (a)-(j)の部分をfor 文を使って書き直せ。 #include<stdio.h> int main() { int a[10]; double sum,ave; sum=0; a[0]=1; a[1]=5; a[2]=7; a[3]=2; a[4]=4; a[5]=1; a[6]=9; a[7]=4; a[8]=20; a[9]=5; sum=sum+a[0];
# /* (a) ここ */ sum=sum+a[1]; /* (b) ここ */ sum=sum+a[2]; /* (c) ここ */ sum=sum+a[3]; /* (d) ここ */ sum=sum+a[4]; /* (e) ここ */ sum=sum+a[5]; /* (f) ここ */ sum=sum+a[6]; /* (g) ここ */ sum=sum+a[7];
# /* (h) ここ */ sum=sum+a[8]; /* (i) ここ */ sum=sum+a[9]; /* (j) ここ */ ave=sum/10; printf("総和は %d です。平均は %d です。\n",sum, ave); }
#
# 問題文4
# 整数を5個入力すると、まずそのまま表示し、次に逆順で表示するプログラムを作れ。
# 実行例: 数を入力して下さい: 3 数を入力して下さい: 7 数を入力して下さい:1 数を入力して下さい: 2 数を入力して下さい: 5
# そのまま表示 3 7 1 2 5 逆順に表示 5 2 1 7 3 プログラムのテキストをコピーして下のテキスト入力フィールドへ出力結果と共に貼り付けて提出すること。
18デフォルトの名無しさん:2009/11/05(木) 02:17:18
http://pc12.2ch.net/test/read.cgi/tech/1255709298/565
# [1] 授業単元:C言語プログラミング
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10062.txt
19デフォルトの名無しさん:2009/11/05(木) 04:22:57
http://pc12.2ch.net/test/read.cgi/tech/1255709298/566
# [1]授業単元 C言語実習
# [2]コマンドラインで指定された英数字と空白、タブ、改行記号
# のみから構成されるテキストファイルに含まれる単語の頻度を
# アルファベット順に出力するプログラム。
# 単語とは英数字のみで構成されているものを指す。
# 一つの単語が1回現れた時は部分単語すべてが現れたものとする。
# 部分単語とは、その単語の連続する部分文字列のことである。
# 授業で述べた多重ハッシュテーブルを利用すること。
# 行の長さ、行の総数、単語の長さに制限は無いが、頻度は
# 32bit整数(符号付き)で正の範囲に表せるものとする。
20デフォルトの名無しさん:2009/11/05(木) 15:22:49
http://pc12.2ch.net/test/read.cgi/tech/1255709298/569
# [1] 授業単元:ソフトウェア工学
# [2] 問題文(含コード&リンク):
# 台数近似を用いて、分割数nに対する I = ∫[1,2]ln(x)dx の値を求めるプログラムを作成し、誤差を求めよ。
21デフォルトの名無しさん:2009/11/05(木) 19:22:00
>>19
Common Lisp
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10072.txt

多重ハッシュテーブルの使い道がよくわからないので、
普通のハッシュテーブルでやってみた
部分単語っていうのもいまいちわからないのだけど、例えば"word"の部分単語は
"w", "o", "r", "d", "wo", "or", "rd", "wor", "ord", "word"
という解釈でおkですか?

22デフォルトの名無しさん:2009/11/05(木) 21:30:29
>>21
多重ハッシュテーブル、部分単語ともに分かりません。
授業受けてみたいですね。
部分単語の解釈は私もそれ以外に思いつかない。
23デフォルトの名無しさん:2009/11/05(木) 23:02:33
>>20
;; Common Lisp

(defun trapezodial-rule-of-integration (fx min max ndivision)
(let ((tmp 0))
(do ((k 1 (+ k 1)))
((= k ndivision))
(incf tmp (funcall fx (+ min (* k (/ (- max min) ndivision))))))
(/ (* (- max min) (+ (/ (+ (funcall fx min) (funcall fx max)) 2) tmp)) ndivision)))

(defun main ()
(let (approximate true-value)
(setf approximate (trapezodial-rule-of-integration #'log 1 2 256)
true-value (- (* 2 (log 2)) 1))
(format t "真値: ~A~%近似値: ~A~%誤差: ~A~%" true-value approximate (- true-value approximate))))
24デフォルトの名無しさん:2009/11/05(木) 23:46:15
>>18
;; Common Lisp

(defun merge (lst1 lst2 test-func)
(cond ((and (null lst1) (null lst2)) nil)
((null lst1) (cons (car lst2) (merge nil (cdr lst2) test-func)))
((null lst2) (cons (car lst1) (merge (cdr lst1) nil test-func)))
(t (if (funcall test-func (car lst1) (car lst2))
(cons (car lst1) (merge (cdr lst1) lst2 test-func))
(cons (car lst2) (merge lst1 (cdr lst2) test-func))))))

(defun merge-sort (lst test-func)
(cond ((> (length lst) 1)
(merge
(merge-sort (subseq lst 0 (floor (/ (length lst) 2))) test-func)
(merge-sort (subseq lst (floor (/ (length lst) 2))) test-func)
test-func))
(t lst)))
25デフォルトの名無しさん:2009/11/06(金) 02:56:56
http://pc12.2ch.net/test/read.cgi/tech/1255709298/598
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): 2つの整数値と1つの文字を、例えば「4+2」のように入力し、
# 入力に応じた四則演算を行って結果を出力するプログラムを作成しなさい。
# ただし、中央の文字に四則演算の記号以外の文字が入力された時のことも考慮しなさい。
26デフォルトの名無しさん:2009/11/06(金) 07:19:57
>>25
% Prolog
二項式とは(_式文字列,N1,_演算子,N2,_答え,_診断) :-
  整数文字ならび(_式文字列,_整数文字ならびの一,R1),
  演算子文字ならび(R1,_演算子文字ならび,R2),
  整数文字ならび(R2,_整数文字ならびの二,R),
  number_chars(N1,_整数文字ならびの一),
  number_chars(N2,_整数文字ならびの二),
  atom_chars(_式,_演算子文字ならび).
  二項式診断(N1,_式,N2,_答え,_診断).

演算子文字ならび([],[],[]).
演算子文字ならび([A|R],[],[A|R]) :- 四則演算子ではない(A),数字である(A).
演算子文字ならび([A|R1],[A|R2],R) :- 四則演算子ではない(A),数字ではない(A),演算子文字ならび(R1,R2,R).
演算子文字ならび([A|R1],[A|R2],R) :- 四則演算子である(A),演算子文字ならび(R1,R2,R).

整数文字ならび([A|R],[],[A|R]) :- 数字ではない(A)..
整数文字ならび([A|R],[A1|R2],R) :- 数字である(A),整数文字ならび(R1,R2,R).

二項式診断(N1,_演算子,N2,_答え,演算子が四則演算子ではありません) :- \+(member(_演算子,[+,-,*,/])),!.
二項式診断(N1,_演算子,N2,_答え,正常終了) :- integer(N1),integer(N2),member(_演算子,[+,-,*,/]),_式 =..[_演算子,N1,N2],_答え is _式.

数字である(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']).
数字ではない(A) :- \+(member(A,['0','1','2','3','4','5','6','7','8','9'])).

四則演算子である(A) :- member(A,['+','-','*','/']).
四則演算子ではない(A) :- \+(member(A,['+','-','*','/'])).
27デフォルトの名無しさん:2009/11/06(金) 08:37:32
>>16
% Prolog

func(K,X) :- X is (-1)^K * (1/(2*K+1)).

π(M,Pi) :- findsum(U,(for(0,K,M),func(M,U)),S),Pi is S * 4.

計算時間と誤差(M,_計算時間,_誤差) :-
  A is time,for(1,N,100),π(M,Pi),N=100,B is time,
  _誤差 is Pi - pi,
  _計算時間 is (B - A) / 100.
28デフォルトの名無しさん:2009/11/06(金) 09:39:04
>>18
% Prolog

マージソート(L,LX) :-
ならびを半分に分割する(L,L1,L2),
  マージソート(L1,L11),
  マージソート(L2,L22),
  併合する(L11,L22,LX).

併合する(L,[],L) :- !.
併合する([],L,L) :- !.
併合する([A|R1],[B|R2],[A|R3]) :-
  A @< B,
  併合する(R1,[B|R2],R3).
併合する([A|R1],[B|R2],[B|R3]) :-
  A @>= B,
  併合する([A|R1],R2,R3).

ならびを半分に分割する(L,L1,L2) :- ならびを半分に分割する(L,L,[],[],L1,L2).

ならびを半分に分割する(L,L0,LX,LY,LX,LY) :- append(LX,LY,L0),!.
ならびを半分に分割する(L,L0,LX,LY,LX,[A|LY]) :- append(LX,[A|LY],L0),!.
ならびを半分に分割する([A,B|R1],L0,LX,LY,L1,L2) :- ならびを半分に分割する(R1,L0,[_|LX],[_|LY],L1,L2).
29デフォルトの名無しさん:2009/11/06(金) 11:06:37
>>14
% Prolog (BinaryDataModel風)
t2_14(File) :- get_lines(File,Lines),member(_行,Lines),split(_行,[','],L),構造追加(L),fail.
t2_14(_).

索引番号起点(-1).
索引番号終点(-1).

構造追加(L) :- 索引番号終点(_索引番号終点),構造追加(L,_索引番号終点).

構造追加([A|R]) :- Random is random mod 9999,\+(index(Random,A,-1)),
  assertz(index(Random,A,-1)),
  length(R,Len),
  assertz(num(Random,Len)),
  attr定義(1,Len,Random,R),!.
  retract(索引番号終点(_索引終点番号)),
  構造追加_2(_索引終点番号,Random).
構造追加([A|R]) :- 構造追加([A|R]).

構造追加_2(-1,Random) :- retract(索引番号起点(_索引起点番号)),assertz(索引番号起点(Random)),assertz(索引番号終点(Random)),!.
構造追加_2(N,Random) :- assertz(索引番号終点(Random)),retract(index(N,W2,_)),assertz(index(N,W2,Random)),!.

attr定義(M,N,A,[]) :- M > N,!.
attr定義(M,N,A,[B|R]) :- assertz(attr(A,M,B)),M2 is M+1,attr定義(M2,N,A,R).
30デフォルトの名無しさん:2009/11/06(金) 11:10:27
>>29 してはいけないところに改行が入ってしまった。

構造追加_2(-1,Random) :- retract(索引番号起点(_索引起点番号)),assertz(索引番号起点(Random)),assertz(索引番号終点(Random)),!.

構造追加_2(N,Random) :- assertz(索引終点,Random)),retract(index(N,W2,_)),assertz(index(N,W2,Random)),!.
31デフォルトの名無しさん:2009/11/06(金) 12:11:00
>>17 問題文1
:- op(600,xf,個目).

'整数 N を入力すると a から N個目までのアルファベットを全て表示'(N個目) :-
  for(1,M,N),put_code(96+M),M=N.
32デフォルトの名無しさん:2009/11/06(金) 12:20:33
>>17 問題文2

'整数 N を入力すると1からN までの間で 3の倍数か、5の倍数のどちらかであるような数の和を表示'(N) :-
  findsum(U,(for(1,M,N),'3の倍数であるか5の倍数'(M)),Sum),
  write_formatted('3か5の倍数の合計は %t です\n',[Sum]).

'3の倍数であるか5の倍数'(N) :- '3の倍数(N),!.
'3の倍数であるか5の倍数'(N) :- '5の倍数(N),!.

'3の倍数'(N) :- 0 is N mod 3.

'5の倍数'(N) :- 0 is N mod 5.
33デフォルトの名無しさん:2009/11/06(金) 12:30:08
>>17 問題文4
% Prolog

'整数を5個入力すると、まずそのまま表示し、次に逆順で表示する' :-
  findall(_整数,(for(1,N,5),write('数を入力して下さい:'),get_integer(_整数)),L),
  concat_atom(L,' ',S1),
  write_formatted('入力されたのは %t です\n',[S1]),
  reverse(L,L2),
  concat_atom(L2,' ',S2),
  write_formatted('逆順に表示すると %t となります\n',[S2]).
34デフォルトの名無しさん:2009/11/06(金) 15:32:45
http://pc12.2ch.net/test/read.cgi/tech/1248012902/454
# 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm 822.txt
#
# (1) 入力された正の整数が素数であるか判定するプログラムを作成する。
# ただし、機能は以下のように実現するものとする。
# boolean 型の戻り値をもつメソッド isPrime は引数に正の整数をとり、
# 素数なら true を返し、そうでないなら false を返す。
# main メソッドから、isPrime を呼び出すようにせよ。
#
# (2)入力された正の整数が素数であるか判定し、素数でない場合は最少の素因数を
# 出力するプログラムを作成する。ただし、機能は以下のように実現するものとする。
# int 型の戻り値をもつメソッド minimumDivisor は引数に正の整数をとり、
# 素数なら0 を返し、そうでないなら最小の素因数を返す。
# main メソッドから、minimumDivisor を呼び出し、戻り値に応じた出力をすようにせよ。
35デフォルトの名無しさん:2009/11/06(金) 17:08:41
>>34 (1)
% Prolog

program :-
  user_parameters([A]),
  atom_to_term(A,N,_),
  isPrime_test(N,_診断),
  write_formatted('%t\n',[_診断]).

isPrime_test(N,true) :- isPrime(N).
isPrime_test(N,false) :- \+(isPrime(N)).

isPrime(1) :- !.
isPrime(N) :- for(2,M,N//2),0 is N mod M.

36デフォルトの名無しさん:2009/11/06(金) 17:14:22
>>35 しまった!! 逆だった。訂正します。
% Prolog

program :-
  user_parameters([A]),
  atom_to_term(A,N,_),
  isPrime_test(N,_診断),
  write_formatted('%t\n',[_診断]).

isPrime_test(N,true) :- isPrime(N).
isPrime_test(N,false) :- \+(isPrime(N)).

isPrime(1) :- !.
isPrime(N) :- \+((for(2,M,N//2),0 is N mod M)).
37デフォルトの名無しさん:2009/11/06(金) 17:18:06
>>36 もう一つ訂正
% 最後に ! を入れて置きましょう。

isPrime(1) :- !.
isPrime(N) :- \+((for(2,M,N//2),0 is N mod M)),!.
38デフォルトの名無しさん:2009/11/06(金) 17:24:02
>>35 (2)
% Prolog

program :-
  user_parameters([A]),
  atom_to_term(A,N,_),
  minimumDiviso(N,_診断),
  write_formatted('%t\n',[_診断]).

minimumDiviso(1,0) :- !.
minimumDiviso(N,M) :- for(2,M,N//2),0 is N mod M,!.
minimumDiviso(N,0).
39デフォルトの名無しさん:2009/11/06(金) 20:38:16
>>20
% Prolog 台数近似って分からないから台形則で。

func(N,X) :- N2 is N,X is ln(N2).

t2_20_誤差(N,X1,X2,_誤差) :-
  台形則(N,X1,X2,S),
  _誤差 is S - (2 * log(2) -1).

台形則(N,X1,X2,S) :-
  _間隔 is (X2 - X1) / N,
  台形則(0,N,X1,_間隔,S).

台形則(N,N,_,_,0.0) :- !.
台形則(J,N,X1,_間隔,S) :-
  func(X1 + _間隔 * J,U1),
  func(X1 + _間隔 * (J + 1),U2),
  S1 is (U1 + U2) * (1.0 / N) / 2.0,
  J2 is J + 1,
  台形則(J2,N,X1,_間隔,S2),
  S is S1 + S2.
40デフォルトの名無しさん:2009/11/07(土) 06:49:00
>>19
% Prolog ハッシュとか意識せず、一番Prologらしい表現で
:- dynamic(hash/2).

t2_19_表示 :- listing(hash/2).

t2_19 :-
  get_line(Line),
  split(Line,[' ','\t','\n'],L),
  member(_単語,L),
  sub_atom(_単語,_,_,_,_部分単語),
  \+(_部分単語=''),
  t2_19_1(_部分単語),
  fail.
t2_19.

t2_19_1(A) :- retract(hash(A,_頻度)),_頻度2 is _頻度 + 1,assertz(hash(A,_頻度2)),!.
t2_19_1(A) :- assertz(hash(A,1)).
41デフォルトの名無しさん:2009/11/07(土) 06:55:15
>>3 >>4 >>13 の解答がまだない。
42デフォルトの名無しさん:2009/11/07(土) 06:57:50
>>3 のようなオブジェクト指向の課題は今後ESPで書くからちょっと待って。もう忘れた・・・
43デフォルトの名無しさん:2009/11/07(土) 08:09:58
>>3
% ESP (その一) なんだか分からないけど継承だらけ。

class さつまのかみ has
  nature 人間,実像;
  attribute 戸籍名:='平忠度',契機,実像;
  :create(Class,_契機,_実像,Obj) :-
    :new(Class,Obj),
    Obj!契機:=_契機,Obj!実像:=_実像,Obj!誕生日:='19490126';
instance
  :予定(Obj,_契機,_予定) :- _契機@>=Obj!契機,予定(Obj,_契機,_予定);
local
  予定(Obj,'20091107','ESPのお勉強');
end.

class 人間 has
  nature 誕生,死亡,遺伝子;
  attribute 戸籍名;
end.

class 実像 has
  attribute 身長,体重,髪の毛の色,体毛,肌の色,歯型,印象;
end.
44デフォルトの名無しさん:2009/11/07(土) 08:11:47
>>3
% ESP (その二)

class 誕生 has
  attribute 誕生日,時刻,立会い医師または助産婦,誕生にまつわるエピソード;
end.

class 死亡 has
  attribute 死亡時刻,確認医師,死因,死亡に至る経過,辞世,墓の在り処;
end.

class 遺伝子 has
  attribute 遺伝子;
end.
45デフォルトの名無しさん:2009/11/07(土) 15:43:31
http://pc12.2ch.net/test/read.cgi/tech/1153585095/932
# 負でない整数nの階乗(n!)は,次のように定義される.
#
# n! = 1 × 2 × 3 × ... × n (n ≧ 1)
# 0! = 1
#
# 引数nを与えるとn!を計算して返す関数fact(n)を定義し,それを用いて0!〜10!を計算して表示するプログラムを作成せよ.
#
46デフォルトの名無しさん:2009/11/07(土) 15:51:56
>>45
% Prolog

'引数nを与えるとn!を計算して返す関数fact(n)を定義し,それを用いて0!〜10!を計算して表示する' :-
  for(0,N,10),
  fact(N,X),
  write_formatted('n=%t,%t\n',[N,X]),
  N=10.

fact(0,1).
fact(N,X) :- \+(N=0),N1 is N-1,fact(N1,Y),X is N * Y.
47デフォルトの名無しさん:2009/11/07(土) 17:19:34
http://pc12.2ch.net/test/read.cgi/tech/1153585095/935
# 引数として英数字からなる文字列を1つ与えて呼び出すと,その全体,最後の1文字を
削ったもの,最後の2文字を削ったもの,…と1文字になるまで表示する関数を定義せよ
.値を返す必要はない.
#
# 次に,キーボードから文字列を読み込み,読み込んだ文字列を引数として定義した関数を呼び出すようにせよ.
#
48デフォルトの名無しさん:2009/11/07(土) 17:43:43
>>47
% Prolog

'引数として英数字からなる文字列を1つ与えて呼び出すと,その全体,最後の1文字を削ったもの,最後の2文字を削ったもの,…と1文字になるまで表示する'(_文字列) :-
  sub_atom(_文字列,0,M,1,_),
  for(1,N,M),
  sub_atom(_文字列,0,_,N,_副文字列),
  write_formatted('%t\n',[_副文字列]),
  N = M.

t2_47 :-
  write('文字列を入力してください :\n'),
  get_line(_文字列),
  '引数として英数字からなる文字列を1つ与えて呼び出すと,その全体,最後の1文字を削ったもの,最後の2文字を削ったもの,…と1文字になるまで表示する'(_文字列).
49デフォルトの名無しさん:2009/11/08(日) 04:39:22
http://pc12.2ch.net/test/read.cgi/tech/1255709298/615
# C++で10進数を2進数に変換するプログラムを配列使って
# 順番通りに表示できるようにするのってどうするんですか
50デフォルトの名無しさん:2009/11/08(日) 04:40:56
>>49
% Prolog

t2_615 :-
  write('10進数をスペースで区切って何個か入力してください : '),
  get_line(Line),
  split(Line,[' '],L),
  member(N,L),
  二進数(N,L),
  wrln(L),
  fail.
t2_615.

二進数(_10進数,L) :-
  length(L,32),
  二進数(_10進数,[],X),
  append(L1,X,L),
  all(L1,0).

二進数(J,Y,[J|Y]) :- J < 2.
二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wrln([]) :- !.
wrln([A|R]) :- write_formatted('%t\n',[A]),wrln(R).
51デフォルトの名無しさん:2009/11/08(日) 04:57:45
>>50 間違い。訂正

wrln([]) :- nl.
wrln([A|R]) :- write(A),wrln(R).

と直すか、wrln/1は使わず、
t2_615 :-
  write('10進数をスペースで区切って何個か入力してください : '),
  get_line(Line),
  split(Line,[' '],L),
  member(N,L),
  二進数(N,L),
  atom_chars(A,L), /* 追加して */
  write_formatted('%t\n',[A]), /* 普通にwrite_formatted/2 で */
  fail.
t2_615.
52デフォルトの名無しさん:2009/11/08(日) 05:04:58
>>51 さらに訂正
二進数/2の第二引数は整数のリストだから、atom_chars/2は使えない。整数はatomと別扱い。
concat_atom/2を使えばよいが、ISO標準ではないから、
>>51 の第二案は使わず、第一案のwrln/1を直すのがよいだろう。
53デフォルトの名無しさん:2009/11/08(日) 05:44:16
http://sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
全部で3つなのですが
1・ 以下のプログラムを作成
・ 以下の数列を0〜20まで表示
・ 数列は以下の通りとする
・ a[0] = 0.01, a[1] = 0.1, a[2] = 1.0
・ a[n+1] = a[n] + a[n-1] + a[n-2]
・ プログラムを実行するとa[0]〜a[20]までの値が改行区切りで表示されること
54デフォルトの名無しさん:2009/11/08(日) 06:02:10
>>53 (これはエラーとなる例)
% Prolog ではN+1では定義は困難。さらに以下のプログラムでは
% t2_53(M,Y) の部分でエラーとなる

t2_53 :-
  findall(X,(for(0,N,20),t2_53(N,X)),L),
  wrln(L).

t2_53(0,0.01).
t2_53(1,0.1).
t2_53(2,1.0).
t2_53(N,X) :-
M is N + 1,
  N1 is N - 1,
  N2 is N - 2,
  t2_53(M,Y),
  t2_53(N1,X1),
  t2_53(N2,X1),
  X is Y - X1 - X2.

%%%%%%%%%%%%%%%%%%%%

wrln([]).
wrln([A|R]) :- write_formatted('%t\n',[A]),wrln(R).
55デフォルトの名無しさん:2009/11/08(日) 06:05:07
>>53
% Prolog 仕方ないから、以下とする。

t2_53 :-
  findall(X,(for(0,N,20),t2_53(N,X)),L),
  wrln(L).

t2_53(0,0.01).
t2_53(1,0.1).
t2_53(2,1.0).
t2_53(N,X) :-
  N1 is N - 1,
  N2 is N - 2,
  N3 is N - 3,
  t2_53(N1,X1),
  t2_53(N2,X2),
  t2_53(N3,X3),
  X is X1 + X2 + X3.

%%%%%%%%%%%%%%%%%%%%
wrln([]).
wrln([A|R]) :- write_formatted('%t\n',[A]),wrln(R).
56デフォルトの名無しさん:2009/11/08(日) 07:04:33
http://pc12.2ch.net/test/read.cgi/tech/1255709298/638
# [1] 授業単元:
# [2] 問題文(含コード&リンク):ソケット通信を用いたチャットの作成
# http://ime.nu/mikilab.doshisha.ac.jp/dia/research/report/2003/0714/006/report20030714006.html
# にある2.1、2.2のクライアント、サーバのプログラム(出来れば簡単な解説もお願いします)
57デフォルトの名無しさん:2009/11/08(日) 07:09:37
http://sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
# 3.以下のプログラムを作成
# 3x3マスのマルバツゲームのボードを作成
# ○側と×側が交互に2次元座標上の位置を入力
# 入力後、毎回ボードを表示する
# たて、よこ、斜めのいずれかに○か×が3つ並んだ
# 時点でプログラムを終了
58デフォルトの名無しさん:2009/11/08(日) 17:38:28
http://pc12.2ch.net/test/read.cgi/tech/1255709298/596
# [1] 授業単元:
# アルゴリズムとプログラミング
# [2] 問題文(含コード&リンク):
# 下のアドレスのプログラムに追加して、ダイクストラ法のプログラムを完成させてください
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10070.txt
# プログラムに使用するデータファイル↓
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10071.txt
# 次のプログラムに、以下の2〜6の処理を追加してダイクストラのプログラムを完成させてください。
# 2、送信ノードに接続されている全てのノードについて、接続リンクの長さを送信ノードからの距離とする。
# 3、送信ノードに接続されている全てのノードのうち、最短の距離を持つノードを確定とする
# 4、確定したノードに接続されている全てのノードについて、送信ノードからこの確定ノードを経由して到達する経路の距離を計算し、これまでの距離より短ければ更新する
# 5、まだ確定していないノードのうち、送信ノードからの距離が最短のノードを確定とする
# 6、全てのノードが確定するまで4,5の処理を繰り返す。
59デフォルトの名無しさん:2009/11/09(月) 02:30:15
http://pc12.2ch.net/test/read.cgi/tech/1255709298/651
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク):
# 正の整数nの2乗の数に、2種類の数字しか現れない
# 4桁の正の整数 n をすべて挙げなさい
60デフォルトの名無しさん:2009/11/09(月) 02:33:33
http://pc12.2ch.net/test/read.cgi/tech/1248012902/461
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】11月11日
# 【 Ver  】1.6.0_11
#
#
# 課題です
# http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/825.zip
# ・課題
# 与えられたデータ(行列Aのデータ A.txt ベクトルbのデータ b.txt)について
# pivot選択付きGaussの消去法を用いて連立方程式Ax=bの解xを求めよ
# また得られたxに対して ||Ax‐b||2を計算せよ
61デフォルトの名無しさん:2009/11/09(月) 03:55:38
>>59
% Prolog

'正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n をすべて挙げる'(L) :-
  findall(N,'正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n '(N),L).

'正の整数nの2乗の数に、2種類の数字しか現れない4桁の正の整数 n '(N) :-
  組合せ([0,1,2,3,4,5,6,7,8,9],2,[A,B]),
  length(L,9),
  '2種類の数字しか現れないならび'(A,B,0,0,L),
  concat_atom(L,Atom),
  atom_to_term(Atom,N1,_),
  N is truncate(sqrt(N1)).
  N >= 1000,N =< 9999,
  U is N * N.

'2種類の数字しか現れないならび'(_,_,1,1,[]) :- !.
'2種類の数字しか現れないならび'(A,B,_,K,[A|R]) :-
  '2種類の数字しか現れないならび'(A,B,1,K,R).
'2種類の数字しか現れないならび'(A,B,K,_,[B|R]) :-
  '2種類の数字しか現れないならび'(A,B,K,1,R).
62デフォルトの名無しさん:2009/11/09(月) 04:24:18
63デフォルトの名無しさん:2009/11/09(月) 04:56:03
http://pc12.2ch.net/test/read.cgi/tech/1255709298/657
# [1] 授業単元: C言語のポインタ、配列、ファイルの問題です
# [2] 問題文(含コード&リンク):
# n件のデータを配列に入力しその平均値を出力するプログラムをつくり、
# 実行部において添字演算子は用いず、*(p+i)と*p++それぞれを用いるパターンを作る
# ただし、入出力処理をファイル処理に、入出力ファイル名はコマンドラインで指定する
64デフォルトの名無しさん:2009/11/09(月) 05:06:17
>>63
% Prolog

'n件のデータを配列に入力しその平均値を出力する'(N) :-
  user_parameters([_入力ファイル,_出力ファイル]),
  open(_入力ファイル,read,Input),
  findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_)),Avg),
  close(Input),
  open(_出力ファイル,write,Output),
  write_formatted(Output,'平均値は %t\n'),
  close(Output),!.
65デフォルトの名無しさん:2009/11/09(月) 05:07:54
>>65 訂正
% Prolog

'n件のデータを配列に入力しその平均値を出力する'(N) :-
  user_parameters([_入力ファイル,_出力ファイル]),
  open(_入力ファイル,read,Input),
  findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_)),Avg),
  close(Input),
  open(_出力ファイル,write,Output),
  write_formatted(Output,'平均値は %t\n',[Avg]), /* この行訂正 */
  close(Output),!.
66デフォルトの名無しさん:2009/11/09(月) 07:41:26
>>65 もう一ヶ所訂正。上から四行目、括弧閉じがひとつ足らなかった。

  findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_))),Avg),
67デフォルトの名無しさん:2009/11/09(月) 16:28:03
http://pc12.2ch.net/test/read.cgi/tech/1248012902/463
# 【課題】
# http://ime.nu/www51.tok2.com/home/rg550/cgi-bin/hosoku/img0047.zip
# 【課題1】
# 実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納
# した後、整列し(順番はどちらでもかまいません)、出力するプログラムを
# 作成しなさい。
# 【課題2】
# 0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと
# 値で出力するプログラムを作成しなさい。また、100個の乱数の平均値も合わせて
# 出力しなさい。
# ただし、0から9 それぞれの個数を数えるための変数に必ず配列を用いてください。
# (出現個数カウント用の変数を10個用意してはいけません。) 例えば、出現個数
# カウント用の配列 count[] を用意すると、 count[0] に0が出現した回数が
# 格納される。もし0が10回出現した場合、count[0]=10となる。)
68デフォルトの名無しさん:2009/11/09(月) 17:24:33
>>67
% Prolog 課題1

'実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納した
後、整列し(順番はどちらでもかまいません)、出力する' :-
  get_chars(_文字ならび),
  sort(_文字ならび,_整列した文字ならび),
  atom_chars(_整列した文字列,_整列した文字ならび),
  write_formatted('%t\n',[_整列した文字列]).
69デフォルトの名無しさん:2009/11/09(月) 17:27:44
>>67
% Prolog 課題2
'0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと値
で出力する' :-
findall([N,0,[]],for(0,N,9),_出現個数カウント用ならび),
'0から9までの整数乱数を100個発生させ'(1,L1),
'その出現分布を棒グラフと値で出力する'(L1,_出現個数カウント用ならび).

'0から9までの整数乱数を100個発生させ'(N,[]) :- N > 100,!.
'0から9までの整数乱数を100個発生させ'(N,[A|R]) :-
A is random mod 10,
N2 is N + 1,
'0から9までの整数乱数を100個発生させ'(N2,R).

'その出現分布を棒グラフと値で出力する'([],L) :-
'グラフと値で出力'(L),!.
'その出現分布を棒グラフと値で出力する'([N|R],L) :-
member([N,C,L1],L),
C2 is C + 1,
ならびの置換([N,C,L1],[N,C2,[_|L1]],L,L2),
'その出現分布を棒グラフと値で出力する'(R,L2).

グラフと値で出力([]).
グラフと値で出力([[N,C,L1]|R]) :-
all(L1,'*'),
write_formatted(' %t: %t %t\n',[N,L1,C]),
グラフと値で出力(R).
70デフォルトの名無しさん:2009/11/09(月) 17:35:57
>>69 書き直し
% Prolog 課題2 (100個の乱数の平均値は表示行数の関係上、省略します)
'0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと値
で出力する' :-
  findall([N,0,[]],for(0,N,9),_出現個数カウント用ならび),
  '0から9までの整数乱数を100個発生させ'(1,L1),
  'その出現分布を棒グラフと値で出力する'(L1,_出現個数カウント用ならび).

'0から9までの整数乱数を100個発生させ'(N,[]) :- N > 100,!.
'0から9までの整数乱数を100個発生させ'(N,[_乱整数|R]) :-
  _乱整数 is random mod 10,
  N2 is N + 1,
  '0から9までの整数乱数を100個発生させ'(N2,R).

'その出現分布を棒グラフと値で出力する'([],L) :-
  'グラフと値で出力'(L),!.
'その出現分布を棒グラフと値で出力する'([N|R],L) :-
  member([N,_カウント,L1],L),
  _カウント2 is _カウント + 1,
  ならびの置換([N,_カウント,L1],[N,_カウント2,[_|L1]],L,L2),
  'その出現分布を棒グラフと値で出力する'(R,L2).

グラフと値で出力([]).
グラフと値で出力([[N,C,L]|R]) :-
  all(L,'*'),
  write_formatted(' %t: %t %t\n',[N,L,C]),
  グラフと値で出力(R).
71デフォルトの名無しさん:2009/11/09(月) 17:59:38
http://pc12.2ch.net/test/read.cgi/tech/1248012902/464
# 0〜30の数字の中からランダムに5つ重複なしで選びたいんですが
# どうやったらいいでしょうか?
# もしそういう関数があれば教えてください
72デフォルトの名無しさん:2009/11/09(月) 18:08:00
>>71
% Prolog

'0〜30の数字の中からランダムに5つ重複なしで選ぶ' :-
  length(L,5),
  '0〜30の数字の中からランダムに5つ重複なしで選ぶ'(L,[],X).

'0〜30の数字の中からランダムに5つ重複なしで選ぶ'([],X,X).
'0〜30の数字の中からランダムに5つ重複なしで選ぶ'([_|R1],Y,X) :-
  N is random mod 31,
  \+(member(N,Y)),
  '0〜30の数字の中からランダムに5つ重複なしで選ぶ'(R1,[N|Y],X),!.
'0〜30の数字の中からランダムに5つ重複なしで選ぶ'(L1,Y,X) :-
  '0〜30の数字の中からランダムに5つ重複なしで選ぶ'(L1,Y,X).
73デフォルトの名無しさん:2009/11/09(月) 18:35:25
http://pc12.2ch.net/test/read.cgi/tech/1255709298/694
# [1] 授業単元:画像処理
# [2] 問題文(含コード&リンク):
#   ブレゼンハムのアルゴリズムを用いて、ウインドウ内に線分を描画するプログラムを作成しなさい。
#   動作の仕様は2通りの中から選びなさい。(どちらでもよい)
#
#   仕様1(マウスの左ボタンと右ボタンを使用する。候補線を表示はなし。)
#   マウスの左ボタンクリック   線分の始点座標の指定
#   マウスの右ボタンクリック   線分の終点座標の指定及び線分の描画
#
#   仕様2(マウスの左ボタンだけで操作する。候補線を表示する。)
#   マウスの左ボタンクリック   線分の始点座標の指定、及び線分の描画開始
#   マウスの移動         始点から線分を絶えず候補として描画。(古い線分は消す)
#   マウスの左ボタンクリック   線分の終点座標の確定。線分を描画。
#
# ただし、ライブラリの点を描画するAPI関数を使って線分を引くこと。直線を引くAPI関数を使ってはならない。
74デフォルトの名無しさん:2009/11/09(月) 23:54:23
http://pc12.2ch.net/test/read.cgi/tech/1255709298/705
# [1] 授業単元:データ構造とアルゴリズム設計
# [2] 問題文(含コード&リンク):
# 入力された小文字のアルファベットを,リストを用いて順次格納する.
# ’−’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示するプログラムを作成
# せよ.
# ただし,リストに格納する際,リストの最後に追加するようにせよ.
# 例(a, b, c, - と順に入力したときa,b,cと出力される)
75デフォルトの名無しさん:2009/11/09(月) 23:55:43
http://pc12.2ch.net/test/read.cgi/tech/1255709298/697
#
# [1] 授業単元:
# アルゴリズムとプログラミング
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10082.txt
# プログラムに使用するデータファイル↓
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10071.txt
76デフォルトの名無しさん:2009/11/10(火) 00:56:32
>>74
% Prolog

'入力された小文字のアルファベットを,リストを用いて順次格納する.'’−'’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示' :-
  新しいキューを作る(_キュー),
  rawmode,
  get_char(_文字),
  '入力された小文字のアルファベットを,リストを用いて順次格納する.'’−'’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示'(_文字,_キュー),
  norawmode.

'入力された小文字のアルファベットを,リストを用いて順次格納する.'’−'’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示'('-',_キュー,_キュー) :- !.
'入力された小文字のアルファベットを,リストを用いて順次格納する.'’−'’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示'(_文字,_キュー,_キュー) :-
  キューに要素を追加する(_文字,_キュー,_キュー_2),
  get_char(_文字_2),
  '入力された小文字のアルファベットを,リストを用いて順次格納する.'’−'’が入力された時に文字の入力を終了し,それまでに格納された全ての文字を表示'(_文字_2,_キュー_2,_キュー_4),
  キューから要素を取り出す(_要素,_キュー_3,_キュー_4),
  put_char(_要素).

新しいキューを作る(X-X).
キューは空である(X-Y) :- X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).
キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y).
77デフォルトの名無しさん:2009/11/10(火) 01:14:45
<A HREF="http://nojiriko.asia/prolog/index.html">このディレクトリの索引</A>
http://pc12.2ch.net/test/read.cgi/tech/1257481818/90
# 始点
# x=cos(t)
# y=sin(t)
#
# 終点
# x=cos(t+dt)
# y=sin(t+dt)
#
# で線を描き、t=t+dtで疑似円を描いています。
#
# 長方形や楕円を、任意の角度に傾けるにはどのようにすれば良いのでしょうか?
#
7877:2009/11/10(火) 01:23:55
>>77
一行目にゴミが入ってしまった。無視してください。
http://nojiriko.asia/prolog/ サイトは故障中で12日に復旧します。
それまでは
http://prolog.asia/html/prolog/ サイトにほとんどをコピーしてあります。
79デフォルトの名無しさん:2009/11/10(火) 02:20:01
>>77
% Prolog

疑似円を描く :-
  疑似円座標をならびに得る(L),
  疑似円を描く(L).

疑似円を描く([[X1,Y1],[X2,Y2]]) :- 線分の描写(X1,Y1,X2,Y2).
疑似円を描く([[X1,Y1],[X2,Y2]|R]) :-
  線分の描写(X1,Y1,X2,Y2),
  疑似円を描く(R).

疑似円座標をならびに得る(L) :-
  _2π is 2 * pi,
  _dt is _2π / 100,
  疑似円座標をならびに得る(0.0,_2π,_dt,L).

疑似円座標をならびに得る(_t_1,_t_2,_dt,[]) :- _t_1 > _t_2,!.
疑似円座標をならびに得る(_t_1,_t_2,_dt,[[X,Y]|R]) :-
  X is cos(_t_1),
  Y is sin(_t_1),
  _t_3 is t_1 + _dt,
  疑似円座標をならびに得る(_t_3,_t_2,R).
80デフォルトの名無しさん:2009/11/10(火) 04:24:20
>>77
% Prolog (半径が1に固定というのはちょっと具合が悪かった)

疑似円を描く(_半径) :-
  疑似円座標をならびに得る(_半径,L),
  疑似円を描く(L).

疑似円を描く([[X1,Y1],[X2,Y2]]) :- 線分の描写(X1,Y1,X2,Y2).
疑似円を描く([[X1,Y1],[X2,Y2]|R]) :-
  線分の描写(X1,Y1,X2,Y2),
  疑似円を描く(R).

疑似円座標をならびに得る(_半径,L) :-
  _2π is 2 * pi,
  _dt is _2π / 100,
  疑似円座標をならびに得る(0.0,_2π,_dt,_半径,L).

疑似円座標をならびに得る(_t_1,_t_2,_dt,_,[]) :- _t_1 > _t_2,!.
疑似円座標をならびに得る(_t_1,_t_2,_dt,_半径,[[X,Y]|R]) :-
  X is _半径 * cos(_t_1),
  Y is _半径 * sin(_t_1),
  _t_3 is t_1 + _dt,
  疑似円座標をならびに得る(_t_3,_t_2,_dt,_半径,R). /* ここも直しました *
81デフォルトの名無しさん:2009/11/10(火) 04:29:43
http://pc12.2ch.net/test/read.cgi/tech/1255709298/719
# [1] 授業単元:画像処理Cプログラミング
# [2] 問題文(含コード&リンク): 基本プログラムを元に各処理を行う
#    基本プログラム:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10083.txt
#   処理内容: ある画像に円形・方形切り出し
# ラベリング、縮退・膨張の処理を行う
# 処理結果例は画像参照
#   処理結果例: http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10084.zip
82デフォルトの名無しさん:2009/11/10(火) 04:52:17
>>75 の問題文は以下。 (Cのソースを読まないと何をやってるか分からない)
# 初めて呼損が起こるまでに確率できた通信回数を評価したい。
# 次のプログラムに追加して、以下の方法で評価を行うプログラムを完成させてください。
#
# 1、ランダムに送受信ノードを決定する
# 2、与えられた送受信ノード間の経路を決定する
# (a)その経路上の全てのリンクに空き容量がある場合、それらを1Mbpsだけ減少させ、「確率できた通信回数」を1増やし、手続き1に戻る
# (b)その経路上に空き容量のないリンクが存在する場合、呼損とし、その時点までの「確率できた通信回数」を記録して手続き3に進む。
# 3、全リンクの空き容量を初期状態に戻し、手続き1に戻る
# 4、1〜3の手続きを1000回行い、「初めて呼損が起こるまでに確立できた通信回数」の平均を算出する。
83デフォルトの名無しさん:2009/11/10(火) 05:52:50
http://pc12.2ch.net/test/read.cgi/tech/1200175247/704
# B列に1万近くの数値があり、そこから特定の範囲(例えば100〜101など)に適した数値を
# 指定したセルに抽出し、複数ある場合はそのしたに並べて抽出するようなプログラムを作りたいのですが、
# どのようにしたらよいでしょうか?
84デフォルトの名無しさん:2009/11/10(火) 06:23:33
>>83 意味不明のところがあるけど、
% Prolog

t2_83(_抽出値範囲キーならび,_抽出ならび) :-
  'B列の生成'(B列),
  抽出ならびの初期化(_初期抽出ならび),
  t2_83(_抽出値範囲キーならび,B列,_初期抽出ならび,_抽出ならび).

t2_83([],B列,X,X).
t2_83([[_値範囲|_キー]|R1],B列,_抽出ならび,X) :-
  'B列から値抽出'(B列,_値範囲,_値ならび),
  抽出ならびの更新(_値ならび,_キー,_抽出ならび,_更新された抽出ならび),
  t2_83(R,B列,_更新された抽出ならび,X).

'B列から値抽出'(B列,_値下限-_値上限,_値ならび) :-
  findall(_値,(member(_値,B列),_値>=_値下限,_値=<_値上限),_値ならび).

抽出ならびの更新([],_,X,X).
抽出ならびの更新([_値|R],_キー,_抽出ならび,_更新された抽出ならび) :-
  list_nth(_キー,_抽出ならび,L1),
  append(L1,[_値],L2),
  位置指定によるならびの置換(_キー,L2,_抽出ならび,_置換された抽出ならび),
  抽出ならびの更新(R,_キー,_置換された抽出ならび,_更新された抽出ならび).

'B列の生成'(B列) :- findall(_値,(for(1,N,10000),_値 is random mod 10000),B列).

抽出ならびの初期化([[],[],[],[],[],[],[],[],[],[]]).
85デフォルトの名無しさん:2009/11/10(火) 06:30:05
>>84
行数制限にかかるので、ちょっとズルをしているが、本来は

位置指定によるならびの置換/4 (これ未定義!)の所はカウントしながら再帰処理を
するところ。
86デフォルトの名無しさん:2009/11/10(火) 08:27:27
http://pc12.2ch.net/test/read.cgi/tech/1255709298/725
# [1] 授業単元: アルゴリズム[I]
# [2] 問題文(含コード&リンク):a,b,c,d,eの5文字をアルファベットとして
#  重複なく4文字をで構成される全てのwordのなかで部分文字列として、
#  ad,bd,deを含まないものを表示せよ
# [3] 環境
#  [3.1] OS: Linux
#  [3.2] コンパイラ名とバージョン: gcc 3.4
#  [3.3] 言語: C
# [4] 期限: 11月11日
# [5] その他の制限 :
87デフォルトの名無しさん:2009/11/10(火) 08:45:31
>>86
% Prolog

'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示' :-
  順列([a,b,c,d,e],4,L),
  \+(append(_,[a,d|_],L)),
  \+(append(_,[b,d|_],L)),
  \+(append(_,[d,e|_],L)),
  atom_chars(_語,L),
  write_formatted('%t\n',[_語]),
  fail.
'a,b,c,d,eの5文字をアルファベットとして重複なく4文字で構成される全てのwordのなかで部分文字列として、ad,bd,deを含まないものを表示'.

% *** user: '順列' / 3 ***
'順列'(Y,0,[]).
順列(Y,N,[A|X]) :-
  del(A,Y,Z),
  M is N - 1,
  順列(Z,M,X).

% *** user: del / 3 ***
del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
  del(A,X,Y).
88デフォルトの名無しさん:2009/11/10(火) 11:32:34
http://pc12.2ch.net/test/read.cgi/tech/1255709298/733
# [1] 授業単元:卒業研究
# [2] 問題文:白黒濃淡画像をガンマ補正するプログラムを作る
89デフォルトの名無しさん:2009/11/10(火) 11:46:10
>>89
% Prolog

ガンマ補正(_画像ファイル,_Headerの長さ,_ガンマ補正,_補正された画像ファイル) :-
  open(_画像ファイル,read,Input,[type(binary)]),
  open(_補正された画像フィル,write,Output,[type(binary)]),
  for(1,N,_Headerの長さ),
  get_byte(C),
  put_byte(C),
  N=_Headerの長さ,
  get_byte(Input,C2),
  ガンマ補正(C2,Input,Output),
  close(Output),
  close(Input),!.

ガンマ補正(-1,_,_,_) :- !.
ガンマ補正(C,Input,Output,_ガンマ補正) :-
  _補正された値 is truncate(floor((( C / 255 ) ^ (1 / _ガンマ補正)) * 255 + 0
.5)),
  put_byte(_補正された値),
  get_byte(Input,C2),
  ガンマ補正(C2,Input,Output,_ガンマ補正).
90デフォルトの名無しさん:2009/11/10(火) 11:50:09
>>89 訂正
% Prolog

ガンマ補正(_画像ファイル,_Headerの長さ,_ガンマ補正,_補正された画像ファイル) :-
  open(_画像ファイル,read,Input,[type(binary)]),
  open(_補正された画像フィル,write,Output,[type(binary)]),
  for(1,N,_Headerの長さ),
  get_byte(Input,C),   /* 訂正箇所 */
  put_byte(Output,C),  /* 訂正箇所 */
  N=_Headerの長さ,
  get_byte(Input,C2),
  ガンマ補正(C2,Input,Output),
  close(Output),
  close(Input),!.

ガンマ補正(-1,_,_,_) :- !.
ガンマ補正(C,Input,Output,_ガンマ補正) :-
  _補正された値 is truncate(floor((( C / 255 ) ^ (1 / _ガンマ補正)) * 255 + 0.5)),
  put_byte(Output,_補正された値),  /* 訂正箇所 */
  get_byte(Input,C2),
  ガンマ補正(C2,Input,Output,_ガンマ補正).
91デフォルトの名無しさん:2009/11/10(火) 11:56:31
>>89 すみません。さらに訂正。引数が同じになってしまった。述語名を変えます。
% Prolog

ガンマ補正(_画像ファイル,_Headerの長さ,_ガンマ補正,_補正された画像ファイル) :-
  open(_画像ファイル,read,Input,[type(binary)]),
  open(_補正された画像フィル,write,Output,[type(binary)]),
  for(1,N,_Headerの長さ),
  get_byte(Input,C),
  put_byte(Output,C),
  N=_Headerの長さ,
  get_byte(Input,C2),
  ガンマ補正の一(C2,Input,Output,_ガンマ補正),
  close(Output),
  close(Input),!.

ガンマ補正の一(-1,_,_,_) :- !.
ガンマ補正の一(C,Input,Output,_ガンマ補正) :-
  _補正された値 is truncate(floor((( C / 255 ) ^ (1 / _ガンマ補正)) * 255 + 0.5)),
  put_byte(Output,_補正された値),
  get_byte(Input,C2),
  ガンマ補正の一(C2,Input,Output,_ガンマ補正).
92デフォルトの名無しさん:2009/11/10(火) 13:17:35
http://pc12.2ch.net/test/read.cgi/tech/1255709298/651
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク):
# 正の整数nの2乗の数に、2種類の数字しか現れない
# 4桁の正の整数 n をすべて挙げなさい
93デフォルトの名無しさん:2009/11/10(火) 13:26:38
>>92 ごめんこれは>>59と同じだった。実は問題が間違っていたという新解釈登場。

http://pc12.2ch.net/test/read.cgi/tech/1255709298/752
# 正の整数nを2乗して得られる4桁の整数のうち、
# 2種類の数字しか現れないものをすべて挙げなさい
94デフォルトの名無しさん:2009/11/10(火) 14:33:27
>>93
% Prolog これだと単純にすべて2乗して確かめる方法で済んでしまう。

t2_93 :-
  '正の整数nを2乗して得られる4桁の整数のうち、2種類の数字しか現れないものをすべて挙げる'(N),  
  write_formatted('%t\n',[N]),
  fail.
t2_93.

'正の整数nを2乗して得られる4桁の整数のうち、2種類の数字しか現れないものをすべて挙げる'(N) :-
  Max is trunscate(sqrt(9999)),
  for(1,N,Max),
  N1 is N * N,
  number_chars(N1,L),
  '2種類の数字しか現れない'(L).

'2種類の数字しか現れない'([A|R]) :- \+(R=[]),all(R,B),\+(B==A).
95デフォルトの名無しさん:2009/11/10(火) 14:55:07
>>93 またまた違った。'2種類の数字しか現れない'/1を変更
% Prolog

t2_93 :-
  '正の整数nを2乗して得られる4桁の整数のうち、2種類の数字しか現れないものをすべて挙げる'(N),  
  write_formatted('%t\n',[N]),
  fail.
t2_93.

'正の整数nを2乗して得られる4桁の整数のうち、2種類の数字しか現れないものをすべて挙げる'(N) :-
  Max is trunscate(sqrt(9999)),
  for(1,N,Max),
  N1 is N * N,
  number_chars(N1,L),
  '2種類の数文字しか現れない'(L).

'2種類の数文字しか現れない'([A|R]) :-
  ならびから削除(A,R,R1),
  \+(R1=[]),
  all(R1,_).

% *** user: 'ならびから削除' / 3 ***
ならびから削除(_,[],[]) :- !.
ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたなら
び) :-
  ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!.
ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび])
:-
  ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!.

96デフォルトの名無しさん:2009/11/10(火) 16:34:41
http://sum2cha.blogpico.com/archives/2017 レス番号182
# [1] 授業単元:アルゴリズム
# [2] 問題文:数値を1から10まで出力する。ただし、5まで出力した時点で
# 一度改行する
97デフォルトの名無しさん:2009/11/10(火) 16:40:22
>>96
% Prolog

'数値を1から10まで出力する。ただし、5まで出力した時点で一度改行する' :-
  for(1,N,10),
  write(N),
  'ただし、5まで出力した時点で一度改行する'(N),
  N = 10.

'ただし、5まで出力した時点で一度改行する'(5) :- nl,!.
'ただし、5まで出力した時点で一度改行する'(_).
98デフォルトの名無しさん:2009/11/10(火) 16:43:31
>>96
% Prolog

t :- for(1,N,10),write(N),t(N),N=10.

t(5) :- nl,!.
t(_).
99デフォルトの名無しさん:2009/11/10(火) 16:54:59
>>96
% Prolog

t :- t(1).

t(N) :- N > 10,!.
t(5) :- write(5),nl,t(6),!.
t(N) :- write(N),N2 is N + 1,t(N2).
100デフォルトの名無しさん:2009/11/10(火) 17:00:33
>>96
% Prolog

t :- t(1).

t(N) :- N > 10.
t(5) :- write(5),nl,t(6).
t(N) :- N >= 1,N =< 10,\+(N=5),write(N),N2 is N + 1,t(N2).
101デフォルトの名無しさん:2009/11/10(火) 18:07:23
http://sum2cha.blogpico.com/archives/2017 レス番号297
# 3より大きく、入力された上限の数未満の全ての自然数かつ非素数について、
# 3で割り切れるものは無視し、3で割った余りが1のものは加算し、
# 余りが2のものは減算して合計を求めよ
102デフォルトの名無しさん:2009/11/10(火) 18:30:24
>>101
% Prolog
'3より大きく、入力された上限の数未満の全ての自然数かつ非素数について、3で割り切れるものは無視し、3で割った余りが1のものは加算し、余りが2のものは減算して合計を求める'(_上限値,_合計) :-
  t2_101(4,_上限値,_合計).

t2_101(N,_上限値,0) :- N >= _上限値,!.
t2_101(N,_上限値,_合計) :-
  \+(素数である(N)),
  2 N mod 3,
  N2 is N + 1,
  t2_101(N2,_上限値,_合計2),
  _合計 is _合計2 - N.
t2_101(N,_上限値,_合計) :-
  \+(素数である(N)),
  1 N mod 3,
  N2 is N + 1,
  t2_101(N2,_上限値,_合計2),
  _合計 is _合計2 + N.
t2_101(N,_上限値,_合計) :-
  N2 is N + 1,
  t2_101(N2,_上限値,_合計).

素数である(N) :- N2 is N // 2,for(2,M,N2),0 is N mod M,!,fail.
素数である(_).
103デフォルトの名無しさん:2009/11/14(土) 05:23:04
>>17
NB.J言語
NB.問題1
f=:a.{~97+i.

>f 6
abcdef
104デフォルトの名無しさん:2009/11/14(土) 05:29:11
>>17
NB.J言語
NB.問題2
f=:verb def '+/a*+./0=3 5|"0 1 [a=.>:i.y'

>f 10
33
>f 100
2418
105デフォルトの名無しさん:2009/11/17(火) 05:34:20
OCNのアクセス封鎖中に、C/C++の宿題スレがどんどん進んでしまって、
余程連投しない限り追いつけなくなりました。ここ5日分は省きます。
http://nojiriko.asia/prolog/index.html にはその間の解答を12個
くらい解答を載せてあります。
106デフォルトの名無しさん:2009/11/17(火) 06:08:28
>>105 12課題どころか28課題あるようなので、リンクを示します。
c2-の後の番号が各宿題スレのレス番号になります。
<A HREF="http://nojiriko.asia/prolog/c2_713.html">c2-713:カエサル暗号の復号</A>
<A HREF="http://nojiriko.asia/prolog/c2_817.html">c2-817:借金の定額返済。何年で返済できるか</A>
<A HREF="http://nojiriko.asia/prolog/shiharaigaku.html"> :ローンの支払い</A>
<A HREF="http://nojiriko.asia/prolog/c2_821.html">c2-812:2進数の1の補数</A>
<A HREF="http://nojiriko.asia/prolog/c2_825.html">c2-825:1から20までを表示する</A>
<A HREF="http://nojiriko.asia/prolog/c2_832.html">c2-832:最大値と置換することによって整列する</A>
<A HREF="http://nojiriko.asia/prolog/c2_833.html">c2-833:対称行列とは</A>
<A HREF="http://nojiriko.asia/prolog/c2_834.html">c2-834:文字列の結合</A>
<A HREF="http://nojiriko.asia/prolog/c2_836.html">c2-836:語の辞書順整列</A>
<A HREF="http://nojiriko.asia/prolog/c2_840.html">c2-840:グー・チョキ・パー</A>
<A HREF="http://nojiriko.asia/prolog/c2_949.html">c2-949:欠落部分の認識</A>
<A HREF="http://nojiriko.asia/prolog/c2_950.html">c2-950:1ポンドは何ドルか</A>
107デフォルトの名無しさん:2009/11/17(火) 06:11:39
<A HREF="http://nojiriko.asia/prolog/py954.html">py-954:1000よりも小さいすべて
の「3または5の倍数」の合計を計算し,結果を表示するプログラム</A>
<A HREF="http://nojiriko.asia/prolog/c2_956.html">c2-956:示された手順に従って入力された値の最大値を表示する</A>
<A HREF="http://nojiriko.asia/prolog/c2_990.html">c2-990:試験の個人平均点による評価</A>
<A HREF="http://nojiriko.asia/prolog/c2_990_2.html">c2-990:試験の個人平均点による評価</A>
<A HREF="http://nojiriko.asia/prolog/py_964.html">py_964:一時ディレクトリ</A>
<A HREF="http://nojiriko.asia/prolog/py_972.html">py_972:繰り返し処理</A>
<A HREF="http://nojiriko.asia/prolog/c132_42.html">c132-42:繰り返し処理・findall/3,for/3,sub_atom/5</A>
<A HREF="http://nojiriko.asia/prolog/c132_42.html">c132-43:代入に関してC言語とPrologの差異</A>
<A HREF="http://nojiriko.asia/prolog/c132_50.html">c132-50:繰り返し処理・reverse,sub_atom/5</A>
<A HREF="http://nojiriko.asia/prolog/c132_62.html">c132-62:選択表示・reverse,sub_atom/5</A>
<A HREF="http://nojiriko.asia/prolog/c132_64.html">c132-64:キーボードから10人分の身長を入力し、 </A>
108デフォルトの名無しさん:2009/11/17(火) 06:13:35
<A HREF="http://nojiriko.asia/prolog/c132_68.html">c132-68:あなたのIPアドレスは</A>
<A HREF="http://nojiriko.asia/prolog/c132_72.html">c132-72:一文字分、整数の文字表現が増えると文字ごとの累計順位が変化する</A>
<A HREF="http://nojiriko.asia/prolog/c132_74.html">c132-74:行列に値の格納とその読み出し</A>
<A HREF="http://nojiriko.asia/prolog/c132_76.html">c132-76:文章中のアルファベットと数字の出現度数</A>
<A HREF="http://nojiriko.asia/prolog/c132_88.html">c132-88:アルファベットの1つ後ろの文字だけ表示</A>
109デフォルトの名無しさん:2009/11/17(火) 07:42:02
http://pc12.2ch.net/test/read.cgi/tech/1258158172/97
# struct meibo {char name[20];int eigo; int kokugo;}
# みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか?
# int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします
# };
#
110デフォルトの名無しさん:2009/11/17(火) 07:43:58
>>109
% Prolog

meibo(L) :-
findall(L2,(get_line(Line),split(Line,[','],L2)),L).
111デフォルトの名無しさん:2009/11/17(火) 07:47:06
>>110 end_of_fileを認識させるのを忘れた!

membo(L) :-
  findall(L2,(get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],L2))),L).
112デフォルトの名無しさん:2009/11/17(火) 09:06:09
>>111 ますます大変な失敗!! get_line/1は非決定性ではなかった。repeat/1が必要。

membo(L) :-
  findall(L2,(repeat,get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],))),L).
113デフォルトの名無しさん:2009/11/17(火) 09:53:06
昨夜の出題なのですが、これだけは載せておきましょう

http://pc12.2ch.net/test/read.cgi/tech/1258158172/81
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):公開鍵と秘密鍵を作り、これらを使い暗号化と復号
化を行うプログラムを書け。(RSA暗号)
# [4] 期限: 2009/11/17朝まで
# 暗号化と復号化の手順は
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10129.txt
#
114デフォルトの名無しさん:2009/11/18(水) 05:49:29
http://pc12.2ch.net/test/read.cgi/tech/1258158172/123
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 文字列GHIJKLMABCDERSTUVWFNOPQXYZに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。
# 例:入力文字列がCQであったときCDERSTUVWFNOPQを表示する。
115デフォルトの名無しさん:2009/11/18(水) 05:55:10
http://pc12.2ch.net/test/read.cgi/tech/1258158172/118
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10132.txt
#
# コンピューターに関数randを使用して0〜99の整数を作らせ、
# キーボードより数を入力し、
# コンピューターの作った数の方が大きければ「もっと大きいです」と表示し、再入力
# コンピューターの作った数の方が小さければ「もっと小さいです」と表示し、再入力
# コンピューターの作った数と一致すれば「当たりです」と表示し、終了
# 入力時には、何回目のトライかも表示すること。
116デフォルトの名無しさん:2009/11/18(水) 05:57:11
http://pc12.2ch.net/test/read.cgi/tech/1258158172/132
# [1] 授業単元:C言語入門
# [2] 問題文(含コード&リンク):txtファイルを複製するGUIプログラムを作りなさい
# [5] その他の制限:要望なのですが、OKボタンを押すとコピーができるようなものになっているとありがたいです。
#
117デフォルトの名無しさん:2009/11/18(水) 06:27:12
>>114
% Prolog

文字列('GHIJKLMABCDERSTUVWFNOPQX').

文字列から入力された第1文字目と第2文字目の間にある文字列を取り出して表示
する(_第1文字目,_第2文字目,_表示する副文字列) :-
  文字列(_文字列),
  atom_chars(_文字列,Chars),
  append(_,[_第1文字目|R1],Chars),
  append(Chars2,[_第2文字目|_],R1),
  atom_chars(_表示する副文字列,Chars2),
  write_formatted('%t\n',[_表示する副文字列]).
118デフォルトの名無しさん:2009/11/18(水) 06:57:34
119デフォルトの名無しさん:2009/11/18(水) 07:10:05
>>114
python

input1 = 'C'
input2 = 'Q'

str = 'GHIJKLMABCDERSTUVWFNOPQXYZ'
print str[str.index('C'):str.index('Q')+1]
120デフォルトの名無しさん:2009/11/18(水) 07:25:48
>>115
python(インデントがおかしいかも)

import random
x = random.randint(0,99)
y = -1
cnt = 0
while x != y:
if y < x:
print u'もっと大きいです'
elif y > x:
print u'もっと小さいです'
print u'試行回数 : ' + unicode(cnt)
cnt += 1
y = input(u'Input your answer: ' )
print u'当たりです ' + unicode(x)
121デフォルトの名無しさん:2009/11/18(水) 07:28:18
122デフォルトの名無しさん:2009/11/18(水) 07:53:23
>>116
python

from easygui import *
import sys,shutil

source = open('./src.dat','w')
source.write('test')
source.close()


r = msgbox(u'こぴーしますか?','Copy',ok_button='OK')
if r != None:
shutil.copyfile('./src.dat','./dst.dat')
123デフォルトの名無しさん:2009/11/18(水) 08:06:50
>>114
% Prolog 実際にはライブラリから述語sub_atom/10を使って、
% http://nojiriko.asia/prolog/t264_u.html

'2つの文字に挟まれた副文字列'(_文字列,_第一文字目,_第二文字目,_副文字列) :-
  sub_atom(_文字列,_,1,_,_,_第一文字目,_残り文字列,_,_,_),
  sub_atom(_残り文字列,_,1,_,_副文字列,_第二文字目,_,_,_,_).

% 表示は省略した。
124デフォルトの名無しさん:2009/11/18(水) 11:22:26
http://pc12.2ch.net/test/read.cgi/tech/1258158172/141
# [1] 授業単元:C言語
# [2] 問題文:
# 整数値として入力された数を素因数分解するプログラムを作成せよ。
# 表示は、612 = 2^2*3^2*17のようにする、これは2の2乗×3の2乗×17という意味であ

#
# 普通に全部×で表示するものはできたんですが、612 = 2^2*3^2*17と^をつかい、〜の何乗と表現するやり方がわかりませんでした。
# よろしくおねがいします。
#
125デフォルトの名無しさん:2009/11/18(水) 11:37:36
http://pc12.2ch.net/test/read.cgi/tech/1258158172/140
#
# 多重繰り返し文を使って,z=1-(x^2+y^2)とz=0平面とで 囲まれる領域の体積の近似値を求めよ.
#
# です。よろしくおねがいします。
#
126デフォルトの名無しさん:2009/11/18(水) 13:03:21
>>124
% Prolog
素因数分解表示(N) :- 素因数分解(N,X),write_formatted('%t = %t\n',[X]).

素因数分解(N,X) :- 素因数分解(2,N,N,0,[],L),素因数分解項構成(L,X).

素因数分解(U,M,N,C,X,X) :- U >= N // 2,!.
素因数分解(U,M,N,0,Y,X) :- member(J^_,Y),0 is U mod J,U2 is U + 2,素因数分解(U2,N,N,0,Y,X),!.
素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2),素因数分解(3,N,N,0,Y,X),!.
素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2),素因数分解(3,N,N,0,[2^C|Y],X),!.
素因数分解(U,M,N,0,Y,X) :- \+(U=2),\+(0 is M mod U),U2 is U + 2,素因数分解(U2,N,N,0,Y,X),!.
素因数分解(U,M,N,C,Y,X) :- \+(U=2),\+(0 is M mod U),U2 is U + 2,素因数分解(U2,N,N,0,[U^C|Y],X),!.
素因数分解(U,M,N,C,Y,X) :- 0 is M mod U,C2 is C + 1,M1 is M // U,素因数分解(U,M1,N,C2,Y,X).

素因数分解項構成([A],A) :- !.
素因数分解項構成([A|R1],B * A) :- 素因数分解項構成(R1,B).
127デフォルトの名無しさん:2009/11/18(水) 14:02:25
http://pc12.2ch.net/test/read.cgi/tech/1258158172/148
# それほど長くないアドレス帳の製作をお願いします。
#
128デフォルトの名無しさん:2009/11/18(水) 14:05:40
>>127
% Prolog

アドレス帳に追加(_氏名,_電話番号ならび,_アドレス) :- assertz(アドレス帳(_氏名,_電話番号ならび,_アドレス)).

アドレス帳から削除(_氏名,_電話番号ならび,_アドレス) :- retract(アドレス帳(_氏名,_電話番号ならび,_アドレス)).

アドレス帳から重複削除(_氏名,_電話番号ならび,_アドレス) :-
  retract(アドレス帳(_氏名,_電話番号ならび,_アドレス)),
  write_formatted('%t\t%t\t%t\t\n',[_氏名,_電話番号ならび,_アドレス]),
  write('この節を削除しますか y or n : '),get_line(Line),
  アドレス帳から重複削除の二(_氏名,_電話番号ならび,_アドレス).
  fail.
アドレス帳から重複削除(_氏名,_電話番号ならび,_アドレス).

アドレス帳から重複削除の二(y,_氏名,_電話番号ならび,_アドレス) :- !.
アドレス帳から重複削除の二(y,_氏名,_電話番号ならび,_アドレス) :-
  \+(Line = y),
  asserta(アドレス帳(_氏名,_電話番号ならび,_アドレス)),!.

アドレス帳を表示(_氏名) :-
  アドレス帳(_氏名,_電話番号ならび,_アドレス),
  write_formatted('\n%t\t%t\t%t\t\n',[_氏名,_電話番号ならび,_アドレス]).
129デフォルトの名無しさん:2009/11/18(水) 22:39:53
>>125
% Prolog

c132_125(_刻み数,_体積の近似値) :-
  _刻み is 1 / _刻み数,
  断面積の積み上げ(_刻み,0.0,L),
  台形の積み上げ(L,_刻み,_体積の近似値).

断面積の積み上げ(_刻み,P,[]) :- P > 1.0,!.
断面積の積み上げ(_刻み,P,[U1|R]) :-
  U1 is (sqrt((P-1.0) * (-1.0)) ^ 2) * pi,
  P2 is P + _刻み,
  断面積の積み上げ(_刻み,P2,R).

台形の積み上げ([A,B],H,S) :- S is (A + B) / 2 * H,!.
台形の積み上げ([A,B|R],H,S) :-
  U is (A + B) / 2 * H,
  台形の積み上げ([B|R],H,S1),
  S is S1 + U.
130デフォルトの名無しさん:2009/11/19(木) 00:46:52
http://pc12.2ch.net/test/read.cgi/tech/1248012902/487
#【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/834.txt
# [4] 探索問題のアルゴリズムについて,以下の問いに答えよ
# (1) 大きな者から順にデータが並んでいる配列を対象とする,2 分探索のプ
# ログラムコードを示せ. プログラムインタフェース(API) は
# bsearch(int key)とする.
#
# (2) 配列を対象とする番兵法を用いない線形探索のプログラムを書け.プロ
# グラムインタフェース(API)はlsearch(int key)とする.
#
# (3) 配列を対象とする番兵法を用いる線形探索のプログラムを書け.ただし,
# データが満杯になることはないと仮定して良い.プログラムインタフェ
# ース(API)はssearch(int key)とする.
#
# [5] キューを配列で表現したとき,データをキューに挿入するinsert(int i)
# とデータをキューから取り除くremove()のプログラムコードを示せ.ただし
# キューが満杯になることは考えなくても良い.つまりリングキューにする必要
# はない.
#
# [6] 連結リストでスタックを表現したとき,データをスタックに挿入する
# push(int i)とデータをスタックから取り除くpop()のプログラムコードを示
# せ.ただしスタックが空の時にpop が呼ばれたときには,エラーメッセージを
# 出すようにすること.(連結リストを使うと,原理的にはスタックが満杯になる
# ことはないので,push におけるエラーメッセージは不要)
131デフォルトの名無しさん:2009/11/19(木) 05:25:28
>>130
% Prolog
% [5]
insert(E,X-[E|Y],X-Y).

remove(E,[E|X]-Y,X-Y).

new(X-X).

empty(X-Y) :- X == Y.
% remove/3は組込述語として存在する。ここでは別にユーザが登録可能とした。
% ?- remove([c,d],[a,b,c,d,e],X).
% X = [a,b,e]

% [6]
push(I,Stack,[I|Stack]).

pop(I,[I|Stack],Stack).
pop(I,[],[]) :- write('Error:stack empty!\n').
132デフォルトの名無しさん:2009/11/19(木) 05:31:54
>>130

[4] Prologには配列がないため、中間位置要素を得るのに必ず逐次的に
リストを手繰る必要がある。したがって、この問題の解として意味の
あるプログラムを作ることはできない。
133デフォルトの名無しさん:2009/11/19(木) 12:39:17
http://pc12.2ch.net/test/read.cgi/tech/1258158172/157
# [1] 授業単元: アルゴリズム&アプリケーション
# [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。
# 各行の情報は、
# 顧客名,前月繰越高,当月入金高,当月売上高,締め日付
# であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。
# 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。
# さて更新プログラムのバグから、或る月の前月繰越高が
# その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。
# 不整合になった以降の情報が正しく、
# それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、
# 1) 不整合部分を探し
# 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。
# ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、
# その後、元のcsvファイルに書き戻しなさい。
# [5] その他の制限: 日付などの持ち方は自由に工夫してよい。
134デフォルトの名無しさん:2009/11/19(木) 12:42:16
135デフォルトの名無しさん:2009/11/19(木) 18:46:14
http://pc12.2ch.net/test/read.cgi/tech/1258320456/20
# ある自然数nについて,nの約数のうち,nより小さいものの和がnと一致するとき,nは完全数と呼ばれる.
#
# たとえば,6の約数は 1, 2, 3, 6 であり,
#
# 6 = 1 + 2 + 3
#
# なので,6は完全数である.
#
# 1000以下のすべての完全数を表示するプログラムを作成せよ.
#
136デフォルトの名無しさん:2009/11/19(木) 18:47:58
>>135
% Prolog

py2_20 :- for(1,N,1000),完全数(N),write_formatted('%t\n',[N]),N=1000,!.
py2_20.

完全数(N) :- findsum(M,(for(1,M,N),0 is N mod M,M < N),X),N is truncate(X).
137デフォルトの名無しさん:2009/11/19(木) 18:52:18
http://pc12.2ch.net/test/read.cgi/tech/1258158172/158
# [1] 授業単元: プログラム演習
# [2] 問題文(含コード&リンク):
# 整数nを読み込み、最外周の長さnの数字のとぐろをまいた図を出力するプログラムを作りなさい。
#
138デフォルトの名無しさん:2009/11/20(金) 05:40:49
http://pc12.2ch.net/test/read.cgi/tech/1258158172/168
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10137.txt
# [課題1-1] 線形探索
#  キーボードから1から30までの整数を入力し、配列 a に対して入力値の線形探索を行い、見つかった
# 結果をすべて表示するプログラムを作成しなさい.ただし、配列 a は1から30までの乱数が100個入って
# いるとする.また、入力の前に配列 a の内容を10個ずつ区切って表示しなさい.
#
# [課題1-2] 線形探索(番兵法)
# 番兵法を用いて課題1-1のプログラムを書き換え,キーボードからの入力値が1〜30以外の場合、あるいは
# 配列 a に目的のデータが存在しない場合に「見つかりませんでした」と表示するプログラムを作成しなさい.
# ただし、目的のデータが存在する場合は,最初に見つかった要素だけ表示させること.
#
139デフォルトの名無しさん:2009/11/20(金) 05:45:33
http://pc12.2ch.net/test/read.cgi/tech/1258158172/172
# 論理の問題ですが
#
# 95年「ここ数年で一番出来が良い」
# 96年「10年に1度の逸品」
# 97年「1976年以来の品質」
# 98年「10年に1度の当たり年」
# 99年「品質は昨年より良い」
# 00年「出来は上々で申し分の無い仕上がり」
# 01年「ここ10年で最高」
# 02年「過去10年で最高と言われた01年を上回る出来栄え」「1995年以来の出来」
# 03年「100年に1度の出来」「近年にない良い出来」
# 04年「香りが強く中々の出来栄え」
# 05年「ここ数年で最高」
# 06年「昨年同様良い出来栄え」
# 07年「柔らかく果実味が豊かで上質な味わい」
# 08年「豊かな果実味と程よい酸味が調和した味
# 09年「50年に1度の出来栄え」
#
# です
140デフォルトの名無しさん:2009/11/20(金) 05:52:14
http://pc12.2ch.net/test/read.cgi/tech/1248012902/493
# 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/840.txt
#
# 入力した10進数の数字を表示し、10進数を2進数に、10進数を36進数に変換し、表示する。
# 36進数は{0〜9,A〜Z}の文字を使用しなければいけない。

141デフォルトの名無しさん:2009/11/20(金) 05:55:02
http://pc12.2ch.net/test/read.cgi/tech/1258320456/30
# 1. 引数nを与えると,nが素数の時はTrueを,素数でないときはFalseを返す関数prime(n) を定義せよ.
# 2. 関数 prime(n) を使用して,1000以下の素数をすべて表示するプログラムを書け.見つかった個数も表示すること.
#
# Hint
#
# 1. 素数とは,1とその数自身のみを約数に持つ数である(ただし,1を除く).
# 2. 言い換えると,2からn-1までのいずれでもnが割り切れない場合,nは素数である(ただし,n > 2の場合).
# 3. または,2からn-1までのいずれか1つでもnを割り切ることができる場合,nは素数ではない(同上).
#
142デフォルトの名無しさん:2009/11/20(金) 06:30:50
>>139
% Prolog 何をするにせよ、第一段階w 第二引数の論理的な解析はじっくり楽しませていただきます。

ボージョレ・ヌーボーの謳い文句('95年','ここ数年で一番出来が良い').
ボージョレ・ヌーボーの謳い文句('96年','10年に1度の逸品').
ボージョレ・ヌーボーの謳い文句('97年','1976年以来の品質').
ボージョレ・ヌーボーの謳い文句('98年','10年に1度の当たり年').
ボージョレ・ヌーボーの謳い文句('99年','品質は昨年より良い').
ボージョレ・ヌーボーの謳い文句('00年','出来は上々で申し分の無い仕上がり').
ボージョレ・ヌーボーの謳い文句('01年','ここ10年で最高').
ボージョレ・ヌーボーの謳い文句('02年','過去10年で最高と言われた01年を上回る出来栄え,1995年以来の出来').
ボージョレ・ヌーボーの謳い文句('03年','100年に1度の出来,近年にない良い出来').
ボージョレ・ヌーボーの謳い文句('04年','香りが強く中々の出来栄え').
ボージョレ・ヌーボーの謳い文句('05年','ここ数年で最高').
ボージョレ・ヌーボーの謳い文句('06年','昨年同様良い出来栄え').
ボージョレ・ヌーボーの謳い文句('07年','柔らかく果実味が豊かで上質な味わい').
ボージョレ・ヌーボーの謳い文句('08年','豊かな果実味と程よい酸味が調和した味').
ボージョレ・ヌーボーの謳い文句('09年','50年に1度の出来栄え').
143デフォルトの名無しさん:2009/11/20(金) 07:30:38
>>142
% Prolog 第二段階w たとえば・・

ここ数年で一番出来が良い(_年産) :-
  出来が良い(_年産,_出来具合),
  ここ数年(_年産,Term),
  findall(_出来具合2,(member(_年産2,Term),ボージョレ・ヌーボー(_年産2,_出来具合2)),_ここ数年のボージョレ・ヌーボー出来具合ならび),
  max(_ここ数年のボージョレ・ヌーボー評価ならび,_出来具合).
144デフォルトの名無しさん:2009/11/20(金) 07:50:07
>>143
% Prolog

ここ数年(_年産,_ここ数年) :-
  年を切り取る(_年産,_年),
  定義者の年齢(_年齢),
  数年は定義者の年齢によって異なる(_年齢,_数年),
  _起点年 is _年 - _数年,
  findall(_年産2,(for(_起点年,_年2,_年),concat_atom([_年,年],_年産2)),_ここ数年).

年を切り取る(_年産,_年) :-
  sub_atom(_年産,S,_,_,年),
  sub_atom(_年産,0,S,_,_年2),
  atom_to_term(_年,_年,_).

定義者の年齢(60).

数年は定義者の年齢によって異なる(_年齢,3) :- _年齢 < 70.
数年は定義者の年齢によって異なる(_年齢,5) :- _年齢 >= 70.
145デフォルトの名無しさん:2009/11/20(金) 10:42:39
>>141
% Prolog

prime(N,'True') :-
  '素数とは,1とその数自身のみを約数に持つ数である(ただし,1を除く)'(N).
prime(N,'False') :-
  \+('素数とは,1とその数自身のみを約数に持つ数である(ただし,1を除く)'(N)).

'素数とは,1とその数自身のみを約数に持つ数である(ただし,1を除く)'(N) :-
  0 is N mod 1,
  0 is N mod N,
  \+((for(2,M,N-1),0 is N mod M)),
  \+(N==1).
146デフォルトの名無しさん:2009/11/20(金) 10:47:29
>>141
% Prolog

'prime(n) を使用して,1000以下の素数をすべて表示する' :-
  for(1000,N,1),
  prime(N,'True'),
  write_formatted('%t\n',[N]),
  N = 1.
'prime(n) を使用して,1000以下の素数をすべて表示する'.
147デフォルトの名無しさん:2009/11/20(金) 11:06:20
>>140
% Prolog これは前スレ875に既出 http://nojiriko.asia/prolog/t875.html
% ここでは少し整理して
http://nojiriko.asia/prolog/j68_493.html
148デフォルトの名無しさん:2009/11/20(金) 17:29:27
http://pc12.2ch.net/test/read.cgi/tech/1258158172/181
# [1] 授業単元:関数を利用したプログラム
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10144.txt
# 課題内容
# 季節がずれますが,夏の頃の天気予報でよく「不快指数」という言葉を聞いたことがあると思います.
# 不快指数が高いと蒸し暑く,寝ぐるしくなります.
# この不快指数は,気温(正確には乾球気温)と湿度という2つの数値により求められます.
# 気温をt(度),湿度をh(%)とすると,以下の式で不快指数が求められます.
# 不快指数 = 0.81× t + 0.01 × h × (0.99 × t - 14.3) + 46.3#
# この不快指数により,次の表のような感覚を得るようです.
# 不快指数 〜55 〜60 〜65 〜70 〜75 〜80 〜85 85〜
# [問題]
# 2つの浮動小数点型(double型)の値を「気温(度)」と「湿度(%)」を表す値として2つの引数で受け取り,
# それらの値によって求められた不快指数の値(dobule型)を戻り値とする関数をfukaishisuuという関数名で作成しよう.
# さらに,このfukaishisuu関数を利用し,キーボードから気温と湿度の値を入力すると,
# 不快指数の値によって体感を示す言葉を表示するプログラムを作成しよう.
149デフォルトの名無しさん:2009/11/20(金) 17:46:13
>>143 一ヶ所間違っていた。訂正
% Prolog

ここ数年(_年産,_ここ数年) :-
  年を切り取る(_年産,_年),
  定義者の年齢(_年齢),
  数年は定義者の年齢によって異なる(_年齢,_数年),
  _起点年 is _年 - _数年,
  findall(_年産2,(for(_起点年,_年2,_年),concat_atom([_年2,年],_年産2)),_ここ数年).

年を切り取る(_年産,_年) :-
  sub_atom(_年産,S,_,_,年),
  sub_atom(_年産,0,S,_,_年2),
  atom_to_term(_年,_年,_).

定義者の年齢(60).

数年は定義者の年齢によって異なる(_年齢,3) :- _年齢 < 70.
数年は定義者の年齢によって異なる(_年齢,5) :- _年齢 >= 70.
150デフォルトの名無しさん:2009/11/20(金) 19:08:56
>>148 一行大事な所が抜けていた
# 不快指数 〜55 〜60 〜65 〜70 〜75 〜80  〜85    85〜
#  体感 寒い 肌寒い 快適 快適 快適 やや不快 不快 不快でたまらない
151デフォルトの名無しさん:2009/11/20(金) 20:26:11
>>148
% Prolog

不快指数体感表示(_気温,_湿度) :-
  不快指数(_気温,_湿度,_不快指数),
  不快指数体感(_不快指数,_体感),
  write_formatted('%tです\n',[_体感]).

不快指数(_気温,_湿度,_不快指数) :-
  _不快指数 is truncate(0.81* _気温 + 0.01 * _湿度 * (0.99 * _気温 - 14.3) +
46.3).

不快指数体感(_不快指数,肌寒い) :- _不快指数 =< 55,!.
不快指数体感(_不快指数,寒い) :- _不快指数 =< 60,!.
不快指数体感(_不快指数,快適) :- _不快指数 =< 65,!.
不快指数体感(_不快指数,快適) :- _不快指数 =< 70,!.
不快指数体感(_不快指数,快適) :- _不快指数 =< 75,!.
不快指数体感(_不快指数,やや不快) :- _不快指数 =< 80,!.
不快指数体感(_不快指数,不快) :- _不快指数 =< 85,!.
不快指数体感(_不快指数,不快でたまらない) :- _不快指数 > 85.

152デフォルトの名無しさん:2009/11/21(土) 04:36:22
http://pc12.2ch.net/test/read.cgi/tech/1258158172/201
# [1] アルゴリズム
# [2] 手入力したい数列の数をまず入力し、その数だけ数列を手入力します。
# その中に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果を表示。
153デフォルトの名無しさん:2009/11/21(土) 05:20:06
154デフォルトの名無しさん:2009/11/21(土) 07:04:18
>>140
% Prolog トップレベルだけ書いておきます。入力した数という場合、
% 今後は定義述語の引数として与えることにします。Prologはインタプリタトップからの
% 使用が当たり前で、述語のなかで入力を求めることはほとんどありません。
% これまで、C言語などの様式に従ってきましたが、これからは上記の方針でいきます。

入力した10進数の数字を表示し、10進数を2進数に、10進数を36進数に変換し、表示する
(_10進数) :-
  N進数(2,_10進数,_2進数文字列),
  N進数(36,_10進数,_36進数文字列),
  write_formatted('10進数 %t は 2進数表現では %t 36進数表現では %t となります
\n',[_10進数,_2進数,_36進数]).

% N進数/3の定義は http://nojiriko.asia/prolog/j68_493.html 参照
155デフォルトの名無しさん:2009/11/21(土) 07:07:33
>>154
% 改行が入ってはいけないところに入ってしまいました。
% 書き直します。

入力した10進数の数字を表示し、10進数を2進数に、10進数を36進数に変換し、表示する(_10進数) :-
  N進数(2,_10進数,_2進数文字列),
  N進数(36,_10進数,_36進数文字列),
  write_formatted('10進数 %t は 2進数表現では %t 36進数表現では %t となります\n',[_10進数,_2進数,_36進数]).

% N進数/3の定義は http://nojiriko.asia/prolog/j68_493.html 参照
156デフォルトの名無しさん:2009/11/21(土) 11:33:59
http://pc12.2ch.net/test/read.cgi/tech/1258158172/200
# [1] 授業単元: コンピュータアーキテクチャ
# [2] 問題文(含コード&リンク):
# 以下の仕様を満たすもぐらたたきゲームを作成する。
# ・ 一度に一つ以上の文字を画面上に表示する
# ・ 一定時間以内に表示された文字と同じキーが押されたら得点とする
# ・ キー入力を受け付ける一定時間が過ぎたら文字を消去する
# 以上の処理を一定回数繰り返す
#
157デフォルトの名無しさん:2009/11/21(土) 12:29:05
158デフォルトの名無しさん:2009/11/21(土) 18:10:24
http://pc12.2ch.net/test/read.cgi/tech/1258158172/211
# [1] 授業単元:プログラミング演習第一
# [2] 問題文:
# #include <stdio.h>
#
# int main(void)
# {
# int t = 6;
#
# if(t >= 6 && t < 12){
# printf("%d時です。おはようございます。\n",t);
# }else if (t >= 12 && t < 18) {
# printf("%d時です。こんにちは。\n",t);
# }else if (t >= 18 && t < 24) || (t >= 0 &&t < 6)){
# printf("%d時です。こんばんは。\n",t);
# }else {
# printf("%d時は時刻の範囲外です。\n",t);
# }
# return 0;
# }
# これのswitch文で書き換えたプログラムを作成しなさい。
# ただし、case文の使用は4回を上限とする。
159デフォルトの名無しさん:2009/11/21(土) 18:13:24
>>158
% Prolog

switch文を使って条件部分を小さく纏める(T) :-
  M is T // 6,
  switch(M,(1:おはようございます(T);2:こんにちは(T);3:こんばんは(T))).

おはようございます(T) :-
  write_formatted('%t時です。おはようございます。\n',[T]).
こんにちは(T) :-
  write_formatted('%t時です。こんにちは。\n',[T]).
こんばんは(T) :-
  write_formatted('%t時です。こんばんは。\n',[T]).

switch(N,N:P) :-
  call(P).
switch(N,(N:P;R)) :-
  call(P).
switch(N,(A:P;R)) :-
  \+(N=A),
  switch(N,R).
160デフォルトの名無しさん:2009/11/21(土) 21:42:31
http://pc12.2ch.net/test/read.cgi/tech/1258158172/212
# [1] 授業単元:プログラミング演習
# [2] 問題文:
# 3行3列の実数行列A=[a_ij]とB[b_ij]の積ABを計算せよ。
# ただし、乗算結果の行列を[c_ij]として次の計算を行うものとする。
# 行列の要素への入力は、代入文あるいは初期化子をもちいること。
# c_ij=Σa_ik×b_kj (Σはk=0で、2までです)
#
161デフォルトの名無しさん:2009/11/21(土) 21:43:43
>>160
% Prolog

行列の掛け算(_行列a,_行列b,_行列c) :-
  findall(L1,for(1,N,3),length(L1,3),_行列c),
  findall(W,順列([1,2,3],2,W),_順列),
  掛け算(_順列,_行列a,_行列b,_行列c),

行列の掛け算([],_,_,_) :- !.
行列の掛け算([[I,J]|R1],_行列a,_行列b,_行列c) :-
  findsum(U,(  for(1,K,3),
         行列要素(_行列a,I,K,N1),
         行列要素(_行列b,K,J,N2),
         U is N1 * N2),S),
  行列要素(_行列c,I,J,S),
  行列の掛け算(R1,_行列a,_行列b,_行列c).
 
行列要素(_行列,_行,_列,_値) :-
  list_nth(_行,_行列,_行の値ならび),
  list_nth(_列,_行の値ならび,_値).
162デフォルトの名無しさん:2009/11/21(土) 22:56:08
>>161
順列だと [1,1],[2,2],[3,3] が入らないからだめでしょう。
これが入ってるのは何て云ったかな?
163デフォルトの名無しさん:2009/11/22(日) 06:06:12
>>162
そうだった! これまでも間違えたところがあったかな・・
「重複順列」。

重複順列(L,N,X) :- length(X,N),重複順列(L,X).
重複順列(L,[]).
重複順列(L,[A|R]) :- member(A,L),重複順列(L,R).

を定義しておく。その上で。
164デフォルトの名無しさん:2009/11/22(日) 06:08:18
>>160 >>161訂正
% Prolog

行列の掛け算(_行列a,_行列b,_行列c) :-
  findall(L1,for(1,N,3),length(L1,3),_行列c),
  findall(W,重複順列([1,2,3],2,W),_重複順列),
  掛け算(_重複順列,_行列a,_行列b,_行列c),

行列の掛け算([],_,_,_) :- !.
行列の掛け算([[I,J]|R1],_行列a,_行列b,_行列c) :-
  findsum(U,(  for(1,K,3),
         行列要素(_行列a,I,K,N1),
         行列要素(_行列b,K,J,N2),
         U is N1 * N2),S),
  行列要素(_行列c,I,J,S),
  行列の掛け算(R1,_行列a,_行列b,_行列c).
 
行列要素(_行列,_行,_列,_値) :-
  list_nth(_行,_行列,_行の値ならび),
  list_nth(_列,_行の値ならび,_値).
165デフォルトの名無しさん:2009/11/22(日) 06:23:30
http://pc12.2ch.net/test/read.cgi/tech/1258158172/221
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10149.txt
# メイン関数において、2つの放物線
#  y=ax2+bx+c (a≠0)
#  y=px2+qx+r (p≠0)
# の係数a、b、c、p、q、rをキーボードから入力し、その数値を関数に引数として渡す。
# 関数はその数値を用いて2曲線の交点の有無を調べ、その交点の個数を戻り値としてメイン関数に渡す
# (交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする)。
# また関数は、もし交点が有限個存在するならばそれらの交点の座標値をメイン関数に渡す。
# メイン関数は関数から得たこれらの情報を得て、交点の個数を画面に表示し、さらにもし交点が有限個存在するならばそれらの座標値を画面に表示する。
# そのようなプログラムを作成せよ。
166デフォルトの名無しさん:2009/11/22(日) 07:10:26
>>165
% Prolog
二つの放物線の交点(_a,_b,_c,_p,_q,_r,X,Y) :-
  A is (_a - _p),
  B is (-b - _q),
  C is (_c - _r),
  D is B^2 - 4 * A * C,
  D > 0,
  X is ((-1) * B + sqrt(D)) / (2 * A),
  Y is _a * (X^2) + _b * X + _c.
二つの放物線の交点(_a,_b,_c,_p,_q,_r,X,Y) :-
  A is (_a - _p),
  B is (-b - _q),
  C is (_c - _r),
  D is B^2 - 4 * A * C,
  D > 0,
  X is ((-1) * B - sqrt(D)) / (2 * A),
  Y is _a * (X^2) + _b * X + _c.
二つの放物線の交点(_a,_b,_c,_p,_q,_r,X,Y) :-
  A is (_a - _p),
  B is (-b - _q),
  C is (_c - _r),
  D is B^2 - 4 * A * C,
  D = 0,
  X is ((-1) * B / (2 * A)),
  Y is _a * (X^2) + _b * X + _c.
167デフォルトの名無しさん:2009/11/22(日) 12:35:58
http://pc12.2ch.net/test/read.cgi/tech/1258158172/224
# C++で、ベクトルの加減を行うプログラムを教えてください。
# #include <iostream>
# using namespace std;
# int main() {
#
# return 0;
# }
# 入力→cin 出力→cout
# 配列とforでお願いします。
168デフォルトの名無しさん:2009/11/22(日) 12:37:12
>>167
% Prolog これも既出
http://nojiriko.asia/prolog/c132_106.html を参照
169デフォルトの名無しさん:2009/11/22(日) 18:54:01
http://pc12.2ch.net/test/read.cgi/tech/1258158172/236
# [1] C言語プログラミング演習
# [2] 標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換するプログラム
# (コマンドラインに 2 4 2 4 を与えた場合タブを入力したら3 7 10 17 20 27...が桁位置に
# なるようスペースを挿入する)
# 入力は半角文字に限って良い。またコマンドラインからは正の整数を表すものが
# 与えられるとして良い
170デフォルトの名無しさん:2009/11/22(日) 19:15:18
>>169
% Prolog

標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する :-
  user_paramegers(L),
  findall(N,(member(A,L),atom_to_term(A,N,_)),L2),
  get_chars(Chars),
  標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,Chars,X).

標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([],_タブストップサイクル,L2,L3) :-
  標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,L2,L3),!.

標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_,_,[],[]) :- !.
標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,['\t'|R2],L) :-
  length(L2,N),
  all(L2,' '),
  append(L2,L3,L),
  標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(R1,_タブストップサイクル,R2,L3),!.
標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,[A|R2],[A|R3]) :-
  \+(A='t'),
  標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する([N|R1],_タブストップサイクル,R2,R3).
171デフォルトの名無しさん:2009/11/22(日) 19:22:13
>>170
% Prolog これだと何も起こらない

標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する :-
  user_paramegers(L),
  findall(N,(member(A,L),atom_to_term(A,N,_)),L2),
  get_chars(Chars),
  標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,Chars,X),
  put_chars(X).
172デフォルトの名無しさん:2009/11/22(日) 20:32:46
http://pc12.2ch.net/test/read.cgi/tech/1258158172/240
# [1] 授業単元: プログラミング論
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10150.txt
#
# 問2(1)を書きました。添削・解説お願いします。
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10151.txt
# 問1
# 遊びの金に困ったA君は、サラ金を利用することにした。
# 日歩20銭で10万円借りた場合、30日後の利息はいくらでしょうか?
# 複利計算で求めなさい。
#
# 問2
# (1)10万円を年利4分で預金したとき、10年後の元利合計を複利計算で求めよ。
# (2)前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示せよ。
173デフォルトの名無しさん:2009/11/23(月) 06:17:24
日歩20銭とは(_日歩20銭) :- _日歩20銭 is 20 / 100 / 100.
年利4分とは(0.04).

日歩20銭で10万円借りた場合、30日後の利息(_30日後の利息) :-
  日歩20銭とは(_日歩20銭),
  _30日後の利息 is _預金 * _日歩20銭^30 - _預金.

10万円を年利4分で預金したとき、10年後の元利合計(_10年後の元利合計) :-
  年利4分とは(_年利4分),
  _10年後の元利合計 is 100000 * ( 1 + _年利4分) ^ 10.

前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示 :- 前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示(1,100000,0).

前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示(N,_,_) :- N> 10,!.
前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示(N,_預金額,_前年度の利息) :-
  年利4分とは(_年利4分),
  _今年の利息 is _預金額 * _年利4分,
  _次年度の預金額 is _預金額 * _年利4分,
  _前年度の利息との差額 is _今年度の利息 - _前年度の利息,
  write_formatted('%t年後 前年度との利息差額は %t です\n',[N,_前年度の利息との差額]),
  N2 is N + 1,
  前年の利息がどのくらいずつ増えてゆくか、前年度の利息との差額を表示(N2,_次年度の預金額,_今年度の利息).
174デフォルトの名無しさん:2009/11/23(月) 08:21:38
http://pc12.2ch.net/test/read.cgi/tech/1200175247/745
# [1] 授業単元:プログラミング初歩
#
# [2] 問題文(含コード&リンク):
#
# ・文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換えるプログラムを作りなさい.
# ・文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい.
#
175デフォルトの名無しさん:2009/11/23(月) 08:26:10
>>174
% Prolog

文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換える(_文字列,_アルファベットの逆順に変換された文字列) :-
  atom_chars(_文字列,_文字ならび),
  アルファベット逆順変換(_文字ならび,_アルファベットの逆順に変換された文字ならび),
  atom_chars(_アルファベットの逆順に変換された文字列,_アルファベットの逆順に変換された文字ならび).

アルファベット逆順変換([],[]).
アルファベット逆順変換([A|R1],[B|R2]) :-
  逆順アルファベット探索(A,B),
  アルファベット逆順変換(R1,R2).

逆順アルファベット探索(A,B) :-
  アルファベットと逆順アルファベット(_,L1,L2),
  append(L0,[A|_],L1),
  length(L0,Len),
  length(L3,Len),
  append(L3,[B|_],L2).

アルファベットと逆順アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]).
アルファベットと逆順アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']).
176デフォルトの名無しさん:2009/11/23(月) 09:39:46
>>174
% Prolog 問題文[2]

文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返す(_文字列,_出現頻度順に文字を並べ替えた文字列) :-
  atom_chars(_文字列,_文字ならび),
  出現頻度順に文字ならびを変換(_文字ならび,[],_出現頻度順に並べ替えたもじならび),
  atom_chars(_出現頻度順に並べ替えたもじならび,_出現頻度順に文字を並べ替えた文字列).

出現頻度順に文字ならびを変換([],Y,X) :-
  sort(Y,Z),
  出現頻度ならびから逆順に文字選択(Z,[],X).
出現頻度順に文字ならびを変換([C|R1],Y,X) :-
  出現頻度ならびをカウントアップ(C,Y,Z),
  出現頻度順に文字ならびを変換(R1,Z,X).

出現頻度ならびをカウントアップ(C,[],[1,C]) :- !.
出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C]|R1]) :- N2 is N + 1,!.
出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N,C]|R2]) :-
  出現頻度ならびをカウントアップ(C,R1,R2).

出現頻度ならびから逆順に文字選択([],X,X) :- !.
出現頻度ならびから逆順に文字選択([[N,C]|R1],Y,X) :-
  出現頻度ならびから逆順に文字選択(R1,[C|Y],X).
177デフォルトの名無しさん:2009/11/23(月) 11:29:32
>>176
% 「大文字・小文字を区別せずに」を見落とした。どこを直せばいいかな・・・
% あ、大変、ここの最終節もまちがっていた! C => C1

出現頻度ならびをカウントアップ(C,[],[1,C]) :-
出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C2]|R1]) :-
  to_lower(C,C2),
  N2 is N + 1,!.
出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :-
  出現頻度ならびをカウントアップ(C,R1,R2).
178デフォルトの名無しさん:2009/11/23(月) 11:33:25
>>177
% 第一節に誤りがあった。
出現頻度ならびをカウントアップ(C,[],[1,C2]) :- to_lower(C,C2),!.
出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C2]|R1]) :-
  to_lower(C,C2),
  N2 is N + 1,!.
出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :-
  出現頻度ならびをカウントアップ(C,R1,R2).
179デフォルトの名無しさん:2009/11/23(月) 17:20:52
http://pc12.2ch.net/test/read.cgi/tech/1258158172/280
# [1] 授業単元:プログラミング演習
# [2] 問題文: http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10157.txt
#
# 以下のようなACIIコード表を画面に表示するプログラムを作成、コンパイル、
# 実行しなさい。
# ただし、for文を必ず使用すること。またASCIIコード0x7Fは制御文字であるので、
# break文またはcontinue文を使用して回避すること。
#
# |0 1 2 3 4 5 6 7 8 9 A B C D E F
#---+--------------------------------
# 2 | ! " # $ % & ' ( ) * + , - . /
# 3 |0 1 2 3 4 5 6 7 8 9 : ; < = > ?
# 4 |@ A B C D E F G H I J K L M N O
# 5 |P Q R S T U V W X Y Z [ \ ] ^ _
# 6 |' a b c d e f g h i j k l m n o
# 7 |p q r s t u v w x y z { | } ~
180デフォルトの名無しさん:2009/11/23(月) 17:22:23
>>179
% Prolog

文字コード表の作成 :-
  write(' |0 1 2 3 4 5 6 7 8 9 A B C D E F'\n'),
  write('--+'),for(0,U2,16),write('--'),U2=16,nl,
  for(2,N,7),
  write_formatted('%t |',[N]),
  for(0,M,15),
  印字可能文字の表示(N,M),
  M = 15,
  nl,
  N = 7.

印字可能文字の表示(7,15) :- !.
印字可能文字の表示(N,M) :-
  N >= 32,N =< 126,
  Code is N * 16 + M,
  char_code(A,Code),
  write_formatted('%t ',[A]),!.
181デフォルトの名無しさん:2009/11/23(月) 17:41:18
http://pc12.2ch.net/test/read.cgi/tech/1248012902/509
# 【 課題 】http://nojiriko.asia/jpeg/841.jpg
# 図の有向グラフの最短経路を求めよ。
# 初期値がMAXでアルゴリズムを作れ。
182デフォルトの名無しさん:2009/11/23(月) 18:45:55
http://pc12.2ch.net/test/read.cgi/tech/1258158172/283
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): 以下の掛け算の表示プログラムを作成しなさい。
#     1 2 3  4  5  6  7  8  9 10
#     2 4 6  8 10 12 14 16 18 20
#     3 6 9 12 15 18 21 24 27 30
#     ・
#     ・
#     ・
#    10・・・                    100
183デフォルトの名無しさん:2009/11/23(月) 19:08:04
>>182
% Prolog

九九表示 :-
  重複順列([1,2,3,4,5,6,7,8,9],2,[M,N]),
  S is M * N,
  write_formatted('%3d',[S]),
  N = 9,
  nl,
  fail.
九九表示.
184デフォルトの名無しさん:2009/11/23(月) 19:11:41
>>183 私は好みませんが、write_fomatted/2は引数に式が可能です。

九九表示 :-
  重複順列([1,2,3,4,5,6,7,8,9],2,[M,N]),
  write_formatted('%3d',[M * N]),
  N = 9,
  nl,
  fail.
九九表示.
185デフォルトの名無しさん:2009/11/23(月) 19:21:39
http://pc12.2ch.net/test/read.cgi/tech/1258158172/290
# [1] 授業単元:プログラム
# [2] 問題文(含コード&リンク):
# 行列とベクトルの掛け算
# y=Ax (A(3*3行列以上)とxを適当に初期化)
#
186デフォルトの名無しさん:2009/11/23(月) 20:11:25
>>179
NB.J言語

a=:(2 4$' |---+'),(3":,.2+i.6),.'|'
b=:'0123456789ABCEDF',:'-'
a,.b,6 16$(32+i.95){a.

|0123456789ABCEDF
---+----------------
2| !"#$%&'()*+,-./
3|0123456789:;<=>?
4|@ABCDEFGHIJKLMNO
5|PQRSTUVWXYZ[\]^_
6|`abcdefghijklmno
7|pqrstuvwxyz{|}~
187デフォルトの名無しさん:2009/11/23(月) 20:15:52
>>182
NB.J言語

*/~>:i.10

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
188デフォルトの名無しさん:2009/11/24(火) 04:20:33
>>182
% Prolog >>187が示されて、漸く九九でないことに気づいたw これは九九でなくてなんていうのかな?

九九表示 :-
  重複順列([1,2,3,4,5,6,7,8,9,10],2,[M,N]),
  S is M * N,
  write_formatted('%3d',[S]),
  N = 10,
  nl,
  fail.
九九表示.
189デフォルトの名無しさん:2009/11/24(火) 04:35:14
>>164
% もう二ヶ所間違っていた。
% ひとつはfindall/3がfindall/4になってしまっている。もうひとつは・・・.

行列の掛け算(_行列a,_行列b,_行列c) :-
  findall(L1,(for(1,N,3),length(L1,3)),_行列c),
  findall(W,重複順列([1,2,3],2,W),_重複順列),
  行列の掛け算(_重複順列,_行列a,_行列b,_行列c).
190デフォルトの名無しさん:2009/11/24(火) 04:38:03
>>160
% Prolog ちょっと間違いがひどかったので書き直し。

行列の掛け算(_行列a,_行列b,_行列c) :-
  findall(L1,(for(1,N,3),length(L1,3)),_行列c),
  findall(W,重複順列([1,2,3],2,W),_重複順列),
  行列の掛け算(_重複順列,_行列a,_行列b,_行列c).

行列の掛け算([],_,_,_) :- !.
行列の掛け算([[I,J]|R1],_行列a,_行列b,_行列c) :-
  findsum(U,(  for(1,K,3),
         行列要素(_行列a,I,K,N1),
         行列要素(_行列b,K,J,N2),
         U is N1 * N2),S),
  行列要素(_行列c,I,J,S),
  行列の掛け算(R1,_行列a,_行列b,_行列c).
 
行列要素(_行列,_行,_列,_値) :-
  list_nth(_行,_行列,_行の値ならび),
  list_nth(_列,_行の値ならび,_値).
191デフォルトの名無しさん:2009/11/24(火) 06:49:16
>>185
% Prolog

対象となる行列([[1,3,5],[2,8,12],[6,0,12]]).

行列とベクトルの積(_ベクトル,_行列とベクトルの積) :-
  対象となる行列(_行列),
  行列とベクトルの積(_行列,_ベクトル,_行列とベクトルの積).

行列とベクトルの積([],_ベクトル,[]).
行列とベクトルの積([_行|R1],_ベクトル,[_行2|R2]) :-
  行列とベクトルの積(_行,_ベクトル_行2),
  行列とベクトルの積(R1,_ベクトル,R2).

行とベクトルの積([],[],[]).
行とベクトルの積([A|R1],[B|R2],[C|R3]) :-
  C is A * B,
  行とベクトルの積(R1,R2,R3).
192デフォルトの名無しさん:2009/11/24(火) 06:59:03
>>191 また間違っていた。行とベクトルの積/3が行列とベクトルの積/3になっているところがある。

対象となる行列([[1,3,5],[2,8,12],[6,0,12]]).

行列とベクトルの積(_ベクトル,_行列とベクトルの積) :-
  対象となる行列(_行列),
  行列とベクトルの積(_行列,_ベクトル,_行列とベクトルの積).

行列とベクトルの積([],_ベクトル,[]).
行列とベクトルの積([_行|R1],_ベクトル,[_行2|R2]) :-
  行とベクトルの積(_行,_ベクトル_行2),
  行列とベクトルの積(R1,_ベクトル,R2).

行とベクトルの積([],[],[]).
行とベクトルの積([A|R1],[B|R2],[C|R3]) :-
  C is A * B,
  行とベクトルの積(R1,R2,R3).

193デフォルトの名無しさん:2009/11/24(火) 14:25:22
http://pc12.2ch.net/test/read.cgi/tech/1248012902/510
# 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/842.txt
# (1)学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示する。
# 次のデータは学生の学籍番号、名前、欠席日数、席次を配列linesで格納したものです。
# String[] lines = { "0001, 山田太郎,2,3,42", "0002, 田中一郎,2,6,31", "0003, 斎藤花子,2,2,4" };
# splitとequalsメソッドを利用する。区切り記号はスペース。
# 引数 -n
# (2) (1)を利用して学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示する。
# 引数 -q
# (3) (1)を利用して各学生の全てのデータを席次順に表示する。
194デフォルトの名無しさん:2009/11/24(火) 14:49:38
>>193
% Prolog

学籍簿('0001', 山田太郎,2,3,42).
学籍簿('0002', 田中一郎,2,6,31).
学籍簿('0003', 斎藤花子,2,2,4).

学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示(_名前) :-
  学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),
  write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]).

学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示(_名前の一部) :-
  学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),
  sub_atom(_名前,_,_,_,_名前の一部),
  write_formatted('%t,%t,%t,%t\n',[_名前の一部,_学籍番号,名前,_欠席日数]).

'各学生の全てのデータを席次順(昇順)に表示' :-
  findall([_学年,_席次],学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),L1),
  sort(L1,L2),
  member([_学年,_席次],L2),
  学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),
  write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]),
  fail.
'各学生の全てのデータを席次順(昇順)に表示'.
195デフォルトの名無しさん:2009/11/24(火) 15:28:19
>>194
% Prolog 少し重いが、以下の処理の方が一般的。

'各学生の全てのデータを席次順(昇順)に表示' :-
  findall([_学年,_席次,_学籍番号,_名前,_欠席日数,_学年,_席次],学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),L1),
  sort(L1,L2),
  member([_,_,_学籍番号,_名前,_欠席日数,_学年,_席次],L2),
  write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]),
  fail.
'各学生の全てのデータを席次順(昇順)に表示'.
196デフォルトの名無しさん:2009/11/24(火) 15:35:42
http://pc12.2ch.net/test/read.cgi/tech/1258158172/308
# 任意の0でない自然数nをキーボードで入力し、入力した数字が奇数の場合、
# その数字に3を掛けと1を足します。入力した数字が偶数の場合、その数字を2で割ります。
# そして得られた数字に同様の操作をし、1に達した時点で終了します。
# そしてこの操作をした回数とこの操作で出た最大値を表示させたい。
197デフォルトの名無しさん:2009/11/24(火) 15:48:56
>>196
% Prolog

c132_308 :-
  c132_308(N,0,_操作した回数,N,_最大値),
  write_formatted('%t,%t\n',[_操作した回数,_最大値]).

c132_308(1,_操作した回数,_操作した回数,_最大値,_最大値) :-
  \+(_操作した回数=0),!.
c132_308(N,M,_操作した回数,Max1,_最大値) :-
  1 is N mod 2,
  N2 is N * 3 + 1,
  M2 is M + 1,
  現在の最大値は(N2,Max1,Max2),
  c132_308(N2,M2,_操作した回数,Max2,_最大値).
c132_308(N,M,_操作した回数,Max1,_最大値) :-
  0 is N mod 2,
  N2 is N // 2,
  M2 is M + 1,
  現在の最大値は(N2,Max1,Max2),
  c132_308(N2,M2,_操作した回数,Max2,_最大値).

現在の最大値は(A,B,A) :- A >= B.
現在の最大値は(A,B,B) :- A < B.
198デフォルトの名無しさん:2009/11/24(火) 15:51:45
>>197 訂正 トップレベル これでは N が入力できていない!

c132_308(N) :-
  c132_308(N,0,_操作した回数,N,_最大値),
  write_formatted('%t,%t\n',[_操作した回数,_最大値]).
199デフォルトの名無しさん:2009/11/24(火) 16:36:16
http://pc12.2ch.net/test/read.cgi/tech/1258158172/314
# [1] 授業単元: プログラミング
#
# [2] 問題文(含コード&リンク):
# 遺伝的アルゴリズムを基にTSP(巡回セールスマン問題)の近似解法のプログラムを書け。
# ただし都市数の数は5〜6個程度で、都市間の距離は自由に決めてよいとする。
#
200デフォルトの名無しさん:2009/11/24(火) 16:51:02
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 巡回セールスマン問題をNearest Addition法で解くプログラムを作成せよ。
# Nearest Addition法とは
# (1)1つの都市からなる長さ0の部分閉路Tをひとつ作成する
# (2)現在の部分閉路Tが全ての都市を含むならば、それが解
# (3)そうでないならば、Tに含まれる都市jとTに含まれない都市kの組み合わせで、
# jとkの間の距離Cjk(jkはCの右下)を最小にするようなものを求める
# (4)(i,j)をTに含まれるパスとするとき、これを2つのパス(i,k)と(k,j)で置き換える
# (5)以上の(2)〜(4)を繰り返す
201デフォルトの名無しさん:2009/11/24(火) 16:55:51
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# タイピングプログラムを作る。
# プログラムの流れは、英単語1行1個ずつ10個入ったファイルを作り、
# 1.テキストファイル名を入れる
# 2.テキストファイルの1行目が表示される
# 3.タイピングをする(ミスをするともう1回タイピングさせる)
# 4.1行目が終わると、2行目が表示され、またタイピングをする
# 5.10問おわったら、かかった時間とミスした回数が出力される
202デフォルトの名無しさん:2009/11/24(火) 17:10:54
# [1]授業単元 プログラム演習
# [2]問題文:一行に「文字列」,「文字列」,「文字列」,「整数」
# というふうに4つの属性がそれぞれコンマで区切られたファイルを構造体に読み込み
# (ここまでは出来ました)、その2番目の属性に現れる全ての相異なる単語の出現頻度を求め、標準出力に書き出す。
# ここで単語は出現した順に並べる。また大文字は小文字に読み替え、区別しない。また単語のうちa,the,by,for,in,on,of,to,withは除外し、カウントしない。
203デフォルトの名無しさん:2009/11/24(火) 17:34:05
# [1] 課題
# [2] 問題文:文字型配列 str1[10] str2[10]を宣言し、これに好きな
#       文字列をキーボードから入力し、それぞれの文字を順
#       に1文字ずつ交互に取り出し出力しなさい。
204デフォルトの名無しさん:2009/11/24(火) 17:36:00
>>203
% Prolog

文字を順に1文字ずつ交互に取り出す(Atom1,Atom2,Char) :-
  sub_atom(Atom1,_,1,R,Char1),
  sub_atom(Atom2,_,1,R,Char2),
  (Char = Char1; Char = Char2).
205デフォルトの名無しさん:2009/11/24(火) 17:53:59
http://pc12.2ch.net/test/read.cgi/tech/1258158172/316
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10165.txt
# 課題1、関数rand()を使用して0〜999の整数を10個作り、
#     画面に表示させた後、昇順(数値の小さい順)に表示させるプログラム
#     (実行例)
#    756、836、237、109、290、647、27、933、198、239
#     27、109、198、237、239、290、647、756、836、933
#
# 課題2、関数rand()を使用して0〜9の整数を作る。これを100回実行し、各数値の出現回数をn[0]〜n[9]の
#     10個の配列にセット、これを用いて次のような棒グラフを表示するプログラムを作成せよ。
#    (実行例)
#     0:***************
# 1:********
# 2:*************
# 3:***********
# 4:*******
# 5:*********
206デフォルトの名無しさん:2009/11/24(火) 18:08:38
>>205
% Prolog
'0〜999の整数を10個作り、画面に表示させた後、昇順(数値の小さい順)に表示'(_整列した整数ならび) :-
  findall(N,N is random mod 1000,L),
  昇順整列(L,[],_整列した整数ならび),
ならびを行出力(_整数整列ならび).

昇順整列([],X,X).
昇順整列([A|R1],L,X) :- 挿入(A,L,L1),昇順整列(R1,L1,X).

挿入(A,[],[A]) :- !.
挿入(A,[B|R1],[A,B|R1]) :- A =< B,!.
挿入(A,[B|R1],[B|R2]) :-
  挿入(A,R1,R2).

ならびを行出力([]).
ならびを行出力([A|R]) :-
  write_formatted('%t\n',[A]),
  ならびを行出力(R).
207デフォルトの名無しさん:2009/11/24(火) 18:14:19
http://pc12.2ch.net/test/read.cgi/tech/1258158172/321
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
#
# 2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入する。
# 例えば、文字列が12345とABでn=3の場合、123AB45となる。
# (1) 配列を用いて作る。
# (2)関数とポインターを用いて作る。
208デフォルトの名無しさん:2009/11/24(火) 18:20:18
>>207
% Prolog

'2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入'(S1,S2,S) :-
  N1 is N - 1,
  sub_atom(S1,0,N1,_,A1,A2,A3,_,_,_),
  concat_atom([A1,S2,A2,A3],S).
209デフォルトの名無しさん:2009/11/24(火) 18:25:05
>>208 訂正。sub_atom/10の中の
% Prolog

'2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入'(S1,S2,S) :-
  N1 is N - 1,
  sub_atom(S1,0,N1,_,_,A2,A3,_,_,_),
  concat_atom([A2,S2,A3],S).
210デフォルトの名無しさん:2009/11/24(火) 22:03:32
>>207
% Prolog
課題2 :-
  課題2(100,[0,0,0,0,0,0,0,0,0,0],L),
  課題2_グラフ(L).

課題2(0,L,L) :- !.
課題2(M,Y,L) :-
  N is random mod 10,
N2 is N + 1,
  'N番目要素をカウントアップ'(1,N2,Y,Y1),
  M1 is M - 1,
  課題2(M1,Y1,L).

課題2_グラフ(L) :-
  for(1,N,10),
  N1 is N - 1,
  list_nth(N,L,_頻度),
  findall('*',for(1,U,_頻度),L2),
  concat_atom([N1,':'|L2],S),
  write_formatted('%t\n',[S]),
  N = 10.

'N番目要素をカウントアップ'(M,0,Y,Y1) :- 'N番目要素をカウントアップ'(1,10,Y,Y1).
'N番目要素をカウントアップ'(N,N,[A|R1],[B|R1]) :- B is A + 1,!.
'N番目要素をカウントアップ'(M,N,[A|R1],[A|R2]) :- M2 is M + 1,'N番目要素をカウントアップ'(M2,N,R1,R2).
211デフォルトの名無しさん:2009/11/24(火) 22:33:23
>>203
NB.J言語

f=:;/@[;@,@|:@,:;/@]

'123' f 'abc'
1a2b3c

'123' f 'abcdefg'
1a2b3cdefg
212デフォルトの名無しさん:2009/11/24(火) 22:42:59
>>205
NB.J言語
NB.
NB.課題1

(,:/:~)?10#100
63 92 51 92 39 15 43 89 36 69
15 36 39 43 51 63 69 89 92 92
213デフォルトの名無しさん:2009/11/24(火) 22:49:51
>>205
NB.J言語
NB.
NB.課題2

load 'misc'
(":@[,':','*'#~])/"1>/:~nubcount ?100#10
0:*************
1:*************
2:*******
3:***************
4:***************
5:*****
6:*******
7:**********
8:******
9:*********
214デフォルトの名無しさん:2009/11/25(水) 04:50:20
>>201
% Prolog

テキストファイルを読み込み1行づつタイピングする :-
  テキストファイル名を入れる(_テキストファイル名),
  get_lines(_テキストファイル名,Lines),
  TimeA is time,
  タイピングをする(1,10,Lines,TimeB,0,_ミスした回数),
  _かかった時間 is time - TimeA,
  write_formatted('かかった時間 %t秒, ミスした回数 %t回\n',[_かかった時間,_ミ
スした回数]),!.

テキストファイル名を入れる(_テキストファイル名) :-
  write('テキストファイル名を入れてください : '),
  get_line(_テキストファイル名).

タイピングをする(M,N,Lines,X,X) :- !.
タイピングをする(M,N,[Line|R],Y,X) :-
  write_formatted('%t: %t : ',[M,Line]),
  get_line(Line),
  M2 is M + 1,
  タイピングをする(M2,N,R,Y,X),!.
タイピングをする(M,N,[Line|R],X) :-
  Y2 is Y + 1,
  タイピングをする(M,N,[Line|R],Y2,X).
215デフォルトの名無しさん:2009/11/25(水) 05:09:10
# http://codepad.org/JEzL3ZJ7 は以下のコメント付加した。これを参考にナップザックプログラムを復元せよ。
# /** ナップザックの個数 */
# /** ナップザック */
# /** 全てのナップザックの総重量 */
# /**
# * このナップザック問題を解く機械を初期化する
# */
# /**
# * ナップザックの内容を全て表示する
#
# /**
# * 全ナップザックの総重量を計算し,capacityに格納する
# */
# /**
# * ナップザックに入れることができる要素
# * @author おーさー
# *
# */
# /** 要素のID */
# /** 要素の重さ,ランダムに決定 */
# /** 要素の価値,ランダムに決定 */
# /**
# * この要素を初期化する
# * @param givenId 要素のID
# */
216デフォルトの名無しさん:2009/11/25(水) 05:15:05
217デフォルトの名無しさん:2009/11/25(水) 05:18:56
現在、>>181 >>199 >>200 >>216 の(Prolog向き?)問題が未解答です。
よろしく、お願いします。
218デフォルトの名無しさん:2009/11/25(水) 06:31:01
http://pc12.2ch.net/test/read.cgi/tech/1258158172/330
# [1] 授業単元:プログラム
# [2]問題文
# 次の要領でテストの点数を入力し、それぞれの点数代の人数が何人いるか求めるプログラム
# 1.テストの点数を入力するガイダンスを用いて次のように出力 :点数の入力 終了条件:eあるいはE
# 2.fgets()を用いて、テストの点数を文字列として入力
# 3.2で入力した文字列が'e'または'E'ならば処理2〜5の処理を終了して6の処理を行う
# 4.文字列で入力した点数をint型変数に変換(atoiを使用する)
# 5.4で変換したint型の点数が0点以上100点以下なら、それぞれの点数代の人数を数える。
# 6.5の結果の表示
219デフォルトの名無しさん:2009/11/25(水) 06:52:14
>>218
% Prolog

テストの点数を入力し、それぞれの点数代の人数が何人いるか求める :-
  write(':点数の入力 終了条件:eあるいはE '),get_line(Line),
  テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,[0,0,0,0,0,0,0,0,0,0],_10点ごと出現頻度ならび),
  for(1,N,10),
  list_nth(N,_10点ごと出現頻度ならび,M),
  write_formatted('%t~%t %t人\n',[(N-1) * 10,N * 10 - 1,M]),
  N = 10.

テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(e,L,L) :- !.
テストの点数を入力し、それぞれの点数代の人数が何人いるか求める('E',L,L) :- !.
テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,L1,L) :-
  atom_to_term(Line,N,_),N >= 0,N =< 100,
  M is (N // 10) + 1,
  出現頻度ならびをカウントアップ(N,L1,L2),
  write(':点数の入力 終了条件:eあるいはE '),get_line(Line2),
  テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line2,L2,L).

出現頻度ならびをカウントアップ(C,[],[1,C]) :- !.
出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C]|R1]) :- N2 is N + 1,!.
出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :- 出現頻度ならびをカウントアップ(C,R1,R2).
220デフォルトの名無しさん:2009/11/25(水) 07:28:13
http://pc12.2ch.net/test/read.cgi/tech/1258158172/328
# [1]プログラミング言語論
# [2]プログラムの製造とライフサイクルについて言語アプリ開発の実際を踏まえて
# 論ぜよ 自作コードを含めること。
221デフォルトの名無しさん:2009/11/25(水) 07:38:49
>>53
NB. J言語

0j2":,.(,[:+/_3{.])^:(18)0.01 0.1 1

0.01
0.10
1.00
1.11
2.21
4.32
7.64
14.17
26.13
47.94
88.24
162.31
298.49
549.04
1009.84
1857.37
3416.25
6283.46
11557.08
21256.79
39097.33
222デフォルトの名無しさん:2009/11/25(水) 11:38:40
http://pc12.2ch.net/test/read.cgi/tech/1258158172/337
# [1] 授業単元:プログラム
# [2] 問題文:
# 二つの値xとyの大きい方の値を返す関数形式マクロは以下のように
# 定義できる
# #define max(x,y) ((x) > (y) ? (x) : (y))
# このマクロを利用して、四つの値a,b,c,dの値の最大値を求める
# max(max(a,b), max(c,d))
# および
# max(max(max(a,b), c), d)
# がどのように展開されるかを示すし、考察を加えよ。
#
223デフォルトの名無しさん:2009/11/25(水) 11:39:48
http://pc12.2ch.net/test/read.cgi/tech/1258158172/338
# [1] 授業単元:プロミング基礎
# [2] 問題文(含コード&リンク):5つの整数データ入力に対する合計計算アルゴリズム
# 1.変数 s に 0 を設定する。
# 2.変数 k に 0 を設定する。
# 3.もし k < 5 でなければ、7.へ行く。
# 4.整数の入力を変数 a に格納する。
# 5.変数 s に 変数 a を加えて、変数 s に 代入する。
# 6.変数 k の内容を 1 だけ増やし、3.にもどる。
# 7.変数 s を出力表示する。
#
224デフォルトの名無しさん:2009/11/25(水) 11:40:54
http://pc12.2ch.net/test/read.cgi/tech/1258158172/339
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):5人の学生の3教科(国・数・英)の点数を
# 読み込んで、2次元配列を用いて以下の条件を満たすプログラムを作成せよ。
# (1)科目別の最高点を求める。
# (2)各学年の3教科の平均を求める。
# これらを表にして表示する。
#
225デフォルトの名無しさん:2009/11/25(水) 13:41:27
226デフォルトの名無しさん:2009/11/25(水) 13:51:25
>>223
% Prolog
'5つの整数データ入力に対する合計計算' :-
  '5つの整数データ入力に対する合計計算'(0,0,X),
write_formatted('%t',[X]).

'5つの整数データ入力に対する合計計算'(_k,_s,_s) :- \+(_k < 5),!.
'5つの整数データ入力に対する合計計算'(_k,_s,X) :-
  get_integer(_a),
  _s2 is _s + _a,
  _k2 is _k + 1,
  '5つの整数データ入力に対する合計計算'(_k2,_s2,X).
227デフォルトの名無しさん:2009/11/25(水) 14:10:48
>>224
% Prolog
'5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点
、3教科の平均を表示' :-
  findall(L,(for(1,N,5),get_line(Line),split(Line,[','],L)),_学生の得点ならび
),
  科目別最高点(_学年の得点ならび,[_国最高点,_数最高点,_英最高点]),
  write('科目別最高点,国,数,英\n'),
  write_formatted(',%t,%t,%t\n',[_国最高点,_数最高点,_英最高点]),
  どんな学年があるか(_学生の得点ならび,_学年ならび),
  write('学年別、科目別平均点\n'),
  member(_学年,_学年ならび),
  findavg([_国,_数,_英],member([_学年,_国,_数_英],_学年の得点ならび),[_国平均
,_数平均,_英平均]),
  member([_学年,_国平均,_数平均,_英平均],_各学年の3教科の平均),
  write_formatted('%t,%t,%t,%t\n',[_学年,_国平均,_数平均,_英平均]),
  fail.
'5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点
、3教科の平均を表示'.

科目別最高点(_学年の得点ならび,_科目別最高点) :-
  行列の転置(_学年の得点ならび,[_|L1]),
  findall(Max,(member(L2,L1),max(L2,Max)),_科目別最高点).

どんな学年があるか(_学生の得点ならび,_学年ならび) :-
  findall(_学年,member(_学年,_学年の得点ならび),L),
  sort(L,_学年ならび).
228デフォルトの名無しさん:2009/11/25(水) 15:26:46
>>202
% Prolog

'2番目の属性に現れる全ての相異なる単語の出現頻度'(_ファイル) :-
  get_split_lines(_ファイル,[','],L),
  出現頻度を求める(L,[],_出現頻度ならび),
  member([_出現頻度,_単語],_出現頻度ならび),
  write_formatted('%t,%t\n',[_単語,_出現頻度]),
  fail.
'2番目の属性に現れる全ての相異なる単語の出現頻度'(_).

出現頻度を求める([],X,X).
出現頻度を求める([[_,W,_,_]|R],Y,X) :-
  to_lower(W,W1),
  \+(member(W1,[a,the,by,for,in,on,of,to,with])),
  出現頻度の更新(W1,Y,Y2),
  出現頻度を求める(R,Y2,X).
出現頻度を求める([[_,W,_,_]|R],Y,X) :-
  to_lower(W,W1),
  member(W1,[a,the,by,for,in,on,of,to,with]),
  出現頻度を求める(R,Y,X).

出現頻度の更新(W,[],[[1,W]]).
出現頻度の更新(W,[[S,W]|R],[[S2,W]|R]) :- S2 is S + 1,!.
出現頻度の更新(W,[L|R1],[L|R2]) :- 出現頻度の更新(W,R1,R2).
229デフォルトの名無しさん:2009/11/25(水) 16:32:05
http://pc12.2ch.net/test/read.cgi/tech/1258320456/43
# 正多角形を表現するクラスPolygonを定義し,いくつかのインスタンスを生成して表示せよ.メソッドも実行して結果を示すこと.
#
# ・辺の数と1辺の長さをアトリビュートとして持つ (コンストラクタは引数として辺の数と1辺の長さを取る)
# ・printすると次のように表示される
# [Polygon] 辺の数: 5, 辺の長さ: 100
# ・周囲の長さを返すメソッド(perimeter)を持つ (引数なし)
#
230デフォルトの名無しさん:2009/11/25(水) 16:44:19
>>229
% ESP

class Polygon has
  :create(Class,Obj,_辺の数,_辺の長さ) :-
    :new(Class,Obj),
    Obj!辺の数 := _辺の数,
    Obj!辺の長さ := _辺の長さ;

instance
  attribute 辺の数,辺の長さ;
  :perrimeter(OBJ,_周囲の長さ) :-
    _周囲の長さ := OBJ!辺の長さ * OBJ!辺の数;
end.
231デフォルトの名無しさん:2009/11/25(水) 16:54:53
>>224 仕様追加
#
# データはキーボードから点数を入力で。
# 表は、
# 番号|  国語  数学  英語  |最高 |最低 |平均
#  1 |       |   |   |
#  2 |       |   |   |
# (中 略)
#  5 |       |   |   |
#  ――――――――――――――――――――――――――――――
# 最高 |
# 最低 |
# 平均 |
# 表はこんな感じで。
# 最低点の表示もお願いします。
232デフォルトの名無しさん:2009/11/25(水) 17:09:16
http://pc12.2ch.net/test/read.cgi/tech/1258158172/354
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# (1)http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10173.txt
# 実行結果が次のようになるように、九九の表を、for文の二重ループを用いて作成しなさい。
#
# ***table of kuku ***
#
# | 1 2 3 4 5 6 7 8 9
# -----------------------------
# 1| 1 2 3 4 5 6 7 8 9
# 2| 2 4 6 8 10 12 14 16 18
# 3| 3 6 9 12 15 18 21 24 27
# 4| 4 8 12 16 20 24 28 32 36
# 5|
# 省略
# |
# |
# 9| 9 18 27 36 45 54 63 72 81
233デフォルトの名無しさん:2009/11/25(水) 17:12:39
http://pc12.2ch.net/test/read.cgi/tech/1258158172/354
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# (1)http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10173.txt
# 次のように各0番目の列要素にテストの点数を初期設定にしてある大きさ
# 10×2の配列がある。この配列の1番目の列要素に点数の高い順から順位を格納するプログラムを作成しなさい。
#
#   [0] [1]
# [0] 67
# [1] 43
# [2] 56
# [3] 97
# [4] 30
# [5] 88
# [6] 76
# [7] 55
# [8] 66
# [9] 78
234デフォルトの名無しさん:2009/11/25(水) 17:14:08
235デフォルトの名無しさん:2009/11/25(水) 17:18:09
http://pc12.2ch.net/test/read.cgi/tech/1258158172/354
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# (1)http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10176.txt
# 明治元年以降の西暦年を4桁の数で入力すると、和暦で都市を表示するプログラムを作成せよ。
# ただし、2つの元号をもつ年は両方の年を表示すること。
#
# (例、1989年→昭和64年、平成元年)

>>234 >233 は http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10174.txt
でした。
236デフォルトの名無しさん:2009/11/25(水) 17:54:37
>>235
% Prolog

年号期間(明治,1868,1912).
年号期間(大正,1912,1926).
年号期間(昭和,1926,1989).
年号期間(平成,1989,2009).

西暦和暦応答(_西暦) :-
  findall(_和暦,明治以降の西暦和暦変換(_西暦,_和暦),L),
  concat_atom(L,',',S),
  write_formatted('%t->%t\n',[S]).

明治以降の西暦和暦変換(_西暦,_和暦) :-
  年号期間(_年号,A,B),
  _西暦>=A,
  _西暦=<B,
  N is _西暦 - A + 1,
  和暦構成(_年号,N,_和暦).

和暦構成(_年号,1,_和暦) :- concat_atom([_年号,元年],_和暦).
和暦構成(_年号,N,_和暦) :- concat_atom([_年号,N,年],_和暦).
237デフォルトの名無しさん:2009/11/25(水) 17:56:20
>>236 一ヶ所間違えた。訂正。
西暦和暦応答(_西暦) :-
  findall(_和暦,明治以降の西暦和暦変換(_西暦,_和暦),L),
  concat_atom(L,',',S),
  write_formatted('%t->%t\n',[_西暦,S]).
238デフォルトの名無しさん:2009/11/25(水) 18:30:59
>>233
% Prolog

配列([[67,_],[43,_],[56,_],[97,_],[30,_],[88,_],[76,_],[55,_],[66,_],[78,_]]).

配列の1番目の列要素に点数の高い順から順位を格納する(L) :-
  配列(L),
  順位付け(L,[],_順位ならび),
  第二要素に順位をセット(L,_順位ならび).

順位付け([],X,X).
順位付け([[A,_]|R1],Y1,X) :- 挿入(A,Y1,Y2),順位付け(R1,Y2,X).

挿入(A,[],[A]).
挿入(A,[B|R],[A,B|R]) :- A > B,!.
挿入(A,[B|R1],[B|R2]) :- A =< B,挿入(A,R1,R2).

第二要素に順位をセット([[A|V]|R],_順位ならび) :-
  list_nth(V,_順位ならび,A),
  第二要素に順位をセット(R,_順位ならび).
239デフォルトの名無しさん:2009/11/25(水) 18:39:31
>>17
maxima

問題1

f(x):= ([r:""],for i thru x do r:concat(r,ascii(96+i)),r)


問題2

f(x):=sum(if(mod(i,3)=0 or mod(i,5)=0)then i else 0,i,1,x);
240デフォルトの名無しさん:2009/11/25(水) 19:06:27
>>232
% Prolog

九九表示 :-
  write(' |'),
  for(1,N,9),write_formatted('%2d ',[N]),N=9,nl,
  for(1,M,30),write('-'),M=30,nl,
  九九表示(1,1).

九九表示(9,10) :- nl,!.
九九表示(M,10) :- nl,M2 is M + 1,九九表示(M2,1).
九九表示(M,1) :-
  write_formatted('%t|%2d ',[M,M]),
  九九表示(M,2).
九九表示(M,N) :-
  write_formatted('%2d ',[M*N]),
  N2 is N + 1,
  九九表示(M,N2).
241デフォルトの名無しさん:2009/11/25(水) 19:11:43
http://pc12.2ch.net/test/read.cgi/tech/1258158172/357
# [1] 授業単元: データ構造とアルゴリズム
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10177.txt
# 1、data.datからgetc()を用いてアルファベットを1文字ずつ読み込み、スタックにpush-downする。
# 2、スタックの内容を表示する関数print_stack_list(s)がprint_stack_list.oにある。
242デフォルトの名無しさん:2009/11/25(水) 20:51:04
>>241
% Prolog

'data.datからgetc()を用いてアルファベットを1文字ずつ読み込み、スタックにpush-d
ownする'(Stack1,Stack2) :-
  see('data.dat'),
  get_char(C),
  'スタックに全文字をpush-downする'(C,Stack1,Stack2),
seen.

'スタックに全文字をpush-downする'(end_of_file,Stack,Stack) :-
'スタックに全文字をpush-downする'(C,Stack,Stack2) :-
  push(C,Stack,Stack1),
  get_char(C2),
  'スタックに全文字をpush-downする'(C2,Stack1,Stack2).

push(C,Stack,[C|Stack]).
243デフォルトの名無しさん:2009/11/25(水) 21:45:12
>>203
maxima
短い文字列の方に合わせてしまうが、そういう仕様ということで。

f(a,b):=simplode(join(charlist(a),charlist(b)),"");

(%i4)f("123","asdfgh");
(%o4) 1a2s3d
(%i5)
244デフォルトの名無しさん:2009/11/26(木) 06:19:49
http://pc12.2ch.net/test/read.cgi/tech/1258158172/358
# [1] 授業単元:Cプログラミング
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.j
p/cgi-bin/joyful/img/10178.txt
# 問題:実行結果が以下の通りになるようにプログラムを追加しなさい。
# 現在のデータ:0/100
# (1)プッシュ (2)ポップ (0)終了:1
# データ:25
# 0 25
# 現在のデータ:1/100
# (1)プッシュ (2)ポップ (0)終了:1
# データ:36
# 0 25
# 1 36
# 現在のデータ:2/100
# (1)プッシュ (2)ポップ (0)終了:1
# データ:45
# 0 25
# 1 36
# 2 45
# 現在のデータ:3/100
# (1)プッシュ (2)ポップ (0)終了:2
# ポップしたデータは45です。
# 0 25
# 1 36
# 現在のデータ:2/100
245デフォルトの名無しさん:2009/11/26(木) 06:56:39
>>244
% Prolog
stack_size(100),

stack_operation(Stack1,Stack2) :- get_action(N),stack_operation(N,Stack1,Stack2).

stack_operation(0,Stack,Stack) :- !.
stack_operation(1,Stack1,Stack) :- write('データ :'),get_integer(N),push(N,Stack,Stack2),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack).
stack_operation(2,Stack1,Stack) :- pop(A,Stack1,Stack2),write_formatted('ポップしたデータは%tです。 \n',[A]),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack).

get_action(N) :- write('(1)プッシュ (2)ポップ (0)終了:'),get_integer(N).

push(A,Stack,[A|Stack]) :- stack_size(Max),length([A|Stack],Len),Len =< Max,!.
push(A,Stack,Stack) :- stack_size(Max),length(Stack,Max),write('スタックが最大サイズを越えました。プッシュできません!!\n'),!.

pop(A,[A|Stack],Stack).
pop(A,[],[]) :- write('スタックは空です!!\n').

print_stack_list(Stack) :- stack_size(Max),print_stack_list(0,Max,Stack),write_formatted('現在のデータ : %t/%t\n',[N,Max]),

print_stack_list(N,Max,[]) :- write('stack empty!\n'),!.
print_stack_list(N,Max,_) :- N > Max,write('スタックの最大サイズに達しました\n') :- !.
print_stack_list(N,Max,[A|R]) :- write_formatted('%t %t\n',[N,A]),N2 is N + 1,print_stack_list(N2,Max,R).
246デフォルトの名無しさん:2009/11/26(木) 06:58:55
>>245 改行してはいけないところに改行が入ってしましました。
stack_opration/3に集中していますから、直して読んでください。
247デフォルトの名無しさん:2009/11/26(木) 07:06:20
>>245 >>246 読み難いですね。以下を参照してください。
http://nojiriko.asia/prolog/c132_358.html
248デフォルトの名無しさん:2009/11/26(木) 07:10:53
http://pc12.2ch.net/test/read.cgi/tech/1258158172/365
# [1]授業単元:応用C言語演習
# [2]問題文(含コード&リンク)
# 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、
# それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順
# にリストする索引作成プログラム
# アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ
# ット順)順についても同じ書式で出力
# 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。
# 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。
# 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む)
# 書式: 単語 (回数) 位置(行番号が若い順)改行
# 位置: 'L'行番号(1から開始)-行内単語番号(1から開始)
# alpha (3回) L32-5 L66-4 L124-1
# beta (2回) L192-1 L276-3
#
249デフォルトの名無しさん:2009/11/26(木) 07:52:19
>>248
% Prolog 索引の作成のみ。表示は次レスで。
文から索引の作成(_ファイル,_索引ならび) :-
  get_lines(_ファイル,Lines),
  行単位に索引を作成(1,Lines,[],_索引ならび).

行単位に索引を作成(_行番号,[],X,X).
行単位に索引を作成(_行番号,[Line|R1],Y,X) :-
  split(Line,[' ',',','\r','t'],_単語ならび),
  行単位に索引に追加(1,_行番号,_単語ならび,Y,Y2),
  _行番号2 is _行番号 + 1,
  行単位に索引を作成(_行番号2,R1,Y2,X).

行単位に索引に追加(_行での相対位置,_行番号,[],X,X).
行単位に索引に追加(_行での相対位置,_行番号,[_単語|R1],Y,X) :-
  索引に追加(_単語,_行番号,_行での相対位置,Y,Y2),
  _行での相対位置2 is _行での相対位置 + 1,
  行単位に索引に追加(_行での相対位置2,_行番号,R1,Y2,X).

索引に追加(_単語,_行番号,_行での相対位置,[[_単語,_位置情報ならび,_頻度]|R1],[[_単語,_更新された位置情報,_頻度2]|R1]) :- !.
索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[_単語,[_行番号,_行での相対位置],1],[単語1,_位置情報ならび1,_頻度1]|R1]) :-
  _単語 @< _単語2,!.
索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[単語1,_位置情報ならび1,_頻度1]|R2]) :-
  _単語 @> _単語2,
  索引に追加(_単語,_行番号,_行での相対位置,R1,R2).
250デフォルトの名無しさん:2009/11/26(木) 07:57:33
>>249
% Prolog 第一節目が未完成だった。
索引に追加(_単語,_行番号,_行での相対位置,[[_単語,_位置情報ならび,_頻度]|R1],[[_単語,_更新された位置情報,_頻度2]|R1]) :-
  _頻度2 is _頻度 + 1,
  append(_位置情報ならび,[_行番号,_行での相対位置],_更新された位置情報),!.
索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[_単語,[_行番号,_行での相対位置],1],[単語1,_位置情報ならび1,_頻度1]|R1]) :-
  _単語 @< _単語2,!.
索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[単語1,_位置情報ならび1,_頻度1]|R2]) :-
  _単語 @> _単語2,
  索引に追加(_単語,_行番号,_行での相対位置,R1,R2).
251デフォルトの名無しさん:2009/11/26(木) 09:10:06
>>248
% Prolog

索引の全表示([]).
索引の全表示([[_単語,_位置情報ならび,頻度]|R]) :-
  findall(S,(member([A,B],_位置情報ならび),concat_atom(['L',A,'-',B],S)),L),
  concat_atom(L,' ',S2),
  write_formatted('%t (%t) %t\n',[_単語,頻度,S2]),
  索引の全表示(R).

出現頻度順索引全表示(_索引ならび) :-
  findall([_頻度|L],(member(L,_索引ならび),last(L,_頻度)),L1),
  sort(L1,L2),
  findall(L,member([_|L],L2),L3),
  reverse(L3,L4),
  索引の全表示(L3).
252デフォルトの名無しさん:2009/11/26(木) 11:29:22
>>248
% Prolog

索引の保護(_文名,_保護ファイル,_索引ならび) :-
  assertz(索引(_文名,_索引ならび)),
  tell(_保護ファイル),
  listing(索引),
  told.

索引の定義(_文名,_保護ファイル,_索引ならび) :-
  reconsult(_保護ファイル),
  索引(_文名,_索引ならび).
253デフォルトの名無しさん:2009/11/26(木) 14:44:57
http://pc12.2ch.net/test/read.cgi/tech/1258320456/45
# Polygonをスーパークラスとして,正三角形(Triangle),正四角形(Square)を表現するクラスをそれぞれ定義せよ.
#
# ・辺の長さのみを引数に与えてインスタンスを生成する
# ・自身の面積を計算して結果を返すメソッドarea()を持つ
# √3 = 1.73 としてよい
# メインルーチンでは,実際にインスタンスを生成し,各インスタンスについて,インスタンス自身,周囲の長さ,面積の3項目を表示するようにせよ.
254デフォルトの名無しさん:2009/11/26(木) 14:47:46
>>253
% ESP

class 正多角形 has
  :create(Class,Obj,_辺の長さ) :-
    :new(Class,Obj),
    Obj!辺の長さ := _辺の長さ;
instance
  attibute 辺の長さ,角;
end.

class 三角形 has
nature 正多角形;
  attribute 角 := 3;
instance
  :area(Obj,_面積) :-
    Obj!辺の長さ * 1.73;
end.

class 四角形 has
nature 正多角形;
  attribute 角 := 4;
instance
  :area(Obj,_面積) :-
    Obj!辺の長さ * Obj!辺の長さ;
end.
255デフォルトの名無しさん:2009/11/26(木) 15:22:19
http://pc12.2ch.net/test/read.cgi/tech/1170662552/284
# 過去の株価を利用したシミュレーションプログラム。
# 具体的には、データとして興味のある某銘柄の日柄(日別に始値、高値、安値、終値、出来高)
# を10年分オープンオフィスの表計算calcにyahooファイナンスから入手しました。
# 例えば、このデータを使って特定の日にその株を1000株買い、以降10円上がれば売り
、売り値から
# 10円下がればまた買い、その買値より10円下がれば買い増し(仮の現金残高がなくな
るまで)し、
# それぞれは買値より10円上がると売る。
# 持ち株がなくなると、高値から1割下がったところからまた始める。
# というようなことを繰り返すと、いくらの利益でいくらの買値ので
# どれぐらい持ち株になった状態かを結果としてだすものです。
#
256デフォルトの名無しさん:2009/11/26(木) 17:19:32
http://pc12.2ch.net/test/read.cgi/tech/1258158172/368
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt
#
# 〜課題1〜
# 3個のint型整数の最小値を返す関数
# int min3(int x,int y,int z)
# を作成せよ。(ただし、標準関数minは使用しないこと。)
#
# (実行例)
# 3個の整数を入力してください。
# 整数1:15
# 整数2:3
# 整数3:23
# 最も小さい値は3です。
257デフォルトの名無しさん:2009/11/26(木) 17:20:31
http://pc12.2ch.net/test/read.cgi/tech/1258158172/368
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt
#
# 〜課題2〜
# int型整数の4乗を返す関数
# int pow4(int x)
# を作成せよ。(ただし関数powは使用しない)
#
# (実行例)
# 整数を入力してください:5
# その4乗値は625です。
258デフォルトの名無しさん:2009/11/26(木) 17:21:28
http://pc12.2ch.net/test/read.cgi/tech/1258158172/368
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt
#
# 〜課題3〜
# 関数voold putstar(int n)を作成して、長方形を表示するプログラムを作成せよ。
#
# (実行例)
# 長方形を作りましょう。
# 横幅:5
# 高さ:3
# *****
# *****
# *****
#
259デフォルトの名無しさん:2009/11/26(木) 18:05:57
http://pc12.2ch.net/test/read.cgi/tech/1258158172/368
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt
#
# 〜課題4〜
# 文字型配列 str='ABCDEFG'が初期設定されている。このstrのデータを英大文字から、英小文字に変換しなさい。
#
260デフォルトの名無しさん:2009/11/26(木) 18:08:58
http://pc12.2ch.net/test/read.cgi/tech/1258158172/368
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt
#
# 〜課題5〜
# 次の要領でテストの点数を入力し、それぞれの点数代の人数が何人いるか求めるプログラムを作成しなさい。
#
# 1、テストの点数を入力するガイダンスを用いて次のように出力しなさい:点数を入力しなさい、終了条件:eあるいはE
# 2、fget()を用いて、テストの点数を文字列として入力しなさい
# 3、1で入力した文字列がeあるいはEであるとき、処理2〜5の処理を終了して6の処理を行いなさい
# 4、文字列で入力した点数をint型変数に変換しなさい(atoiを使用しなさい)
# 5、4で変換したint型の点数が0点以上100点以下なら、次のそれぞれの点数代の人数を数えなさい。
# 6,5の結果を表示しなさい。
261デフォルトの名無しさん:2009/11/26(木) 18:26:12
>>256
% Prolog

'3個の整数の最小値を返す' :-
  write('3個の整数を入力してください。\n'),
  '3個の整数を得る'(1,[A|R]),
  最小値は(A,R,_最小値),
  write_formatted('最も小さい値は%tです。\n',[_最小値]).

最小値は(A,[],A).
最小値は(A,[B|R],X) :- A =< B,最小値は(A,R,X).
最小値は(A,[B|R],X) :- A > B,最小値は(B,R,X).

'3個の整数を得る'(N,[]) :- N > 3,!.
'3個の整数を得る'(N,[_整数|R]) :-
  write('整数%t:',[N]),
  get_integer(_整数),
  N2 is N + 1,
  '3個の整数を得る'(R).

262デフォルトの名無しさん:2009/11/26(木) 18:30:08
>>256
% Prolog 3個の整数を得るには以下のやり方もある。

'3個の整数を得る'(L) :-
  findall(_整数,(for(1,N,3),write('整数%t:',[N]),get_integer(_整数)),L).
263デフォルトの名無しさん:2009/11/26(木) 19:07:37
>>257
% Prolog 4乗を定義は以下が代表的なもの。

pow4(X,Y) :- Y is X * X * X * X.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pow4(X,Y) :- Y is X ^ 4.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pow4(X,Y) :- pow4(4,X,Y).

pow4(1,X,X) :- !.
pow4(N,X,Y) :- N1 is N - 1,pow4(N1,X,Z),Y is X * Z.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pow4(X,Y) :- pow4(1,4,X,Y).

pow4(M,N,_,1) :- M > N,!.
pow4(M,N,X,Y) :- M1 is M + 1,pow4(M1,N,X,Z),Y is X * Z.
264デフォルトの名無しさん:2009/11/26(木) 19:20:17
>>263 4乗の定義は ですね。

pow4(M1,N,X,Z),Y is X * Z.
と再帰の外側に演算が来るのがちょっと気になりますね。

pow4(X,Y) :- pow4(1,4,X,X,Y).

pow4(M,N,_,Y,Y) :- M > N,!.
pow4(M,N,X,Y1,Y) :- Y2 is X * Y1,M2 is M + 1,pow4(M2,N,X,Y2,Y).

とすれば中に入ります。ただ、この手の先読み的手法がわかりやすいかどうか。
265デフォルトの名無しさん:2009/11/26(木) 19:30:04
>>258
% Prolog これもいろんな定義が何度も出てきました。for/3を使うのは
% あまりProlog的な感じがしませんが、使うことはあります。

長方形を作りましょう :-
  write('横幅 :'),get_integer(_横幅),
  write('高さ :'),get_integer(_高さ),
  for(1,M,_高さ),
  for(1,N,_横幅),
  write('*'),
  N = _横幅,
  nl,
  M = _高さ.

266デフォルトの名無しさん:2009/11/26(木) 20:28:08
>>259
% Prolog

str('ABCDEFG').
%%%%%%% 普通は以下の定義で済ます%%%%%%%%%%%%
英大文字から、英小文字に変換 :-
  str(Str1),
  to_lower(Str1,Str2),
  write_formatted('%t',[Str2]).

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
英大文字から、英小文字に変換 :-
  str(Str1),
  atom_codes(Str1,Codes1),
  findall(C,(member(A,Codes),C is A - 32),Codes2),
  atom_codes(Str2,Codes2),
  write_formatted('%t',[Str2]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
英大文字から、英小文字に変換 :-
  str(Str1),
  atom_codes(Str1,Codes1),
  英大文字から、英小文字に変換(Codes1,Codes2),
  atom_codes(Str2,Codes2),
  write_formatted('%t',[Str2]).

英大文字から、英小文字に変換([],[]).
英大文字から、英小文字に変換([C1|R1],[C2|R2]) :- C2 is C1-32,英大文字から、英小文字に変換(R1,R2)
267デフォルトの名無しさん:2009/11/26(木) 21:27:20
>>260
% Prolog
テストの点数を入力し、それぞれの点数代の人数が何人いるか求める :-
  get_line(Line),
  テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,[0,0,0,0,0,0,0,0,0,0,0],L),
  それぞれの点数台の人数が何人いるか表示(L).

それぞれの点数台の人数が何人いるか表示(L) :-
  append(L1,[M|L2],L),
  length(L1,N),
  write_formatted('%2d~%2d点台は%t人です。\n',[N*10,N*10+9,M]),
  N = 9,
  last(L,M11),
  write_formatted('   100点は%t人です。\n',[M11]).

テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(e,L,L).
テストの点数を入力し、それぞれの点数代の人数が何人いるか求める('E',L,L).
テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,L1,L) :-
  atom_to_term(Line,N,_),
  点数台集計に加算(N,L1,L2),
  get_line(Line2),
  テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line2,L2,L).

点数台集計に加算(N,L1,L2) :-
  N1 is N // 10,
  length(L0,N1),
  append(L0,[M|L3],L1),
  M2 is M + 1,
  append(L0,[M2|L3],L2).
268デフォルトの名無しさん:2009/11/27(金) 04:18:05
http://pc12.2ch.net/test/read.cgi/tech/1258158172/384
# [1] 授業単元:ヒューマンインターフェイス
# [2] 問題文(含コード&リンク):少なくとも以下の英文を日本語分に翻訳できるプログラムを作成せよ
#            1.The boy beats a dog with a stick.
# 2.Every boy loves a dog .
# 3.The dog is loved by every boy.
# 4.The boy saw a girl with a telescope.
# 5.The boy saw a girl with a dog.
# 6.The boy cut a stick with a saw.
269デフォルトの名無しさん:2009/11/27(金) 04:26:18
http://pc12.2ch.net/test/read.cgi/tech/1258158172/389
# [1] 授業単元:C言語実習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10187.txt
# ■問題1
#  任意の画素数をもつ画像をアフィン変換(移動,拡大縮小,回転,せん断)するプログラムを作成せよ.
#  変換後の画像は画像ファイルとして保存すること.
#
# ■問題2
#  問題1で作成したプログラムに,逆アフィン変換を行う機能を追加せよ。
#  そして,アフィン変換,逆アフィン変換(最近傍法),逆アフィン変換(線形補間法)での結果に違いがあることを確認せよ.
#
#  ※逆アフィン変換とは,出力画像の座標値(X, Y)に対して逆変換を行うことで,入力画像の座標値(x, y)を求めるものである.
#
# (注意)
#  変換後の座標値が,配列のサイズ(縦と横)を越えるかどうかを確認し,超える場合は適切な例外処理を行うこと.
#
270デフォルトの名無しさん:2009/11/27(金) 04:28:55
http://pc12.2ch.net/test/read.cgi/tech/1258158172/392
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 3つの自然数を辺にもつ直角三角形を1000個出力するプログラムを書きなさい。
# ただし、3つの辺 a, b, c は a <= b <= c とする。
# また、3辺の比率が同じものはカウントしないこととする。
271デフォルトの名無しさん:2009/11/27(金) 04:35:15
http://pc12.2ch.net/test/read.cgi/tech/1258158172/407
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 課題1、文字列、と2つの整数(それぞれ n, m とする)を入力すると
# n文字目から m文字 *に変えるプログラムを書け。
#
# 実行例
#   文字を入力して下さい
# Toshidaigaku
# nを入力して下さい
# 4
# mを入力して下さい
# 2
# 出力は
# Tos**daigaku
#
# 課題2、文字列を入力すると、全ての文字を次の文字コードの文字に
# 変えて、結果を表示するプログラムを書け。
#
# 実行例
#
# 文字を入力して下さい
# Toshidaigaku
# 出力は
# Uptijebjhblv
272デフォルトの名無しさん:2009/11/27(金) 04:38:13
http://pc12.2ch.net/test/read.cgi/tech/1258158172/408
# 課題3、文字列を入力すると、文字列中の
# a の個数を数えるプログラムを書け。
#
# 実行例
#
# 文字を入力して下さい
# Toshidaigaku
# aが2個含まれています
#
# [5] その他の制限:
# #include <stdio.h>
# int main()
# スタートでお願いします。
273デフォルトの名無しさん:2009/11/27(金) 04:57:22
http://pc12.2ch.net/test/read.cgi/tech/1248012902/527
# 【 課題 】 http://ime.nu/www.dotup.org/uploda/www.dotup.org397919.txt.html

# 【 形態 】1
# 【 GUI  】4
# 【 期限 】11/27まで
# 【 Ver  】1.6.0_16
#
# できれば動作の解説もお願いします
# パターン照合の問題です。
# string型の引数を二つ与えてそれが同じものかどうかを判定します。
# 基本的なものは書けたのですが、機能拡張で
# "you are a student" と "You are Student"
# のように大文字小文字を区別せずに同じものとして判定させるのが課題です

274デフォルトの名無しさん:2009/11/27(金) 06:59:59
http://pc12.2ch.net/test/read.cgi/tech/1258158172/425
# [1]やさしいC++ 演習
# [2]
# (1) int値 n,一つのcharポインタpを引数に持ちcharポインタを戻り値型とする関数atosを次の仕様のもとに作成
# pがNULLでないならばそれが指す領域をdelete[]解放してNULLを返す。pがNULLの場合はpに16文字分の領域を割り当て,指す領域にsprintf関数によりnの10進文字列表現を書き込みそれを返す。
# (2) キーボードから正の整数が入力されるまで、入力促進文字列(プロンプト)を表示し
# 入力待ちを行い、入力された整数をint参照型引数nに入れて戻る関数inputを作成
# マニュピュレータやscanfを使用しないこと。
# (3)8個のintへの参照引数を持つsortという名称のvoid関数を作成
# 左からみてある引数が負ならそれを含めた残りの引数を整列対象としない条件のもとで
# 引数を小さい順に整列。整列対象の数を一行一列に空白区切りで出力する。
# この時atos関数を使うこと。処理記述にループ(ループ文を使うこと)があってはならない。
# (4) (1)~(3)の関数を用いてmain(void)関数を実行すると,それまでに入力された正の整数を
# sort関数を用いてソート/表示した後新しい整数をinput関数を用いて読み込む
# ことを8回繰り返した後、入力された8個の整数を整列したものをsort関数により表示する
# ようなものを作成する。for文とswitch文を使うこと。配列を使わないこと。
# (5) (1)〜(4)についてそれぞれ独立にテストしたコードを作成すること
275デフォルトの名無しさん:2009/11/27(金) 07:13:02
>>270
% Prolog
'3つの自然数を辺にもつ直角三角形を1000個出力' :-
  '3つの自然数を辺にもつ直角三角形'(1,1000,1,[],X),
  member(L,X),
  write_formatted('%t\n',[L]),
  fail.
'3つの自然数を辺にもつ直角三角形を1000個出力'.

'3つの自然数を辺にもつ直角三角形'(M,Max,_,_,[]) :- M > Max,!.
'3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,[[A,B,C]|R]) :-
  約数が存在しない(C,Y),
  C1 is truncate(C ^ 2),
  自然数の2乗(3,N,A,A1),
  自然数の2乗(3,N,B,B1),
  A =< B,
  C1 is A1 + B1,
  M2 is M + 1,C2 is C + 1,
  '3つの自然数を辺にもつ直角三角形'(M2,Max,C2,[C|Y],R).
'3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,X) :- C2 is C + 1,'3つの自然数を辺にもつ直角三角形'(M,Max,C2,Y,X).

自然数の2乗(M,N,M,X) :- M =< N,X is truncate(M * M).
自然数の2乗(M1,N,M,X) :- M =< N,M2 is M1 + 1,自然数の2乗(M2,N,M,X).

約数が存在しない(A,L) :- \+((member(B,L),0 is A mod B)),!.
276デフォルトの名無しさん:2009/11/27(金) 07:22:49
>>268
% Prolog (未完成) 最も単純にやるなら。こんな感じで。
日英辞書(少年,boy).
日英辞書(叩く,beats).
日英辞書(棒,stick).
日英辞書(すべての,Every).
日英辞書(見た,saw).
日英辞書(犬,dog).
日英辞書(愛した,loved).
日英辞書(削る,cut).
日英辞書(のこぎり,saw).
:- module(日本語,[名詞/2,動詞/2,助動詞/2]).
名詞([少年|R],R).
名詞([犬|R],R).
名詞([棒|R],R).
名詞([少女|R],R).
動詞([見た|R],R).
動詞([愛した|R],R).
助動詞([です|R],R).
動詞([叩く|R],R).
:- module(英語,[文/2,主語/2,述語/2,目的語/2,名詞句/2,動詞句/2,前置詞/2,名詞/2,冠詞/2]).
文(L,R) :- 主語(L,R1),述語(R1,R2),目的語(R2,R).
主語(L,R) :- 名詞句(L,R).
・・・
% 完成したら、 http://nojiriko.asia/prolog/c132_384.html に書いておきます。
277デフォルトの名無しさん:2009/11/27(金) 07:35:54
>>271
% Prolog

'文字列と2つの整数(それぞれ n, m とする)を入力するとn文字目からm文字*に変える'(_文字列,N,M,_変換された文字列) :-
  sub_atom(_文字列,N - 1,M,R,_),
  length(L,M),
  all(L,*),
  concat_atom(L,S),
  sub_atom(_文字列,0,N,_,S1),
  sub_atom(_文字列,N + M,R,_,S2),
  concat_atom([S1,S,S2],_変換された文字列).
278デフォルトの名無しさん:2009/11/27(金) 07:50:44
>>272
% Prolog

program :-
  write('文字を入力して下さい\n'),
  get_line(_文字列),
  '文字列を入力すると、文字列中の a の個数を数える'(_文字列,N),
  write_formatted('aが%t個含まれています\n',[N]).

'文字列を入力すると、文字列中の a の個数を数える'(_文字列,N) :-
  findall(_,sub_atom(_文字列,_,1,_,a),L),
  length(L,N).
279デフォルトの名無しさん:2009/11/27(金) 07:58:44
>>273
% Prolog

string型の引数を二つ与えて大文字小文字を区別せずそれが同じものかどうかを判定(_
文字列1,_文字列2,同じもの) :-
  to_lower(_文字列1,_小文字化された文字列),
  to_lower(_文字列2,_小文字化された文字列),!.
string型の引数を二つ与えて大文字小文字を区別せずそれが同じものかどうかを判定(_,
_,同じものではない).
280デフォルトの名無しさん:2009/11/27(金) 08:52:59
http://pc11.2ch.net/test/read.cgi/db/1252492296/290
# ・テーブルデータ
# tblA
# pkey|value
# ----+-----
# 1  |a
# 2  |b
#
# tblB
# pkey|value
# ----+-----
# 1  |c
#
# ・欲しい結果
# tblA
# pkey|value
# ----+-----
# 1  |c
# 2  |b
#
# ・説明 両テーブルとも、pkeyが主キーです。
# pkeyを条件に、tblAのvalueを、tblBのvalueで上書きしたいのですが、
# どの様に書くのが一般的なのでしょうか。
281デフォルトの名無しさん:2009/11/27(金) 09:22:57
>>280
% Prolog
tblA(1,a).
tblA(2,B).

tblB(1,c).

update(_対象述語/Arity1,_キー位置1,_被置換項位置,_置換指定述語/Arity2,_キー位置2,_置換項位置) :-
  length(L1,Arity1),
  length(L2,Arity2),
  P1 =.. [_対象述語|L1],
  P2 =.. [_置換指定述語|L2],
  list_nth(_キー位置1,L1,A),
  list_nth(_キー位置2,L2,A),
  list_nth(_置換項位置,L2,B),
  call(P2),
  call(P1),
  retract(P1),
  ならびの位置指定置換(_被置換項位置,B,L1,L3),
  P3 =.. [_対象述語|L3],
  asserta(P3).
282デフォルトの名無しさん:2009/11/27(金) 19:03:46
283デフォルトの名無しさん:2009/11/27(金) 19:35:56
http://pc12.2ch.net/test/read.cgi/tech/1258158172/430
# [1]C言語演習
# [2] コマンドラインで与えられた整数を読み取りその総和を返す関数を作りなさい。
# 但し、一つでも数字でない文字列が与えられた場合はその文字列を表示し、計算できない
# ことをメッセージ出力する。整数は64ビット符号付き整数の範囲とし与えられた数が
# その範囲に収まらない場合や総和の計算の途中でそうなる場合も、オーバーフローする
# 旨メッセージ出力すること。
284デフォルトの名無しさん:2009/11/27(金) 19:48:45
http://pc12.2ch.net/test/read.cgi/tech/1248012902/539
# 【 課題 】三目並べゲームを作れ(以下は仕様)
#       ・二人の対戦者が交互にO,Xの場所をマウスでクリックする
#       ・マウスがクリックされたとき、対戦者のテーマ音を一回再生する
#       ・既にO,Xがある場所が指定されたら、無視する
#       ・勝敗が決定すると勝者のマーク(XorO)を赤で描画し、テーマ音を3回鳴らす
#       ・勝敗が決すると入力を無視する
# 【 形態 】 Applet
# 【 GUI  】 制限なし
# 【 期限 】11月 30日
# 【 Ver  】1.6.0_10
# 【 補足 】自分でほぼ作ったんですがXが勝った場合にテーマ音が3回なりません
# http://ime.nu/www.dotup.org/uploda/www.dotup.org401130.java.html
#
# あと再描画させると以前に描画させたOやXが消えてしまうので
# paintメソッドの中でsuper.paint(g)を使ってないんですが、
# それではなぜか処理が遅くなったので、updateメソッドを使って
# その中でpaint(g)を直接呼び出してます
285デフォルトの名無しさん:2009/11/27(金) 20:35:48
http://pc12.2ch.net/test/read.cgi/tech/1258158172/432
# [1] 授業単元:暇なヤシ集まれ
# [2] 問題文(含コード&リンク):
#  最大10桁の数字列sと 10000 以下の正整数dが
#  与えられたとき、sの各数字を並べ替えて出来る全
#  ての数の中で、dで割り切れる数の総数を求める。
#
#  計算例) s, d => 解
#  ・ 000, 1 => 1
#  ・ 1234567890, 1 => 3628800
#  ・ 123434, 2 => 90
#
286デフォルトの名無しさん:2009/11/27(金) 21:25:00
>>255
% Prolog シミュレーションのエンジン部分。詳細は http://nojiriko.asia/prolog/t2_255.html

シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R],_日付,N,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :-
売買の契機(_前終,_始,_高,_安,_終,_契機ならび),
一日のシミュレーション(1,N,_契機ならび,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数).
シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R],_日付,N,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :-
売買の契機(_前終,_始,_高,_安,_終,_契機ならび),
一日のシミュレーションの二(_契機ならび,_売買値1,_売買値2,_現金残高1,_現金残高2,_持株数1,_持株数2),
シミュレーション([[_日付,_始,_高,_安,_終,_]|R],_日付,N,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数).

一日のシミュレーション(M,M,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :-
オペ(_売買値1,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数).
一日のシミュレーション(M,N,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :-
オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2),
M2 is M + 1,
一日のシミュレーション(M2,N,R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数).

一日のシミュレーションの二([],_売買値,_売買値,_現金残高,_現金残高,_持株数,_持株数) :- !.
一日のシミュレーションの二([_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :-
オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2),
一日のシミュレーションの二(R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数).
287デフォルトの名無しさん:2009/11/27(金) 21:33:25
>>286 ぎゃーっ。
これを読んでくれる人はいないだろうけれど、ひとこと。
なぜ、一日のシミュレーション/9 とそれとそっくりの
一日のシミュレーションの二/7 があるのか、
その違いは何か、それぞれどんな働きをしているのか。
288デフォルトの名無しさん:2009/11/28(土) 05:32:52
http://pc12.2ch.net/test/read.cgi/tech/1258158172/438
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt
#
# 〜課題1〜
# 変数a,b,cへ値を読み込み、方程式ax2(axの二乗)+bx+c=0の会を出力するプログラムを作成せよ。ただし、a=/0(aノット0)の場合の判別式はD=b2-4acで与えられるものとし、
# 解の公式は-b+-4ac/2aで与えられるものとする。虚数解となる場合はたとえばx=3+5i,x=3-5iのように実数部と虚数部がわかるように出力せよ。すべての場合を見落とさず考えよ。
# ルートの関数はsqrt関数を使う。たとえば√2.5を求める場合、
# double a;
# a=sqrt(2.5); /*√2.5をaに代入*/
# のように書く。ただし、sqrtの()内に与えられる数(変数も指定できる)は正の実数(double型)でなければならない。
289デフォルトの名無しさん:2009/11/28(土) 05:34:14
http://pc12.2ch.net/test/read.cgi/tech/1258158172/438
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt
#
# 〜課題2〜
# 変数nを入力すると、以下の図のような表示を行うプログラムをそれぞれ作成せよ。ただし、図はn=5の場合である。
# 1つのプログラムとして作成せよ。
#
# *
#     ***
# *****
# *******
# *********
290デフォルトの名無しさん:2009/11/28(土) 05:43:27
>>289
すみません。化けました。要するに星の「ピラミッド」です。
291デフォルトの名無しさん:2009/11/28(土) 06:23:36
>>203 (再掲)
% Prolog
% sub_atom/5はISO標準の非決定性述語。
% ここでは、先頭から一文字ずつ取りだしているが、これは規格で保証されて
% いる訳ではない。逆順に取れてしまっても文句の言いようがない。
% 現在の処理系ではこれで動くというだけだ。より安定的なコードは%%%のあとに。

文字を順に1文字ずつ交互に取り出す(Atom1,Atom2,Char) :-
  sub_atom(Atom1,_,1,R,Char1),
  sub_atom(Atom2,_,1,R,Char2),
  (Char = Char1; Char = Char2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

文字を順に1文字ずつ交互に取り出す(Atom1,Atom2,Char) :-
  atom_chars(Atom1,Chars1),
  atom_chars(Atom2,Chars2),
  文字ならびから文字を順に1文字ずつ交互に取り出す(Chars1,Chars2,Char).

文字ならびから文字を順に1文字ずつ交互に取り出す([Char|R],Chars2,Char).
文字ならびから文字を順に1文字ずつ交互に取り出す(Chars1,[Char|R],Char).
文字ならびから文字を順に1文字ずつ交互に取り出す([_|R1],[_|R2],Char) :-
  文字ならびから文字を順に1文字ずつ交互に取り出す(R1,R2,Char).
292デフォルトの名無しさん:2009/11/28(土) 06:58:22
>>291
% 以下のように書く人が多い。速くてスマートだが、二本のどちらの
% リストの処理中か分からず、述語を発展させのが困難で私は嫌い。

文字ならびから文字を順に1文字ずつ交互に取り出す([Char|R],Chars2,Char).
文字ならびから文字を順に1文字ずつ交互に取り出す([_|L1],L2,Char) :-
  文字ならびから文字を順に1文字ずつ交互に取り出す(L2,L1,Char).
293デフォルトの名無しさん:2009/11/28(土) 07:43:30
>>288
% Prolog
:- op(250,xf,i).

二次方程式の解(0,B,C,X) :- X is (-1) * C / B.
二次方程式の解(A,B,C,X) :-
  0.0 is B^2 - 4 * A * C,
  X is ((-1) * B) / (2 * A).
二次方程式の解(A,B,C,X) :-
  U is B^2 - 4 * A * C,
  U > 0.0,
  X is ((-1) * B) + sqrt(U)) / (2 * A).
二次方程式の解(A,B,C,X) :-
  U is B^2 - 4 * A * C,
  U > 0.0,
  X is ((-1) * B) - sqrt(U)) / (2 * A).
二次方程式の解(A,B,C,(D+Ei)) :-
  U is B^2 - 4 * A * C,
  U < 0.0,
  D is ((-1) * B) / (2 * A),
  E is U / (2 * A).
二次方程式の解(A,B,C,(D-Ei)) :-
  U is B^2 - 4 * A * C,
  U < 0.0,
  D is ((-1) * B) / (2 * A),
  E is U / (2 * A).
294デフォルトの名無しさん:2009/11/28(土) 10:03:00
>>289
% Prolog

ピラミッド(N) :-
  length(L1,N),all(L1,' '),
  ピラミッド(L1,[]).

ピラミッド([],HL).
ピラミッド([_|L1],HL) :-
  append(L1,HL,L1,L2),
  concat_atom(L2,S),
  write_formatted('%t\n',[S]),
  ピラミッド(L1,['*'|HL]).
295デフォルトの名無しさん:2009/11/28(土) 10:07:27
>>294 間違えた。
% Prolog

ピラミッド(N) :-
  length(L1,N),
  all(L1,' '),
  ピラミッド(L1,[*]).

ピラミッド([],HL).
ピラミッド([A|L1],HL) :-
  append([A|L1],HL,[A|L1],L2),
  concat_atom(L2,S),
  write_formatted('%t\n',[S]),
  ピラミッド(L1,['**'|HL]).
296デフォルトの名無しさん:2009/11/28(土) 10:17:00
>>295 やっぱり違う。意外とややこしい。
% Prolog

ピラミッド(N) :-
  length(L1,N),
  all(L1,' '),
  ピラミッド(L1,[*]).

ピラミッド([],HL) :- concat_atom(HL,S),write_formatted('%t\n',[S]).
ピラミッド([_|L1],HL) :-
  append(L1,HL,L1,L2),
  concat_atom(L2,S),
  write_formatted('%t\n',[S]),
  ピラミッド(L1,['**'|HL]).
297デフォルトの名無しさん:2009/11/28(土) 10:35:08
>>296
数値演算処理がlength/2に隠蔽されていていいコードですね。でもさすがに、
length/2 + all/2 とか
concat_atom/2 + write_formatted/2 はひとつのユーティリティ述語に纏めた
方がいいと思いますよ。そろそろ。
298デフォルトの名無しさん:2009/11/28(土) 10:50:08
>>297
all/2 や concat_atom/2 は既にそれに当たるんだけど。できる限り、
汎用述語を増やさないというか、あっても使わないのがPrologのスタイルだけど、
たしかにここまで頻繁に現れるとなると「そろそろ」かも知れない。
299デフォルトの名無しさん:2009/11/28(土) 12:06:05
>>283
% Prolog

入力パラメータ加算(S) :-
  user_parameters(L),
  入力パラメータ解析(L,0,S,正常終了).

入力パラメータ解析(_,_,_,_診断) :- \+(_診断=正常終了),!.
入力パラメータ解析([],S,S,正常終了) :- !.
入力パラメータ解析([A|R1],S1,S,正常終了) :-
  exception_handler(atom_to_term(A,N,_),error(E,I),error_message(E,I),fail),
  加算処理(N,S1,S2,_診断2),
  入力パラメータ解析(R1,S2,S,_診断2).
入力パラメータ解析([A|R1],S1,S,異常終了) :-
  write_formatted('入力パラメータの解析中にエラーが発生しました。:"%t" 処理を停止します。\n',[N]),!.

加算処理(N,S1,S2,正常終了) :- integer(N),
  exception_handler(S2 is S1 + N,error(E,I),error_message(E,I),fail),!.
加算処理(N,S1,S1,演算エラー) :- integer(N),!.
加算処理(N,S1,S1,非整数エラー) :- \+(integer(N)),
  write_formatted('パラメータに整数以外の要素がありました : %t\n',[N]),!.

error_message(E,I) :- write_formatted('%t,%t エラー\n',[E,I]).
300デフォルトの名無しさん:2009/11/28(土) 16:17:33
>>289
main = readLn >>= \n -> putStr $ unlines [replicate (n-i) ' ' ++ replicate (2*i-1) '*' | i <- [1..n]]
301デフォルトの名無しさん:2009/11/28(土) 16:39:48
>>288
import Data.Complex

solve2 :: RealFloat a => Complex a -> Complex a -> Complex a -> [Complex a]
solve2 0 b c = [c / b]
solve2 a b c = let d = b*b - 4*a*c
in [(-b + sqrt d) / (2*a), (-b - sqrt d) / (2*a)]

main = print $ solve2 1 1 1
302デフォルトの名無しさん:2009/11/28(土) 16:48:19
>>283
import System.Environment (getArgs)
main = getArgs >>= print . sum . map read
303デフォルトの名無しさん:2009/11/28(土) 17:57:58
>>285
% Prolog

'最大10桁の数字列sと 10000 以下の正整数dが与えられたとき、sの各数字を並べ替えて出来る全ての数の中で、dで割り切れる数の総数を求める'(_数字ならび,D,X) :-

  length(_数字ならび,Len),
  Len =< 10,
  D < 10000,
  findall(Y,(数字ならびから順列整数(_数字ならび,Len,Y),0 is Y mod D),L),
  sort(L,L2),
  length(L2,X).

数字ならびから順列整数(Y,0,0).
数字ならびから順列整数(Y,N,X) :-
  del(Z = Y - A),
  M is N - 1,
  数字ならびから順列整数(Z,M,X2),
  X is truncate(10^M*A+X2).
304デフォルトの名無しさん:2009/11/29(日) 03:34:10
http://pc12.2ch.net/test/read.cgi/tech/1258158172/451
# [1]やさしいC言語
# [2] 4つの数を大きさの小さい順に並べ替える関数 Sort4(int *a,int *b.int *c,int *d)
# (呼び出し後a<=b<=c<=dとなる)を作り、この関数を利用してキーボードから4つ
# の整数を読み取り、大きい順に出力するプログラムを作りなさい。
# Sort4関数の中ではループ文(while/do while/for)を用いないこと
#
305デフォルトの名無しさん:2009/11/29(日) 03:37:27
http://pc12.2ch.net/test/read.cgi/tech/1258158172/458
# [1] 基礎プログラミング実習
#
# [2]99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,
# またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ.
# 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY=
#
# 変換された文字列はABCabc***SdfGH**X**yy*です.
#
# 追伸:
# ちなみにどうやらアスキーコードを使うらしいです。
# 大文字のコードに32を足せば小文字のコードになるとか言ってました。
# これを使わなければいけないようです。
# あとライブラリ関数は使用不可です。
# 文字列とかやったの初めてです。
#
306デフォルトの名無しさん:2009/11/29(日) 04:00:01
>>285
NB. J言語

f=:dyad def'+/0=y|~.".(i.!#x)A.x'

'000' f 1
1
'123434' f 2
90
'123456789' f 1
362880
'1234567890' f 1
|out of memory: f
| +/0=y|~.".(i.!#x) A.x

10桁はout of memoryになってしまいます。(使用したパソコンのメモリは512MB)
もっとメモリがあれは実行できるのかどうかは、わかりません。
307デフォルトの名無しさん:2009/11/29(日) 04:08:43
>>305
% Prolog
'アルファベットの小文字は大文字にアルファベットの大文字は小文字にまたアルファベット以外の文字はアスタリスク*に変換して表示' :-
  write('99文字以下の文字列を入力してください. '),
  get_line(Line),
  atom_codes(Line,Codes),
  length(Codes,_長さ),_長さ =< 99,
  文字コードによる直接変換(Codes,Codes2),
  atom_codes(_変換された文字列,Codes2),
  write_formatted('変換された文字列は%tです\n',[_変換された文字列]).

文字コードによる直接変換([],[]).
文字コードによる直接変換([Code|R1],[Code2|R2]) :-
  Code >= 65,Code =< 90,
  Code2 is Code + 32,
  文字コードによる直接変換(R1,R2).
文字コードによる直接変換([Code|R1],[Code2|R2]) :-
  Code >= 97,Code =< 122,
  Code2 is Code - 32,
  文字コードによる直接変換(R1,R2).
文字コードによる直接変換([Code|R1],[42|R2]) :-
  \+((Code >= 65,Code =< 90)),
  \+((Code >= 97,Code =< 122)),
  文字コードによる直接変換(R1,R2).
308デフォルトの名無しさん:2009/11/29(日) 04:28:48
>>304
% Prolog

sort4(A,B,C,D,X1,X2,X3,X4) :-
  順列([A,B,C,D],4,[X1,X2,X3,X4]),
  X1 >= X2,
  X2 >= X3,
  X3 >= X4,!.
309デフォルトの名無しさん:2009/11/29(日) 05:40:35
>>289
NB. J言語

f=:monad def'''-*''(1!:2&2)@#~(,.<:@+:@(y&-))|.i.y'


f 5
----*
---***
--*****
-*******
*********
310デフォルトの名無しさん:2009/11/29(日) 05:46:39
http://pc12.2ch.net/test/read.cgi/tech/1258158172/456
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt
#
# 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。
# 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。
# データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。

# 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で
# それぞれの値段は23、23、10という状況を表す。
# -------------------
# 3
# 10
# 20
# 13
# 23
# 23
# 10
# -------------------
# 荷物の重みと値段はともに、1から100までの乱数で与えることとする。
# void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている
# ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]にデータを入力する。
311デフォルトの名無しさん:2009/11/29(日) 05:54:22
>>258
NB. J言語

f=:,$'*'"_

3 f 5
*****
*****
*****
312デフォルトの名無しさん:2009/11/29(日) 06:47:48
>>310
% Prolog

ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :-
  データファイルの読み出し(_ファイル名,N,_価格ならび,_重さならび),
  findall(M,for(1,M,N),_1からNまで),
  findmax(_合計価格,詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格),_詰めることのできる最高合計金額).

データファイルの読み出し(_ファイル名,N,_重さならび,_価格ならび) :-
  see(_ファイル名),get_integer(N),get_integers(L1),seen,
  length(L2,N),length(L3,N),
  append(_重さならび,_価格ならび,L1),!.

詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格) :-
  for(1,M,N),
  組合せ(_1からNまで,M,L),
  findsum(Wi,(member(A,L),list_nth(A,_重さならび,Wi)),_合計重量),
  _合計重量 =< _許容最大重量,
  findsum(Pi,(member(A,L),list_nth(A,_価格ならび,Pi)),_合計金額).

get_integers(L) :-
  findall(I,(get_line(Line),(Line=end_of_file,!,fail;atom_to_term(Line,I,_))),L),!.
313デフォルトの名無しさん:2009/11/29(日) 09:01:30
>>182
使用言語:maxima

printf(true,"~{~{~4d~}~%~}",makelist(makelist(i*j,j,1,10),i,1,10));
314デフォルトの名無しさん:2009/11/29(日) 10:37:37
http://pc12.2ch.net/test/read.cgi/tech/1258158172/475
# 【質問テンプレ】
# [1] 授業単元:Cプログラミング
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10196.txt
# 入力された1000以下の整数を素因数分解して、結果を出力するプログラムを作成しなさい。
# 素因数分解とは、自然数を素数ばかりの積の形に書き表すことをいう。
#
# 例:60=2*2*3*5 このとき2、3、5は60の素因数であるという。
#
# 自然数Nが素因数分解できるとき、N≧G^2となる素因数Gが存在することが数学的に証明されているので次のようなアルゴリズムを考えた。
# (1)キーボードから入力された数nが1以下なら、再入力させる。
# (2)kに2を代入する。
# (3)kの二乗をmとする。
# (4)nとmを比較し、nがm以上なら(記述ミスかもしれないnがm未満なら?)nを素因数として出力して終了する。
# (5)nがmより小さければnをkで割り、商qと余りrを求める。
# (6)余りrが0でなければ(nがkで割り切れなければ)、kの値を1増やして(3)に戻る。
# (7)余りrが0なら(nがkで割り切れれば)、kを素因数として出力する。
# (8)商qが1なら処理を終了する、そうでなければqを新たなnとして(5)に戻る。
315デフォルトの名無しさん:2009/11/29(日) 10:40:15
http://pc12.2ch.net/test/read.cgi/tech/1258320456/47
# 【 課題 】四人四首問題。「かるた部」の練習の一環として、
# 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに
# しました。四枚とは、
# やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな
# やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし
# やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば
# やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり
# ルールは、
# 1) 二人ゲームである。
# 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。
# 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。
# 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。
#
# [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。
# つぎに、読み札の順番を決めます。これはこの段階では表示しません。
# 一首、読み、それを表示し、
# 1) 空札 : 何文字目まで読まれてそれがわかったか
# 2) 相手札 : 同上
# 3) 自分札 : 同上
# を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。
# 4) 二つのモードで作りなさい
#  1) 読まれた札を二人とも記憶している。
#  2) 読まれた札は忘れてしまう。
# 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。
316デフォルトの名無しさん:2009/11/29(日) 10:58:48
>>182
使用言語: R

write(sprintf("%4d",1:10%o%1:10),"",10)

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
317デフォルトの名無しさん:2009/11/29(日) 11:30:26
>>314
NB. J言語

f=:monad def';(,'' * ''&;)/<@":"0 q:y'


f 11111
41 * 271

f 11111111
11 * 73 * 101 * 137
318デフォルトの名無しさん:2009/11/29(日) 12:28:54
http://pc12.2ch.net/test/read.cgi/tech/1258158172/486
# [1] 授業単元:C言語演習
# [2] 問題文: 1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに
# 入力された値の合計値を表示するプログラムを作成しなさい。ただし
# 1〜100以外の数字が入力されたときは”エラー”と表示させる。
#
319デフォルトの名無しさん:2009/11/29(日) 13:42:13
>>17 問題2
使用言語: R

f <- function (n) {
a <- 1:n
sum(a[a%%3==0|a%%5==0])
}

> f(10)
[1] 33
> f(2000)
[1] 933668
320デフォルトの名無しさん:2009/11/29(日) 18:06:47
>>17 問題1
使用言語: R

f <- function (n) {substr("abcdefghijklmnopqrstuvwxyz",1,n)}

> f(6)
[1] "abcdef"
> f(30)
[1] "abcdefghijklmnopqrstuvwxyz"
321デフォルトの名無しさん:2009/11/29(日) 18:47:28
http://pc12.2ch.net/test/read.cgi/tech/1258158172/497
# [1] 授業単元:C
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10200.txt
#
# 初期設定された文字列の順序を逆に並べ替えるプログラムを作成せよ。
# ただし、並べ替える部分は関数とし、文字列の長さは最大255文字とする
322デフォルトの名無しさん:2009/11/30(月) 05:04:32
http://pc12.2ch.net/test/read.cgi/tech/1248012902/549
# 課題は長くて載せられないため
# <A HREF="http://nojiriko.asia/prolog/j68_549_kadai.html">ここにコピーさせてい
ました</A>
323デフォルトの名無しさん:2009/11/30(月) 05:07:01
>>322
すみません。肝心の原文の在り処を削ってしまいました。
http://oshiete1.goo.ne.jp/qa5482918.html
324デフォルトの名無しさん:2009/11/30(月) 06:05:17
>>318
% Prolog 汎用述語の定義は http://nojiriko.asia/prolog/c132_486.html を参照してください。

'1〜100までの数字を繰り返し入力し、最後に0を入力するとこれまでに入力された値の
合計値を表示する'(_合計値) :-
  findsum(X,(repeat,get_integer(X),(X=0,!,fail;範囲範囲チェック(X)),_合計値),
  write_formatted('合計は%t\n',[_合計値]).

整数範囲チェック(X):- X > 0,X =< 100.
整数範囲チェック(X):- \+((X >0,X =<100)),write('整数範囲エラー\n'),fail.
325デフォルトの名無しさん:2009/11/30(月) 06:16:26
>>321
% Prolog 初期設定されたというところが微妙。Prologだと・・・かな

初期設定された文字列の順序を逆に並べ替える :-
  retract('(初期)設定文字列'(_文字列)),
  文字列の反転(_文字列,_反転された文字列),
  asserta('(初期)設定文字列'(_反転された文字列)).

文字列の反転(_文字列,_反転された文字列) :-
  atom_chars(_文字列,Chars),
  reverse(Chars,RChars),
  atom_chars(_反転された文字列,RChars).
326デフォルトの名無しさん:2009/11/30(月) 07:12:49
>>321
使用言語: 十進BASIC

SUB reverse(a$)
LET b=LEN(a$)
LET c=INT(b/2)
FOR i = 1 TO c
LET t$=a$(i:i)
LET a$(i:i)=a$(b-i+1:b-i+1)
LET a$(b-i+1:b-i+1)=t$
LET c=5
NEXT I
END SUB
LET s$="12345"
CALL reverse(s$)
PRINT s$
END

実行結果
54321
327デフォルトの名無しさん:2009/11/30(月) 07:42:12
>>318
使用言語: 十進BASIC

LET v=1
DO WHILE v<>0
INPUT v
IF 0<=v AND v<=100 THEN
LET s=s+v
ELSE
PRINT "エラー"
END IF
LOOP
PRINT s
END

実行結果
? 1
? 2
? 200
エラー
? 3
? 0
6
328デフォルトの名無しさん:2009/11/30(月) 12:23:26
>>318
エラーチェックする範囲をまちがえた。
使用言語: 十進BASIC

LET s=0
LET v=1
DO WHILE v<>0
INPUT v
IF 1<=v AND v<=100 THEN
LET s=s+v
ELSE
PRINT "エラー"
END IF
LOOP
PRINT s
END

実行結果
? 1
? 2
? 200
エラー
? 3
? 0
6
329デフォルトの名無しさん:2009/11/30(月) 12:26:27
>>17  問題2
使用言語: Arc

(def f (n)
(sum
[if (or (is (mod _ 3) 0) (is (mod _ 5) 0)) _ 0 ]
(range 1 n)))

arc> (f 20)
98
arc> (f 100000)
2333416668
arc>
330デフォルトの名無しさん:2009/11/30(月) 12:54:59
http://pc12.2ch.net/test/read.cgi/tech/1258158172/550
# [1] 授業単元: プログラミングU
# [2] 問題文(含コード&リンク):
#
# 2進数と10進数の相互変換のプログラムを作る。
# 自作関数として変換(計算)部分と入力部分とを分ける。
# 正負の数、少数も変換できるようにする。
# 入力はScanfを使用する。
#
331デフォルトの名無しさん:2009/11/30(月) 14:38:24
>>45
使用言語: Arc

(def fact (n) (if (is n 0) 1 (apply * (range 1 n))))

arc> (for i 0 10 (prn (fact i)))
1
1
2
6
24
120
720
5040
40320
362880
3628800
nil
332デフォルトの名無しさん:2009/11/30(月) 17:22:28
http://pc12.2ch.net/test/read.cgi/tech/1258158172/557
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10207.txt
# [問題]
# 行数と列数を引数として、その行数と列数だけアスタリスクを表示させる関数showwas
ter()を作成する。
# 入力は正の整数だけを考えれば平気です。
#
# [解らない部分]
# 下のプログラム中の???の部分が解りません…
# 予備ですが現在、関数の呼び出しやプロトタイプ宣言などを習っています
# よろしくお願い致します
333デフォルトの名無しさん:2009/11/30(月) 17:23:23
http://pc12.2ch.net/test/read.cgi/tech/1258158172/560
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# int型整数の4乗を返す関数
# int pow4(int x)
# を作成せよ。(ただし関数powは使用しない)
#
# (実行例)
# 整数を入力してください:5
# その4乗値は625です。
#
334デフォルトの名無しさん:2009/11/30(月) 17:29:59
>>333
% Prolog 既出 http://nojiriko.asia/prolog/c132_368_2.html

pow4 :-
  get_inetger(N),
  pow4(N,X),
  write_formatted('その4乗値は%tです。\n',[X]).

pow4(N,X) :-
  X is N * N * N * N.
335デフォルトの名無しさん:2009/11/30(月) 17:44:44
>>332
% Prolog

showwaster(M,N) :-
  waster(M,N,L),
  showwaster(L).

showwaster([]).
showwaster([L|R]) :-
  writeAn(L),
  showwaster(R).

waster(N1,N,M,[]) :- N1 > N,!.
waster(N1,N,M,[A|R]) :-
  length(L,M),
  all(L,*),
  N2 is N1 + 1,
  waster(N2,N,M,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
writeAn(_ならび) :-
  concat_atom(_ならび,Atom),
  write_formatted('%t\n',[Atom]).
336デフォルトの名無しさん:2009/11/30(月) 17:51:55
>>335 違っていたので書き直し
% Prolog

showwaster(M,N) :-
  waster(1,N,M,L), /* ここを訂正 */
  showwaster(L).

showwaster([]).
showwaster([L|R]) :-
  writeAn(L),
  showwaster(R).

waster(N1,N,M,[]) :- N1 > N,!.
waster(N1,N,M,[A|R]) :-
  length(L,M),
  all(L,*),
  N2 is N1 + 1,
  waster(N2,N,M,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
writeAn(_ならび) :-
  concat_atom(_ならび,Atom),
  write_formatted('%t\n',[Atom]).
337デフォルトの名無しさん:2009/11/30(月) 20:19:03
>>257 >>331
使用言語: maxima

pow4(n):=n*n*n*n;


(%i15) pow4(6);
(%o15) 1296
338デフォルトの名無しさん:2009/11/30(月) 20:21:22
>>258 >>332
使用言語: maxima

showwaster(a,b):=(c:smake(b,"*"),for i thru a do print(c));

(%i1) showwaster(3,15);
***************
***************
***************
339デフォルトの名無しさん:2009/11/30(月) 20:28:07
http://pc12.2ch.net/test/read.cgi/tech/1258158172/565
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10209.txt
# 以下の実行結果を元に、元金[円]と年利[%]と預金年度をキーボードから入力させ、
# 10年間預金したときの毎年度の利息と元利合計を表示するプログラムを作成、コンパイル、実行しなさい。
# なお、利息は複利で計算し、毎年度の利息の円単位未満は切り捨てること。
# 元金[円]を入力してください : 3613 enter↓
# 年利[%]を入力してください  : 9.6 enter↓
# 預金年度を入力してください : 2009 enter↓
# +-----------+------------+-----------+er↓
# | 年度    |  利息  |  元利合計|
# +-----------+------------+-----------+
# |   2009 |      |   3613 |
# |   2010 |    346 |   3959 |
#        <中略>
# |   2018 |    721 |   8238 |
# |   2019 |    790 |   9028 |
# +-----------+------------+-----------+
340デフォルトの名無しさん:2009/11/30(月) 20:55:10
>>257 >>331
使用言語: Arc

(def pow4 (n) (* n n n n))

arc> (pow4 7)
2401
341デフォルトの名無しさん:2009/11/30(月) 20:56:40
>>258 >>332
使用言語: Arc

(def showwaster (a b) (for i 1 a (for j 1 b (pr "*")) (prn) ))

arc> (showwaster 5 8)
********
********
********
********
********
nil
342デフォルトの名無しさん:2009/11/30(月) 21:41:02
>>305
-- Haskell
import Data.Char

main = getLine >>= putStrLn . map convert

convert c | isUpper c = toLower c
| isLower c = toUpper c
| otherwise = '*'
343デフォルトの名無しさん:2009/11/30(月) 21:42:51
>>314
-- Haskell
main = print $ factorize 60

factorize :: Integral a => a -> [a]
factorize = go 2
where
go k n | n < k*k = [n]
| r == 0 = k : go k q
| otherwise = go (k+1) n
where (q,r) = n `divMod` k
344デフォルトの名無しさん:2009/11/30(月) 21:47:02
>>257 >>331
使用言語: 十進BASIC

DEF pow4(n)=n*n*n*n
PRINT pow4(8)
END

実行結果
4096
345デフォルトの名無しさん:2009/11/30(月) 21:47:19
>>318
-- Haskell

import Control.Monad.State

main = execStateT t318 0 >>= print

t318 :: StateT Int IO ()
t318 = do
n <- liftIO readLn
if n == 0
then return ()
else if 1 <= n && n <= 100
then modify (+n) >> t318
else error "error"
346デフォルトの名無しさん:2009/11/30(月) 21:51:12
>>258 >>332
使用言語: 十進BASIC

SUB showwaster(a,b)
PRINT REPEAT$(REPEAT$("*",b)&CHR$(10),a)
END SUB
CALL showwaster(5,3)
END

実行結果
***
***
***
***
***
347デフォルトの名無しさん:2009/11/30(月) 22:09:01
>>322
-- Haskell

import System.Environment (getArgs)

newtype Point2D a = Point2D (a,a)
newtype Triangle a = Triangle (Point2D a,Point2D a)

main = do
argv <- getArgs
case argv of
[ax,ay,bx,by] -> let a = mkPoint2D (read ax) (read ay)
b = mkPoint2D (read bx) (read by)
in print $ getArea $ mkTriangle a b
_ -> putStrLn "usage: a.out ax ay bx by"

mkPoint2D = curry Point2D
mkTriangle = curry Triangle

getArea :: Fractional a => Triangle a -> a
getArea (Triangle (Point2D (ax,ay), Point2D (bx,by)))
= abs (ax*by - ay*bx) / 2
348デフォルトの名無しさん:2009/11/30(月) 22:23:14
>>339
% Prolog
'10年間預金したときの毎年度の利息と元利合計を表示' :-
  催促付き整数入力('元金[円]を入力してください : ',_元金1),
  催促付き整数入力('年利[%]を入力してください : ',_年利),
  催促付き整数入力('預金年度を入力してください : ',_預金年度1),
  write('+-----------+------------+-----------+\n'),
  write('| 年度    |  利息  |  元利合計|\n').
  write('+-----------+------------+-----------+\n'),
  元利合計計算(_預金年度1,_預金年度,_年利,0,_元金1,_元利合計),
  年度ごとに表示(_預金年度1,_預金年度,_利息,_元利合計),
  _預金年度 is _預金年度1 + 10,
  write('+-----------+------------+-----------+\n'),!.

元利合計計算(_預金年度,_預金年度,_年利,_利息,_元金,_元金).
元利合計計算(_預金年度1,_預金年度,_年利,_,_元金1,_元金) :-
  _利息2 is truncate(_元金1 * _年利 / 100),
  _元金2 is _元金1 + _利息2,
  _預金年度2 is _預金年度 + 1,
  元利合計計算(_預金年度2,_預金年度,_年利,_利息2,_元金2,_元利合計).

年度ごとに表示(_預金年度,_預金年度,_利息,_元利合計) :-
  write_formatted('|   %t |  | %8d |\n',[_預金年度,_元利合計]),!.
年度ごとに表示(_,_預金年度,_利息,_元利合計) :-
  write_formatted('|   %t | %8d | %8d |\n',[_預金年度,_元利合計]),!.
349デフォルトの名無しさん:2009/11/30(月) 23:02:04
>>305
使用言語: 十進BASIC
FUNCTION f$(s$)
FOR i=1 TO LEN(s$)
LET c=ORD(s$(i:i))
IF 65<=c AND c<=90 THEN
LET d=c+32
ELSEIF 97<=c AND c<=122 THEN
LET d=c-32
ELSE
LET d=42
END IF
LET s$(i:i)=CHR$(d)
NEXT I
LET f$=s$
END FUNCTION

PRINT f$("abcABC123sDFgh#""x32YY=")
END

実行結果
ABCabc***SdfGH**X**yy*
350デフォルトの名無しさん:2009/11/30(月) 23:12:34
>>339
ime.nu くらい抜いてくれ
-- Haskell
import Control.Arrow ((&&&), (>>>))
import Control.Applicative ((<*>))
import qualified System.IO.UTF8 as U
import System.IO (hFlush, stdout)
import Text.Printf (printf)

flush = hFlush stdout

main = do
U.putStr "元金[円]を入力してくさい: " >> flush
a <- readLn
U.putStr "年利[%]を入力してください: " >> flush
b <- readLn
U.putStr "預金年度を入力してください: " >> flush
c <- readLn

putStrLn "+-----------+------------+-----------+"
U.putStrLn "| 年度 | 利息 | 元利合計 |"
putStrLn "+-----------+------------+-----------+"
mapM_ (\(x,(y,z)) -> putStrLn $ prettify x y z) $ zip [c,c+1..] $ take 11 $ t339 a b
putStrLn "+-----------+------------+-----------+"
where
prettify :: Int -> Int -> Int -> String
prettify = printf "|%11d|%12d|%11d|"

t339 init i = iterate (snd >>> interest i &&& ((+) <*> interest i)) (0,init)

interest :: (RealFrac a, Integral b) => a -> b -> b
interest d n = floor $ fromIntegral n * d/100
351デフォルトの名無しさん:2009/12/01(火) 00:06:02
>>339
使用言語: 十進BASIC

INPUT PROMPT "元金[円]を入力してください :":元金
INPUT PROMPT "年利[%]を入力してください  :":年利
INPUT PROMPT "預金年度を入力してください :":預金年度
LET 利息=0
PRINT "+------------+------------+------------+"
PRINT "|  年度  |  利息  | 元利合計 |"
PRINT "+------------+------------+------------+"
PRINT USING "|############| |############|": 預金年度,元金
FOR i=1 TO 10
LET 利息=INT(元金*年利/100)
LET 元金=元金+利息
PRINT USING "|############|############|############|": 預金年度+i,利息,元金
NEXT I
PRINT "+------------+------------+------------+"
END
352デフォルトの名無しさん:2009/12/01(火) 01:00:03
ASPで九九を表示するプログラム
For nextやtableタグを使用して

どなたか助けて
353デフォルトの名無しさん:2009/12/01(火) 02:49:06
Response.write "<table border=1>"
Response.write "<tr>"
Response.write "<td>"
For i=1 to 9
For j=1 to 9
A=j*i
Response.write A
Response.write "</td>"
Response.write "<td>"
Next
Response.write "</tr>"
Next
Response.write "</table>"

テーブルに上手くおさめることができません。
9マス9マスで同時に納めていく方法がしたいです。
354デフォルトの名無しさん:2009/12/01(火) 03:39:01
できたー。aspというよりhtmlが不勉強でしたorz
355デフォルトの名無しさん:2009/12/01(火) 03:48:09
>>354
どうなったの?
356デフォルトの名無しさん:2009/12/01(火) 03:52:35
>>355
Response.write "<table border=1>"
For i=1 to 9
Response.write "<tr>"
For j=1 to 9
Response.write "<td>"
A=j*i
Response.write A
Response.write "</td>"
Next
Response.write "</tr>"
Next
Response.write "</table>"

多分これでいいかと思うのだけど
間違ってたり簡略できたら指摘してほしいな
357デフォルトの名無しさん:2009/12/01(火) 04:05:54
Forの間に<td>がひとつくる。正解ですね。
358デフォルトの名無しさん:2009/12/01(火) 05:07:26
>>352 >>353
大括弧[]を<table></table>,中括弧{}を<tr></tr>,
小括弧()を<td></td>とすれは下のように囲えばいいみたいです。
あと、</td>と</tr>は省略可能だそうです。
[
{(1)(2)(3)(4)(5)(6)(7)(8)(9)}
{(2)(4)(6)(8)(10)(12)(14)(16)(18)}
{(3)(6)(9)(12)(15)(18)(21)(24)(27)}
{(4)(8)(12)(16)(20)(24)(28)(32)(36)}
{(5)(10)(15)(20)(25)(30)(35)(40)(45)}
{(6)(12)(18)(24)(30)(36)(42)(48)(54)}
{(7)(14)(21)(28)(35)(42)(49)(56)(63)}
{(8)(16)(24)(32)(40)(48)(56)(64)(72)}
{(9)(18)(27)(36)(45)(54)(63)(72)(81)}
]
359デフォルトの名無しさん:2009/12/01(火) 07:26:06
>>358
今日では閉じタグの省略は、あまり歓迎されていないので注意。
360デフォルトの名無しさん:2009/12/01(火) 09:11:44
>>17 問題2
使用言語: 十進BASIC

FUNCTION f(n)
LET s=0
FOR i=1 TO n
IF MOD(i , 3 ) = 0 OR MOD(i , 5 ) = 0 THEN
LET s=s+i
END IF
NEXT I
LET f=s
END FUNCTION

PRINT f(500)
END

実行結果
58418
361デフォルトの名無しさん:2009/12/01(火) 09:14:09
>>17 問題5
使用言語: 十進BASIC

DIM d(5)
FOR i=1 TO 5
INPUT PROMPT "数を入力して下さい:":d(i)
NEXT I
PRINT "そのまま表示"
FOR i=1 TO 5
PRINT d(i);
NEXT I
PRINT
PRINT "逆順に表示"
FOR i=5 TO 1 STEP -1
PRINT d(i);
NEXT I
PRINT
END

実行結果
数を入力して下さい:10
数を入力して下さい:11
数を入力して下さい:12
数を入力して下さい:13
数を入力して下さい:14
そのまま表示
10 11 12 13 14
逆順に表示
14 13 12 11 10
362デフォルトの名無しさん:2009/12/01(火) 09:24:25
>>315
% Prolog 長くなるので中核部分のみ

現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :-
append(_自分の手札ならび,_相手の手札ならび,_手札として存在する札ならび),
決まり字判断(_手札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび).

決まり字判断([],_,[]) :- !.
決まり字判断([_手札|R1],_まだ読まれていない札ならび,[[_手札,Len,_決まり字]|R2])
:-
  先頭から共通部分の次の文字までで最長のもの(_手札,_まだ読まれていない札ならび,Len,_決まり字),
  決まり字判断(R1,_まだ読まれていない札ならび,R2).

先頭から共通部分の次の文字までで最長のもの(_手札,_まだ読まれていない札ならび,Len,_決まり字) :-
  findmax([Len,_決まり字],
    (  member(_札,_まだ読まれていない札ならび),
      \+(_札=_手札),
      先頭から共通部分の次の文字まで(1,_手札,_札,_決まり字,Len)),[Len,_決まり字]),!.
先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]).

先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-
  N2 is N + 1,
  先頭から共通部分の次の文字まで(R1,R2,R3,Len),!.
先頭から共通部分の次の文字まで(Len,[A|R1],_,[A],Len).
363デフォルトの名無しさん:2009/12/01(火) 09:31:39
>>362 書き直し
% Prolog 長くなるので中核部分のみ

現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :-
  append(_自分の手札ならび,_相手の手札ならび,_手札として存在する札ならび),
  決まり字判断(_手札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび).

決まり字判断([],_,[]) :- !.
決まり字判断([_手札|R1],_まだ読まれていない札ならび,[[_手札,_位置,_決まり字]|R2]) :-
  先頭から共通部分の次の文字までで最長のもの(_手札,_まだ読まれていない札ならび,_位置,_決まり字),
  決まり字判断(R1,_まだ読まれていない札ならび,R2).

先頭から共通部分の次の文字までで最長のもの(_手札,_まだ読まれていない札ならび,_位置,_決まり字) :-
  findmax([_位置,_決まり字],
    (  member(_札,_まだ読まれていない札ならび),
      \+(_札=_手札),
      先頭から共通部分の次の文字まで(1,_手札,_札,_決まり字,_位置)),[_位置,_決まり字]),!.
先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]).

先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-
  N2 is N + 1,
  先頭から共通部分の次の文字まで(R1,R2,R3,Len),!.
先頭から共通部分の次の文字まで(_位置,[A|R1],_,[A],_位置).
364デフォルトの名無しさん:2009/12/01(火) 09:34:16
>>45
使用言語: 十進BASIC

FUNCTION fact(n)
IF n=0 THEN
LET fact=0
ELSE
LET a=1
FOR i=1 TO n
LET a=a*i
NEXT I
LET fact=a
END IF
END FUNCTION
PRINT fact(15)
END

実行結果
1307674368000
365デフォルトの名無しさん:2009/12/01(火) 09:46:21
現在の決まり字の判断は次の読み札が読まれるまでの「間」だが、
一々すべて判断し直すとは考えにくい。
一枚読み終わった時点で一枚前の段階に微修正を加えてという方が、
自然だろうから書き直しが必要なようだ。
できたら http://nojiriko.asia/prolog/py2_47.html に書きます。ちょっと待って。
366デフォルトの名無しさん:2009/12/01(火) 14:52:51
>>207
使用言語: 十進BASIC

FUNCTION f$(a$,b$,n)
LET a$(n+1:n)=b$
LET f$=a$
END FUNCTION

PRINT f$("12345","AB",3)
END

実行結果
123AB45
367デフォルトの名無しさん:2009/12/01(火) 15:20:33
>>365
アーカイブの方見せてもらったけど、この手のやつは、親が(ここでは読み手ということになるけど)、サーバーにないと面白くない。
このプログラムだと、そこから、一字ずつ取ってくる。あるいは、競技者も
サーバーのモードで次の文字を待ち受けている。
そういう風に作れませんか?
368デフォルトの名無しさん:2009/12/01(火) 16:32:50
>>367
シミュレーションの域を越えるな。ほとんどゲーム。
面白いからやってみるけど。
その前にもうすこし、人間の思考に近づけなくちゃね。
369368:2009/12/01(火) 16:35:50
>>367
ここでやると邪魔になるから、この話はこっちでやるね。
http://pc11.2ch.net/test/read.cgi/mysv/1102662133/
370デフォルトの名無しさん:2009/12/01(火) 17:25:54
<A HREF="http://nojiriko.asia/prolog/index.html">このディレクトリの索引</A>
http://pc12.2ch.net/test/read.cgi/tech/1258158172/588
# [1] 授業単元:Cプログラミング演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10211.txt
#
# 課題(1)
# 4つの整数を入力し、その最大値、最小値、平均を求める関数を各自で定義し出力するプログラムを書け。
#
# 課題(2)
# 任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力するプログラムを書け。
# 例えば数字に123456789と入力し、桁数を5とした場合下5桁の5を出力する関数。
#
# 課題(3)
# 課題(1)の整数を配列形式で定義し、同様に最大値、最小値、平均値を出力するプログラムを書け。
# (余力があれば分散も考えてみよ)
371デフォルトの名無しさん:2009/12/01(火) 17:26:51
http://pc12.2ch.net/test/read.cgi/tech/1258158172/589
# [1]C言語入門
# [2] 3つの整数x,y,zを入力し、これらを引数として、大きい順に入れ替えて返す関数をつくれ。ただしポインタ変数を用いること。
# main関数は整数の入力と結果の表示のみにする。
#
372デフォルトの名無しさん:2009/12/01(火) 17:28:47
>>370 一行目は関係ありません。無視してください。
373デフォルトの名無しさん:2009/12/01(火) 17:41:44
>>370 課題(1)
% Prolog

'4つの整数を入力し、その最大値、最小値、平均を求める' :-
  '4つの整数を入力し、その最大値、最小値、平均を求める'(_最大値,_最小値,_平均値),
  write_formatted('最大値=%t,最小値=%t,平均値=%t\n',[_最大値,_最小値,_平均値]).

'4つの整数を入力し、その最大値、最小値、平均を求める'(_最大値,_最小値,_平均値) :-
  findall(N,(for(1,M,4),get_integer(N)),L),
  max(L,_最大値),
  min(L,_最小値),
  avg(L,_平均値).
374デフォルトの名無しさん:2009/12/01(火) 17:51:37
>>370 課題(1)
% Prolog それとも、入力は関数の引数として取るべきなのだろうか。
% Prologの場合、インタプリタだから、

'4つの整数を入力し、その最大値、最小値、平均を求める'(_整数1,_整数2,_整数3,_整数4,_最大値,_最小値,_平均値) :-
  integer(_整数1),integer(_整数2),integer(_整数3),integer(_整数4),
  max([_整数1,_整数2,_整数3,_整数4],_最大値),
  min([_整数1,_整数2,_整数3,_整数4],_最小値),
  avg([_整数1,_整数2,_整数3,_整数4],_平均値).

% とする方がいいのかもしれない。write_formatted/2で標準出力への印字はProlog本来のスタイルではない。

375デフォルトの名無しさん:2009/12/01(火) 18:06:02
>>370 課題(2)
% Prolog

任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力(_数字文字列,_桁数,_整数) :-
  atom(_数字文字列),
  sub_atom(_数字文字列,0,Len,0,_数字文字列),
  min([Len,_桁数],Min),
  sub_atom(_数字文字列,Len-Min,Min,_,_副文字列),
  atom_to_term(_副文字列,_整数,_),
  integer(_整数).
  
376デフォルトの名無しさん:2009/12/01(火) 18:07:55
>>370 課題(3)
% Prolog

'4つの整数を入力し、その最大値、最小値、平均を求める'([_整数1,_整数2,_整数3,_整数4],_最大値,_最小値,_平均値) :-
  integer(_整数1),integer(_整数2),integer(_整数3),integer(_整数4),
  max([_整数1,_整数2,_整数3,_整数4],_最大値),
  min([_整数1,_整数2,_整数3,_整数4],_最小値),
  avg([_整数1,_整数2,_整数3,_整数4],_平均値).
377デフォルトの名無しさん:2009/12/01(火) 18:08:56
>>370 課題(1)
使用言語: 十進BASIC

DEF max4(a,b,c,d)=MAX(MAX(a,b),MAX(c,d))
DEF min4(a,b,c,d)=MIN(MIN(a,b),MIN(c,d))
DEF avg4(a,b,c,d)=(a+b+c+d)/4
LET a=31
LET b=41
LET c=59
LET d=26
PRINT max4(a,b,c,d);min4(a,b,c,d);avg4(a,b,c,d)
END

実行結果
59 26 39.25
378デフォルトの名無しさん:2009/12/01(火) 18:22:11
>>370 課題(2)
使用言語: 十進BASIC

DEF f(n,d)=MOD(INT(n/10^(d-1)),10)

PRINT f(123456789,4)
END

実行結果
6
379デフォルトの名無しさん:2009/12/01(火) 18:24:48
>>371
% Prolog こういうプログラムはいかに簡単にソースを自動生成できるかに掛かっている。
% 自動生成が簡単なら、こういう定義は有力だと思う。

'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,X,Y,Z) :-
  X >= Y,Y >= Z.
'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,X,Z,Y) :-
  X >= Z,Z >= Y.
'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Y,X,Z) :-
  Y >= X,X >= Z.
'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Y,Z,X) :-
  Y >= Z,Z >= X.
'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Z,X,Y) :-
  Z >= X,X >= Y.
'3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Z,Y,X) :-
  Z >= Y,Y >= X.
380デフォルトの名無しさん:2009/12/01(火) 18:44:24
>>370 課題(1)
使用言語: J

max=:>./
min=:<./
avg=:+/%#

max 3 5 1 2
5
min 3 5 1 2
1
avg 3 5 1 2
2.75
381デフォルトの名無しさん:2009/12/01(火) 19:01:46
>>370 課題(2)
使用言語: J

f=:dyad def '".(<:y){|.":x'

123456789 f 3
7
382デフォルトの名無しさん:2009/12/01(火) 19:13:16
http://pc12.2ch.net/test/read.cgi/tech/1258158172/590
# [1]C言語実習
# [2] 覆面算 SEND+MORE=MONEYを解くプログラム(各字は数字を表す)
# 2進数から16進数の場合について、解がある時は一つずつ進数を明示した上で
# 表示。但しいずれの場合も最上位桁は0ではないものとする。
#
383デフォルトの名無しさん:2009/12/01(火) 19:16:16
>>382 訂正が出ていました。http://pc12.2ch.net/test/read.cgi/tech/1258158172/592http://pc12.2ch.net/test/read.cgi/tech/1258158172/590

# [1]C言語実習
# [2] 覆面算 SEND+MORE=MONEYを解くプログラム(各字は数字を表す)
# 2進数から8進数の場合について、解がある時は一つずつ進数を明示した上で
# 表示。但しいずれの場合も最上位桁は0ではないものとする。
#
384デフォルトの名無しさん:2009/12/01(火) 19:29:19
>>370 課題(2)
使用言語: Arc

(def f(n d) (mod (trunc (/ n (expt 10 (- d 1)))) 10))

arc> (f 123456789 2)
8
385デフォルトの名無しさん:2009/12/01(火) 23:10:33
http://pc12.2ch.net/test/read.cgi/tech/1258158172/608
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10219.txt
# [課題1-1] 線形探索
#  キーボードから1から30までの整数を入力し、配列 a に対して入力値の線形探索を行い、見つかった
# 結果をすべて表示するプログラムを作成しなさい.ただし、配列 a は1から30までの乱数が100個入って
# いるとする.また、入力の前に配列 a の内容を10個ずつ区切って表示しなさい.(疑似乱数を使用すること)
#
# [実行結果]
# 配列 a の内容はつぎの通りです.
# 26 12 24 24 28 6 11 24 4 17 ←疑似乱数なので左の例とない。
# 15 19 11 16 29 28 20 22 5 19
# 1 8 5 25 5 13 4 4 30 7
# 16 26 19 9 20 16 15 30 9 24
#       <中略>
# 8 30 28 26 8 17 12 23 16 21
# 16 2 14 28 28 22 9 23 20 11
# 21 5 14 27 25 10 7 27 11 21
# 29 18 20 26 14 28 12 25 21 28
# 1〜30までの整数を入力して下さい.
# 17
# a[9] は 17 と同じ値です.
# a[65] は 17 と同じ値です.
386デフォルトの名無しさん:2009/12/01(火) 23:14:37
http://pc12.2ch.net/test/read.cgi/tech/1258158172/610
# 問題
# A さんと B さんがゲームで対戦した.対戦は N 回にわたって行った.各回の対戦において,
# より高い点数を獲得した人がその回の勝者となる.
# すなわち,第 i 回目の対戦で
# A さんの点数が B さんの点数より大きければ第 i 回目は A さんの勝ち,
# B さんの点数が A さんの点数より大きければ B さんの勝ち,
# 同点の場合はどちらの勝ちにもならない.
# N 回の対戦における A さんと B さんの点数が与えられたとき,
# A さんと B さんがそれぞれ何回勝ったかを出力するプログラムを作成せよ.
387デフォルトの名無しさん:2009/12/01(火) 23:14:59
>>370 課題(2)
使用言語: Io

f:=method(n,d,n asString reverse at(d-1) asCharacter asNumber)

Io> f(12345,2)
==> 4
388デフォルトの名無しさん:2009/12/01(火) 23:27:30
http://pc12.2ch.net/test/read.cgi/tech/1258158172/604
# [1] 授業単元:
# 得点を比較するプログラムです
# ファイルから一行2整数づつ読み込み、先の方が大きいか、後の方が大きいか、
# カウントしていきます。ファイルを読み終わったらカウントした数字を出力します。
389デフォルトの名無しさん:2009/12/01(火) 23:40:01
http://pc12.2ch.net/test/read.cgi/tech/1258158172/611
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10222.txt
# 2桁の数を入力する(もし、2桁以外の整数を入力したら、再入力となる)を作成し、
# main関数では得られた2桁の値の1の位と10の位の値を掛け算した値を表示するプログラム
# 動作を確認するための適切なmain関数も作成すること。
390デフォルトの名無しさん:2009/12/01(火) 23:58:53
>>389
% Prolog

program :-
  2桁の数を入力する(N),
  M is ((N // 10) * ( N mod 10)),
  write_formatted('2桁の値 %t の1の位と10の位の値を掛け算した値は %t です
\n',[N,M]).

2桁の数を入力する(N) :-
  write('2桁の数を入力してください : '),
  get_integer(N),
  N >= 0,N =< 99.
2桁の数を入力する(N) :-
  write_formatted('2桁の数を得られませんでした\n再入力 : '),
  2桁の数を入力する(N).
391デフォルトの名無しさん:2009/12/02(水) 00:05:54
>>370 課題(2)
使用言語: Xtal

ix:001>f:fun(n,d){a:n.to_s.split("").to_a; return a[a.size-d].to_i;}
ix:002>f(123456789,7).p;
3
392デフォルトの名無しさん:2009/12/02(水) 00:18:02
>>389
使用言語: J

f=:*/@("."0@":)

f 29
18
f 87
56
393デフォルトの名無しさん:2009/12/02(水) 04:15:25
>>388 >>386もほとんど同種。 後出しでデータフォーマットは A : %d,B : %d らしい。
% Prolog
program :-
  user_parameters([_ファイル名]),
  get_split_lines(_ファイル名,[':',' ',','],L),
  二数のどちらが大きいか(L,0,0,_カウンタA,_カウンタB),
  write_formatted('A : %t,B : %t\n',[_カウンタA,_カウンタB]).

二数のどちらが大きいか([],_カウンタA,_カウンタB,_カウンタA,_カウンタB).
二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-
  _先の方 > _後の方,
  A2 is A + 1,
  二数のどちらが大きいか(R1,A2,B,_カウンタA,_カウンタB).
二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-
  _先の方 < _後の方,
  二数のどちらが大きいか(R1,A,B2,_カウンタA,_カウンタB).
二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-
  二数のどちらが大きいか(R1,A,B,_カウンタA,_カウンタB).
394デフォルトの名無しさん:2009/12/02(水) 05:40:49
>>114
使用言語: J

f=:dyad def '(([}.[:i.[:>:])//:~x i.y){x'


'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'CQ'
CDERSTUVWFNOPQ
'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'AZ'
ABCDERSTUVWFNOPQXYZ
'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'ZQ'
QXYZ
395デフォルトの名無しさん:2009/12/02(水) 05:41:30
>>389
;; Common Lisp
(defun mult()
(let ((num 0) n1 n10)
(do ()
((and (> num 9) (< num 100)))
(format t "2桁の数を入力してください~%> ")
(setf num (read)))
(setf n1 (mod num 10)
n10 (/ (- num n1) 10))
(format t "1の位と10の位の積 = ~A~%" (* n1 n10))))
396デフォルトの名無しさん:2009/12/02(水) 06:01:11
>>385
% Prolog

'キーボードから1から30までの整数を入力し、配列 a に対して入力値の線形探索を行い、見つかった結果をすべて表示する' :-
  'a は1から30までの乱数が100個入っている'(A),
  'a の内容を10個ずつ区切って表示'(A),
  repeat,
  write('探索する整数を入力してください(1~30) : '),
  get_integer(N),
  N >=1, N =< 30,!,
  append(L1,[N|L2],A),
  length(L1,_位置),
  write_formatted(' %t: %t\n',[N,_位置+1]),
  fail.
'キーボードから1から30までの整数を入力し、配列 a に対して入力値の線形探索を行い、見つかった結果をすべて表示する'.

'a は1から30までの乱数が100個入っている'(A) :-
  findall(M,(for(1,N,100),M is ((random mod 30) + 1),A).

'a の内容を10個ずつ区切って表示'(A) :-
  'N個組'(10,A,L),
  append(_,[L1|_],L),
  write_formatted('%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n',L1),
  fail.
'a の内容を10個ずつ区切って表示'(_).
397デフォルトの名無しさん:2009/12/02(水) 08:59:48
>>389
使用言語: Xtal

input:fun(){n:0;
while(true){
print("2桁の数字を入力:");
n=stdin.get_s(2).to_i;
if(10<=n && n<=100)break;
}
return n;
}

n:input();
println(%f"1の位と10の位の積は %d * %d = %d"(n%10,n/10,n/10*(n%10)));

実行結果
2桁の数字を入力:6
2桁の数字を入力:84
1の位と10の位の積は 4 * 8 = 32
398デフォルトの名無しさん:2009/12/02(水) 12:33:29
http://pc12.2ch.net/test/read.cgi/tech/1258320456/52
# 【 課題 】和歌について考察する問題。
# 歌 ... こぬ人を待つほの浦の夕凪はやくやもしほの身もこがれつつ (定家)
# これはかなり複雑なうたです。
# 人をまつとは「待つ」であり、「松」です。まつ帆だからです。松の姿に似た帆です。
# もちろん松は浦の背景でもあります。浦は夕凪ですから心は風を「待って」もいます。
# 風はありませんから、待ってもこぬ人なのです。風があの人なのかそれとも帆船なのか
# 微妙です。浦は「浦」であると同時に心の「裏」であり、あの人(風)の気持ちを「占」なふ、
# うらでもあります。
# 「焼くや」(やいているのだろうか)とは、恋に焦がれて身を焼いているのであり、
# やくやもしほとは藻塩(自分)が陽にあぶられ、渇き、焼かれ、煙でいぶされ、さらに
# 煮られ、再び乾かされというような、製塩法の愛の地獄絵であり、身もこがれという
# 言葉には「藻」がここでも含まれています。製塩の煙は夕凪の浦に実際に漂って
# いるのかもしれません。
# 以上のような、この歌に含まれる語とそれからくる連想をプログラムで表現しなさい。
399デフォルトの名無しさん:2009/12/02(水) 12:35:14
>>389
使用言語: Io

input:=method(
f:=File standardInput
while(true,
write("number: ")
n:=f readLine asNumber
if(10<=n and n<=100,break(n))
))
x:=input
writeln(x%10," * ",(x/10)floor," = ",x%10 * (x/10)floor)

実行結果
number: 34
4 * 3 = 12
400デフォルトの名無しさん:2009/12/02(水) 12:39:17
>>398
どうでもいいことだけど、
夕凪は ではなくて 夕凪に ではなかったかな。
401デフォルトの名無しさん:2009/12/02(水) 14:40:01
>>203
使用言語: Io

f:=method(a,b,
s:=""
for(i,0,(a size) min(b size)-1,
s=s .. (a at(i)asCharacter) .. (b at(i)asCharacter)
)
s
)

Io> f("12345","asd")
==> 1a2s3d
402デフォルトの名無しさん:2009/12/02(水) 15:06:13
>>258 >>332
使用言語: Io

showwaster:=method(a,b,a repeat("*"repeated(b)println))

Io> showwaster(6,6)
******
******
******
******
******
******
403デフォルトの名無しさん:2009/12/02(水) 15:29:21
http://pc12.2ch.net/test/read.cgi/tech/1258158172/632
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10226.txt
#
# 要素数がnoであるint型の配列v2の並びを逆順にしたものを配列v1に格納する関数
#    void intary_rcpy(int v1[], const int v2[],int no)
# を作成せよ
404デフォルトの名無しさん:2009/12/02(水) 19:05:50
>>403
% Prolog
% Prologには言語要素として配列がなく、リストを使う。リストでこの問題を表現しようと
% すると、noの扱いが難しい。無視すれば単なるreverseだが・・。

intary_rcpy(V1,V2,No) :-
  length(V1,No), /* あらかじめNo要素のリストを作っているがほとんど無意味 */
  intary_rcpy_1(V1,[],V2).

intary_rcpy_1(X,X,[]).
intary_rcpy_1(X,Y,[A|R]) :- intary_rcpy_1(X,[A|Y],R).
405デフォルトの名無しさん:2009/12/02(水) 19:22:55
http://pc12.2ch.net/test/read.cgi/tech/1258158172/638
# 【質問テンプレ】
# [1] 授業単元:大学の授業
# [2] 問題文(含コード&リンク):したにまとめて書きました
# 1:originalファイルから、シミュレーション範囲(数値)を読み取り、insertedファイルにコピー
# 2:absorbalファイルから、水分子の各原子の位置(座標)を読み取る
# 3:2の座標をランダムに発生させた数(ランダムに発生させた数の範囲は0以上originalファイルから読み込んだ範囲まで)だけ平行移動し、insertedファイルに書きたす
#   3は入力されたn回繰り返す
# 4:3の結果をinsertedファイルに書き足し、そのあとendを2回書きこみ終了
# 以下のコードではシミュレーション範囲は読み取れているが乱数発生時に反映されていない
# また、水分子の位置も毎回同じになっている→これを改善したい
406デフォルトの名無しさん:2009/12/02(水) 20:16:24
>>140
使用言語: Io

f:=method(d,
write(d,"(base 10)\n",("".. d)toBase(2),"(base 2)\n",
("".. d)toBase(36)uppercase,"(base 36)\n")
)

Io> f(20)
20(base 10)
10100(base 2)
K(base 36)
407デフォルトの名無しさん:2009/12/02(水) 21:45:29
>>398
% Prolog これは相当大変。木構造にでも纏めればいいのかな。

歌('こぬ人を待つほの浦の夕凪はやくやもしほの身もこがれつつ').

歌音('こぬひとをまつほのうらのゆうなぎにやくやもしおのみもこがれつつ').

音通(も,藻).
音通(_語,_部分的な語) :-
sub_atom(_語,_,_,_,_部分的な語),
\+(_部分的な語==[]).

連想(藻塩,地獄絵).
連想(藻塩,陽光).
連想(藻塩,干す).
連想(藻塩,焼く).
連想(藻塩,煙).
連想(藻塩,灰).
連想(藻塩,煮る).
連想(藻塩,製塩).
連想(製塩,潮汲み).
連想(潮汲み,海女).
連想(浦,海女).
連想(焼く,煙).
連想(凪,煙).
408デフォルトの名無しさん:2009/12/02(水) 21:47:16
>>397 つづき
連想(凪,煙).
連想(藻,塩).
連想(身,藻).
連想(焦がれ,恋).
連想(焦がれ,焦げる).
連想(焦がれ,木枯らし).
連想(木枯らし,寂しい).
連想(木枯らし,冬).
連想(焼く,焦がれ).
連想(焦がれ,人).
連想(藻,海).
連想(海,帆).
連想(凪,風).
連想(凪,浦).
連想(風,帆).
連想(松,帆).
連想(松,緑).
連想(浦,帆).
連想(占い,裏).
連想(裏,心).
連想(占い,恋).
連想(裏,背信).
409デフォルトの名無しさん:2009/12/03(木) 03:38:49
>>398 >>400 >>407
歌('こぬ人を待つほの浦の夕凪にやくやもしほの身もこがれつつ').

ですね。
410デフォルトの名無しさん:2009/12/03(木) 03:43:23
http://pc12.2ch.net/test/read.cgi/tech/1258158172/664
# [1] C言語
# [2] 問題文(含コード&リンク):
# 問題1 unsigned int型の引数を1つ持ち, その値を2進数で印字する戻
# 値のない関数, print_bin() を作成し, 動作を確認できるプロ
# グラムとして作成して rep07.c として提出せよ。
# ただし, putchar() 以外のライブラリ関数を使用してはなら
# ない。
411デフォルトの名無しさん:2009/12/03(木) 03:44:43
http://pc12.2ch.net/test/read.cgi/tech/1258158172/664
# 問題2 double型の配列とint型の引数を持ち, double型の戻値を持つ関
# 数を考える。第一引数のdouble型の配列の要素数が第二引数で
# 与えられるとして, 第一引数のdouble 型の配列に格納されてい
# る値のうち最大のものを戻値として返す関数 max_d_array() を
# 作成し, 動作確認できるプログラムとして作成して rep08.c と
# して提出せよ。
# ただし, max_d_array() 内部ではいかなる関数も呼んではな
# らず, 制御構文としては while()文, if()文, return文のみを
# 用いて実装しなければならない。do-while()文, for()文,
# switch-case文, goto文, 条件式(三項演算子?:)は使ってはなら
# ない。三項演算子以外の各種演算子と変数は自由に使って良い。
412デフォルトの名無しさん:2009/12/03(木) 03:45:49
http://pc12.2ch.net/test/read.cgi/tech/1258158172/664
# 問題3
# 標準入力からの入力に対して、アルファベットの文字を3文字ず
# らして標準出力に出力するシーザー暗号化プログラムを作成し
# て、rep09.c として提出せよ。具体的には, 小文字に対しては
# a -> d, b -> e, ..., w -> z, x -> a, y -> b, z -> c なる
# 変換である。もちろん大文字に関しても同様の変換処理をしな
# ければならない。
#
413デフォルトの名無しさん:2009/12/03(木) 04:24:46
>>410
% Prolog

print_bin(N) :- N < 2,write(N).
print_bin(N) :- N >= 2,N2 is J // 2,M is N mod 2,print_bin(N2),write(M).


二進数(J,Y,[J|Y]) :- J < 2.
二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X).
414デフォルトの名無しさん:2009/12/03(木) 04:31:30
>>413 >>410 ごめん。参考にした二進数/3が残ってしまった。それを消して。
% Prolog

print_bin(N) :- N < 2,write(N).
print_bin(N) :- N >= 2,N2 is J // 2,M is N mod 2,print_bin(N2),write(M).
415デフォルトの名無しさん:2009/12/03(木) 04:46:38
>>411
% Prolog
% リスト要素がNを越えた時にはfailにせず、そこまでの最大値を返すこととする。

max_d_list(L,N,Max) :- max_d_list([D|R],N,D,Max).

max_d_list([],_,Max,Max) :- !.
max_d_list(_,0,Max,Max) :- !.
max_d_list([D|R],N,Max1,Max) :-
  Max1 >= D,
  N1 is N - 1,
  max_d_list(R,N1,Max1,Max).
max_d_list([D|R],N,Max1,Max) :-
  Max1 < D,
  N1 is N - 1,
  max_d_list(R,N1,D,Max).
416デフォルトの名無しさん:2009/12/03(木) 05:23:47
>>412
% Prolog

アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).
アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z']).

program :- rep03.

rep03 :- get_char(Char), アルファベットならびの選択(Char,L),rep03(Char,L).

rep03(end_of_file,_).
rep03(Char,L) :-
  list_nth(N,L,Char),
  ならびの回転(左方向,3,L,L3),
  list_nth(N,L3,A),
  put_char(A),
  get_char(Char2),
  アルファベットならびの選択(Char2,L2),
  rep03(Char2,L2).

アルファベットならびの選択(Char,L) :- Char @>= a,Char @=< z,アルファベット(小文
字,L).
アルファベットならびの選択(Char,L) :- Char @>= 'A',Char @=< 'Z',アルファベット(
大文字,L).
417デフォルトの名無しさん:2009/12/03(木) 05:26:51
>>416 改行を失敗したので書き直し。

アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).
アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']).

program :- rep03.

rep03 :- get_char(Char), アルファベットならびの選択(Char,L),rep03(Char,L).

rep03(end_of_file,_).
rep03(Char,L) :-
  list_nth(N,L,Char),
  ならびの回転(左方向,3,L,L3),
  list_nth(N,L3,A),
  put_char(A),
  get_char(Char2),
  アルファベットならびの選択(Char2,L2),
  rep03(Char2,L2).

アルファベットならびの選択(Char,L) :- Char @>= a,Char @=< z,アルファベット(小文字,L).
アルファベットならびの選択(Char,L) :- Char @>= 'A',Char @=< 'Z',アルファベット(大文字,L).
418デフォルトの名無しさん:2009/12/03(木) 08:12:43
>>403
% Prolog
% Prologには言語要素として配列がなく、リストを使う。リストでこの問題を表現しようと
% これだとV2の要素数が越えた場合もV1はNoで打ち切りfailとはならない。
% もちろんNoに満たないときも成立する。

intary_rcpy(V1,V2,No) :-
  intary_rcpy_1(V1,[],V2,No).

intary_rcpy_1(X,X,_,0) :- !.
intary_rcpy_1(X,X,[],_).
intary_rcpy_1(X,Y,[A|R],No) :- No1 is No - 1,intary_rcpy_1(X,[A|Y],R,No1).
419デフォルトの名無しさん:2009/12/03(木) 10:36:51
http://pc12.2ch.net/test/read.cgi/tech/1258158172/667
# [1] 授業単元:C++実習
# [2] 問題文(含コード&リンク):分数クラス2
# 分数を扱うクラスを作成する。クラス名はBunsu。データメンバはint型でbunshiとbunboでpraivateとする。
# コンストラクタにより初期化をおこなう。初期値が指定されなかったときは省略時引数ででbunshi,bunboとも1で初期化すること。
# またBunsuクラスの振る舞いをテストする適切なmain関数も作成すること。1ファイルで作成してください。
#
# 作成する関数
# ・コンストラクタ
# ・演算子のオーバーロード(friend関数で作成すること)
# +, -, *, /, ==, != の演算子について多重定義を行なう。演算結果は約分する。
# >>と<<のオーバーロード(friend関数で作成すること)
# ・<<Bunsuクラスのオブジェクトをcoutで出力すると分子/分母の形式で出力する。
420デフォルトの名無しさん:2009/12/03(木) 11:32:39
http://pc12.2ch.net/test/read.cgi/tech/1197620454/543
# 問い1
# ・二次元配列arrayを使ってユーザーのログインページを作りなさい。
# ・ユーザー名、パスワードのエラーメッセージを表示させること
# 問い2
# 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること
# あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。
# ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。
# つまり残り7枠を登録さればよい。
# プログラムはfor、while、do whileのどれかひとつでよい。
# ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。
# デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。
# slnファイルの名前がフォルダ名と違っていますが気にしないでください。
# 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければ と思います。
421デフォルトの名無しさん:2009/12/03(木) 12:01:03
# [1] 授業単元:fortran
# [2] 問題文(含コード&リンク):配列を使わずに平均値、分散、標準偏差を表示せよ
# データ数nとn個のデータを入力し、平均値、分散、標準偏差を標示せよ。なおn≧5である。
# dimension、if、go toを使ってはいけない。
422デフォルトの名無しさん:2009/12/03(木) 13:41:06
>>421
% Prolog

配列を使わずに平均値、分散、標準偏差を表示 :-
  write('データ数 : '),
  get_integer(N),
  write_formatted('%個の数を1個1行で連続して入力してください : ',[N]),
  get_line(Line),
  atom_to_term(Line,X,_),
  配列を使わずに平均値、分散、標準偏差を表示(1,N,X,0,_,Z).
  _分散 is Z / N,
  _標準偏差 is sqrt(Z / (N - 1)),
write_formatted('平均値=%t,分散=%t,標準偏差=%t\n',[_平均値,_分散,_標準偏差]),!.

配列を使わずに平均値、分散、標準偏差を表示(M,N,X,S,_平均,0.0) :-
  M > N,_平均 is S / N,!.
配列を使わずに平均値、分散、標準偏差を表示(M,N,X,S1,_平均,Z) :-
  get_line(Line2),
  atom_to_term(line2,X2,_),
  S2 is S1 + X,
  M1 is M - 1,
  配列を使わずに平均値、分散、標準偏差を表示(M1,N,X2,S2,_平均,Z2),
  Z is (X - _平均) ^ 2 + Z2.
423デフォルトの名無しさん:2009/12/03(木) 14:14:40
http://pc12.2ch.net/test/read.cgi/tech/1258158172/669
# [1] 授業単元:プログラミング演習
# [2] 問題文
# 氏名をキーボードから入力させ、入力された文字列長を求めて画面に表示するプログラムを作りなさい。
# ただし、文字列長を求めるのに標準ライブラリ関数を使用しないこと。バッファオーバーランなどが発生する
# 不正な入力は行われないものとする。
424デフォルトの名無しさん:2009/12/03(木) 14:24:18
>>423
% Prolog

氏名をキーボードから入力させ、入力された文字列長を求めて画面に表示する :-
  write('氏名を入力してください : '),
  get_line(Line),
  atom_chars(Line,Chars),
  入力された文字列長を求める(Chars,N),
  write_formatted('入力された文字列長は %t です\n',[N]).

入力された文字列長を求める([],0).
入力された文字列長を求める([_|R],N) :-
  入力された文字列長を求める(R,N1),
  N is N1 + 1.
425デフォルトの名無しさん:2009/12/03(木) 16:11:18
>>420
% Prolog
ttylogin :-
  write('\nlogin: '),
  get_line(_ユーザー名),write('password: '),
  system('stty -echo raw'),
  get_char(X),put_char('*'),
  パスワードを得る(X,Password),
  ユーザ管理(_ユーザー名,Password,_診断),
  assertz(ログイン情報(_ユーザー名,Password,_診断)),
  シェル(_ユーザー名,_診断),
  ttylogin.

パスワードを得る('\r',[]) :- !.
パスワードを得る(C,[C|R]) :- get_char(C2),put_char('*'),パスワードを得る(C2,R).

ユーザ管理(_ユーザー名,Password,ok) :-
  concat_atom(Password,PasswordAtom),
  カエサル暗号(17,PasswordAtom,_暗号文),
  user_password(_ユーザ名,_暗号文),!.
ユーザ管理(_ユーザー名,Password,'UserPassword Error') :- user_passwork(_ユーザー名,_),!.
ユーザ管理(_ユーザー名,Password,S) :- concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!.

user_password(tama,'Jrslif').

シェル(_,S) :- \+(S==ok),!.
シェル(_,_) :- system.
426デフォルトの名無しさん:2009/12/03(木) 16:32:50
>>425
-rawに戻すの忘れた。
427デフォルトの名無しさん:2009/12/03(木) 16:48:44
http://pc12.2ch.net/test/read.cgi/tech/1197620454/434
# 問題文
# モンテカルロ法による円周率
# 1×1の正方形と1/4円を用いて円周率を求めるプログラムを作成したい
# なお、関係式、及び正方形と1/4円の図は以下の様になる
# π/4:1 = P : P + Q
# π = 4P/P + Q = 4P/N
# πは円周率、Pは円外にある点の数、NはP + Qとする
428デフォルトの名無しさん:2009/12/03(木) 17:55:54
>>427
% Prolog

モンテカルロ法により円周率を求める(N,Pi) :-
  モンテカルロ法により円周率を求める(0,N,0,H),
  P is H / N,
  Pi is 4 * Pi,
  write_formatted('Pi = %t\n',[Pi]).

モンテカルロ法により円周率を求める(M,N,H,H) :- M > N,!.
モンテカルロ法により円周率を求める(M,N,H1,H) :-
  X1 is (random mod 7717) / 7717,
  Y1 is (random mod 7717) / 7717,
  U is X * X + Y * Y,
  '1に収まっていればカウント'(U,H1,H2),
  M2 is M + 1,
  モンテカルロ法により円周率を求める(M,N,H2,H).

'1に収まっていればカウント'(U,H1,H2) :-
  U < 1,
  H2 is H1 + 1,!.
'1に収まっていればカウント'(U,H1,H1).
429デフォルトの名無しさん:2009/12/03(木) 18:19:36
http://pc12.2ch.net/test/read.cgi/tech/1258158172/671
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 関数としてy=sinx,y'=sinx+xcosxを取り上げ、f'(x)=sinx+xcosxの値を数値微分に
# りよる方法から計算するプログラムを作成し
# 解析値と比較してみよ。ただしh=0.1とし、0≦x≦πとせよ。
#
430デフォルトの名無しさん:2009/12/03(木) 18:36:18
>>429
揚げては見たが何をやりたいのかさっぱりわからん。
431デフォルトの名無しさん:2009/12/03(木) 19:21:57
>>420
% Prolog 配列はまったく使っていないけれど、Prologとして自然な表現で。
adduser :-
  write('username : '),get_line(_ユーザー名),
  rawmode,write('password : '),get_char(Char),put_char(*),
  パスワードを得る(Char,Password),norawmode,
  write('Retype Password : '),get_char(Char2),put_char(*),
  パスワードを得る(Char2,Password2),
  パスワードは一致する(Password,Password2),
  定義枠の限界を越えていない,
  ユーザー登録(_ユーザー名,Password),

パスワードは一致する(A,A) :- !.
パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail.

ユーザー登録(_ユーザー名,Password) :-
  concat_atom(Password,PasswordAtom),
  カエサル暗号(17,PasswordAtom,PasswordAtom2),
  assertz(user_password(_ユーザ-名,PasswordAtom2)).

定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!.
定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail.

定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F).
432デフォルトの名無しさん:2009/12/04(金) 04:12:05
http://pc12.2ch.net/test/read.cgi/tech/1248012902/565
# 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/854.txt
# メッセージの流れる順番は次のようになる。
# 学生オブジェクト(yamada)から
# 1)教員への成績問い合わせメッセージ(askScore("0001"))
# 教員オブジェクト(endo)から
# 2)成績問い合わせのメッセージ(searchScore("0001"))
# 事務室オブジェクト(defaultOffice)から
# 3)得点または-1を返答
# 教員オブジェクト(endo)から
# 4)得点または-1を返答
#
# この順番でメッセージを交換し学生オブジェクトが教員オブジェクトを経由して
# 自分の成績を知ることができるようにしなさい。
433デフォルトの名無しさん:2009/12/04(金) 04:37:35
434デフォルトの名無しさん:2009/12/04(金) 04:41:26
http://pc12.2ch.net/test/read.cgi/tech/1258158172/677
# [1] 授業単元:プログラミング演習
# [2] 1.サンプルプログラムを参考に乱数によって生成した20個の数字を配列に入れ、バブルソートによって小さい順に表示するプログラムを作成せよ。
# 2.サンプルプログラムを参考乱数によって生成した20個の数字を配列に入れ、バブルソートによって大きいものから順に表示するプログラムを作成せよ。
# 3.キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を
# 小さい順に表示するプログラムを作成せよ。数字は10個入力したらプログラムは終了するようにすること.
# 4.0から1までのdouble型の数字を20個乱数によって生成し、小さい順に表示するプログラムを作成せよ。
# 5.以下の英単語を辞書順に(アルファベット順に)ソートによって並べ替えて表示するプログラムを作成せよ。すべての4文字の単語であることを利用してもよい。
#
# mane, malt, mama, mark, mare, maid, made, mach, many, mess, meat, neat, like, lime, limb
#
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10230.txt
#
435デフォルトの名無しさん:2009/12/04(金) 04:46:12
http://pc12.2ch.net/test/read.cgi/tech/1258158172/688
# [1] 授業単元:
# アルゴリズムとプログラミング
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10234.txt
#
# リストを用いたスタックの基本操作
#
# リストsを用いてスタックの基本操作を行うプログラムを実現したい。
# 図のプログラムを完成させよ。
# ただし下記の条件を守れ。
#
# 1: data.datからgetc()を用いてアルファベットを一文字ずつ読み込み、スタックsにpush-downする。
#
# 2: スタックの内容を表示する関数 print_stack_list(s)は分割しているので、分割コンパイルにより
# 実行ファイルを作れ。
436デフォルトの名無しさん:2009/12/04(金) 04:50:28
>>433
その後、
>684 名前:デフォルトの名無しさん :2009/12/04(金) 00:22:13
> >>683
> > y=sinx,y'=sinx+xcosx
> 2つの関数じゃないなら、これって矛盾してないかい?
>685 名前:671 :2009/12/04(金) 00:31:41
> >>684
> y'はただyの式を微分しただけなので特に矛盾はないと思うんですが
> ただ正直、私も題意を理解できなかったのでここに書かせてもらいました…
>686 名前:デフォルトの名無しさん :2009/12/04(金) 00:44:23
> y=xsinxの間違いじゃないんですか
となっている。
437デフォルトの名無しさん:2009/12/04(金) 05:20:53
>>434
% Prolog

乱数によって生成した20個の数字を配列に入れ、バブルソートによって小さい順に表 示 :-
  findall(M,(for(1,N,20),M is random),整数ならび),
  バブルソートによって小さい順に(_整数ならび,_整列した整数ならび),
  writeln(_整列した整数ならび).

バブルソートによって小さい順に(L1,L2) :-
  整列順が崩れるまで(L1,L3),
  バブルソートによって小さい順に(L3,L2).
バブルソートによって小さい順に(L,L).

整列順が崩れるまで([A,B|R],[B,A|R]) :-
  A > B,!.
整列順が崩れるまで([A,B|R1],[A|R2]) :-
  A =< B,
  整列順が崩れるまで([B|R1],R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
writeln([]).
writeln([A|R]) :- write_formatted('%t\n',[A]),writeln(R).

438デフォルトの名無しさん:2009/12/04(金) 05:28:15
>>434
% Prolog

乱数によって生成した20個の数字を配列に入れ、バブルソートによって大きい順に表示 :-
  findall(M,(for(1,N,20),M is random),整数ならび),
  バブルソートによって大きい順に(_整数ならび,_整列した整数ならび),
  writeln(_整列した整数ならび).

バブルソートによって大きい順に(L1,L2) :-
  大きい順の整列が崩れるまで(L1,L3),
  バブルソートによって大きい順に(L3,L2).
バブルソートによって大きい順に(L,L).

大きい順の整列が崩れるまで([A,B|R],[B,A|R]) :-
  A < B,!.
大きい順の整列が崩れるまで([A,B|R1],[A|R2]) :-
  A >= B,
  大きい順の整列が崩れるまで([B|R1],R2).
439デフォルトの名無しさん:2009/12/04(金) 06:07:11
>>434
% Prolog
キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を小さい順に表示する :-
  キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を小さい順に表示する(10,[]).

キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を小さい順に表示する(0,_) :- !.
キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N,_現在まで整列されたならび) :-
  get_integer(_整数),
  小さい順整列ならびに挿入(_整数,_現在まで整列されたならび,_整列し直したならび),
  concat_atom(_整列し直したならび,' ',_整列文字列),
  write_formatted('%t\n',[_整列文字列]),
  N1 is N - 1,
  キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N1,_整列し直したならび).

小さい順整列ならびに挿入(N,[],[N]) :- !.
小さい順整列ならびに挿入(N,[A|R],[N,A|R]) :- N < A,!.
小さい順整列ならびに挿入(N,[A|R],[A|R]) :- N >= A,小さい順整列ならびに挿入(N,R1,R2).
440デフォルトの名無しさん:2009/12/04(金) 06:14:27
>>434
% Prolog

0から1までのdouble型の数字を20個乱数によって生成し、小さい順に表示する :-
  findall(F,(for(1,N,20),F is (random mod 7717) / 7717),L1),
  バブルソートによって小さい順に(L1,L2),
  writeln(L2).
441デフォルトの名無しさん:2009/12/04(金) 06:29:37
>>439 第三節訂正
% R1 R2 であるべきところが R R になっていた。

小さい順整列ならびに挿入(N,[],[N]) :- !.
小さい順整列ならびに挿入(N,[A|R],[N,A|R]) :- N < A,!.
小さい順整列ならびに挿入(N,[A|R1],[A|R2]) :- N >= A,小さい順整列ならびに挿入(N,R1,R2).
442デフォルトの名無しさん:2009/12/04(金) 06:39:07
>>434
% Prolog

英単語ならび([mane, malt, mama, mark, mare, maid, made, mach, many, mess, meat, neat, like, lime, limb]).

'英単語を辞書順に(アルファベット順に)ソートによって並べ替えて表示する' :-
  英単語ならび(L1),
  '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'(L1,[],L2),
  writeln(L2).

'英単語を辞書順に(アルファベット順に)ソートによって並べ替える'([],L,L) :- !.
'英単語を辞書順に(アルファベット順に)ソートによって並べ替える'([_単語|R],L1,L2) :-
  小さい順整列ならびに文字列挿入(_単語,L1,L2),
  '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'(R,L2,L).

小さい順整列ならびに文字列挿入(_文字列,[],[_文字列]) :- !.
小さい順整列ならびに文字列挿入(_文字列,[A|R],[_文字列,A|R]) :- _文字列 @< A,!.
小さい順整列ならびに文字列挿入(_文字列,[A|R1],[A|R2]) :- _文字列 @>= A,小さい順整列ならびに文字列挿入(_文字列,R1,R2).
443デフォルトの名無しさん:2009/12/04(金) 06:49:42
http://pc11.2ch.net/test/read.cgi/db/1081818145/493
#
# 同一テーブル構成のTBL-A、TBL-Bがの2つがあります。
# テーブルレイアウトは、
# 基準日   int(8)
# 社員番号  int(10)
# 構成     int(10)
# だとします。
#
# TBL-AとTBL-Bを比較し、以下のことをSQLでやりたいんですが、何か関数等あるんでしょうか?
#
# (1)社員番号がTBL-Aに在ってTBL-Bに無い場合-->TBL-Bに該当レコード追加
#
# (2)社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以降の場合-->TBL-Bの該当レコードをTBL-Aで上書き
#
# (3)社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以前の場合-->何もしない
#
# (4)社員番号がTBL-Bに在ってTBL-Aに無い場合-->何もしない
444デフォルトの名無しさん:2009/12/04(金) 07:24:49
>>435
% Prolog

stack(s,[]).

リストsを用いてスタックの基本操作を行う :-
  open('data.dat',read,Instrem),
  get_char(Instream,C),
  stack(s,L1),
  リストsを用いてスタックの基本操作を行う(Instream,C,L1,L2),
  close(Instream),
  save_stack(s,L2).

リストsを用いてスタックの基本操作を行う(Instream,end_of_file,L,L) :- !.
リストsを用いてスタックの基本操作を行う(Instream,C,L1,L2) :-
  push(C,L1,L3),
  get_char(Instream,C2),
  リストsを用いてスタックの基本操作を行う(Instream,C2,L3,L2).

push(A,L,[A|L]).

save_stack(Stack,L) :- retract(stack(Stack,_)),assertz(stack(Stack,L)).
445デフォルトの名無しさん:2009/12/04(金) 09:00:29
>>443
% Prolog (1)
社員構成管理(_社員番号) :- '社員番号がTBL-Aに在ってTBL-Bに無い場合-->TBL-Bに該当レコード追加'(_社員番号),!.
社員構成管理(_社員番号) :- '社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以降の場合-->TBL-Bの該当レコードをTBL-Aで上書き'(_社員番号),!.
社員構成管理(_社員番号) :- '社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以前の場合-->何もしない'(_社員番号),!.
社員構成管理(_社員番号) :- '社員番号がTBL-Bに在ってTBL-Aに無い場合-->何もしない'(_社員番号),!.
446デフォルトの名無しさん:2009/12/04(金) 09:03:51
>>443
% prolog (2)

'社員番号がTBL-Aに在ってTBL-Bに無い場合-->TBL-Bに該当レコード追加'(_社員番号) :-
  'TBL-A'(_基準日,_社員番号,_構成),
  \+('TBL-B'(_,_社員番号,_)),
  assertz('TBL-B'(_基準日,_社員番号,_構成)).
'社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以降の場合-->TBL-Bの該当レコードをTBL-Aで上書き'(_社員番号) :-
  'TBL-A'(_基準日A,_社員番号,_構成A),
  'TBL-B'(_基準日B,_社員番号,_構成B),
  _基準日A @> _基準日B,
  retract('TBL-B'(_基準日B,_社員番号,_構成B)),
  assertz('TBL-B'(_基準日A,_社員番号,_構成A)).
'社員番号が両方に存在し、TBL-Aの基準日がTBL-Bの基準日以前の場合-->何もしない'(_社員番号) :-
  'TBL-A'(_基準日A,_社員番号,_構成A),
  'TBL-B'(_基準日B,_社員番号,_構成B),
  _基準日A @=< _基準日B.
'社員番号がTBL-Bに在ってTBL-Aに無い場合-->何もしない'(_社員番号) :-
  'TBL-B'(_,_社員番号,_),
  \+('TBL-A'(_,_社員番号,_)).
447デフォルトの名無しさん:2009/12/04(金) 09:33:57
>>445 >>446
Prolog以外の言語ではまずお目にかかれない構成のプログラムですね。
仕様の条件に矛盾がないことが絶対の条件です。そこをパスしていれば
仕様の文言にそれぞれ集中できますから、書きやすくなりますね。
448デフォルトの名無しさん:2009/12/04(金) 10:32:31
>>436
例えばラグランジェ法で数値微分するプログラムを書いて、
Xを0.1刻みで値を求めて、sin(X) + X * cos(X) のそれぞれの値と
比較するという意味でしょう。
449デフォルトの名無しさん:2009/12/04(金) 13:11:39
http://pc12.2ch.net/test/read.cgi/tech/1258158172/689
# [1] 授業単元:
# プログラミング基礎実習
# [2] 問題文(含コード&リンク):
# n個の中からr個を取り出すときの組合わせの数nCrを求める関数を作成せよ。
# ただし、再帰は使わないこと!(繰返し文を使う)
# エラー処理(n<1、r<1の場合、n<rの場合)も考える。
#
450デフォルトの名無しさん:2009/12/04(金) 13:20:33
>>449
% Prolog 前にありましたね。ちょっとインチキ臭いコードです。

nCr(N,R,X) :-
  Y is N-R+1,
  findall(N1,for(N,N1,Y),L1),
  findall(N2,for(R,N2,1),L2),
  concat_atom(L1,'*',S1),
  concat_atom(L2,'*',S2),
  atom_to_term(S1,Term1,_),
  atom_to_term(S2,Term2,_),
  X is Term1 // Term2.
451デフォルトの名無しさん:2009/12/04(金) 13:39:26
http://pc12.2ch.net/test/read.cgi/tech/1258158172/690
# [1] 授業単元:
# プログラミング基礎
# [2] 問題文(含コード&リンク):
# キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求めるプログラムを作成せよ。
# ただし、総和を求める部分はmain関数と別の関数を作ること。
#
452デフォルトの名無しさん:2009/12/04(金) 13:41:56
>>451
% Prolog

program :-
  user_paramebers([A]),
  atom_to_term(A,N,_),
  write('一行にカンマ区切りで%t個、%t行の浮動小数点数を入力してください(入力終了はctrl-dを入力)\n',[N,N]),
  'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和),
  write_formatted('総和は%tです\n',[_総和]).

'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和) :-
  get_split_lines(user_input,[','],L),
  findsum(S1,(member(Line,L),findsum(Line,S1)),_総和).
453デフォルトの名無しさん:2009/12/04(金) 13:43:51
>>452 user_parmebersになってしまった。入力データ数のチェックをして
% いないからかなりの手抜きです。

program :-
  user_parameters([A]),
  atom_to_term(A,N,_),
  write('一行にカンマ区切りで%t個、%t行の浮動小数点数を入力してください(入力終了はctrl-dを入力)\n',[N,N]),
  'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和),
  write_formatted('総和は%tです\n',[_総和]).

'キーボードから実数配列a[N][N]の各要素に値を入力し、すべての要素の総和を求める'(_総和) :-
  get_split_lines(user_input,[','],L),
  findsum(S1,(member(Line,L),findsum(Line,S1)),_総和).
454デフォルトの名無しさん:2009/12/04(金) 13:47:49
>>453 さらに間違い。

4行目は writeになっていますが、write_formatted/2です。
455デフォルトの名無しさん:2009/12/04(金) 17:50:30
456デフォルトの名無しさん:2009/12/04(金) 19:00:11
>>432
% Prologはオブジェクト指向言語ではないので、よい答えは作れません。現実に
% Prologでこのようなことが起こるためにはそれぞれがサーバーとして起動していて、
%%%%%%%%%%% 山田 サーバー (この場合はクライアントとして) %%%%%%%%%%%%%%%%
先生(国語,遠藤).

先生に成績を問い合わせる(国語,_応答) :-
先生(国語,_先生),
_先生 :: 国語の成績は何点でしょうか(山田,_応答).

%%%%%%%%%%% 遠藤 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
国語の成績は何点でしょうか(_生徒,_応答) :-
事務局 :: 係はだれですか(成績問い合わせ,_係),
_係 :: 生徒の成績は何点でしょうか(遠藤,_生徒,国語,_応答).

%%%%%%%%%% 事務局 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
係はだれですか(成績問い合わせ,defaultOffice).

%%%%%%%%%%% defaultOffice サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%
生徒の成績は何点でしょうか(_先生,_生徒,_科目,_応答) :-
成績簿(_生徒,_科目,_成績),
concat_atom([_生徒,の,_科目,の成績は,_成績,点です],_応答).

成績簿(yamada,国語,78).
成績簿(yamada,数学,57).

のようなメッセージ交換が行われる必要があります。
457デフォルトの名無しさん:2009/12/04(金) 19:07:02
>>432 書き直し
%%%%%%%%%%% 山田 サーバー (この場合はクライアントとして)%%%%%%%%%%%%%%%%%%%%%
先生(国語,遠藤).

先生に成績を問い合わせる(国語,_応答) :-
  先生(国語,_先生),
  _先生 :: 国語の成績は何点でしょうか(山田,_応答).

メッセージ受信(_宛先,_メッセージ) :- assertz(メッセージ(_宛先,_メッセージ)).
%%%%%%%%%%% 遠藤 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
国語の成績は何点でしょうか(_生徒,_応答) :-
  事務局 :: 係はだれですか(成績問い合わせ,_係),
  _係 :: 生徒の成績は何点でしょうか(遠藤,_生徒,国語,_応答).

%%%%%%%%%% 事務局 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
係はだれですか(成績問い合わせ,defaultOffice).

%%%%%%%%%%% defaultOffice サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%
生徒の成績は何点でしょうか(_先生,_生徒,_科目,_応答) :-
  成績簿(_生徒,_科目,_成績),
  concat_atom([_生徒,の,_科目,の成績は,_成績,点です],_応答).

成績簿(yamada,国語,78).
成績簿(yamada,数学,57).
458デフォルトの名無しさん:2009/12/04(金) 19:09:16
>>457 www
成績簿(山田,国語,78).
成績簿(山田,数学,57).
ですね。
459デフォルトの名無しさん:2009/12/04(金) 20:30:27
http://pc11.2ch.net/test/read.cgi/db/1252492296/307
#
# 業務テーブル G_info
# 業務ID | 業務名 |
# G0001 | ○○設計 |
# G0002 | ××調査 |
# G0003 | ○△設計 |
#
# 業務担当テーブル G_charge
# 業務ID | 役割 | 社員ID
# G0001 | 管理 | P101
# G0001 | 検査 | P103
# G0001 | 設計 | P105
# G0002 | 管理 | P102
# G0002 | 検査 | P103
# G0002 | 設計 | P106
# G0003 | 管理 | P101
# G0003 | 検査 | P104
# G0003 | 設計 | P107
#
# こんなテーブル構成だったとして、
# 設計 = P101 かつ 検査 = P103 の担当者を持つ業務名を取り出すにはどのようにす
# れば良いのでしょうか?
460デフォルトの名無しさん:2009/12/04(金) 20:37:39
>>459
% Prolog

?- 業務テーブル(A,X),業務担当テーブル(A,設計,'P101'),業務テーブル(A,検査,'P103').
461デフォルトの名無しさん:2009/12/05(土) 04:20:21
>>460 まちがってる!

?- 業務テーブル(A,X),業務担当テーブル(A,設計,'P101'),業務担当テーブル(A,検査,'P103').
462デフォルトの名無しさん:2009/12/05(土) 04:40:17
% Prolog おまけ

'>>459のテーブル表示ファイルからテーブルを抜き取り述語として定義する'(_ファイル) :-
  get_split_lines(_ファイル,[' ','|'],Lines),
  一つ以上のテーブルを述語として定義(Lines).

一つ以上のテーブルを述語として定義(Lines) :-
  append(_,[[A,B]|L2],Lines),
  append([_|L3],[''|L4],L2),
  sub_atom(A,_,_,_,_テーブル名,テーブル,_,_,_,_),
  テーブルを述語として定義(_テーブル名,L3),
  一つ以上のテーブルを述語として定義(L4).
一つ以上のテーブルを述語として定義(_).

テーブルを述語として定義(_テーブル,L) :-
  member(L1,L),
  P =.. [_テーブル|L1],
  assertz(P),
  fail.
テーブルを述語として定義(_,_).
463デフォルトの名無しさん:2009/12/05(土) 05:27:18
http://pc12.2ch.net/test/read.cgi/tech/1235561034/658
# 以下を表示するプログラムを示せ。
#
# -1
# ---3
# ------6
# ----------10
# ---------------15
# ---------------------21
# -------------------------25
# ---------------------------27
# ---------------------------27
# -------------------------25
# ---------------------21
# ---------------15
# ----------10
# ------6
# ---3
# -1
464デフォルトの名無しさん:2009/12/05(土) 07:30:52
>>463
% Prolog

pro_658(Max,M) :- f1(0,Max,M,0).

f1(Max,Max,M,V) :- f2(Max,M,V).
f1(N,Max,M,V) :-
  N =< Max,
  V2 is V + N + 1,
  'print-'(V2),
  N2 is N + 1,
  f1(N2,Max,M,V2),
  'print-'(V2).

f2(N,M,_) :- N =< M,!.
f2(N,M,V) :-
  V2 is V + N - M,
  'print-'(V2),
  N2 is N - M,
  f2(N2,M,V2),
  'print-'(V2).

'print-'(V) :- for(1,N,V),write(-),N=V,write_formatted('%t\n',[V]).
465デフォルトの名無しさん:2009/12/05(土) 09:53:55
>>463 訂正
f1の定義の三行目は
  N < Max,
にしないと、バックトラックしてきた場合に終わらなくなりますね。
466デフォルトの名無しさん:2009/12/05(土) 15:00:56
http://pc12.2ch.net/test/read.cgi/tech/1248012902/570
# 10個の値の最大値を求めるプログラム
# 10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示するプログラムを作成しなさいというものです。
# 実行結果の例は以下のような感じです。
# 1人目の身長(cm)を入力してください:(入力待ち)
# 2人目の身長(cm)を入力してください:(入力待ち)
# 略
# 10人目の身長(cm)を入力してください:(入力待ち)
# この中で一番身長が高い人は○○cmです。
# (注意)
# 1最大値を記憶する変数を用意し、0を代入しておく。
# 2for文を用いて以下の処理を十回繰り返す。
# 2.1「?人目の身長(cm)を入力してください」と表示する
# 2.2キーボードから値を入力する。
# 2.3入力値が記憶している最大値より大きいかどうかをif文を用いて比較する。
# 2.3.1大きいならば、その値を最大値として代入する。
# 3 結果を表示する
467デフォルトの名無しさん:2009/12/05(土) 16:15:54
>>466
% Prolog
'10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示' :-
  write_formatted('%人目の身長を入力してください : ',[1]),
  get_integer(I),
  '10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(1,I,M,X),
  write_formatted('最も高かった身長は%tcmです\n',[X]).

'10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(10,I,M,M) :-
  I =< M,!.
'10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(10,I,M,I) :-
  I > M,!.
'10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(N,I,M,X) :-
  I =< M,
  N2 is N + 1,
  write_formatted('%人目の身長を入力してください : ',[N2]),
  get_integer(I2),
  '10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(N2,I2,M,X).
'10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(N,I,M,X) :-
  I > M,
  N2 is N + 1,
  write_formatted('%人目の身長を入力してください : ',[N2]),
  get_integer(I2),
  '10人の身長データを順にcm単位で入力したとき、一番大きな身長は何cmかを表示'(N2,I2,I,X).
468デフォルトの名無しさん:2009/12/05(土) 17:18:59
http://pc11.2ch.net/test/read.cgi/db/1252492296/314
# ユーザーが複数の資格を持っているというありがちなテーブル構成があるのですが、
# 「資格1または資格2を持っているユーザー」の検索はできるのですが、
# 「資格1と資格2」を両方持っているユーザー」の検索ができません。
#
# テーブル構成はこんな感じです。
#
# ユーザーテーブル
# [ユーザーID、名前]
# 001,山田
# 002,鈴木
#
# 資格テーブル
# [ユーザーID、資格]
# 001,資格1
# 001,資格2
# 002,資格1
469デフォルトの名無しさん:2009/12/05(土) 18:22:28
>>468
% Prolog

ユーザーID('001',山田).
ユーザーID('002',鈴木).

資格('001',資格1).
資格('001',資格2).
資格('002',資格1).

'「資格1と資格2」を両方持っているユーザー'(X) :-
  setof(_名前,(資格(_ユーザーID,資格1),資格(_ユーザーID,資格2),ユーザーID(_ユーザーID,_名前)),X).
470デフォルトの名無しさん:2009/12/06(日) 00:27:54
>>410
使用言語: 十進BASIC

SUB print_bin(n)
LET b$=""
IF n=0 THEN LET b$="0"
DO WHILE(n>0)
LET b$=STR$(MOD(n,2))&b$
LET n=INT(n/2)
LOOP
PRINT b$
END SUB
CALL print_bin(123456789)
PRINT BSTR$(123456789,2) !組込みの関数の場合
END
実行結果
111010110111100110100010101
111010110111100110100010101
471デフォルトの名無しさん:2009/12/06(日) 01:30:15
>>412
使用言語: 十進BASIC

LET t$="abcdefghijklmnopqrstuvvxyzabcABCDEFGHIJKLMNOPQRSTUVWXYZABC"
INPUT a$
LET s$=""
FOR i=1 TO LEN(a$)
LET b=POS(t$,a$(i:i))+3
LET s$=s$&t$(b:b)
NEXT I
PRINT s$
END

実行結果
? aBcDeFgHiJkLmNoPqRsTuVwXyZ
dEfGhIjKlMnOpQrStUvWxYcAbC
472デフォルトの名無しさん:2009/12/06(日) 02:44:58
>>412
使用言語: J

c=:65 97+/i.26
f=:monad def '(a.i.y){(3|."1 c{a.)c}a.'

f 'AbcXyz'
DefAbc
473デフォルトの名無しさん:2009/12/06(日) 04:36:21
http://pc12.2ch.net/test/read.cgi/tech/1258158172/709
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10227.txt
#
# [課題1]
#  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに
# 配列aのデータを基本選択法によって昇順に整列し、整列後の配列a内容を表示させなさい.
# [課題2]
#  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに
# 配列aのデータを基本選択法によって降順に整列し、整列後の配列a内容を表示させなさい.
474デフォルトの名無しさん:2009/12/06(日) 05:20:20
>>410
使用言語: Io

g:=method(n,if(n<2,write(n),g((n/2)floor);write(n%2)))
print_bin:=method(n,g(n);writeln)

Io> print_bin(123456789)
111010110111100110100010101
==> nil
475デフォルトの名無しさん:2009/12/06(日) 06:59:24
>>17 問題1
使用言語: tcl

proc f {n} {string range " abcdefghijklmnopqrstuvwxyz" 1 $n}

% f 30
abcdefghijklmnopqrstuvwxyz
% f 7
abcdefg
476デフォルトの名無しさん:2009/12/06(日) 08:06:40
>>17 問題2
使用言語: tcl

proc f {n} {
set s 0
for {set i 1} {$i<=$n} {incr i} {
if {[expr $i%3==0||$i%5==0]} {incr s $i}
}
puts $s
}

% f 10
33
% f 100
2418
477デフォルトの名無しさん:2009/12/06(日) 09:08:00
>>466
使用言語: 十進BASIC

LET h=0
FOR i=1 TO 10
INPUT PROMPT STR$(i)&"人目の身長(cm)を入力してください:":a
IF a>h THEN LET h=a
NEXT I
PRINT USING"この中で一番身長が高い人は###cmです。": h
END

実行結果
1人目の身長(cm)を入力してください:190
2人目の身長(cm)を入力してください:180
3人目の身長(cm)を入力してください:170
4人目の身長(cm)を入力してください:165
5人目の身長(cm)を入力してください:155
6人目の身長(cm)を入力してください:187
7人目の身長(cm)を入力してください:147
8人目の身長(cm)を入力してください:152
9人目の身長(cm)を入力してください:166
10人目の身長(cm)を入力してください:174
この中で一番身長が高い人は190cmです。
478デフォルトの名無しさん:2009/12/06(日) 09:43:40
>>17 問題1
使用言語: UWSC

print f(9)
print f(30)

FUNCTION f(n)
RESULT = copy("abcdefghijklmnopqrstuvwxyz",1,n)
FEND

実行結果
abcdefghi
abcdefghijklmnopqrstuvwxyz
479デフォルトの名無しさん:2009/12/06(日) 12:37:56
123456
12345
1234
123
12
1
480デフォルトの名無しさん:2009/12/06(日) 12:45:48
>>47
あれ?なんか書き込みに失敗したのでもう一度。
使用言語: 十進BASIC

SUB f(s$)
LET b=LEN(s$)
FOR i=1 TO b
PRINT s$
LET s$=s$(1:b-i)
NEXT I
END SUB
CALL f("123456")
END

実行結果
123456
12345
1234
123
12
1
481デフォルトの名無しさん:2009/12/06(日) 16:23:31
>>17 問題1
使用言語: なでしこ

●f(n)
「abcdefghijklmnopqrstuvwxyz」の1から n 文字抜き出して表示。

f(5)


実行結果
abcde
482デフォルトの名無しさん:2009/12/06(日) 17:42:45
>>481
いいねぇ。
483デフォルトの名無しさん:2009/12/06(日) 17:52:52
http://pc12.2ch.net/test/read.cgi/tech/1258158172/735
# [1] 授業単元:プログラミング演習
# [2] 問題文:
#   http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1023
9.txt
#
# 1.
# 元金[円]と年利[%]と預金年数[年]をキーボードから入力させ、満期の元利合計を表示
する
# プログラムsmp8-12.cを作成、コンパイル、実行しなさい。
# (以下の実行結果を参照にして)
# その際、元金、年利、預金年数を引数として元利合計を求める関数clac_pandi()を作

# 利用すること(clac_pandiでは画面表示不可とする)。
# なお、利息は複利で計算し、毎年度の利息の円単位未満は切捨てること。
#
# 元金[円]を入力してください : 3613 enter↓
# 年利[%]を入力してください : 9.6 enter↓
# 預金年度を入力してください : 21 enter↓
# 3613円を年利9.600000%で21年間預金すると、24734円になります。
484デフォルトの名無しさん:2009/12/06(日) 17:53:57
http://pc12.2ch.net/test/read.cgi/tech/1258158172/735
# [1] 授業単元:プログラミング演習
# [2] 問題文:
#   http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10239.txt
#
# 2.
# 文字をキーボードから入力させ、英大文字は英小文字に変換して、英小文字は英大文字に変換して、
# その他の文字はそのまま出力するプログラムを作成しなさい。
# ただし、文字の入力にはgetchar関数を、出力にはputchar関数を必ず使用すること。
# また、文字の変換には標準ライブラリ関数を使用せず、文字を引数とする自作の関数
# conv_letter()を作成、利用すること(conv_letterでは画面表示不可とする。)
#
485デフォルトの名無しさん:2009/12/06(日) 17:55:50
http://pc12.2ch.net/test/read.cgi/tech/1258158172/735
# [1] 授業単元:プログラミング演習
# [2] 問題文:
#   http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10239.txt
#
# 3.
# 24時制の時間、分、秒をキーボードから入力させ、秒数に変換して画面に出力するプログラムを
# 作成しなさい。(以下の実行結果を参照のこと)。その際、時間、分、秒を引数として秒数を求める
# 関数clac_second()を作成、利用すること(clac second()では画面表示不可とする。)
# なお、この関数は、不正な時間、分、秒が渡された際、エラーとして-1を返すこととする。
#
# 時間(0〜23)を入力してください:96↓
# 分(0〜59)を入力してください:36↓
# 秒(0〜59)を入力してください:13↓
# 不正な時間、分、または秒が入力されました
# $
# 時間(0〜23)を入力してください:16↓
# 分(0〜59)を入力してください:36↓
# 秒(0〜59)を入力してください:13↓
# 不正な時間、分、または秒が入力されました
# 16時間36分13秒は59773秒です。
486デフォルトの名無しさん:2009/12/06(日) 18:19:02
>>481
なでしこやるなぁ。
487デフォルトの名無しさん:2009/12/06(日) 19:13:57
>>17 問題1
使用言語: APL(A+)

$mode ascii
f n : 'abcdefghijklmnopqrstuvwxyz'[iota n min 26]

f 6
abcdef
f 30
abcdefghijklmnopqrstuvwxyz
488デフォルトの名無しさん:2009/12/06(日) 19:34:21
>>47
使用言語: Io

f:=method(s,(b:=s size)repeat(i,writeln(s slice(0,b-i))))

Io> f("12345")
12345
1234
123
12
1
==> nil
489デフォルトの名無しさん:2009/12/06(日) 19:34:30
http://pc12.2ch.net/test/read.cgi/tech/1258158172/749
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10241.txt
# 下記構造体型配列を作る。
# データは入力すること。
# 確認のため各配列要素を表示すること。
# 20 40 10 50 30
# CD GH AB IJ EF
#
490デフォルトの名無しさん:2009/12/07(月) 00:08:06
http://pc12.2ch.net/test/read.cgi/tech/1258158172/754
# [1] 授業単元:C
# [2] 問題文(含コード&リンク):
# 入力されたデータをもとに売上明細を作成して表示する。
# 入力データは商品名と金額で、最大20件とし、^zで終了する。
# 入力されたデータは構造体配列に記録し、
# 入力終了後金額を集計して合計を表示する。
# <構造体メンバ>
# 商品名:char型10桁
# 金額:long型
# <実行結果>
# ^z
# 商品名    金額
# パソコン   248500
# ラジオ     3200
# テレビ    120500
# オーディオ  314000
# レイゾウコ   65800
# クーラー    79000
# 合計    831000
#
491デフォルトの名無しさん:2009/12/07(月) 05:09:12
http://pc12.2ch.net/test/read.cgi/tech/1258158172/759
# [1] 授業単元:C応用
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10244.txt
#
# 関数DeleteThresholdを作成し、Threshold(閾値)の値をscanfで読み込み、
# 学生aからdの英語と数学の平均点と閾値を比較し、
# 閾値以下の学生をリストから削除するプログラムを作成する。
# 関数DeleteThreshold内で関数Printを使用する。
# また、関数Printの次の行に、〜人削除の場合は「〜人削除しました」と入力する。
# 全員削除の場合は「全員削除しました」だけを入力する。
492デフォルトの名無しさん:2009/12/07(月) 07:30:27
>>483
% Prolog

元利合計(M,_利率,_借入金,_元利合計) :-
  元利合計(1,M,_利率,_借入金,_元利合計).

元利合計(N,M,_利率,_元利合計,_元利合計) :- N > M.
元利合計(N,M,_利率,_元利合計1,_元利合計) :-
  N =< M,
  _元利合計2 is _元利合計1 + floor(_元利合計1 * _利率),
  N2 is N + 1,
  元利合計(N2,M,_利率,_元利合計2,_元利合計).
493デフォルトの名無しさん:2009/12/07(月) 08:14:29
>>485
使用言語: 十進BASIC

FUNCTION calc_second(h,m,s)
IF (0<=h AND h<=23)AND(0<=m AND m <=59)AND(0<=s AND s<=59) THEN
LET calc_second=h*60*60+m*60+s
ELSE
LET calc_second=-1
END IF
END FUNCTION
INPUT PROMPT "時間(0〜23)を入力してください:":h
INPUT PROMPT "分(0〜59)を入力してください:":m
INPUT PROMPT "秒(0〜59)を入力してください:":s
LET t=calc_second(h,m,s)
IF t=-1 THEN
PRINT "不正な時間、分、または秒が入力されました。"
ELSE
PRINT USING"##時間##分##秒は#####秒です。":h,m,s,t
END IF
END
実行結果
時間(0〜23)を入力してください:96
分(0〜59)を入力してください:36
秒(0〜59)を入力してください:13
不正な時間、分、または秒が入力されました。
時間(0〜23)を入力してください:16
分(0〜59)を入力してください:36
秒(0〜59)を入力してください:13
16時間36分13秒は59773秒です。
494デフォルトの名無しさん:2009/12/07(月) 08:19:03
>>182
使用言語: APL(A+)

$mode ascii
a := 1+iota 10
a *. a
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
495デフォルトの名無しさん:2009/12/07(月) 08:21:39
>>257 >>331
使用言語: REBOL

>> pow4: func[n][n * n * n * n]
>> pow4(6)
== 1296
>> pow4(100)
== 100000000
>> pow4(500)
** Math Error: Math or number overflow
** Where: pow4
** Near: n * n * n
496デフォルトの名無しさん:2009/12/07(月) 09:52:21
>>485
% Prolog

'24時制の時間、分、秒をキーボードから入力させ、秒数に変換して画面に出力する':-
  催促付き整数入力('時間(0〜23)を入力してください:',_時間),
  催促付き整数入力('分(0〜59)を入力してください:',_分),
  催促付き整数入力('秒(0〜59)を入力してください:',_秒),
  clac_second(_時間,_分,_秒,_診断),
  通算秒表示(_時間,_分,_秒,_診断).

clac_second(_時間,_分,_秒,_診断) :-
  _時間>=0,_時間=<23,
  _分>=0,_分=<59,
  _秒>=0,_秒=<59,
  _診断 is _時間 * 60 * 60 + _分 * 60 + _秒,!.
clac_second(_時間,_分,_秒,-1).

通算秒表示(_,_,_,-1) :- write('不正な時間、分、または秒が入力されました\n'),!.
通算秒表示(_時間,_分,_秒,_通算秒) :-
  write_formatted('%t時間%t分%t秒は%t秒です\n',[_時間,_分,_秒,_通算秒]),!.
催促付き整数入力(_催促,_整数) :-
  write(_催促),
  get_integer(_整数),!.
497デフォルトの名無しさん:2009/12/07(月) 10:15:23
>>484
% Prolog

文字をキーボードから入力させ、英大文字は英小文字に変換して、英小文字は英大文字に変換して、その他の文字はそのまま出力する :-
  get_char(C),
  conv_letter(C,X),
  put_char(C).

conv_letter(C1,C2) :-
  大文字(L1),
  list_nth(N,L1,C1),
  小文字(L2),
  list_nth(N,L2,C2),!.
conv_letter(C1,C2) :-
  小文字(L1),
  list_nth(N,L1,C1),
  大文字(L2),
  list_nth(N,L2,C2),!.
conv_letter(C,C).

大文字(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']).
小文字([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).
498デフォルトの名無しさん:2009/12/07(月) 10:50:34
>>47
使用言語: J

smoutput\.'Hello, world!'
Hello, world!
ello, world!
llo, world!
lo, world!
o, world!
, world!
world!
world!
orld!
rld!
ld!
d!
!
499デフォルトの名無しさん:2009/12/07(月) 11:02:14
>>490
% Prolog
入力されたデータをもとに売上明細を作成して表示する :-
  売上データの収集(_収集されたデータ),
  findsum(_金額,member([_,_金額],_収集されたデータ),_金額合計),
  write('商品名   金額\n'),
  明細表の印刷(_収集されたデータ,_金額合計),!.

売上データの収集(_収集されたデータ) :-
  write('商品名と金額をカンマで区切って入力してください\n').
  findall([A2,B],
      (  for(1,N,10),get_line(Line),
        ( Line=end_of_file,!,fail;
          split(Line,[','],[A,B]),
          '10桁の文字列'(A,A2))),_収集されたデータ),!.

明細表の印刷([],_金額合計) :- write_formatted('%10s %10d\n',[金額合計,_金額合計]).
明細表の印刷([[_商品名,_金額]|R],_金額合計) :-
  write_formatted('%10s %10d\n',[_商品名,_金額]),
  明細表の印刷(R,_金額合計).

'10桁の文字列'(_文字列,_10桁の文字列) :-
  atom_chars(_文字列,Chars),
  length(L,10),
  apend(Chars,L1,L),
  all(L1,' '),
  atom_chars(_10桁の文字列,L),!.
'10桁の文字列'(_文字列,_10桁の文字列) :- sub_atom(_文字列,0,10,_,_10桁の文字列).
500デフォルトの名無しさん:2009/12/07(月) 11:09:31
>47
使用言語: J
間違えました。後ろから削るんだった。

smoutput@|.\.|.'Hello, world!'
Hello, world!
Hello, world
Hello, worl
Hello, wor
Hello, wo
Hello, w
Hello,
Hello,
Hello
Hell
Hel
He
H
501デフォルトの名無しさん:2009/12/07(月) 11:37:41
>>491
% Prolog
英語(a,70).
英語(b,79).
英語(c,90).
英語(d,69).
数学(a,80).
数学(b,63).
数学(c,55).
数学(d,80).

閾値以下の学生をリストから削除する(_学生リスト,_判定後の学生リスト,_削除メッセージ) :-
  get_integer(_閾値),
  findall([_学生,_二科目の平均],
    (  member(_学生,_学生リスト),英語(_学生,_英語),数学(_学生,_数学),
      _二科目の平均 is (_英語 + _数学) / 2),_二科目の平均ならび),
  findall(_学生2,(member([_学生2,_平均点2],_二科目の平均ならび),_平均点2 >= _閾値),_判定後の学生ならび),
  length(_学生ならび,Len1),
  length(_判定後の学生ならび,Len2),
  削除メッセージ(Len1,Len2,_削除メッセージ).
 
削除メッセージ(Len,Len,'全員削除しました。') :- !.
削除メッセージ(Len1,Len2,_メッセージ) :- _削除人数 is Len2 - Len1,concat_atom([_削除人数,人削除しました。],_メッセージ).

閾値を読み込む(_閾値) :- get_integer(_閾値).
502デフォルトの名無しさん:2009/12/07(月) 11:43:58
>>45
使用言語: J

fact=:*/@(>:@i.)

,.fact"0 i.11
1
1
2
6
24
120
720
5040
40320
362880
3628800
503デフォルトの名無しさん:2009/12/07(月) 11:49:36
>>501
% Prolog せっかく述語定義したのだから、これに置き換えてください。

閾値以下の学生をリストから削除する(_学生リスト,_判定後の学生リスト,_削除メッセージ) :-
  閾値を読み込む(_閾値),
  ....
504デフォルトの名無しさん:2009/12/07(月) 12:03:36
>>45
使用言語: Io

fact:=method(n,a:=1;for(i,1,n,a=a*i);a)

Io> for(i,0,10,writeln(fact(i)))
1
1
2
6
24
120
720
5040
40320
362880
3628800
==> nil
505デフォルトの名無しさん:2009/12/07(月) 13:44:45
>>207
使用言語: Io

f:=method(s1,s2,n,s1 asMutable atInsertSeq(n,s2))

Io> f("12345","AB",3)
==> 123AB45
506デフォルトの名無しさん:2009/12/07(月) 13:52:05
>>114
使用言語: Io

f:=method(s1,s2,s1 .."GHIJKLMABCDERSTUVWFNOPQXYZ"between(s1,s2).. s2)

Io> f("C","Q")
==> CDERSTUVWFNOPQ
507デフォルトの名無しさん:2009/12/07(月) 13:53:54
>>473
% Prolog

a([983,386,577,215,393,935,686,292,349,821,762,527,690,359,663,626,340,226,
872,236,711,468,367,529,882,630,162,923,767,335,429,802,622,958,969,967,893,
656,311,242,529,973,721,219,384,437,798,624,615,670,813,326,191,180,756,973,
762,870,896,581,205,325,384,727,336,405,746,229,113,957,424,595,982,145,714,
367,534,564,943,150,287,808,376,378,888,184,403,651,954,299,232,160,576,568,
839,812,926,586,994,939]).

'100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示' :-
  a(L),
  member10(L1,L),
  concat_atom(L1,' ',S),
  write_formatted('%t\n',[S]),
  fail.
'100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示'.

member10(L1,L) :- length(L1,10),append(L1,L2,L).
member10(L1,L) :- length(L3,10),append(L3,L2,L),member10(L1,L2).
508デフォルトの名無しさん:2009/12/07(月) 13:59:35
>473 つづき
% Prolog
配列aのデータを基本選択法によって昇順に整列し、整列後の配列a内容を表示 :- a(L),基本選択法(L,L2),write_formatted('%t\n',[L2]).

基本選択法([A,B|R],L) :-
  A =< B,
  最初に見つかったAより小さい数と交換(A,[B|R],X,L2),
  基本選択法の二(A,X,L2,L).
基本選択法([A,B|R],L) :-
  A > B,
  基本選択法([B,A|R],L).

基本選択法の二(A,B,L1,[A|L2]) :-
  A =< B,
  基本選択法([B|L1],L2).
基本選択法の二(A,B,L1,L) :-
  A > B,
  基本選択法([B|L1],L).

最初に見つかったAより小さい数と交換(A,[],A,[]) :- !.
最初に見つかったAより小さい数と交換(A,[B|R],B,[A|R]) :- B > A,!.
最初に見つかったAより小さい数と交換(A,[B|R1],X,[B|R2]) :-
  A =< B,
  最初に見つかったAより小さい数と交換(A,R1,X,R2).
509デフォルトの名無しさん:2009/12/07(月) 14:12:25
>473 つづき
% Prolog
配列aのデータを基本選択法によって降順に整列し、整列後の配列a内容を表示 :- a(L),
基本選択法降順(L,L2),write_formatted('%t\n',[L2]).

基本選択法降順([A,B|R],L) :-
  A >= B,
  最初に見つかったAより大きい数と交換(A,[B|R],X,L2),
  基本選択法降順の二(A,X,L2,L).
基本選択法降順([A,B|R],L) :-
  A < B,
  基本選択法降順([B,A|R],L).

基本選択法降順の二(A,B,L1,[A|L2]) :-
  A >= B,
  基本選択法降順([B|L1],L2).
基本選択法降順の二(A,B,L1,L) :-
  A < B,
  基本選択法降順([B|L1],L).

最初に見つかったAより大きい数と交換(A,[],A,[]) :- !.
最初に見つかったAより大きい数と交換(A,[B|R],B,[A|R]) :- B < A,!.
最初に見つかったAより大きい数と交換(A,[B|R1],X,[B|R2]) :-
  A =< B,
  最初に見つかったAより大きい数と交換(A,R1,X,R2).
510デフォルトの名無しさん:2009/12/07(月) 15:45:17
http://pc12.2ch.net/test/read.cgi/tech/1222224721/610
#
# 平成元号年を入力して,西暦年を表示する。
#     例えば,21と入力したら,「平成21年は西暦2009年です」と表示する。
# (ヒント:元号年を a とすると,西暦年は1988+a )
511デフォルトの名無しさん:2009/12/07(月) 15:45:57
http://pc12.2ch.net/test/read.cgi/tech/1222224721/610
#
# 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか
# を表示する。(ヒント:頭の数と足の数を変数として,鶴の数と亀の数について
# 連立方程式を作り,解を与える式の値を表示させればよい)
#
512デフォルトの名無しさん:2009/12/07(月) 15:51:29
>>510
% Prolog

平成元号年を入力して,西暦年を表示 :-
  get_integer(_平成元号年),
  _西暦年 is 1988 + _平成元号年,
  write_formatted('平成%t年は西暦%t年です\n',[_平成元号年,_西暦年]).
513デフォルトの名無しさん:2009/12/07(月) 16:08:47
>>510
% Prolog

鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
  催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
  催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
  findall(N,for(0,N,_鶴と亀の頭の数の合計),L),
  重複順列(L,2,[A,B]),
  _鶴と亀の頭の数の合計 is A + B,
  _鶴と亀の足の数の合計 is 2 * A + 4 * B,
  write_formatted('鶴が%匹、亀が%匹。\n',[A,B]).
514デフォルトの名無しさん:2009/12/07(月) 16:15:12
>>17 問題1
使用言語: Xtal

f:fun(n)"abcdefghijklmnopqrstuvwxyz".split("").take(n).join("");

ix:005>f(8).p;
abcdefgh
ix:006>f(30).p;
abcdefghijklmnopqrstuvwxyz
515デフォルトの名無しさん:2009/12/07(月) 16:33:09
>>510
使用言語: Xtal

f:fun(n)%f"平成%d年は、西暦%d年です。"(n,1988+n);

ix:003>f(21).p;
平成21年は、西暦2009年です。
516デフォルトの名無しさん:2009/12/07(月) 16:39:52
http://pc12.2ch.net/test/read.cgi/tech/1258158172/771
# [1] 授業単元:C言語演習
# [2] 問題文(含コード&リンク):これに全て記載 http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10245.c
#
# 問題
# graph.cの関数print_graph_memory()を参考に、グラフの連結であるか否かの判定を行うプログラムを作成せよ。
# または連結な場合は、一筆書きできるか否かの判定を行うようにせよ。
# sample5.dimacs、sample6.dimacs、sample7.dimacsを連結判定・一筆書き判定せよ。
517デフォルトの名無しさん:2009/12/07(月) 16:51:46
http://pc11.2ch.net/test/read.cgi/db/1252492296/241
# SELECT した全レコードの特定カラムを文字列連結したものを得る方法はありますか?
#
# SELECT C FROM T
#
# とやったときに AAA、BBB、CCC といった値が得られる時、AAABBBCCC のような 1つの値が欲しいです。
# さらにそれらの間に任意の区切り文字を入れて AAA:BBB:CCC のような値を得ることはできるでしょうか。
518デフォルトの名無しさん:2009/12/07(月) 17:01:00
>>517
% Prolog

'SELECTした全レコードのN番目カラムを文字列連結したものを得る'(T/_属性の数,N,_連結した文字列) :-
  length(L,_属性の数),
  P =.. [T|L]),
  findall(X,(call(P),list_nth(N,L,X)),_解ならび),
  concat_atom(_解ならび,_連結した文字列).
519デフォルトの名無しさん:2009/12/07(月) 17:22:14
>>516
% Prolog

有向グラフに於いて到達可能(A,B) :-
  有向グラフ(A,B),!.
有向グラフに於いて到達可能(A,B) :-
  有向グラフ(A,C),
  有向グラフに於いて到達可能(C,B).
520デフォルトの名無しさん:2009/12/07(月) 17:52:44
>>510
使用言語: J

f=:monad def ' ''平成'',(":y),''年は、西暦'',(":1988+y),''年です。'' '

f 10
平成10年は、西暦1998年です。
521デフォルトの名無しさん:2009/12/07(月) 18:18:46
>>510
使用言語: 十進BASIC

SUB f(n)
PRINT "平成";n;"年は、西暦";1988+n;"年です。"
END SUB
CALL f(15)
END

実行結果
平成 15 年は、西暦 2003 年です。
522デフォルトの名無しさん:2009/12/07(月) 19:23:03
>>516
% Prolog

有向グラフに於いて一筆書き(A,_経路) :-
  setof((B,C),有向グラフ(B,C),L),
  length(L,Len),
  有向グラフに於いて一筆書き(A,A,Len,[],_経路).

有向グラフに於いて一筆書き(A,A,Len,L,[]) :- length(L,Len),!.
有向グラフに於いて一筆書き(A,S,Len,L,[A|R]) :-
  有向グラフ(A,B),
  \+(member((A,B),L)),
  有向グラフに於いて一筆書き(B,S,Len,[(A,B)|L],R).
523デフォルトの名無しさん:2009/12/07(月) 19:34:54
鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
  催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
  催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
  ガウス行列に変形([[1,1,_鶴と亀の頭の合計],[2,4,_鶴と亀の足の合計]],L1),
  既約ガウス行列に変形(L1,[[_,_,_鶴の何羽],[_,_,_亀何匹]]),
  write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]).
  重複順列(L,2,[A,B]),
  _鶴と亀の頭の数の合計 is A + B,
  _鶴と亀の足の数の合計 is 2 * A + 4 * B,
  write_formatted('鶴が%匹、亀が%匹。\n',[A,B]).
524デフォルトの名無しさん:2009/12/07(月) 19:36:02
>>523 ゴミが残ってしまった。
% Prolog

鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
  催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
  催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
  ガウス行列に変形([[1,1,_鶴と亀の頭の合計],[2,4,_鶴と亀の足の合計]],L1),
  既約ガウス行列に変形(L1,[[_,_,_鶴の何羽],[_,_,_亀何匹]]),
  write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]).
525デフォルトの名無しさん:2009/12/07(月) 19:37:46
>>513 >>510 最終行に誤りがあった。
% Prolog

鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
  催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
  催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
  findall(N,for(0,N,_鶴と亀の頭の数の合計),L),
  重複順列(L,2,[A,B]),
  _鶴と亀の頭の数の合計 is A + B,
  _鶴と亀の足の数の合計 is 2 * A + 4 * B,
  write_formatted('鶴が%t羽、亀が%t匹。\n',[A,B]).
526デフォルトの名無しさん:2009/12/07(月) 19:39:17
http://pc12.2ch.net/test/read.cgi/tech/1258158172/773
# [1] 授業単元:プログラミング�
# [2] 問題文(含コード&リンク): 構造体を使って二つの複素数の積を求める
527デフォルトの名無しさん:2009/12/07(月) 19:48:49
>>524 >>510 まだ間違いがあった。
% Prolog

鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
  催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
  催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
  ガウス行列に変形([[1,1,_鶴と亀の頭の合計],[2,4,_鶴と亀の足の合計]],L1),
  既約ガウス行列に変形(L1,[[_,_,_鶴何羽],[_,_,_亀何匹]]),
  write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]).

% 未完成だけど(マイナスが出てくるとエラーになることがある)行列の変形は
% http://nojiriko.asia/prolog/Gauss_gyoretsu_ni_henkei.html
528デフォルトの名無しさん:2009/12/07(月) 21:00:15
>>511
使用言語: J

f=:('鶴の数 = ',:'亀の数 = '),.":@,.@%.&(1 1,:2 4)

f 3 8
鶴の数 = 2
亀の数 = 1
f 20 64
鶴の数 = 8
亀の数 = 12
529デフォルトの名無しさん:2009/12/07(月) 21:49:03
>>495
REBOLのソースなんて初めて見た。ありがとう。
530デフォルトの名無しさん:2009/12/07(月) 22:06:20
>>511
使用言語: maxima

f(x,y):=(matrix([1,1],[2,4])^^-1) . matrix([x],[y]);
g(x):=printf(true,"鶴の数 = ~a~%亀の数 = ~a",x[1,1],x[2,1])

(%i40) g(f(3,8));
鶴の数 = 2
亀の数 = 1
(%o40) false
(%i41) g(f(20,64));
鶴の数 = 8
亀の数 = 12
(%o41) false
531デフォルトの名無しさん:2009/12/07(月) 23:56:11
>>47
使用言語: maxima

f(s):=(b:slength(s),for i thru b do printf(true,"~a~%",substring(s,1,b-i+2)));

(%i68) f("maxima");
maxima
maxim
maxi
max
ma
m
(%o68) done
532デフォルトの名無しさん:2009/12/08(火) 05:03:21
>>174 問題2
使用言語: J

f=:;@((]\:+/"1)@=<@#])@tolower

f 'aSddAdsAsfdaDfdfDF'
dddddddaaaaffffsss

f 'AAbbbCCccddDdd'
dddddccccbbbaa
533デフォルトの名無しさん:2009/12/08(火) 06:32:31
>>17 問題1
使用言語: REBOL

>> f: func[n][copy/part "abcdefghijklmnopqrstuvwxyz" n]
>> f 6
== "abcdef"
>> f 30
== "abcdefghijklmnopqrstuvwxyz"
534デフォルトの名無しさん:2009/12/08(火) 08:22:54
>>489
% Prolog
%
% [[20,'CD'],[40,'GH'],[10,'AB'],[50,'IJ'],[30,'EF']]
%
prologで構造体配列に近いものを作り確認のため表示する :-
  prologで構造体配列に近いものを作る(L),
  findall(A,member([A,_],L),L1),
  concat_atom(L1,' ',S1),
  write_formatted('%t\n',[S1]),
  findall(B,member([B,_],L),L2),
  concat_atom(L2,' ',S2),
  write_formatted('%t\n',[S2]).

prologで構造体配列に近いものを作る(L) :-
  get_split_lines(user_input,[','],L).

prologで構造体配列に近いものを作り述語として定義する(_構造体名) :-
  prologで構造体配列に近いものを作る(L),,
  member(L1,L),
  P =.. [_構造体名|L1],
  assertz(P),
  fail.
prologで構造体配列に近いものを作り述語定義する(_).
535デフォルトの名無しさん:2009/12/08(火) 08:40:55
>>489
% Prolog
%
% [[20,40,10,50,30],['CD','GH','AB','IJ','EF']]
%
% a([20,40,10,50,30],['CD','GH','AB','IJ','EF']).

prologで構造体配列に近いものを作り確認のため表示する :-
  prologで構造体配列に近いものを作る(L),
  findall(L1,member(L1,L),L2),
  concat_atom(L2,' ',S2),
  write_formatted('%t\n',[S2]),
  fail.

prologで構造体配列に近いものを作る(L) :-
  get_split_lines(user_input,[','],L).

prologで構造体配列に近いものを作り述語として定義する(_構造体名) :-
  prologで構造体配列に近いものを作る(L),
  member(L1,L),
  P =.. [_構造体名,L1],
  assertz(P),
  fail.
prologで構造体配列に近いものを作り述語定義する(_).
536デフォルトの名無しさん:2009/12/08(火) 08:42:36
>>534 訂正
% Prolog

  prologで構造体配列に近いものを作る(L),,
==>
  prologで構造体配列に近いものを作る(L),
537デフォルトの名無しさん:2009/12/08(火) 09:19:03
>>526
% Prolog

:- op(350,xf,i).

複素数の積(A + B i,C + D i,E + F i) :-
  E is A * C - B * D,
  F is A * D + B * C.
538デフォルトの名無しさん:2009/12/08(火) 09:23:46
>>17 問題2
使用言語: REBOL

>> f: func [n] [s: 0 repeat i n [if (i // 5 = 0) or (i // 3 = 0) [s: s + i]] s ]
>> f 10
== 33
>> f 100
== 2418
539デフォルトの名無しさん:2009/12/08(火) 09:58:49
http://pc12.2ch.net/test/read.cgi/tech/1258158172/778
# [1] 授業単元:プログラミング演習2
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10246.txt
# 課題2-1の問題文とそのプログラムを下に示しときます。
#
# [課題2-1]
# n件の整数型データを配列に入力し、その平均値を出力するプログラムを作成せよ。
# なお、実行部において添字演算子を用いないこと。また、*(p+i)の形を用いること。
#
# [課題2-2]
# 課題2-1と同じ機能を持つプログラムを作成せよ。ただし、入出力処理をファイル処理に変更し、
# 入出力ファイルはコマンドラインで指定すること。
#
540デフォルトの名無しさん:2009/12/08(火) 10:08:00
>>539
% Prolog

'N件の整数型データを配列に入力し、その平均値を出力する' :-
  write('データ数:'),
  get_integer(N),
  findavg(I,(for(1,M,N),write_formatted('%t番目 値:',[M]),get_integer(I)),_平
均値),
  write_formatted('平均=%t\n',[_平均値]),!.
541デフォルトの名無しさん:2009/12/08(火) 10:14:57
>>539
% proloog
% 課題2-2

program :-
  user_parameters([_入力ファイル名,_出力ファイル名]),
  see(_入力ファイル名),
  tell(_出力ファイル名),
  'N件の整数型データを配列に入力し、その平均値を出力する',
  told,
  seen.

'N件の整数型データを配列に入力し、その平均値を出力する' :-
  get_integer(N),
  findavg(I,(for(1,M,N),get_integer(I)),_平均値),
  write_formatted('平均=%t\n',[_平均値]),!.
542デフォルトの名無しさん:2009/12/08(火) 12:23:08
>>17 問題2
使用言語: なでしこ

●f(n)
 s=0
 iで1からnまで繰り返す
  もし(i%3=0)または(i%5=0)ならばs=s+i
 sを戻す。

f(10)を表示
f(100)を表示

実行結果
33
2418
543デフォルトの名無しさん:2009/12/08(火) 13:47:15
>>370 課題(2)
使用言語: REBOL

>> f: func [n d] [mod (to-integer n / power 10 (d - 1)) 10]
>> f 123456789 4
== 6
544デフォルトの名無しさん:2009/12/08(火) 18:29:21
>>45
使用言語: R

> fact <- function(n){if(n==0)1 else prod(1:n)}
> for(i in 0:10)cat(fact(i),"\n")
1
1
2
6
24
120
720
5040
40320
362880
3628800
545デフォルトの名無しさん:2009/12/08(火) 18:45:27
>>47
使用言語: R

> f <- function(s){write(substring(s,1,(nchar(s)):1),"")}
> f("substring")
substring
substrin
substri
substr
subst
subs
sub
su
s
546デフォルトの名無しさん:2009/12/08(火) 19:16:59
>>511
使用言語: R

f <- function(x,y){
a <- matrix(c(1,2,1,4),2,2)
b <- matrix(c(x,y))
c <- solve(a) %*% b
cat("鶴の数 = ",c[1],"\n亀の数 = ",c[2],"\n")
}
> f(3,8)
鶴の数 = 2
亀の数 = 1
> f(10,24)
鶴の数 = 8
亀の数 = 2
547デフォルトの名無しさん:2009/12/08(火) 20:23:24
http://pc11.2ch.net/test/read.cgi/db/1252492296/321
#
# スコアランキングで、自分の上下4人を含めた9人分の情報を取ってきたいのですが、どのようにすればよいでしょうか?
# (自分が1位などの場合は自分と下位8人分を取得します)
#
548デフォルトの名無しさん:2009/12/08(火) 20:27:26
>>547
% Prolog

スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-
  findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),
  sort(L1,L2),
  reverse(L2,L3),
  for(5,N,1),
  append(_,L,_,L3),
  length(L,9),
  member([_スコア,_自分],L),
  自分の最良の席を取る(N,_自分,L).

自分の最良の席を取る(N,_自分,L) :-
  list_nth(N,L,[_,_自分]),!.
自分の最良の席を取る(N,_自分,L) :-
  M is 10 - N,
  list_nth(M,L,[_,_自分]),!.
549デフォルトの名無しさん:2009/12/08(火) 20:32:27
>>511
使用言語: 十進BASIC

DATA 1,1,2,4
DIM a(2,2)
DIM b(2,1)
DIM c(2,1)
DIM g(2,2)
MAT READ a
MAT INPUT PROMPT "頭の数,足の数 : " :b
MAT g=INV(a)
MAT c=g*b
PRINT "鶴の数 = ";c(1,1)
PRINT "亀の数 = ";c(2,1)
END

実行結果
頭の数,足の数 : 100,360
鶴の数 = 20
亀の数 = 80
550デフォルトの名無しさん:2009/12/08(火) 22:24:28
>>547
% Prolog
スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-
  findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),
  sort(L1,L2),
  reverse(L2,L3),
  append(L11,[[_スコア,_氏名]|L12],L3),
  自分の最良の席を取る(L11,[_スコア,_自分],L12,L).

自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-
  length(L12,Len2),Len2 =< 4,
  Len1 is 9 - Len2 - 1,length(L1,Len1),
  append(_,L1,L11),
  append(L1,[[_スコア,自分]|,L12],L),!.

自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-
  length(L11,Len1),Len1 =< 4,
  Len2 is 9 - Len1 - 1,length(L2,Len2),
  append(L2,_,L12),
  append(L11,[[_スコア,_自分]|L2],L),!.

自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-
  length(L1,4),length(L2,4),
  append(_,L1,L11),
  append(L2,_,L12),
  append(L1,[[_スコア,_自分]|L2],L),!.
自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-
  append(L11,[[_スコア,_自分]|L12],L).
551デフォルトの名無しさん:2009/12/08(火) 22:28:58
>>370 課題(2)
使用言語: R

> f <- function(n,d){(n%/%10^(d-1))%%10}
> f(123456789,3)
[1] 7
552デフォルトの名無しさん:2009/12/09(水) 04:40:26
http://pc12.2ch.net/test/read.cgi/tech/1258158172/810
# [1] アルゴリズム
#
# [2] 自然数の数列内にあるnよりも大きい数と小さい数が
# 数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力する。
# つまり、(n-a,...,n+b,....n,....n+c,....,n-d)という風になっているnを探すプログラムです。
553デフォルトの名無しさん:2009/12/09(水) 04:52:17
>>552
% Prolog

自然数の数列内にあるnよりも大きい数と小さい数が数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力(_自然数ならび) :-
  append(L1,[N|L2],_自然数ならび),
  findsum(1,(member(A,L1),A > N),1),
  findsum(1,(member(B,L2),B < N),1),
  write_formatted('%t\n',[N]).
554デフォルトの名無しさん:2009/12/09(水) 05:24:08
http://pc12.2ch.net/test/read.cgi/tech/1258158172/784
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク): 構造体を身長順に並べ変えなさい。身長が同じ場合は番号が若い順に並べなさい。
#   作ったけどうまくいかなかったのがこれです。
#   http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10249.txt
#
555デフォルトの名無しさん:2009/12/09(水) 05:29:49
>>554
% Prolog
番号・氏名・身長([[ 3,'一郎',180.0 ], [ 5,'二郎',175.5 ],[ 1,'三郎',180.0 ], [ 4,'四郎',175.5 ],[ 2,'五郎',169.9 ]]).

構造体を身長順に並べ変えなさい。身長が同じ場合は番号が若い順に並べなさい :-
  retract(番号・氏名・身長(L)),
  身長順に並べ変える。ただし身長が同じ場合は番号が小さい順(L,[],L2),
  assertz(番号・氏名・身長(L2)).

身長順に並べ変える。ただし身長が同じ場合は番号が小さい順([],L,L) :- !.
身長順に並べ変える。ただし身長が同じ場合は番号が小さい順([U|R1],L1,L) :-
  身長順に挿入ただし同じ場合は番号の小さい順(U,L1,L2),
  身長順に並べ変える。ただし身長が同じ場合は番号が小さい順(R1,L2,L).

身長順に挿入ただし同じ場合は番号の小さい順([L],[L]).
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[[_番号1,_氏名1,_身長1]|R1],[[_番号,_氏名,_身長],[_番号1,_氏名1,_身長1]|R1]) :-
  _身長 > _身長1,!.
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[[_番号1,_氏名1,_身長1]|R1],[[_番号,_氏名,_身長],[_番号1,_氏名1,_身長1]|R1]) :-
  _身長 = _身長1,
  _番号 < _番号1,!.
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[U|R1],[U|R2]) :-
  身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],R1,R2).
556デフォルトの名無しさん:2009/12/09(水) 05:35:51
>>555 >>554 間違い。真ん中あたりの単位節。
% Prolog
番号・氏名・身長([[ 3,'一郎',180.0 ], [ 5,'二郎',175.5 ],[ 1,'三郎',180.0 ], [ 4,'四郎',175.5 ],[ 2,'五郎',169.9 ]]).

構造体を身長順に並べ変えなさい。身長が同じ場合は番号が若い順に並べなさい :-
  retract(番号・氏名・身長(L)),
  身長順に並べ変える。ただし身長が同じ場合は番号が小さい順(L,[],L2),
  assertz(番号・氏名・身長(L2)).

身長順に並べ変える。ただし身長が同じ場合は番号が小さい順([],L,L) :- !.
身長順に並べ変える。ただし身長が同じ場合は番号が小さい順([U|R1],L1,L) :-
  身長順に挿入ただし同じ場合は番号の小さい順(U,L1,L2),
  身長順に並べ変える。ただし身長が同じ場合は番号が小さい順(R1,L2,L).

身長順に挿入ただし同じ場合は番号の小さい順(U,[U]) :- !. /* 修正箇所はここです */
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[[_番号1,_氏名1,_身長1]|R1],[[_番号,_氏名,_身長],[_番号1,_氏名1,_身長1]|R1]) :-
  _身長 > _身長1,!.
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[[_番号1,_氏名1,_身長1]|R1],[[_番号,_氏名,_身長],[_番号1,_氏名1,_身長1]|R1]) :-
  _身長 = _身長1,
  _番号 < _番号1,!.
身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],[U|R1],[U|R2]) :-
  身長順に挿入ただし同じ場合は番号の小さい順([_番号,_氏名,_身長],R1,R2).
557デフォルトの名無しさん:2009/12/09(水) 05:39:37
>>552
使用言語: J
下の段が1になっているものが答えのつもりです。

f=:monad def 'y,:4=+/|:#@~.@>0 cutopen"1*-/~y'

f 10?100
88 20 14 3 43 66 18 28 59 31
0 0 0 0 1 0 0 0 0 0
f 10?100
11 76 40 72 83 64 59 66 22 42
0 0 1 1 0 1 1 0 0 0
558デフォルトの名無しさん:2009/12/09(水) 11:47:50
>>547
% Prolog
スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-
  findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),
  sort(L1,L2),
  reverse(L2,L3),
  スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L).

スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L) :-
  length(L1,4),
  length(L2,4),
  append(L1,[[_スコア,_自分]|L2],L),
  append(_,L,_,L3),!.
スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L) :-
  list_nth(N,L3,[_スコア,_自分]),
  N < 4,
  length(L,8),
  append(L,_,L3),!.
スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_,_,L3,L) :-
  length(L,8),
  append(_,L,L3),!.
スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_,_,L,L).
559デフォルトの名無しさん:2009/12/09(水) 12:05:20
>>558
sort/2 の直後、reverse/2の直後でそれぞれ最初の4データまでに
[_スコア,_自分]が出現するかどうか検査するともう少し速くはなる。
560デフォルトの名無しさん:2009/12/09(水) 14:31:44
>>552 下の問題補足説明がでたので、解答を一部変更。
% Prolog
% http://pc12.2ch.net/test/read.cgi/tech/1258158172/816

自然数の数列内にあるnよりも大きい数と小さい数が数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力(_自然数ならび) :-
  append(L1,[N|L2],_自然数ならび),
  findsum(1,(member(A,L1),A > N),M1),M1 >= 1,
  findsum(1,(member(B,L2),B < N),M2),M2 >= 1,
  write_formatted('%t\n',[N]),
  fail.
自然数の数列内にあるnよりも大きい数と小さい数が数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力(_).
561デフォルトの名無しさん:2009/12/09(水) 15:12:43
http://pc11.2ch.net/test/read.cgi/db/1252492296/330
# ■テーブルデータ
# ・IDテーブル   # ・マスターテーブル
# 1, 2, 3      # 1, A
# 1, 2, 4      # 2, A
# 5, -1, -1     # 3, A
# -1, 1, 2      # 4, B
# 2, -1, 5      # -1, Z
#
# ■やりたいこと
# マスターテーブルを参照してIDテーブルの各IDにクラス(A, B, Z)を振り当て、
# 各レコードが同一クラスに属するか否かを判定し、同一クラスに属するレコード
# だけクラス付で抽出する。
# ここで「同一クラスに属する」とは、クラスA, B, Zからなるグループに対して、
# Z以外の要素が一種類しか存在しない場合に、グループはそのクラスに属すると定める。
# 最終的に欲しいデータは
#
# 1, 2, 3, A
# 5, -1, -1, B
# -1, 1, 2, A
#
# となります。よろしくお願いします。
562デフォルトの名無しさん:2009/12/09(水) 15:15:35
>>561
% Prolog

'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない' :-
  'ID'(Id_1,Id_2,Id_3),
  マスター(Id_1,_クラス1),
  マスター(Id_2,_クラス2),
  マスター(Id_3,_クラス3),
  setof(U,(member(U,[_クラス1,_クラス2,_クラス3]),\+(U='Z')),[_クラス]),
  write_formatted('%t,%t,%t,%t\n',[Id_1,Id_2,Id_3,_クラス]),
  fail.
'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない'.
563デフォルトの名無しさん:2009/12/09(水) 15:32:00
>>561 実は元の質問の最後に以下の付加があった。無視したが。
# ※IDテーブルの列数=3、クラス数=3 というのは揃っている必要はなく
# IDが5列ありクラスが10種類あるという場合でも適用可能な回答をお願いしたいです。
http://pc11.2ch.net/test/read.cgi/db/1252492296/330
# これが可能になるように変更しなさい。
564デフォルトの名無しさん:2009/12/09(水) 15:38:21
>>563
% Prolog 設計上好ましい変更ではない。
% 述語 'ID' を1引数として、データをリストとして持つ。

'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない' :-
  'ID'(L),
  setof(U,(member(ID,L),マスター(ID,U),\+(U='Z')),[_クラス]),
  concat_atom(L,',',S),
  write_formatted('%t,%t\n',[S,_クラス]),
  fail.
'クラスA, B, Zからなるグループに対して、Z以外の要素が一種類しか存在しない'.
565デフォルトの名無しさん:2009/12/09(水) 15:51:57
>>552
使用言語: 十進BASIC
RANDOMIZE
LET N=10
DIM d(N)
FOR i=1 TO N
LET d(i)= INT(RND*100)
NEXT I
MAT PRINT d;
FOR i=3 TO N-2
LET lc1=0
LET lc2=0
FOR L=1 TO i-1
IF d(i)<d(L) THEN LET lc1=1
IF d(i)>d(L) THEN LET lc2=1
IF lc1+lc2=2 THEN BREAK
NEXT L
LET rc1=0
LET rc2=0
FOR R=i+1 TO N
IF d(i)<d(R) THEN LET rc1=1
IF d(i)>d(R) THEN LET rc2=1
IF rc1+rc2=2 THEN BREAK
NEXT R
IF lc1+lc2+rc1+rc2=4 THEN PRINT d(i);
NEXT I
END
実行結果
95 26 34 5 55 45 99 65 44 1
34 55 45
566デフォルトの名無しさん:2009/12/09(水) 17:58:06
>>370 課題(2)
使用言語: Yacas

In> f(n,d):=Mod(Div(n,10^(d-1)),10);
Out> True
In> f(123456789,2)
Out> 8
In> f(123456789,7)
Out> 3
567デフォルトの名無しさん:2009/12/09(水) 18:28:00
http://pc12.2ch.net/test/read.cgi/tech/1258158172/841
# [1] 授業単元: C言語演習編
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10252.txt
#
# 問題1:
# 文字列(128文字未満)を読み込み、その長さを表示するプログラムを作成せよ。
# ただし、文字列の走査には、ポインタ変数を使用すること。文字列操作関数を用いないこと。
#
# 問題2:
# 問題1の読み込み部分をファイル処理に変更せよ。 fgetc()関数を使用すること。
# コマンドラインにファイル名が指定できること。ただし、ファイル名を指定しない場合は標準入力とすること。
568デフォルトの名無しさん:2009/12/09(水) 18:29:49
>>567
% Prolog
'文字列(128文字未満)を読み込み、その長さを表示する' :-
  get_char(C),
  '文字列(128文字未満)を読み込む'(C,L),
  length(L,N),
  write_formatted('%t文字です\n',[N]).

'文字列(128文字未満)を読み込む'('\n',[]) :- !.
'文字列(128文字未満)を読み込む'(C,[C|R]) :-
  get_char(C2),
  '文字列(128文字未満)を読み込む'(C2,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
program :-
  user_parameters([_ファイル名]),
  open(_ファイル名,read,Instream),
  get_char(Instream,C),
  '文字列(128文字未満)を読み込む'(Instream,C,L),
  length(L,N),
  write_formatted('%t文字です\n',[N]),
  close(Instream).

'文字列(128文字未満)を読み込む'(_,'\n',[]) :- !.
'文字列(128文字未満)を読み込む'(Instream,C,[C|R]) :-
  get_char(Instream,C2),
  '文字列(128文字未満)を読み込む'(Instream,C2,R).
569デフォルトの名無しさん:2009/12/09(水) 18:34:13
>>17 問題1
使用言語: Yacas

In> f(n):="abcdefghijklmnopqrstuvwxyz"[1 .. Min(n,26)]
Out> True
In> f(6)
Out> "abcdef"
In> f(30)
Out> "abcdefghijklmnopqrstuvwxyz"
570デフォルトの名無しさん:2009/12/09(水) 18:48:40
>>17 問題2
使用言語: Yacas

In> f(n):=Sum(i,1,n,If(Mod(i,3)=0 Or Mod(i,5)=0,i,0))
Out> True
In> f(10)
Out> 33
In> f(100)
Out> 2418
571デフォルトの名無しさん:2009/12/09(水) 20:12:52
>>511
使用言語: Yacas

In> f(x,y):=Echo("{鶴の数,亀の数} = ",SolveMatrix({{1,1},{2,4}},{x,y}))
Out> True
In> f(3,8)
{鶴の数,亀の数} = {2,1}
Out> True
In> f(10,24)
{鶴の数,亀の数} = {8,2}
Out> True
572デフォルトの名無しさん:2009/12/09(水) 21:22:41
http://pc12.2ch.net/test/read.cgi/tech/1258158172/858
# ../test/read.cgi/tech/1258158172/857
#
# [1] 授業単元: forとかwhileとか
# [2] 問題文(含コード&リンク):
# ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める.
# (a) 区間を10分割してどの区間に解があるかを求めるプログラムを作成しなさい.
# (b) 解がある区間が見つかったら,さらにその区間を10分割してどの区間に解があるかを求めるという作業を5回繰り返すプログラムを作成しなさい.
#
# (補足)2分法
# 2分法とは,中間値の定理に根拠をおいて,数式的に解くことのできない方程式の解を求める方法である.
# 下図に示すように,xの値を少しずつ変化させた場合に,隣り合う二つのf(x)の値の符号が異なる区間が存在すると,その方程式の解はその区間内に存在する.
# 区間を少しずつ狭めていくことにより,その方程式の近似解を求めることができる.方程式の近時解法として代表的なものには2分法の他に,ニュートン法もある.
#
573デフォルトの名無しさん:2009/12/09(水) 21:23:58
http://pc12.2ch.net/test/read.cgi/tech/1258158172/859
#
# [1] 授業単元: forとかwhileとか
# [2] 問題文(含コード&リンク): 関数y=x3+1の微分曲線を求めるプログラムを作成しなさい.計算範囲は0≦x≦2とし,間隔は0.1とする.
#
#
574デフォルトの名無しさん:2009/12/10(木) 04:23:15
http://pc12.2ch.net/test/read.cgi/tech/1258158172/862
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク):
# 課題 リスト処理
#   実行結果のようにキーボードから入力して整数を入力順にリストに格納し、入力値に
# 番号を付けて表示するプログラムを作成しなさい.ただし入力の終了はCtrl+dで行えるようにすること。
# 入力する値や個数が実行例と異なる場合にも正しく動作するようにすること.
# 必ず1個以上の整数が入力されるとする.
#
# [実行結果]
# 整数を順番に入力してください.
# 5
# 10
# 15
# 入力データは以下の通りです.
# [1] 5
# [2] 10
# [3] 15
575デフォルトの名無しさん:2009/12/10(木) 04:27:37
http://pc12.2ch.net/test/read.cgi/tech/1258158172/863
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10253.txt
#
# ●問題1‐1 反復型処理(ビット列の表示)
#  符号なし32bit整数を入力して、その数を2進表示するプログラムを作成しなさい。
# さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切ること。
#
# [実行結果]
# 符号なし32bit整数を入力してください.
# 987654321
# 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 です.
# 0のビット数は15,1のビット数は17です.

576デフォルトの名無しさん:2009/12/10(木) 04:32:17
http://pc12.2ch.net/test/read.cgi/tech/1258158172/863
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10253.txt
# ●問題1‐2
#  符号なし32bit整数を2つ入力して、それらを2進表示するプログラムを作成しなさい。
# さらに、実行例のようにビット反転(1の補数表示〜),ビットシフト(<<, >>), ビット論理積(&),ビット論理和(|),
# ビット排他的論理和(^)を表示しなさい。ただし2進表示は4桁ずつ区切ること.
# また問題1‐1で作成した2進表示の関数を再利用すること。
# [実行結果]
# 符号なし32bit整数2つを入力してください.
# 987654321 123456789
# 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 ,
# 123456789 は2進表示で 0000 0111 0101 1011 1100 1101 0001 0101 です.
# 〜987654321 は2進表示で 1100 0101 0010 0001 10010111 0100 1110 ,
# 〜123456789 は2進表示で 1111 1000 1010 0100 0011 0010 1110 1010 です.
# 987654321 << 1は2進表示で 0111 0101 1011 1100 1101 0001 0110 0010 ,
# 123456789 >> 1は2進表示で 0000 0011 1010 1101 1110 0110 1000 1010 です.
# 987654321 & 123456879 は2進表示で 0000 0010 0101 1010 0100 1000 0001 0001 です
# 987654321 | 123456879 は2進表示で 0011 1111 1101 1111 1110 1101 1011 0101 です.
# 987654321 ^ 123456879 は2進表示で 0011 1101 1000 0101 1010 0101 1010 0100 です.
577デフォルトの名無しさん:2009/12/10(木) 04:33:39
http://pc12.2ch.net/test/read.cgi/tech/1258158172/869
# [1] 授業単元:c言語
# [2] 問題文(含コード&リンク):
# 文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。 ただし標準ライブラリは使用しないこと。
#
578デフォルトの名無しさん:2009/12/10(木) 04:39:48
http://pc12.2ch.net/test/read.cgi/tech/1258158172/886
#
# [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10254.txt
#
# ★演習問題1-6*
# 2個のlnt型整数値a,bを,それぞれを指すポインタを用いて入れ替える
# 関数
# swap(int*a,lnt*b)
# を作成せよ.
#  (実行例)
# 2個の整数を入力してください.
# 整数A:24
# 整数B:25
# これらの値を交換しました.
# 整数A:25です.
# 整数B:24です.
579デフォルトの名無しさん:2009/12/10(木) 04:43:36
http://pc12.2ch.net/test/read.cgi/tech/1258158172/886
#
# [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10254.txt
#
# ★演習問題1-7*
# 3個のlnt型整数値を,昇順に並び変える関数を作成し,実行結果により
# この関数が正しく動作することを確認せよ.(先の課題の関数swapを使用する・)
#  (実行例)# 2個の整数を入力してください.
# 整数A:32
# 整数B:48
# 整数C:15
# これらの値を交換しました.
# 整数A:15
# 整数B:32
# 整数C:48
580デフォルトの名無しさん:2009/12/10(木) 04:56:22
http://pc12.2ch.net/test/read.cgi/tech/1258158172/886
#
# [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10254.txt
# ★演習問題1-9*
# 1〜10までの整数の和を求めるプログラムをポインタを使って求めよ.(時
# 間があり,可能であれば,平均も求めよ:こちらは任意課題とする),
581デフォルトの名無しさん:2009/12/10(木) 04:58:27
http://pc12.2ch.net/test/read.cgi/tech/1258158172/886
#
# [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10254.txt
# ★演習問題1-10
# 大きさ10の整数型配列を用意し,図2のように初期設定しなさい。この
# 配列を順に調べ、奇数の値のみ,別の大きさ10の整数型配列に代入しな
# さい.また,配列の中身と,何個格納したかを画面表示しなさい.
582デフォルトの名無しさん:2009/12/10(木) 07:55:15
>>573
% Prolog

f(X,Y) :- Y is X ^ 3 + 1.

'関数y=x3+1の微分曲線を求める'(L) :-
  '関数y=x3+1の微分曲線を求める'(0,2,0,0.1,L).

'関数y=x3+1の微分曲線を求める'(X1,XMax,Y1,_間隔,[]) :- X1 >= XMax,!.
'関数y=x3+1の微分曲線を求める'(X1,XMax,Y1,_間隔,[[X,Z]|R]) :-
  X is X1 + _間隔,
  f(X,Y),
  Z is (Y-Y1) / _間隔,
  '関数y=x3+1の微分曲線を求める'(X,XMax,Y,_間隔,R).
583デフォルトの名無しさん:2009/12/10(木) 08:00:37
>>572
% Prolog

ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,X) :-
  ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,0,X,Y,X).

ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,P,X,A,X) :-
  abs((pi * X * X) - Y) < 0.01,!.
ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,P,Z,A,X) :-
  (pi * Z * Z) < Y,
  Z2 is (P + Z) / 2,
  ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,P,Z2,Z,X),!.
ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,P,Z,A,X) :-
  Z2 is (A + Z) / 2,
  ycm2の面積を有する円の半径xを,2分法を用いて近似解を求める(Y,Z,Z2,A,X).
584デフォルトの名無しさん:2009/12/10(木) 08:15:11
>>574
% Prolog

キーボードから入力して整数を入力順にリストに格納し、入力値に番号を付けて表示す
る :-
  write('整数を順番に入力してください. \n'),
  キーボードから入力して整数を入力順にリストに格納する(L),
  write('入力データは以下の通りです. \n'),
  入力値に番号を付けて表示する(1,L).

キーボードから入力して整数を入力順にリストに格納する([]).
キーボードから入力して整数を入力順にリストに格納する([N|R]) :-
  get_integer(N),
  キーボードから入力して整数を入力順にリストに格納する(R).

入力値に番号を付けて表示する(1,[]).
入力値に番号を付けて表示する(N,[A|R]) :-
  write_formatted('[%t] %t\n',[N,A]),
  N2 is N + 1,
  入力値に番号を付けて表示する(N2,R).
585デフォルトの名無しさん:2009/12/10(木) 08:51:45
>>577
% Prolog

文字列ABCDEFGHIJKLMNに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示する :-
  atom_chars('ABCDEFGHIJKLMN',Chars),
  write('文字列を入力してください :'),
  get_line(_文字列),
  sub_atom(_文字列,0,1,_,_第1文字),
  sub_atom(_文字列,1,1,_,_第2文字),
  append(L1,[_第1文字|L2],Chars),
  第1文字目と第2文字目の間にある文字列(_第2文字,L1,L2,L),
  concat_atom(L,_第1文字目と第2文字目の間にある文字列),
  write_formatted('第1文字目と第2文字目の間にある文字列は %t です\n',[_第1文字目と第2文字目の間にある文字列]).

第1文字目と第2文字目の間にある文字列(_第2文字,L1,_,L) :-
  append(_,[_第2文字|L],L1),!.
第1文字目と第2文字目の間にある文字列(_第2文字,_,L2,L) :-
  append(L,[_第2文字|_],L2),!.
586デフォルトの名無しさん:2009/12/10(木) 10:34:09
>>575
% Prolog

符号なし32bit整数を入力して、その数を2進表示する。さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切る :-
二進数(1234218219,L1),
'N個組'(4,L1,L2),
findall(B,(member(A,L2),concat_atom(A,B)),L3),
concat_atom(L3,' ',S),
write_formatted('%tは2進表示で%tです.\n',[N,S]),
count(member(0,L1),Count0),
count(member(1,L1),Count1),
write_formatted('0のビット数は%t,1のビット数は%tです.\n',[Count0,Count1]).

% 二進数/2 'N個組'/3 count/2 は http://nojiriko.asia/prolog/c132_863_1.html を参照
587デフォルトの名無しさん:2009/12/10(木) 10:38:41
>>586 (>>585) 訂正
% Prolog

符号なし32bit整数を入力して、その数を2進表示する。さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切る :-
  write('符号なし32bit整数を入力してください. \n'),
  get_integer(_十進数),
  二進数(_十進数,L1),
  'N個組'(4,L1,L2),
  findall(B,(member(A,L2),concat_atom(A,B)),L3),
  concat_atom(L3,' ',S),
  write_formatted('%tは2進表示で%tです.\n',[N,S]),
  count(member(0,L1),Count0),
  count(member(1,L1),Count1),
  write_formatted('0のビット数は%t,1のビット数は%tです.\n',[Count0,Count1]).

% 二進数/2 'N個組'/3 count/2 は http://nojiriko.asia/prolog/c132_863_1.html を参照
588デフォルトの名無しさん:2009/12/10(木) 12:41:27
http://pc12.2ch.net/test/read.cgi/tech/1248012902/584
# 【 課題 】 http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htmの857です
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】指定なし
# 【 期限 】12/11
# 【 Ver  】1.6.0_16
#
# よろしくお願いします
#
#
# 以下の2文を同一と認識できるようなプログラムを作成せよ
# ?が先頭の単語は変数とする
#
# '?x' :- 対応する要素が大文字であっても小文字であってもよい.
# '?y' :- 大文字小文字の区別をする.
#
# ・?x is ?y and ?x name(?x)
# ・Rose is rose and ?y name(Rose)
#
589デフォルトの名無しさん:2009/12/10(木) 12:45:34
>>588 間違いました。途中、私が書き込んだメモが入ってしまった。
http://pc12.2ch.net/test/read.cgi/tech/1248012902/584
# 【 課題 】 http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htmの857です
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】指定なし
# 【 期限 】12/11
# 【 Ver  】1.6.0_16
#
# よろしくお願いします
#
#
# 以下の2文を同一と認識できるようなプログラムを作成せよ
# ?が先頭の単語は変数とする
#
# ・?x is ?y and ?x name(?x)
# ・Rose is rose and ?y name(Rose)
#
590デフォルトの名無しさん:2009/12/10(木) 12:58:28
http://pc12.2ch.net/test/read.cgi/tech/1258158172/890
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# sinxをテイラー展開しn項目で打ち切ったものについて
# xについては0から2πまでの範囲を0.05π刻みでけいさんし、nについてはn=1,2,3,4(すなわち3次、5次、7次、9次までの展開)について計算し
# x   sinx 3次まで ・・・・・9次まで
# 0.0 …
# 0.157 …
# のような数表を自分で指定したファイルに出力するプログラムを作成しなさい。
#
591デフォルトの名無しさん:2009/12/10(木) 13:50:47
>>576
% Prolog これは完全に既出でしかも分量が大きいから以前のものを参照してください。
% ビット演算

http://nojiriko.asia/prolog/t855.html
592デフォルトの名無しさん:2009/12/10(木) 14:53:47
http://pc12.2ch.net/test/read.cgi/tech/1258158172/904
# [1] 授業単元: forとかwhileとか
# [2] 問題文(含コード&リンク): ある整数を入力し,その約数をすべてと約数の個数を表示するプログラムを作成しなさい.
#
593デフォルトの名無しさん:2009/12/10(木) 14:59:47
>>592
% Prolog

ある整数を入力し,その約数をすべてと約数の個数を表示する :-
  get_integer(N),
  count((for(1,M,N),0 is N mod M,write_formatted('%t ',[M])),Count),
  write_formatted('\n約数の個数は%tです\n',[Count]).

% count/2 の定義は http://nojiriko.asia/prolog/c132_863_1.html 参照
594デフォルトの名無しさん:2009/12/10(木) 15:03:56
http://pc12.2ch.net/test/read.cgi/tech/1258158172/907
# [2] 問題文(含コード&リンク): ある整数を入力し,それより小さい素数をすべて表示するプログラムを作成しなさい.

595デフォルトの名無しさん:2009/12/10(木) 15:22:53
>>594
% Prolog

ある整数を入力し,それより小さい素数をすべて表示する :-
  write('整数を入力してください : '),
  get_integer(N),
  N1 is N - 1,
  素数生成(N1,L),
  concat_atom(L,',',S),
  write_formatted('%tより小さいすべての素数は %t です\n',[N,S]).

% 素数生成/2 は http://nojiriko.asia/prolog/t266.html 参照
596デフォルトの名無しさん:2009/12/10(木) 18:33:35
>>590
% Prolog

'sin(X)をテイラー展開'(_ファイル名) :-
tell(_ファイル名),
テイラー展開(0.0),
told.

テイラー展開(F) :- F > 2 * pi,!.
テイラー展開(F) :- Y is sin(F),write_formatted('%3.1f %8.7f ',[F,Y]),fail.
テイラー展開(F) :-
for(1,N,4),テイラー展開(sin(F),N,Y),write_formatted('%8.7f ',[Y]),N=4,
write('\n'),
F2 is F + pi * 0.05,
テイラー展開(F2).
? ? 
  for(1,N,4),テイラー展開(sin(F),N,Y),write_formatted('%8.7f ',[Y]),N=4,
  write('\n'),
  F2 is F + pi * 0.05,
  テイラー展開(F2).

テイラー展開(sin(X),N,Y) :-
  findsum(Z,(for(0,M,N),テイラー展開の二(sin(X),M,Z)),Y).

テイラー展開の二(sin(X),N,Y) :-
  U is 2 * N + 1,
  階乗(U,U2),
  Y is (((-1) ^ N) / U2) * (X ^ (2 * N + 1)).
597デフォルトの名無しさん:2009/12/10(木) 18:39:07
>>590 書き直し
% Prolog 冪乗計算がオーバーフローするのかな。X = 2.0 辺りからおかしくなる。

'sin(X)をテイラー展開'(_ファイル名) :-
  tell(_ファイル名),
  テイラー展開(0.0),
  told.

テイラー展開(F) :- F > 2 * pi,!.
テイラー展開(F) :- Y is sin(F),write_formatted('%5.3f %8.7f ',[F,Y]),fail.
テイラー展開(F) :-
  for(1,N,4),テイラー展開(sin(F),N,Y),write_formatted('%8.7f ',[Y]),N=4,
  write('\n'),
  F2 is F + pi * 0.05,
  テイラー展開(F2).

テイラー展開(sin(X),N,Y) :-
  findsum(Z,(for(0,M,N),テイラー展開の二(sin(X),M,Z)),Y).

テイラー展開の二(sin(X),N,Y) :-
  U is 2 * N + 1,
  階乗(U,U2),
  Y is (((-1) ^ N) / U2) * (X ^ (2 * N + 1)).
598デフォルトの名無しさん:2009/12/10(木) 21:05:37
>>589
% Prolog
'2文を同一と認識'(_文1,_文2) :-
  'SPLIT'(_文1,[' ','(',')'],L1),delete_space(L1,L11),
  'SPLIT'(_文2,[' ','(',')'],L2),delete_space(L2,L22),
   変数置換(L11,L22,X,Y),
   X = Y.

delete_space(L1,L2) :- findall(A,(member(A,L1),\+(A=' ')),L2).

変数置換(L1,L2,VL1,VL2) :-
  length(L1,Len),length(VL1,Len),length(VL2,Len),
  append(L1,L2,L3),
  変数置換の二(X,L3,L4),
  append(VL1,VL2,L4).

変数置換の二(_,[],[]) :- !.
変数置換の二(X,[A1|R1],[X|R2]) :-
  \+(var(A1)),atom(A1),
  sub_atom(A1,0,2,_,'?x'),
  変数置換の二(X,R1,R2),!.
変数置換の二(X,[A1|R1],[_|R2]) :-
  \+(var(A1)),atom(A1),
  sub_atom(A1,0,2,_,'?y'),
  変数置換の二(X,R1,R2),!.
数置換の二(X,[A|R1],[A|R2]) :- 変数置換の二(X,R1,R2),!.
599デフォルトの名無しさん:2009/12/11(金) 03:59:19
>>598
匿名変数は・・・。全部が匿名変数だという解釈で済んでしまう。
600デフォルトの名無しさん:2009/12/11(金) 04:16:03
>>598
それから、'SPLIT'/3の定義がないけど、

?- 'SPLIT'(abcdefg,[b,e],X).

X = [a,b,cd,e,fg]

でいいのかい?
601デフォルトの名無しさん:2009/12/11(金) 04:41:50
>>580
% Prolog
% ポインター云々とは何の関係もないが、利用しやすい総和の定義。

総和(_から,_まで,_何番目,_まででは,_総和) :-
  総和(_から,_まで,0,1,_何番目,_まででは,_総和).

総和(M,N,X,Nth1,Nth,M,X) :- M > N,!,fail.
総和(M,N,Y,Nth,Nth,M,X) :- X is Y + M.
総和(M,N,Y,Nth1,Nth,Z,X) :-
  M2 is M + 1,
  Y2 is Y + M,
  Nth2 is Nth1 + 1,
  総和(M2,N,Y2,Nth2,Nth,Z,X).
602デフォルトの名無しさん:2009/12/11(金) 12:02:10
>>599
確かにw 書き直します。Prologの変数を使うとうまくいかないようですね。
>>600 述語 'SPLIT'/3 は
http://nojiriko.asia/prolog/split_2.html を参照してください。
いろんなパターンが定義されています。
603デフォルトの名無しさん:2009/12/11(金) 15:37:00
http://pc12.2ch.net/test/read.cgi/tech/1258158172/949
# /* オリジナル関数calc */
# /* calc(入力データ、計算結果のアドレスを格納するポインタ) */
# int calc(double input_data, double * data_ptr)
# {
# /*ポインタを使って、呼び出し元のデータ格納場所に値を設定 */
# *data_ptr = input_data * 2;
# return0; /* 正常終了 */
# }
#
# 上記プログラムを参考に、
# 二つの入力データの変数(倍精度実数型)
# double input_data1, input_data2;
# に対しての、四則演算(+、−、*、/)の結果を、それぞれ
# double plus_data, minus_data, multiply_data, divide_data;
# の4変数に設定する機能を持つ、オリジナル関数calcを作成せよ。
# ただし、main関数上でのcalc関数の呼び出し方法は、以下のようにすること。
# calc(inpt_data1, input_data2, &plus_data, &minus_data, &multiply_data, _data);
# 最後に、main関数上で上記4変数に格納された計算結果を画面に出力せよ。
# 以上の仕様のプログラムを、calc.cという名前で作成せよ。
# calc.cをVisual Studioで実行して、実行結果をcalc.c内の文末に「コメント行」と
して記載せよ 。
604デフォルトの名無しさん:2009/12/11(金) 15:47:01
>>603
% Prolog
program :-
  user_parameters([Atom1,Atom2]),
  atom_to_term(Atom1,Input_data1,_),
  atom_to_term(Atom2,Input_data2,_),
  calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data),
  write_formatted('%t + %t = %t\n',[Input_data1,Input_data2,Plus_data]),
  write_formatted('%t - %t = %t\n',[Input_data1,Input_data2,Minus_data]),
  write_formatted('%t * %t = %t\n',[Input_data1,Input_data2,Multiply_data]),
  write_formatted('%t / %t = %t\n',[Input_data1,Input_data2,Divide_data]).

calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data) :-
  Plus_data is Input_data1 + Input_data2,
  Minus_data is Input_data1 - Input_data2,
  Multiply_data is Input_data1 * Input_data2,
  Divide_data is Input_data1 / Input_data2.
605デフォルトの名無しさん:2009/12/11(金) 17:03:38
http://pc12.2ch.net/test/read.cgi/tech/1258158172/966
# 下のように支払い金額の計算書を出力するように下のプログラムを修正してください。
# menu0 650 1 650
# menu1 680 2 1360
# menu2 720 3 2160
# menu3 840 2 1680
# menu4 920 1 920
# menu5 980 0 0
# menu6 1080 0 0
# menu7 1280 1 1280
# goukei 10 6370
#
# メニュー番号を10回打ち込んでメニューそれぞれの個数と合計を出力する感じです。
606デフォルトの名無しさん:2009/12/11(金) 17:27:52
>>605
% Prolog その1
単価表(menu0,650).
単価表(menu1,680).
単価表(menu2,720).
単価表(menu3,840).
単価表(menu4,920).
単価表(menu5,980).
単価表(menu6,1080).
単価表(menu7,1280).

支払い金額の計算書を出力する :-
  length(L,10),
  メニュー番号と数量を10回打ち込む(L),
  支払い金額の計算書を出力する(L).

支払い金額の計算書を出力する(L) :-
  単価表(Menu,_単価),
  findsum(_数量,member([Menu,_数量],L),_合計数量),
  _合計金額 is _合計数量 * _単価,
  write_formatted('%t %t %t %t\n',[Menu,_単価,_合計数量,_合計金額]),
  fail.
支払い金額の計算書を出力する(L) :-
  findsum([_数量,_金額],(単価表(Menu,_単価),member([Menu,_数量],L),_金額 is _数量 * _単価),[_合計数量,_合計金額]),
  write_formatted('gokei %5s %t %t\n',[Menu,' ',_合計数量,_合計金額]).
607デフォルトの名無しさん:2009/12/11(金) 17:29:14
>>605
% Prolog その2

メニュー番号と数量を10回打ち込む([]).
メニュー番号と数量を10回打ち込む([L1|R]) :-
  get_split_line([' ',','],L1),
  メニュー番号と数量を10回打ち込む(R).
608デフォルトの名無しさん:2009/12/11(金) 18:01:35
http://science6.2ch.net/test/read.cgi/informatics/1155976582/70
# 1:あるグラフGはk個の連結成分からなり、各成分は木。
# Gの頂点の個数をnとするとき、Fの辺の個数はいくつか
#
# 2:連結な平面グラフGにおいて、頂点の個数をn、辺の個数をm
# Gは閉路を含むが辺を1つずつ除去することで閉路を含まない連結グラフを作る
# 最低いくつの辺を除去すればよいか
# 宿題なんだけど教えてくれ
609デフォルトの名無しさん:2009/12/11(金) 18:36:02
http://pc12.2ch.net/test/read.cgi/tech/1245017721/12
# 実際の問題を簡単にした問題例です。
#
# 流れ:
# キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
# ということを目標金額まで繰り返し、到達したらその金がなくなるまで
# 家でごろ寝し、なくなったらまた働く
#
# キャラクタは
#   ・バイトをする : 手持ちが1増える
#   ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
#   ・家で寝る : 貯金が1減る
# の状態を取ります。
# 財布の許容量は3、目標貯金額は5とします。
#

610デフォルトの名無しさん:2009/12/11(金) 19:42:33
http://pc12.2ch.net/test/read.cgi/tech/1258158172/975
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
#
# ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10258.txt
#
# 表1のように,あるコンテストに関する4人の5点満点のデータがあるとき,「各個人の得点の平均を
# 求める」,「平均点より表2のような評価を行う」,「データや平均点及び評価を表示する」の3つのユーザ定義関数を用いて結果を表示する。
#
# 表1
#
# http://fx.104ban.com/up/src/up10430.jpg
#
# 考え方
# データのNoと点数はmain 関数の中で初期化する。そして各人の点数を引数として平均値を求める
# ユーザ定義関数,平均値を引数として評価を求めるユーザ定義関数,データNoと点数と平均値と評価を
# 引数として表示を行うユーザ定義関数を別々に定義し,これらのユーザ定義関数をmain関数の中で呼び
# 出して結果を表示するプログラムとする。
611デフォルトの名無しさん:2009/12/11(金) 20:18:46
612デフォルトの名無しさん:2009/12/12(土) 02:35:49
http://pc12.2ch.net/test/read.cgi/tech/1260532772/2
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10259.txt
#
# 問題文が長いためここに載せられません。[2]のリンクを参照してください
613デフォルトの名無しさん:2009/12/12(土) 02:40:13
http://pc12.2ch.net/test/read.cgi/tech/1136994325/977
# ターミナル上でテキストを編集するプログラムを作成せよ
# 以下のコマンドも使えるようにする事
#
# i =テキスト挿入
# p =単語の手前にポインタ移動
# d =入力した数だけポインタの後ろの文字を消す
# c =入力した文字列をポインタの後の文字列に置き換える
# s =ポインタの後に空白挿入
# q =終了
#
614デフォルトの名無しさん:2009/12/12(土) 02:45:47
http://pc12.2ch.net/test/read.cgi/tech/1248012902/602
# 【 課題 】複数人の名前を入力してから3教科の点数を全員分入力し、各教科の平均点と、最高点と取った人の名前を表示せよ。

615デフォルトの名無しさん:2009/12/12(土) 04:10:37
http://pc12.2ch.net/test/read.cgi/tech/1260532772/5
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): 5教科のテストの点数を入力し、それらの合計点を算出するようなプログラムを作成せよ。実行結果の例を以下に示す。
# -----------------------------------------------
# 国語:?
# 算数:?
# 理科:?
# 社会:?
# 英語:?
# 合計点は?点です。
616デフォルトの名無しさん:2009/12/12(土) 04:28:23
>>615
% Prolog

'5教科'(国語).
'5教科'(算数).
'5教科'(理科).
'5教科'(社会).
'5教科'(英語).

'5教科のテストの点数を入力し、それらの合計点を算出して表示する' :-
  '5教科のテストの点数を入力し、それらの合計点を算出'(_合計点),
  write_formatted('合計点は%t点です\n',[_合計点]).

'5教科のテストの点数を入力し、それらの合計点を算出'(_合計点) :-
  findsum(_点数,('5教科'(_教科),催促付き整数入力('%t : ',[_教科],_点数)),_合計点).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
催促付き整数入力(_表示パターン,_催促情報ならび,_整数) :-
  write_formatted(_表示パターン,_催促情報ならび),
  get_integer(_整数),!.

催促付き整数入力(_催促,_整数) :-
  write(_催促),
  get_integer(_整数),!.
617デフォルトの名無しさん:2009/12/12(土) 06:08:41
>>614->>616
結構微妙で楽しいね。'3教科'が国語・数学・英語で、'5教科'は
国語・算数・理科・社会・英語なのか。それが常識? ではなさそう。
それとも、この小学校私立かな。結局、3教科の方は手を付けず、
>>615 だけは実行結果の「例」からリバースエンジニアリングすることにした。
そもそも実行結果の例から仕様を改竄する態度を教育していいものかという疑問は残る。
618デフォルトの名無しさん:2009/12/12(土) 06:36:20
>>612 の最初の課題は
# ●基本課題 1a (2分木データの生成と表示)
# 2分木の節を格納するためのデータ構造(Tree 型)を,次のように定義する.
#
# typedef struct _tree {
# char node; /* 節のデータ (1文字) */
# struct _tree *left; /* 左の子へのポインタ */
# struct _tree *right; /* 右の子へのポインタ */
# } Tree;
#
# 2分木の枝と葉のデータを生成するための次の2つの関数を作れ.
#
# Tree *branch(char x, Tree *l, Tree *r);
# 節を格納する記憶領域を確保
# 節を初期化(節データを x,左右の子へのポインタを l, r に設定)
# 生成した Tree 型データへのポインタを戻り値として返す
#
# Tree *leaf(char x);
# 節を格納する記憶領域を確保
# 節を初期化(節データを x,左右の子へのポインタを NULL に設定)
# 生成した Tree 型データへのポインタを戻り値として返す
619デフォルトの名無しさん:2009/12/12(土) 06:37:51
すみません。肝心な部分が切れてしまった。あと二行追加です。

# 関数 branch() と leaf() を使って,算術式を表す2分木のデータを生成し,
# 各2分木の根へのポインタを,Tree * 型の変数に格納せよ.
620デフォルトの名無しさん:2009/12/12(土) 06:38:59
>>612 二番目の課題です。

# ●基本課題 1b (2分木を扱う再帰関数の作成)
#
# 2分木の「高さ」を求める関数 height() を作れ.
# また,十分な数の検査データを作り,動作の正しさを検証せよ.
621デフォルトの名無しさん:2009/12/12(土) 07:34:47
622デフォルトの名無しさん:2009/12/12(土) 10:07:51
http://pc12.2ch.net/test/read.cgi/tech/1260532772/6
# 問題5
# 英字アルファベット大文字を入力すると、その文字の小文字が表示されるようなプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# アルファベットの大文字を入力して下さい:A
# 小文字はaです。
# ------------------------------------------------
623デフォルトの名無しさん:2009/12/12(土) 10:13:26
>>622
% Prolog 何度も何度も繰り返される課題。ここでは、少し変化してみよう。

大文字小文字の対応表を定義する(_対応表述語名) :-
  abolish(_対応表述語名/2),
  for(65,N,90),
  N2 is N + 32,
  char_code(_大文字,N),
  char_code(_小文字,N2),
  P =.. [_対応表述語名,_大文字,_小文字],
  assertz(P),
  N=90,!.

:- 大文字小文字の対応表を定義する('A,a...Z,z').

英字アルファベット大文字を入力すると、その文字の小文字が表示される :-
  write('大文字をいれてください :'),
  rawmode,
  get_char(C),
  'A,a...Z,z'(CC,Cc),
  put_char(Cc),
  norawmode,
  write_formatted('小文字は%tです。\n',[Cc]).
624デフォルトの名無しさん:2009/12/12(土) 10:16:31
>>623 途端に間違えた。 訂正。

英字アルファベット大文字を入力すると、その文字の小文字が表示される :-
  write('大文字をいれてください :'),
  rawmode,
  get_char(CC),
  'A,a...Z,z'(CC,Cc),
  put_char(Cc),
  norawmode,
  write_formatted('小文字は%tです。\n',[Cc]).
625デフォルトの名無しさん:2009/12/12(土) 11:19:50
626デフォルトの名無しさん:2009/12/12(土) 11:37:32
http://pc12.2ch.net/test/read.cgi/tech/1260532772/10
# [1]単元 初等C言語
# [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には
# 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表
# 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー
# マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に
# yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単
# 位、日単位で出力するプログラム(小数点一位以下四捨五入)
# 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。
# また9999年12月31日23時59分59秒以後の時刻も与えられないとする。
# うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日
# にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒
# は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する
627デフォルトの名無しさん:2009/12/12(土) 12:50:30
http://pc12.2ch.net/test/read.cgi/tech/1260532772/6
#
# 問題4
# 平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出するプログラムを作成せよ。Aの平方根はsqrt(A)という数学関数で算出される(Aは引数でdouble型)。
# 数学関数を使用する場合、<math.h>というファイルから情報を得なければならないので、#include<stdio.h>の
# 下の行に#include<math.h>という命令文を付け加えなければならない(2つのinclude文)。実行結果の例を以下に示す。
# ------------------------------------------------
# x1:0
# y1:0
# x2:1
# y2:1
# この2点間の距離は1.414214です。
628デフォルトの名無しさん:2009/12/12(土) 12:52:18
>>627
% Prolog

'平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する' :-
  '2点の座標を得る'([x1,y1,x2,y2],[X1,Y1,X2,Y2]),
  平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離),
  write_formatted('この2点間の距離は%tです。\n',[_2点間の距離]).

'2点の座標を得る'([],[]) :- !.
'2点の座標を得る'([A|R1],[V|R2]) :-
  concat_atom([A,' :'],S),
  write(S),
  get_line(Line),
  atom_to_term(Line,V,_),
  '2点の座標を得る'(R1,R2).

平面上の2点間の距離(X1,Y1,X2,Y2,_2点間の距離) :-
  _2点間の距離 is sqrt((X2-X1)^2 + (Y2-Y1)^2).
629デフォルトの名無しさん:2009/12/12(土) 13:09:28
http://pc12.2ch.net/test/read.cgi/tech/1260532772/6
#
# 問題2
# 長さX(cm:センチメートル)を入力すると、Y(inch:インチ)に変換するプログラムを作成せよ。1(inch)は2.54(cm)とする。実行結果の例を以下に示す。
# ------------------------------------------------
# 長さ(センチメートルで入力して下さい):2.54
# 2.54(cm)は 1.000(inch)です。
630デフォルトの名無しさん:2009/12/12(土) 13:10:35
>>629
% Prolog

'長さX(cm:センチメートル)を入力すると、Y(inch:インチ)に変換する' :-
  write('長さ(センチメートルで入力して下さい):'),
  get_line(Line),
  atom_to_term(Line,X,_),
  センチメートル・インチ変換(X,Y),
  write_formatted('%t (cm) は %t (inch) です。\n',[X,Y]).

センチメートル・インチ変換(X,Y) :-
  \+(var(X)),
  Y is X / 2.54.
センチメートル・インチ変換(X,Y) :-
  \+(var(Y)),
  X is Y * 2.54.
631デフォルトの名無しさん:2009/12/12(土) 13:28:57
>>630 訂正
% ! が必要ですね。

センチメートル・インチ変換(X,Y) :-
  \+(var(X)),
  Y is X / 2.54,!.
センチメートル・インチ変換(X,Y) :-
  \+(var(Y)),
  X is Y * 2.54.
632デフォルトの名無しさん:2009/12/12(土) 13:34:21
>>631
そのカットなんですが

センチメートル・インチ変換(X,Y) :-
  \+(var(X)),!,
  Y is X / 2.54.

の位置に入れるのとどちらが正しい?というか普通ですか。

633デフォルトの名無しさん:2009/12/12(土) 13:48:41
>>632
グリーンカットとレッドカットというような分類があって、
確か「Prologの技芸」などに詳しい説明があったと思います。
>>631 はグリーンカットかな。実は私は詳しく知りません。
忘れました。一般に ! を最後に書くことが多いと思いますが、それは、

1) .. p(_) :- p1,!,p2,p3, .. p7.
2) .. p(_) :- p1,p2,p3, .. p7,!.

2) の方が無駄なバックトラックが少なくなるからです。同時にp1から
p7がどんな性質の目標であったとしても、このp(_)は決定性の述語で
あることが明確になります。システム(処理系)とこのソースの読み手に
そのことを伝えるためのカットだと思えばよいでしょう。
634デフォルトの名無しさん:2009/12/12(土) 14:55:07
http://pc11.2ch.net/test/read.cgi/db/1252492296/344
# ID | NAME | DATA
# --+-------+-----
# 1 | tanaka | aa
# 2 | satou | bb
# 3 | suzuki | cc
#
# 例えばこんなテーブルがあったときに
# IDとNAMEに関してマッチするレコードを
# 取得するとしたら
#
# WHERE ID = 1 AND NAME = 'tanaka'
#
# としますけど、マッチングの条件が複数あるときって
#
# WHERE (ID = 1 AND NAME = 'tanaka') OR (ID = 2 AND NAME = 'satou')
#
# こんなふうに単純に書くしかないでしょうか?
# マッチング条件の対象列がひとつなら
#
# WHERE NAME in ('satou', 'suzuki')
#
# とできますが、複数列の場合にもこういうふうにまとめて書く方法がないかと思いまして・・・
635デフォルトの名無しさん:2009/12/12(土) 15:05:26
>>634
% Prolog

テーブル(1,tanaka,aa).
テーブル(2,satou,bb).
テーブル(3,suzuki,cc).

?- テーブル(1,takaka,Z);テーブル(2,satou,Z).

?- findall([X,Y,Z],(member([X,Y],[[1,tanaka],[2,satou]]),テーブル(X,Y,Z)),L).
636デフォルトの名無しさん:2009/12/12(土) 16:29:09
>>632
ごめんなさい。グリーンカットは>>631ではなくて>>632の方です。
637デフォルトの名無しさん:2009/12/12(土) 17:09:16
638635:2009/12/12(土) 17:27:18
>>634

?- テーブル(X,Y,Z),member([X,Y],[[1,tanaka],[2,satou]]).

?- member([X,Y],[[1,tanaka],[2,satou]]),テーブル(X,Y,Z).

?- テーブル(X,Y,Z),append(_,[[X,Y]|_],[[1,tanaka],[2,satou]]).

?- append(_,[[X,Y]|_],[[1,tanaka],[2,satou]]),テーブル(X,Y,Z).
639デフォルトの名無しさん:2009/12/12(土) 17:32:42
>>623
何をやっているのか、わかりません。真ん中あたりにある
:- から始まる行はなんですか?
640デフォルトの名無しさん:2009/12/12(土) 18:20:38
>>639
:- 大文字小文字の対応表を定義する('A,a...Z,z'). はその上に定義された
述語 大文字小文字の対応表を定義する/1 をインタプリタがconsultする時に
実行します(させています)。これによって、
'A,a...Z,z'('A',a).
'A,a...Z,z'('B',b).
<中略>
'A,a...Z,z'('Z',z).
という変換テーブルが定義されたことになります。一般にPrologのプログラマは
このような具体的な値による定義(外延的な定義)を好む傾向があります。
コードに32を足して小文字を生成するというようなルールは穢いと感じ、
そういうことは先に済ましてしまおう、というのがこのプログラムの趣旨です。
http://nojiriko.asia/prolog/t844.html などにも極端なコードが見られます。
ここではソースを読む人のために予め小さなプログラムを作ってソースを生成して
しまっています。このコードをキーボードから入力するのはさすがに億劫ですが、
プログラムを先に働かせて、視覚的なプログラムコードを用意します。
どちらも、本来実行時に計算されるであろうことと類似の計算を予め実行して
しまって、プログラマにとってより好ましいと感じるソースコードを生成して
いるという点で共通しています。
641デフォルトの名無しさん:2009/12/12(土) 18:29:49
http://pc12.2ch.net/test/read.cgi/tech/1260532772/32
# [1] 授業単元: プログラミング論
# [2] 問題文(含コード&リンク):
# 次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。
#
# A=[5 3]   B=[7 1 5 4]
#   [3 8]     [1 9 2 8]
#   [1 6]
#   [9 1]
#
# 解の表示)
#        [38 32 31 44]
#        [29 75 31 76]
#        [13 55 17 52]
#        [64 18 47 44]
642デフォルトの名無しさん:2009/12/12(土) 18:51:20
>>641
% Prolog

'A'([[5,3],[3,8],[1,6],[9,1]]).

'B'([[7,1,5,4],[1,9,2,8]]).

A・Bの行列をA×Bの計算をして、その結果を表示する :-
'A'(_行列A),
'B'(_行列B),
行列の積(_行列A,_行列B,_行列C),
行列の表示(_行列C).

% 行列の積/3,行列の表示/1 の定義は http://nojiriko.asia/prolog/c133_32.html 参照
643デフォルトの名無しさん:2009/12/12(土) 20:09:59
http://pc12.2ch.net/test/read.cgi/tech/1260532772/38
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10261.txt
#
# 以下のプログラムを作成せよ。
# プログラムは日付・休日かどうか・出費の分類(朝食・昼食・夕食・本・休日)、
# 出費の金額・買ったものの名前を順に尋ね、2にある構造体の配列(最大20件)に格納して
# 最後に配列のデータをファイルに追記する。連続で入力できるようにし、もしユーザが
# 日付で0年と入力すると終了するようにする。
#
# 残りの情報は http://nojiriko.asia/prolog/c133_38.html に載せておきます。
644デフォルトの名無しさん:2009/12/12(土) 21:15:45
>>643
# この問題どうせなら、入力は、
# 休日の2009年12月11日に朝食で食パンを350円 買い
# 休日の2009年12月11日にJumpという本を240円 買った
# の形式にしましょう。入力項目の出現順もある程度自由ということで。
645デフォルトの名無しさん:2009/12/12(土) 23:13:43
>>17 問題1
使用言語: Axiom

f(n)=="abcdefghijklmnopqrstuvwxyz"(1..min(n,26))

(20) -> f(6)
(20) "abcdef"
(21) -> f(30)
(21) "abcdefghijklmnopqrstuvwxyz"
646デフォルトの名無しさん:2009/12/12(土) 23:15:07
>>17 問題2
使用言語: Axiom

f(n)==reduce(+,[i for i in 1..n | rem(i,3)=0 or rem(i,5)=0])

(12) -> f(10)
(12) 33
(13) -> f(100)
(13) 2418
647デフォルトの名無しさん:2009/12/12(土) 23:17:05
>>182
使用言語: Axiom

print(matrix[[i*j for i in 1..10]for j in 1..10])

+1 2 3 4 5 6 7 8 9 10 +
| |
|2 4 6 8 10 12 14 16 18 20 |
| |
|3 6 9 12 15 18 21 24 27 30 |
| |
|4 8 12 16 20 24 28 32 36 40 |
| |
|5 10 15 20 25 30 35 40 45 50 |
| |
|6 12 18 24 30 36 42 48 54 60 |
| |
|7 14 21 28 35 42 49 56 63 70 |
| |
|8 16 24 32 40 48 56 64 72 80 |
| |
|9 18 27 36 45 54 63 72 81 90 |
| |
+10 20 30 40 50 60 70 80 90 100+
648デフォルトの名無しさん:2009/12/12(土) 23:18:08
>>45
使用言語: Axiom

-> fact(n)==reduce(*,[i for i in 1..n])
-> for i in 0..10 repeat print(fact(i))
1
1
2
6
24
120
720
5040
40320
362880
3628800
649デフォルトの名無しさん:2009/12/13(日) 01:00:04
>>575
使用言語: J

f=:monad define
a=.(32#2)#:y
b=.(,' '&,)/_4[\1":a
c0=.+/0=a
c1=.32-c0
smoutput (":y),' は2進表示で ',b,' です.'
smoutput '0のビット数は',(":c0),',1のビット数は',(":c1),'です.'
)

f 123456789
123456789 は2進表示で 0000 0111 0101 1011 1100 1101 0001 0101 です.
0のビット数は16,1のビット数は16です.
650デフォルトの名無しさん:2009/12/13(日) 01:50:16
>>575
使用言語: J

f=:monad define
a=.>:I.0=y|~>:i.y
smoutput '約数 = ',":a
smoutput '約数の数 = ',":#a
)

f 12345
約数 = 1 3 5 15 823 2469 4115 12345
約数の数 = 8
651デフォルトの名無しさん:2009/12/13(日) 01:56:21
>650
問題の番号間違えました。>>592でした。
652デフォルトの名無しさん:2009/12/13(日) 03:35:51
>>627
使用言語: J

f=:monad def '%:+/*:| -/_2,\y'

f 0 0 1 1
1.41421
f 0 1 2 3
2.82843
653デフォルトの名無しさん:2009/12/13(日) 03:37:42
>>629
使用言語: J

f=:(,&'(cm) = ')@": , (,&'(inch)')@":@%&2.54

f 1
1(cm) = 0.393701(inch)
f 2.54
2.54(cm) = 1(inch)
f 49
49(cm) = 19.2913(inch)
654デフォルトの名無しさん:2009/12/13(日) 03:56:56
http://pc12.2ch.net/test/read.cgi/tech/1260532772/67
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt
#
# 元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付
# までの日数を計算し,結果を表示するプログラムを作成したい.
655デフォルトの名無しさん:2009/12/13(日) 04:53:52
>>643 >>644
% Prolog 最初の入力解析部は(もう少し細かな解析が必要かもしれない)
解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を,買]).

入力文の解析(_文,_解析した文の要素) :-
解析上鍵となる言葉(_鍵言葉ならび),
sPLIT(_文,_鍵言葉ならび,L1),
有意な要素の収集(L1,_解析した文の要素),!.

有意な要素の収集(L,L1,_解析した文要素) :-
member(_出費の分類,[朝食,夕食,本,休日]),
\+(member(_出費の分類,L1)),
有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!.
有意な要素の収集(L,L1,_解析した文要素) :-
member(X,[年,月,日,円],
\+(member([_,X],L1)),
append(_,[A,X|_],L),
'整数か?ただし全角文字は整数に変換する'(A,N),
有意な要素の収集(L,[[N,月]|L1],_解析した文要素),!.
有意な要素の収集(L,L1,_解析した文要素) :-
append(L0,[_購入物,を|R],L),
\+(member(_購入物,[本,夕食,朝食,休日])),
\+(member([購入物_購入物],L1)),
有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!.
有意な要素の収集(_,解析した文要素,_解析した文要素) :- !.
656デフォルトの名無しさん:2009/12/13(日) 04:56:33
>>655 書き直し
解析上鍵となる言葉([休日,年,月,日,円,朝食,夕食,本,は,が,の,に,で,ために,へ,を,
買]).

入力文の解析(_文,_解析した文の要素) :-
  解析上鍵となる言葉(_鍵言葉ならび),
  sPLIT(_文,_鍵言葉ならび,L1),
  有意な要素の収集(L1,_解析した文の要素),!.

有意な要素の収集(L,L1,_解析した文要素) :-
  member(_出費の分類,[朝食,夕食,本,休日]),
  \+(member(_出費の分類,L1)),
  有意な要素の収集(L,[_出費の分類|L1],_解析した文要素),!.
有意な要素の収集(L,L1,_解析した文要素) :-
  member(X,[年,月,日,円],
  \+(member([_,X],L1)),
  append(_,[A,X|_],L),
  '整数か?ただし全角文字は整数に変換する'(A,N),
  有意な要素の収集(L,[[N,月]|L1],_解析した文要素),!.
有意な要素の収集(L,L1,_解析した文要素) :-
  append(L0,[_購入物,を|R],L),
  \+(member(_購入物,[本,夕食,朝食,休日])),
  \+(member([購入物_購入物],L1)),
  有意な要素の収集(L,[[購入物,_購入物]|L1],_解析した文要素),!.
有意な要素の収集(_,解析した文要素,_解析した文要素) :- !.
657デフォルトの名無しさん:2009/12/13(日) 05:03:37
>>656 訂正します。有意な要素の収集の第二定義(節)

有意な要素の収集(L,L1,_解析した文要素) :-
  member(X,[年,月,日,円],
  \+(member([X,_],L1)),
  append(_,[A,X|_],L),
  '整数か?ただし全角文字は整数に変換する'(A,N),
  有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!.


  有意な要素の収集(L,[[N,X]|L1],_解析した文要素),!.

% 月ではなくてXでなくてはいけません。
658デフォルトの名無しさん:2009/12/13(日) 05:27:11
これ抜けてました。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/6
問題3
ある整数Xを入力した時に、それを3で割った商と余りを算出するプログラムを作成せよ。余りを算出する演算子は%であるが、%を使わないこと。実行結果の例を以下に示す。
659デフォルトの名無しさん:2009/12/13(日) 05:32:40
>>658
% Prolog

ある整数Xを入力した時に、それを3で割った商と余りを算出する(N,_余り) :-
  length(L,N),
  '3で割った商と余りを算出する'(L,_余り).

'3で割った商と余りを算出する'([_,_,_|R],_余り) :-
  '3で割った商と余りを算出する'(R,_余り).
'3で割った商と余りを算出する'(L,_余り) :- length(L,_余り).
660デフォルトの名無しさん:2009/12/13(日) 05:39:41
>>659(>>658) 済みません。訂正。
% Prolog

ある整数Xを入力した時に、それを3で割った商と余りを算出する(X,_商,_余り) :-
  length(L,X),
  '3で割った商と余りを算出する'(L,[],_商,_余り).

'3で割った商と余りを算出する'([_,_,_|R],L1,_商,_余り) :-
  '3で割った商と余りを算出する'(R,[_|L1],_商,_余り).
'3で割った商と余りを算出する'(L,L1,_商,_余り) :- length(L1,_商),length(L,_余り).
661デフォルトの名無しさん:2009/12/13(日) 05:53:41
>>17 問題1
使用言語: Scilab

-->function out=f(n)
--> out=part('abcdefghijkmnopqrstuvwxyz',1:n)
-->endfunction

-->f(6)
ans =
abcdef
-->f(30)
ans =
abcdefghijkmnopqrstuvwxyz
662デフォルトの名無しさん:2009/12/13(日) 06:12:24
>>658
使用言語: J
J言語では、%は除算で、|が剰余です。

f=:monad def '(,(y-3&*))<.y%3'
f 35
11 2
663デフォルトの名無しさん:2009/12/13(日) 06:27:28
>>661
Scilab 初めて見ました。ありがとうございます。
664デフォルトの名無しさん:2009/12/13(日) 07:20:23
>>17 問題2
使用言語: Scilab

function out=f(n)
s=0
for i=1:n
if modulo(i,3)==0 | modulo(i,5)==0 then
s=s+i
end
end
out=s
endfunction

-->f(10)
ans =
33.

-->f(100)
ans =
2418.
665デフォルトの名無しさん:2009/12/13(日) 07:39:07
>>654
% Prolog (その一)
'元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-
  write('元号の頭文字,年,月,日 :'),
  get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]).

'元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-
  '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),
  元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),
  元年の西暦は(_元号,_元年の西暦年),
  _西暦年 is _元年の西暦年 + _年 - 1,
  その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),
  write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]).

その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-
  年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),
  _日数 is _前月末日までの日数 + _日.

年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-
  N is _月 - 1,
  findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数).
666デフォルトの名無しさん:2009/12/13(日) 07:41:13
>>654
% Prolog (その二)

元号の頭文字をローマ字変換した時にの最初の文字(明治,m).
元号の頭文字をローマ字変換した時にの最初の文字(大正,t).
元号の頭文字をローマ字変換した時にの最初の文字(昭和,s).
元号の頭文字をローマ字変換した時にの最初の文字(平成,h).

元年の西暦は(明治,1868).
元年の西暦は(大正,1912).
元年の西暦は(大正,1926).
元年の西暦は(昭和,1989).

うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- \+(0 is _年 mod 4),fail.

月の日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]).
月の日数(_,_月,30) :- member(_月,[4,6,8,10]).
月の日数(_年,2,29) :- うるう年(_年).
月の日数(_年,2,28) :- \+(うるう年(_年)).
667デフォルトの名無しさん:2009/12/13(日) 07:43:02
>>666 訂正
% Prolog

元年の西暦は(明治,1868).
元年の西暦は(大正,1912).
元年の西暦は(昭和,1926).
元年の西暦は(平成,1989).
668デフォルトの名無しさん:2009/12/13(日) 07:46:59
>>665 訂正 のに->の
'元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-
  '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),
  元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字),
  元年の西暦は(_元号,_元年の西暦年),
  _西暦年 is _元年の西暦年 + _年 - 1,
  その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),
  write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]).

>>666 ここも訂正 のに->の
元号の頭文字をローマ字変換した時の最初の文字(明治,m).
元号の頭文字をローマ字変換した時の最初の文字(大正,t).
元号の頭文字をローマ字変換した時の最初の文字(昭和,s).
元号の頭文字をローマ字変換した時の最初の文字(平成,h).
669デフォルトの名無しさん:2009/12/13(日) 08:13:23
>>594
使用言語: J

f=:p:@i.@(_1&p:)

f 30
2 3 5 7 11 13 17 19 23 29
670デフォルトの名無しさん:2009/12/13(日) 10:06:58
>>257 >>331
使用言語: MaTX

Func Integer pow4(n)
Integer n;
{
return n*n*n*n;
}

MaTX (6) pow4(77)
ans = 35153041
671デフォルトの名無しさん:2009/12/13(日) 10:16:14
>>17 問題1
使用言語: MaTX

Func String f(n)
Integer n;
{
return "abcdefghijklmnopqrstuvwxyz"(1:min(n,26));
}

MaTX (20) f(6)
abcdef
MaTX (21) f(30)
abcdefghijklmnopqrstuvwxyz
672デフォルトの名無しさん:2009/12/13(日) 12:17:34
>>17 問題2
使用言語: MaTX

Func Real f(n)
Integer n;
{
a=[1:n];
return sum(a*((rem(a,3)==0) || (rem(a,5)==0)));
}

MaTX (72) f(10)
ans = 33
MaTX (73) f(100)
ans = 2418
673デフォルトの名無しさん:2009/12/13(日) 16:54:18
>>17 問題2
使用言語: Scilab
>664 ではfor文を使ったが、こちらは配列を使うやりかた。
関数定義も別の方法が見つかったので、それを使ってみた。

-->deff('[x]=f(n)','a=[1:n];x=sum(a(modulo(a,3)==0|modulo(a,5)==0))')

-->f(10)
ans =
33.
-->f(100)
ans =
2418.
674デフォルトの名無しさん:2009/12/13(日) 19:05:06
>>592
使用言語: Scilab

function f(n)
a=[1:n]
b=a(modulo(n,a)==0)
disp("約数 = "+strcat(string(c)," "))
disp("約数の数 = "+string(length(b)))
endfunction

-->f(30)
約数 = 1 2 3 5 6 10 15 30
約数の数 = 8
675デフォルトの名無しさん:2009/12/14(月) 00:18:50
>>658
;; Common Lisp
(defun div3 (num)
(let ((a (floor (/ num 3))))
(cons a (- num (* a 3)))))
676デフォルトの名無しさん:2009/12/14(月) 05:52:40
677デフォルトの名無しさん:2009/12/14(月) 06:20:31
http://pc12.2ch.net/test/read.cgi/tech/1260532772/83
# [1] 授業単元: Cプログラム応用A
# [2] 問題文(含コード&リンク):
# 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。
# ただし、同じ長さの単語がある場合最初に見つけた一つでいい。
#
# ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。
# ただし、単語の長さは100文字以内と考えていい。
#
678デフォルトの名無しさん:2009/12/14(月) 07:45:50
>>677
% Prolog

指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初に出てくる単語,_最後に出てくる単語,_最も長い単語) :-
  get_lines(_ファイル,Lines),
  concat_atom(Lines,S),
  split(S,[' ','\t','\n'],_単語ならび),
  sort(_単語ならび,_整列された単語ならび),
  append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),
  findmax(_長さ,(member(_単語,_整列された単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最も長い単語).
679678:2009/12/14(月) 07:49:58
>>678
これだと、先頭が大文字の単語が先に並んでしまうのか。あとで訂正します。
680デフォルトの名無しさん:2009/12/14(月) 14:19:34
http://pc12.2ch.net/test/read.cgi/tech/1260532772/87
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示せよ。
# 表示は全部で5行になる。
#
# txtファイルの内容
# Gunma
# 2016027
# 6363.16
# Saitama
# 7104222
# 3797.25
# Chiba
# 6108809
# 5156.60
# Tokyo
# 12790202
# 2187.58
# Kanagawa
# 8899545
# 2415.84
681デフォルトの名無しさん:2009/12/14(月) 14:32:54
http://pc12.2ch.net/test/read.cgi/tech/1260532772/95
# [1] 授業単元:計算機基本
# [2] 問題文(含コード&リンク):
# 1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求めるプログラムを作ってみましょう。
# 途中経過も表示してください。
# 例:1^2 + 2^2 =
# 1^2 + 2^2 + 3^2 =
# ....
#
682デフォルトの名無しさん:2009/12/14(月) 15:03:18
>>678 (>>677)
% Prolog sort/2 を 辞書順整列/2 に置き換えてください。その上で追加。

辞書順整列([X|Xs],Ys) :- 辞書順分割(Xs,X,Littles,Bigs),辞書順整列(Littles,s),辞書順整列(Bigs,Bs),append(Ls,[X|Bs],Ys) .
辞書順整列([],[]).

% *** user: partition / 4 ***
辞書順分割([X|Xs],Y,[X|Ls],Bs) :- 辞書順に比較(X,Y,@<),辞書順分割(Xs,Y,Ls,Bs) .
辞書順分割([X|Xs],Y,[X|Ls],Bs) :- 辞書順に比較(X,Y,=),辞書順分割(Xs,Y,Ls,Bs) .
辞書順分割([X|Xs],Y,Ls,[X|Bs]) :- 辞書順に比較(X,Y,@<),辞書順分割(Xs,Y,Ls,Bs) .

辞書順分割([],Y,[],[]).

辞書順に語を比較(_語1,_語2,_関数) :- atom_chars(_語1,Chars1),atom_chars(_語2,Chars2),辞書順に比較(Chars1,Chars2,_関数).

辞書順に比較(L,L,=) :- !.
辞書順に比較([],[_|_],@<) :- !.
辞書順に比較([_|_],[],@>) :- !.
辞書順に比較([A|R1],[A|R2],F) :- 辞書順に比較(R1,R2,Func),!.
辞書順に比較([A|R1],[B|R2],@<) :- to_lower(A,U),to_lower(B,U),A <@ B,!.
辞書順に比較([A|R1],[B|R2],@>) :- to_lower(A,U),to_lower(B,U),A @> B,!.
辞書順に比較([A|R1],[B|R2],@<) :- \+((to_lower(A,U),to_lower(B,U))),A <@ B,!.
辞書順に比較([A|R1],[B|R2],@>) :- \+((to_lower(A,U),to_lower(B,U))),A @> B,!.
683デフォルトの名無しさん:2009/12/14(月) 15:16:51
>>680
% Prolog

txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示する :-
  get_lines(_ファイル名,Lines),
  'N個組'(3,Lines,_情報ならび),
  member([_都道府県名,_人口,_面積],_情報ならび),
  write_formatted('%t %t %t\n',[_都道府県名,_人口,_面積]),
  fail.
txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示する.
684デフォルトの名無しさん:2009/12/14(月) 15:46:04
>>681
% Prolog

'1から10までの整数の2乗の和を途中経過も表示しながら求める'(Sum) :-
  '1から10までの整数の2乗の和'(1,10,0,Sum),

'1から10までの整数の2乗の和'(M,N,_,Sum,Sum) :- M > N,!.
'1から10までの整数の2乗の和'(M,N,L1,Sum1,Sum) :-
  Sum2 is M ^ 2 + Sum1,
  append(L,[M],L2),
  途中経過の表示(L2,Sum2),
  M2 is M + 1,
  '1から10までの整数の2乗の和'(M2,N,L2,Sum2,Sum).

途中経過の表示([N],Sum) :- write_formatted('+ %t ^ 2 = %t\n',[Sum]),!.
途中経過の表示([N|R],Sum) :-
  write_formatted('%t ^ 2 + ',[N]),
  途中経過の表示(R,Sum).
685デフォルトの名無しさん:2009/12/14(月) 16:21:12
http://pc12.2ch.net/test/read.cgi/tech/1260532772/104
# [1] 授業単元:Cプログラミング演習
# [2] 問題文:多項式f(x)=Cn×?のn乗+Cn-1×?の(n-1)乗+...+C1×?
# +C0×?の0乗 の次数nと多項式の係数Cn,Cn-1,..,C1,C0を順に読み込み、
# 変数?=0.0、0.1、0.2,・・、0.9、1.0に対する多項式f(x)の値を計算して見やすい形に
# [5] その他の制限:配列の問題です。 for構文を必ず使い、
# f(x)=((...((Cn?+Cn-1)?+Cn-2)...)?+C1)?+C0
# と単純な効率の良いプログラム計算するようなもの。つまり
#  fx←Cn
#  fx←fx*?+Cn-1  というような代入を参考にして考えてみる
686デフォルトの名無しさん:2009/12/14(月) 16:30:23
>>681
使用言語: 十進BASIC

LET s=0
FOR i=1 TO 10
LET s=s+i*i
FOR j=2 TO i
PRINT STR$(j-1);"^2 + ";
NEXT J
PRINT STR$(i);"^2 =";s
NEXT I
END

実行結果
1^2 = 1
1^2 + 2^2 = 5
1^2 + 2^2 + 3^2 = 14
1^2 + 2^2 + 3^2 + 4^2 = 30
1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 = 91
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 = 140
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 = 204
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 = 285
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 + 10^2 = 385
687デフォルトの名無しさん:2009/12/14(月) 18:30:19
>>681
使用言語: J

;"1((>(,' + '&;)/&.><@,&'^2'@":"0&.><\>:i.10),.<' = '),.,.":&.>;/+/\*:>:i.10

1^2 = 1
1^2 + 2^2 = 5
1^2 + 2^2 + 3^2 = 14
1^2 + 2^2 + 3^2 + 4^2 = 30
1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 = 91
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 = 140
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 = 204
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 = 285
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 + 10^2 = 385
688デフォルトの名無しさん:2009/12/14(月) 18:44:14
http://pc12.2ch.net/test/read.cgi/tech/1260532772/112
# 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
#  ポーカーゲーム(の一部)をC言語にて作成する。
#
#  ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
#    カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
#    プレイヤは配られたカードの中から交換するものを選択できるようにする。
#    ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
#    プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
#  表示、カードの選択は標準入出力を利用してください。
#
689デフォルトの名無しさん:2009/12/14(月) 19:07:33
>>688
% Prolog (その一)

連続(2,3).
連続(3,4).
連続(4,5).
連続(5,6).
連続(6,7).
連続(7,8).
連続(8,9).
連続(9,10).
連続(10,'J').
連続('J','Q').
連続('Q','K').
連続('K','A').

役('One Pair',[C1/A,C2/A,C3/B,C4/C,C5/D]) :- 異なる([A],[B,C,D]).
役('Two Pair',[C1/A,C2/A,C3/B,C4/B,C5/C]) :- 異なる([A,B],[C]).
役('Three Cards',[C1/A,C2/A,C3/A,C4/B,C5/C]) :- 異なる([A],[B,C]).
役('Four Cards',[C1/A,C2/A,C3/A,C4/A,C5/B]) :- 異なる([A],[B]).
役('Full House',[C1/A,C2/A,C3/A,C4/B,C5/B]) :- 異なる([A],[B]).
役('Flush',[C1/A,C1/B,C1/C,C1/D,C1/E]) :-
  \+(役('Straight',[C1/A,C1/B,C1/C,C1/D,C1/E])).
役('Straight',[C1/A,C2/B,C3/C,C4/D,C5/E]) :-
  連続(A,B),連続(B,C),連続(C,D),連続(D,E),
  \+(役('Flush',[C1/A,C2/B,C3/C,C4/D,C5/E])).
690デフォルトの名無しさん:2009/12/14(月) 20:13:19
http://pc11.2ch.net/test/read.cgi/db/1252492296/
# (idlist テーブル)    (sales テーブル)
# id  name  taxfree  id  data  price
# 1  A   1      1  12/8  3000
# 2  B   0      1  12/7  2500
# 3  C   1      2  12/8  2000
# 4  D   0      2  12/7  2800
# 5  E   0      3  12/8  150
# 6  F   1      3  12/7  200
#             6  12/5  500
#
# 上記2つのテーブルから、
# 下記の形式のように、idlistから taxfree=1 のものをまず表示し、
# 最新日付のデータか、最新日付が無い場合一番近い日付のデータを表示したいと考え
ています。
#
# id  name  data  price
# 1  A   12/8  3000
# 3  C   12/8  150
# 6  F   12/5  500
691690:2009/12/14(月) 20:18:26
>>690
id name taxfree
id data price
id name data price
のdataはdateの間違いだと思います。
692デフォルトの名無しさん:2009/12/14(月) 20:26:06
>>690
% Prolog

'idlistから taxfree=1 のものをまず表示し、最新日付のデータか、最新日付が無い場合一番近い日付のデータを表示する' :-
  write('id name date price\n'),
  idlist(Id,Name,1),
  findmax([Date,Id,Name,Price],sales(Id,Date,Price),[Date,Id,Name,Price]),
  write_formatted('%2d %4s %t %4d\n',[Id,Name,Date,Price]),
  fail.
'idlistから taxfree=1 のものをまず表示し、最新日付のデータか、最新日付が無い場合一番近い日付のデータを表示する'.
693デフォルトの名無しさん:2009/12/14(月) 20:33:28
http://pc12.2ch.net/test/read.cgi/tech/1260532772/94
# [1] 授業単元: 通信プロトコル
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10268.txt
# tcpを用いて21個石がある中から1〜3個の石をServer、Clientで取り合い、
# 最後の1つを取った方が負けとなる石取りゲームを作りなさい。
# server、clientの処理、および使用するポートは自由に決めて構わない。
694デフォルトの名無しさん:2009/12/14(月) 22:00:12
http://pc12.2ch.net/test/read.cgi/tech/1260532772/125
# [1] 計算物理
# [2]
# �原点に静止していた電子を考える。ここに直線偏光した電磁波が入射してきたとき、電
# 子の運動の様子を計算せよ。円偏光のときはどうか。磁場の力は無視してよい。
#
# �地球をめぐる衛星は、大気の摩擦を受けて少しづつ落下する。この様子を計算せよ。値
# は実際の値を入れなくともよいが、摩擦を受けつつ地球の重力を受けてまわる様子を正し
# く微分方程式であらわし、それを解け。
#
# �有限の広さの薄い電極をもつ平行平板コンデンサーの周りの電場(電位)を計算し、可
# 視化する。平行平板コンデンサーの内部では一様な電場ができることはよく知られている。
# しかし端の電場はどのようにずれているのであろうか。
# (コンデンサーよりも十分大きい設置した箱型の境界を考える。その中にコンデンサーの極
# 板をおき、片方に電圧をかけて境界条件のように取り扱えばよい。)
695デフォルトの名無しさん:2009/12/14(月) 22:07:24
http://pc12.2ch.net/test/read.cgi/tech/1260532772/126
# [1] 授業単元:Cプログラミング
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10269.txt
#
# ハノイの塔
# 軸名を数値でなく文字列で表せるように実現せよ。例:"A軸","B軸","C軸"
#
% C言語のソースの一部作り換えとしての出題のようですが、
% ハノイの塔のプログラムを作る問題としましょう。
696デフォルトの名無しさん:2009/12/15(火) 05:50:53
>>257 >>331
使用言語: Yorick

> func f(n){return n*n*n*n;}

> f(7)
2401
> f(500)
-1924509440
697デフォルトの名無しさん:2009/12/15(火) 06:00:36
>>17 問題2
使用言語: Yorick

> func f(n){a=indgen(1:n);return sum(a*(a%3==0|a%5==0));}
> f(10)
33
> f(100)
2418
698デフォルトの名無しさん:2009/12/15(火) 06:29:25
>>693
% Prolog (クライアント その一)

'必勝Client'(Host,Port,_受け取った情報) :-
  socket(internet, stream, Socket),
  host_addr(Server,Port),
  socket_connect(Socket, Server : Port),
  open(Socket,read,Input),
  open(Socket,write,Output),
  get_line(Input,Line),
  write_formatted('%t\n',[Line]),
  '必勝Client_1'(Input,Output,Line),
  close(Input),
  close(Output),
  socket_shutdown(Socket),!.

'必勝Client_1'(Input,Output,_受け取った情報) :-
  get_line(Line),
  '必勝Client_2'(Input,Output,Line,_受け取った情報).
'必勝Client_1'(_,_,_).
699デフォルトの名無しさん:2009/12/15(火) 06:31:05
>>693
% Prolog (必勝クライアント その二)

'必勝Client_2'(Input,Output,end_of_file,end_of_file) :- !.
'必勝Client_2'(Input,Output,_受け取った情報,_受け取った情報).
'必勝Client_2'(Input,Output,Line1,_受け取った情報) :-
  atom_chars(_受け取った情報,Chars),
  取る石を決める(Chars,L),
  atom_chars(_取る石の文字表現,L),
  取った石を送る(_取った石の文字表現,Host,Socket,Input,Output),
  get_line(Line2),
  '必勝Client'(Input,Output,Line2,_受け取った情報).

取る石を決める([A],[A]) :- !.
取る石を決める([A,B],[A,B]) :- !.
取る石を決める([A,B,C],[A,B,C]) :- !.
取る石を決める([A,B,C,D],[A]) :- !.
取る石を決める([_,_,_,_|R],X) :- 取る石を決める(R,X).

取った石を送る(_取った石の文字表現,Host,Input,Output) :-
  write_formatted(Output,'%t\n',[_取った石の文字表現]),
  flush_output(Output).
700デフォルトの名無しさん:2009/12/15(火) 06:43:41
>>698 (>>693) 大間違い。訂正!

'必勝Client'(Host,Port,_受け取った情報) :-
  socket(internet, stream, Socket),
  host_addr(Server,Port),
  socket_connect(Socket, Server : Port),
  open(Socket,read,Input),
  open(Socket,write,Output),
  get_line(Input,Line),
  write_formatted('%t\n',[Line]),
  '必勝Client_1'(Socket,Input,Output,Line).

'必勝Client_1'(_,Input,Output,_受け取った情報) :-
  get_line(Line),
  '必勝Client_2'(Input,Output,Line,_受け取った情報).
'必勝Client_1'(Socket,Input,Output,_) :-
  close(Input),
  close(Output),
  socket_shutdown(Socket),!.
701デフォルトの名無しさん:2009/12/15(火) 06:51:12
>>17 問題1
使用言語: Yorick

> func f(n){return strpart("abcdefghijklmnopqrstuvwxyz",1:n);}
> f(6)
"abcdef"
> f(30)
"abcdefghijklmnopqrstuvwxyz"
702デフォルトの名無しさん:2009/12/15(火) 06:51:57
>>699 (>>693)
% Prolog もう一つ間違い発見。最終節。

'必勝Client_2'(Input,Output,end_of_file,end_of_file) :- !.
'必勝Client_2'(Input,Output,_受け取った情報,_受け取った情報).
'必勝Client_2'(Input,Output,Line1,_受け取った情報) :-
  atom_chars(_受け取った情報,Chars),
  取る石を決める(Chars,L),
  atom_chars(_取る石の文字表現,L),
  取った石を送る(_取った石の文字表現,Host,Socket,Input,Output),
  get_line(Line2),
  '必勝Client_2'(Input,Output,Line2,_受け取った情報).
703デフォルトの名無しさん:2009/12/15(火) 07:51:50
>>698 (>>693)
% Prolog たくさん訂正。

'必勝Client'(Server,Port,_受け取った情報) :-
  socket(internet, stream, Socket),
  socket_connect(Socket, Server : Port),
  open(Socket,read,Input),
  open(Socket,write,Output),
  '必勝Client_1'(Socket,Input,Output,_受け取った情報).

% この中でget_lineをする必要はなかった。それから_受け取った情報がトップレベルに接続していなかったからそこも訂正。
704デフォルトの名無しさん:2009/12/15(火) 07:59:25
% Prolog 無手順クライアントの一般型を示します。述語名で与えられる目標は二引数(_サーバからの受信情報,_サーバへの送信情報)
クライアント一般型(Server,Port,_述語名,_受け取った情報) :-
  socket(internet, stream, Socket),
  socket_connect(Socket, Server : Port),
  open(Socket,read,Input),
  open(Socket,write,Output),
  クライアント一般型_1(Input,Output,_述語名,Line).

クライアント一般型_1(_,Input,Output,_述語名,_受け取った情報) :-
  get_line(Line),
  クライアント一般型_2(Input,Output,Line,_述語名,_受け取った情報).
クライアント一般型_1(Socket,Input,Output,_,_) :-
  close(Input),
  close(Output),
  socket_shutdown(Socket),!.

クライアント一般型_2(Input,Output,_,end_of_file,end_of_file) :- !.
クライアント一般型_2(Input,Output,_,_受け取った情報,_受け取った情報).
クライアント一般型_2(Input,Output,_述語名,Line1,_受け取った情報) :-
  functor(P,_述語名,Arg),
  arg(1,P,Line1),
  arg(2,P,Message),
  call(P),
  write_formatted(Output,%t\n,[Message]),
  flush_output(Output),
  get_line(Line2),
  クライアント一般型_2(Input,Output,_述語名,Line2,_受け取った情報).
705デフォルトの名無しさん:2009/12/15(火) 08:22:04
>>704
% Prolog 例えば以下のように進みます。ここでは一回の通信ごとに停止させています。

?- クライアント一般型('192.9.168.2',10111,必勝石とりゲーム,X).
X = 石石石石石石石石石石石石石石石石石石石石石;
X = 石石石石石石石石石石石石石石石石石;
...
X = 石石石;
yes
?-
706デフォルトの名無しさん:2009/12/15(火) 09:33:39
http://pc12.2ch.net/test/read.cgi/tech/1257481818/43
# 連想配列を多次元のものとして扱いたいのですが、どのように宣言すればよいのでしょうか?
#
# typedef map<string, int> HogeMap;
# HogeMap pb;
# pb["test1"] = 10;
# pb["test2"] = 100;
#
# 現在は↑のように宣言して使っていますが、
#
# pb["test1"][0] = 10;
# pb["test1"][1] = 20;
# pb["test2"][0] = 100;
# pb["test2"][1] = 200;
#
# イメージとしては↑のように扱いたいのです。もしや不可能でしょうか?
707デフォルトの名無しさん:2009/12/15(火) 09:35:09
>>706
% Prolog

pb([test1,0],10).
pb([test1,1],20).
pb([test2,0],100).
pb([test2,1],200).
708デフォルトの名無しさん:2009/12/15(火) 09:40:31
http://pc12.2ch.net/test/read.cgi/tech/1254281104/887
# 質問なのですが
#
# 競馬の騎手の複勝率と複勝回収率データがあって
# 10/10迄、11/01迄、12/20迄というように、
# ある日付までに複勝率が30%以上だった騎手を購入した場合の
# 複勝回収率を出すにはどうすればいいのでしょうか?
#
# どの騎手でも構わないのですが、レースが行われる前日まで複勝率30%だった騎手の馬を
# 購入していた場合の回収率を知るにはどうすればいいのでしょうか?
#
709デフォルトの名無しさん:2009/12/15(火) 11:04:22
>>708
% Prolog 重み付けがされていないから以下の場合でないと解がでない。

:- op(250,xf,迄).
:- op(250,xf,(%)).

連勝率・連勝回収率(野平祐二,10/10 迄,37 %,81 %).
連勝率・連勝回収率(野平祐二,11/1 迄,35 %,78 %).
連勝率・連勝回収率(野平祐二,12/20 迄,36 %,79 %).
連勝率・連勝回収率(嶋田功,10/10 迄,29 %,68 %).
連勝率・連勝回収率(嶋田功,11/1 迄,30 %,70 %).
連勝率・連勝回収率(嶋田功,12/20 迄,28 %,66 %).
連勝率・連勝回収率(関口健太郎,10/10 迄,17 %, 49 %).
連勝率・連勝回収率(関口健太郎,11/1 迄,27 %,66 %).
連勝率・連勝回収率(関口健太郎,12/20 迄,19 %,54 %).

'ある日付までに複勝率が30%以上だった騎手を購入した場合の複勝回収率'(_騎手,_月/_日 迄,_連勝回収率 %) :-
  連勝率・連勝回収率(_騎手,_月/_日 迄,_連勝率 %,_連勝回収率 %),
  _連勝率 >= 30.

'ある日付までに複勝率が30%以上だった騎手を購入した場合の複勝回収率'(_月/_日 迄,_騎手・連勝率ならび) :-
  findall([_騎手,_連勝率],(連勝率・連勝回収率(_騎手,_月/_日 迄,_連勝率 %,_連勝回収率 %),_連勝率>=30),_騎手・連勝率ならび).
710デフォルトの名無しさん:2009/12/15(火) 11:30:43
http://pc12.2ch.net/test/read.cgi/tech/1260532772/158
# [1] 授業単元:計算機基本
# [2] 問題文(含コード&リンク):
# 1から500までの整数から、3の倍数を1行に10個ずつ表示するプログラムを作れ。ただし、一個の整数を表示する桁数を5桁に指定すること。
#
711デフォルトの名無しさん:2009/12/15(火) 11:36:04
>>710
% Prolog

'1から500までの整数から、3の倍数を1行に10個ずつ表示する' :-
  findall(N,(for(1,N,500),0 is N mod 3),L),
  'N個組'(10,L,L10),
  concat_atom(L1,' ',S),
  write_formatted('%t\n',[S]),
fail.
'1から500までの整数から、3の倍数を1行に10個ずつ表示する'.

% 'N個組'/2 の定義は http://nojiriko.asia/prolog/c132_869_1.html を参照してください
712デフォルトの名無しさん:2009/12/15(火) 11:48:58
>>592
使用言語: Yorick

func f(n){
a=indgen(1:n)
b=a(where(n%a==0))
print,"yakusu = ",b
print,"yakusu no kazu = ",numberof(b)
}

> f,30
"yakusu = " [1,2,3,5,6,10,15,30]
"yakusu no kazu = " 8
713デフォルトの名無しさん:2009/12/15(火) 11:59:31
>>592
使用言語: J

_10,\5":"0>:I.0=3|>:i.500

3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
63 66 69 72 75 78 81 84 87 90
93 96 99 102 105 108 111 114 117 120
123 126 129 132 135 138 141 144 147 150
153 156 159 162 165 168 171 174 177 180
183 186 189 192 195 198 201 204 207 210
213 216 219 222 225 228 231 234 237 240
243 246 249 252 255 258 261 264 267 270
273 276 279 282 285 288 291 294 297 300
303 306 309 312 315 318 321 324 327 330
333 336 339 342 345 348 351 354 357 360
363 366 369 372 375 378 381 384 387 390
393 396 399 402 405 408 411 414 417 420
423 426 429 432 435 438 441 444 447 450
453 456 459 462 465 468 471 474 477 480
483 486 489 492 495 498
714デフォルトの名無しさん:2009/12/15(火) 12:02:58
>713
あー。また問題番号、間違えました。>>710 です。
715デフォルトの名無しさん:2009/12/15(火) 12:09:49
http://pc12.2ch.net/test/read.cgi/tech/1260532772/159
# [1] 授業単元: ものつくりの実習中に必要になりました
# [2] 問題文(含コード&リンク):
# 全角の日本語をJISコードに変換したいです。
# ”あいうえお終”と入力したときに
# 2422
# 2424
# 2426
# 2428
# 242A
# 3D2A
# のように返してくれるとうれしいです。
#
716デフォルトの名無しさん:2009/12/15(火) 12:14:58
>>715
% Prolog

全角の日本語をJISコードに変換 :-
  get_line(Line),
  atom_chars(Line,Chars),
  全角の日本語をJISコードに変換(Chars).

全角の日本語をJISコードに変換([]).
全角の日本語をJISコードに変換([A|R]) :-
  char_code(A,Code),
  Jis_code is Code # truncate(2^15+2^7),
  write_formatted('%x\n',[Jis_code]),
  全角の日本語をJISコードに変換(R).
717デフォルトの名無しさん:2009/12/15(火) 13:31:09
>>710
使用言語: 十進BASIC

FOR i=3 TO 500 STEP 3
PRINT USING "#####": i;
IF MOD(i,10)=0 THEN PRINT
NEXT I
PRINT
END
718デフォルトの名無しさん:2009/12/15(火) 14:29:08
>>658
使用言語: maxima

f(n):=[a:fix(n/3),n-a*3];

(%i120) f(35);
(%o120) [11, 2]
(%i121) f(1234567);
(%o121) [411522, 1]
719デフォルトの名無しさん:2009/12/15(火) 15:10:35
>>710
使用言語: maxima

for i:3 thru 500 step 3 do printf(true,"~5d~[~%~]",i,mod(i,10)+1);
720デフォルトの名無しさん:2009/12/15(火) 15:15:59
>>711 (>>710) よく見たら間違ってました。L1->L10です。
% それからhttp://nojiriko.asia/prolog/ アーカイブサイトは現在停電中で普通です。
'1から500までの整数から、3の倍数を1行に10個ずつ表示する' :-
  findall(N,(for(1,N,500),0 is N mod 3),L),
  'N個組'(10,L,L10),
  concat_atom(L10,' ',S),
  write_formatted('%t\n',[S]),
fail.
'1から500までの整数から、3の倍数を1行に10個ずつ表示する'
721デフォルトの名無しさん:2009/12/15(火) 15:17:09
>>720
普通です -> 不通ですw
722デフォルトの名無しさん:2009/12/15(火) 16:00:59
>>59
使用言語: maxima

(%i176) f(n):=if length(unique(charlist(string(n*n))))=2 then true else false;
(%i177) for i:1000 thru 9999 do if f(i) then print(i);
1000
2000
3000
3114
723デフォルトの名無しさん:2009/12/15(火) 17:16:52
http://pc12.2ch.net/test/read.cgi/tech/1136788500/434
# 50人のクラス(男子35人)から5人の委員をランダムに選ぶ。このとき選ばれた委員の中に男3人、女2人が入る確率をBASICで求めよ。
#
724デフォルトの名無しさん:2009/12/15(火) 22:39:26
>>613
% Prolog (その一) 作りかけばかりで申し訳ないが。VT100のエスケープシーケンスで使いそうなもの。

カーソルをPl行上へ移動(Pl) :- put_code(27),write_formatted('[%tA',[Pl]).

カーソルをPl行下へ移動(Pl) :- put_code(27),write_formatted('[%tB',[Pl]).

カーソルをPc桁右へ移動(Pc) :- put_code(27),write_formatted('[%tC',[Pc]).

カーソルをPc桁左へ移動(Pc) :- put_code(27),write_formatted('[%tD',[Pc]).

カーソルを移動(Pl,Pc) :- put_code(27),write_formatted('[%t;%tH',[Pl,Pc]).

カーソルから画面の終わりまでを消去 :- put_code(27),write('[J').

画面の始めからカーソルまでを消去 :- put_code(27),write('[1J').

画面全体を消去 :- put_code(27),write('[2J').

カーソルから行の終わりまでを消去 :- put_code(27),write('[K').

行全体を消去 :- put_code(27),write('[2K').

行の始めからカーソルまでを消去 :- put_code(27),write('[1K').
725デフォルトの名無しさん:2009/12/16(水) 09:38:52
Prolog多いな・・・・
本当に使われてない言語なんだなカワイソス
C言語/C++なら毎日のように宿題があるのに
726デフォルトの名無しさん:2009/12/16(水) 10:00:03
Prolog講座の宿題ってどんなものになるんだろう。
「Prologの宿題片付けますスレ」立てたら、書き込みあるかな。
727デフォルトの名無しさん:2009/12/16(水) 10:02:07
>>710
使用言語: Io

for(i,3,500,3,write(i asString(5,0),if(i mod(10)==0,"\n","")))
728デフォルトの名無しさん:2009/12/16(水) 10:22:33
>>681
使用言語: Io

s:=0;for(i,1,10,s=s+i*i;for(j,2,i,write(j,"^2 + "));writeln(i,"^2 = ",s))
729デフォルトの名無しさん:2009/12/16(水) 10:36:41
>>681
使用言語: Io
うーん、実行結果を省略したら、またまちがえた。

s:=0;for(i,1,10,s=s+i*i;for(j,2,i,write(j-1,"^2 + "));writeln(i,"^2 = ",s))
730デフォルトの名無しさん:2009/12/16(水) 11:22:24
>>45
使用言語: maxima

(%i214) f(n):=apply("*",makelist(i,i,1,n));
(%i215) makelist(print(f(i)),i,0,10);
1
1
2
6
24
120
720
5040
40320
362880
3628800
731デフォルトの名無しさん:2009/12/16(水) 12:43:15
http://pc12.2ch.net/test/read.cgi/tech/1260532772/169
# [1] 授業単元:c言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10273.txt
#
# 文字列 str1, str2それぞれに文字列を入力し、str1←str1&' '&str2の操作をして、
# str1の内容を表示させなさい。
#
# str1?WAKARI
# str2?MASENN
# WAKARI MASENN
732デフォルトの名無しさん:2009/12/16(水) 12:45:24
http://pc12.2ch.net/test/read.cgi/tech/1260532772/170
# [1] 授業単元:c言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10274.txt
#
# 文字列strの中に、文字cが含まれている個数(含まれていなければ0とする)
# を返す関数
# int str_chnum(const char str[], int c) {/*・・・・*/}
# を作成せよ
733デフォルトの名無しさん:2009/12/16(水) 12:48:58
>>732

str_chnum(_文字列,_文字,_個数) :-
  count(sub_atom(_文字列,_,1,_,_文字),_個数).
734デフォルトの名無しさん:2009/12/16(水) 13:23:48
>>731
% Prolog 代入はできないから、この程度

二行を空白をはさんで連結する :-
  get_line(Str1),
  get_line(Str2),
  concat_atom([Str1,Str2],' ',Str),
  write_formatted('%t\n',[Str]),
735デフォルトの名無しさん:2009/12/16(水) 14:44:04
>>731
使用言語: maxima

(%i216) f(s1,s2):=(s1:concat(s1," ",s2),print(s1));
(%i217) f("123","abc");
123 abc
736デフォルトの名無しさん:2009/12/16(水) 14:45:00
>>732
使用言語: maxima

(%i257) str_chnum(s,c):=slength(s)-slength(ssubst("",c,s));
(%i258) str_chnum("123123111","1");
(%o258) 5
737デフォルトの名無しさん:2009/12/16(水) 14:59:05
>>731
使用言語: J

str1=:'123'
str2=:'abc'
str1=:str1,' ',str2
smoutput str1
123 abc
738デフォルトの名無しさん:2009/12/16(水) 15:00:13
>>732
使用言語: J

f=:+/@E.

'm' f 'maxima'
2
'c' f 'maxima'
0
739デフォルトの名無しさん:2009/12/16(水) 15:44:07
http://pc12.2ch.net/test/read.cgi/tech/1260532772/177
# [1] 授業単元: コンピュータプログラミング
# [2] 問題文(含コード&リンク)
# 1)f(x,y)=dy/dx=-4(x-1)y,y(0)=e^-2の一階微分方程式についてオイラーの方法で数値解を求めるプログラムを作成せよ。
# 2)dy/dx=f(x,y)=1-y,y(0)=0
#   dy/dx=f(x,y)=y(1-y),y(0)=0.01
#   dy/dx=f(x,y)=2yx,y(0)=1
# の数値解をオイラー法によって求めよ。
#
740デフォルトの名無しさん:2009/12/16(水) 15:58:34
>>370 課題(2)
使用言語: maxima

(%i262) f(n,d):=(a:string(n),charat(a,slength(a)-d+1));
(%i263) f(123456789,4);
(%o263) 6
741デフォルトの名無しさん:2009/12/16(水) 17:22:43
>>731
使用言語: Xtal

ix:001>str1:"123";
ix:002>str2:"abc";
ix:003>str1=str1~" "~str2;
ix:004>str1.p;
123 abc
742デフォルトの名無しさん:2009/12/16(水) 17:23:36
>>732
使用言語: Xtal

ix:008>str_chnum:fun(s,c)s.split("").to_a.select(|v|v==c).to_a.size;
ix:009>str_chnum("123123111","2").p;
2
743デフォルトの名無しさん:2009/12/16(水) 18:00:06
>>731
使用言語: Io

Io> str1:="123"
==> 123
Io> str2:="abc"
==> abc
Io> str1=str1 .. " " .. str2
==> 123 abc
Io> str1 println
123 abc
==> 123 abc
744デフォルトの名無しさん:2009/12/16(水) 18:01:01
>>732
使用言語: Io

Io> f:=method(s,c,s size-(s asMutable removeSeq(c))size)

Io> f("123111","1")
==> 4
745デフォルトの名無しさん:2009/12/16(水) 19:40:37
>>731
使用言語: Arc

arc> (= str1 "123")
"123"
arc> (= str2 "abc")
"abc"
arc> (= str1 (+ str1 " " str2))
"123 abc"
arc> (prn str1)
123 abc
"123 abc"
746デフォルトの名無しさん:2009/12/16(水) 19:41:30
>>732
使用言語: Arc

;組み込み関数の場合
arc> (count #\1 "123123111")
5


arc> (def str_chnum(s c) (- (len s) (len(rem c s))))
#<procedure: str_chnum>
arc> (str_chnum "123123111" #\1)
5
747デフォルトの名無しさん:2009/12/16(水) 20:28:07
http://pc12.2ch.net/test/read.cgi/tech/1260532772/179
# [1] 授業単元:アルゴリズムの基礎
# [2] 問題文:・ハッシュ関数によるデータ格納を配列を用いて実現するプログラムの作成
# ・入力データは自然数
# ・配列の要素数とハッシュ関数は任意
# ・重複処理はオープンアドレス法を用いる
#
748デフォルトの名無しさん:2009/12/16(水) 21:15:40
>>731
使用言語: R

> str1<-"123"
> str2<-"abc"
> str1<-paste(str1," ",str2,sep="")
> cat(str1,"\n")
123 abc
749デフォルトの名無しさん:2009/12/16(水) 21:16:51
>>732
使用言語: R

> str_chnum<-function(s,c)nchar(s)-nchar(gsub(c,"",s))
> str_chnum("123123111","1")
[1] 5
750デフォルトの名無しさん:2009/12/16(水) 21:56:50
>>681
使用言語: R

> for(i in 1:10)cat(paste(1:i,"^2",sep="",collapse=" + "),"=",sum((1:i)^2),"\n")
1^2 = 1
1^2 + 2^2 = 5
1^2 + 2^2 + 3^2 = 14
1^2 + 2^2 + 3^2 + 4^2 = 30
1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 = 91
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 = 140
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 = 204
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 = 285
1^2 + 2^2 + 3^2 + 4^2 + 5^2 + 6^2 + 7^2 + 8^2 + 9^2 + 10^2 = 385
751デフォルトの名無しさん:2009/12/17(木) 04:56:45
http://pc12.2ch.net/test/read.cgi/tech/1260532772/191
# [1] 授業単元:ゼミ演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10275.txt
# 1週間の売り上げの合計を計算する問題
# 以下は疑似プログラミング言語を用いたプログラムである
# n = read();
# sum = 0;
# for i=1 to n{
# x=read(); sum =sum +x;
# }
# report(sum);
#
# このプログラムにsales.datというファイルを読み込ませC言語の形に直し完成させなさい
#
# 読み込ませるファイルの内容
# sales.dat
# 7
# 89231
# <中略>
# 64489
752デフォルトの名無しさん:2009/12/17(木) 05:07:18
>>751
% Prolog 本当は擬似プログラムを解析して述語に変換するプログラムとしたいね。
% 今は、

1週間の売り上げの合計を計算する問題 :-
  get_lines('sales.dat',Lines),
  findsum(N,(member(A,Lines),atom_to_term(A,N,_)),Sum),
  write_formatted('%t\n',[Sum]).
753デフォルトの名無しさん:2009/12/17(木) 06:46:51
754デフォルトの名無しさん:2009/12/17(木) 07:33:55
>>751
使用言語: J

(1!:1)<'sales.dat'
1000
2000
3000

smoutput +/".;._2 toJ(1!:1)<'sales.dat'
6000
755デフォルトの名無しさん:2009/12/17(木) 07:34:58
http://pc12.2ch.net/test/read.cgi/tech/1260532772/194
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt
#
# 必修課題2
# 初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、
# この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。
# 実行結果の例を以下に示す。
# ------------------------------------------------
# 第X項から:1
# 第Y項まで:10
# 初項1公差1の等差数列において、
# 第1項から第10項までの数列の和は55です。
# ------------------------------------------------
756デフォルトの名無しさん:2009/12/17(木) 07:36:52
http://pc12.2ch.net/test/read.cgi/tech/1260532772/194
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt
#
# 発展課題1
# 単細胞生物が翌日には2分裂して2細胞になるとする。1匹も死なないとすると、
# 細胞数が1万匹を超えるのは何日目になるかを算出するプログラムを作成せよ。
# 実行結果の例を以下に示す。
# ------------------------------------------------
# 15日目に16384個の細胞数になります。
# ------------------------------------------------
757デフォルトの名無しさん:2009/12/17(木) 08:00:19
>>726
Prolog講座と宿題はなんかピンとこないな。少なくとも丸投げはいないだろw
全国の大学に100以上Prolog講座があるそうだから、書き込みくらいはありそう
だけど。
758デフォルトの名無しさん:2009/12/17(木) 09:04:08
>>755
使用言語: J

g=:dyad def '+/x}.i.>:y'
f=:dyad define
smoutput '初項1公差1の等差数列において、'
smoutput '第',(":x),'項から第',(":y),'項までの数列の和は',(":x g y),'です。'
)

2 f 9
初項1公差1の等差数列において、
第2項から第9項までの数列の和は44です。
759デフォルトの名無しさん:2009/12/17(木) 09:17:43
>>756
使用言語: J

f=:monad define
a=.2+<.2^.y
smoutput (":a),'日目に',(":2^<:a),'個の細胞数になります。'
)

f 10000
15日目に16384個の細胞数になります。
f 100000
18日目に131072個の細胞数になります。
760デフォルトの名無しさん:2009/12/17(木) 11:49:04
>>755
使用言語: maxima

f(a,b):=printf(true,"初項1公差1の等差数列において、
第~d項から第~d項までの数列の和は~dです。
",a,b,sum(i,i,a,b));

(%i324) f(3,20);
初項1公差1の等差数列において、
第3項から第20項までの数列の和は207です。
761デフォルトの名無しさん:2009/12/17(木) 12:10:06
>>756
使用言語: maxima

f(n):=(a:fix(log(n)/log(2.0))+2,
printf(true,"~d日目に~d個の細胞数になります。~%",a,2^(a-1)));

(%i329) f(1000);
11日目に1024個の細胞数になります。
(%i330) f(10000);
15日目に16384個の細胞数になります。
762デフォルトの名無しさん:2009/12/17(木) 13:48:11
>>731
使用言語: Yorick

> str1="123"
> str2="abc"
> str1=str1+" "+str2
> write,str1
123 abc
763デフォルトの名無しさん:2009/12/17(木) 13:48:54
>>732
使用言語: Yorick

> func str_chnum(s,c){a=strchar(s);return sum(a==c);}
> str_chnum("123123111",'1')
5
764デフォルトの名無しさん:2009/12/17(木) 17:29:31
>>755
% Prolog

初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,Sum) :-
  findsum(N,for(X,N,Y),Sum).
765デフォルトの名無しさん:2009/12/17(木) 17:39:58
>>756
% Prolog

細胞生物が翌日には2分裂して2細胞になる(N日目,N日目,_今日の細胞数,_今日の細胞数).
細胞生物が翌日には2分裂して2細胞になる(N1,_何日目,今日の細胞数,_細胞数) :-
  N2 is N + 1,
  _翌日の細胞数 is _今日の細胞数 * 2,
  細胞生物が翌日には2分裂して2細胞になる(N2,_何日目,_翌日の細胞数,_細胞数).

?- 細胞生物が翌日には2分裂して2細胞になる(1,_何日目,1,_細胞数),_細胞数 > 10000.
766デフォルトの名無しさん:2009/12/17(木) 17:50:52
>>755
% Prolog

:- op(250,xf,項).

'初項1公差1の等差数列におけるX項からY項までの数列の和を算出する'(X 項,Y 項,_数列の和) :-
  findsum(N,for(X,N,Y),_数列の和).

% 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X 項,Y 項,Sum) :-
%   findsum(N,for(X,N,Y),Sum).
% とすると "初項1公差"のところの"項"が関数と誤解されてSyntaxErrorになるかも知れない。
% シングルクォーツで囲めばこのようなことは起こらない。
767デフォルトの名無しさん:2009/12/17(木) 19:27:52
http://pc12.2ch.net/test/read.cgi/tech/1260532772/198
# [1] 授業単元:統計
# [2] 問題文
# 正規分布表をC言語でつくってみよう。
# 先生が最初のちょっとを教えてくれた。
# #include<stdio.h>
# #include<math.h>
# #include<stdilb.h>
#
# float normal_gauss_fn(float z)
# {
# return(exp(z*z/(-2.0))/sqrt(2.0*3.14));
# }
768デフォルトの名無しさん:2009/12/17(木) 19:29:52
http://pc12.2ch.net/test/read.cgi/tech/1260532772/201
# [1] 授業単元:画像処理とC言語
# [2] 問題文(含コード&リンク):
# メモリ上に64バイトのデータがあります。これは4x16の行列です。
# char buf[16][4] = { a0, b0, c0, d0, ... , a15, b15, c15, d15 };
#
# 組込関数を用いてxmmレジスタに4分割して読込みました。中のイメージはこうです。
# __m128i t0 = { a0 , b0 , c0 , d0 , ... , a3 , b3 , c3 , d3 };
# __m128i t1 = { a4 , b4 , c4 , d4 , ... , a7 , b7 , c7 , d7 };
# __m128i t2 = { a8 , b8 , c8 , d8 , ... , a11, b11, c11, d11 };
# __m128i t3 = { a12, b12, c12, d12, ... , a15, b15, c15, d15 };
#
# ここから16x4の転置行列を得ましょう。内容のイメージはこうです。
# __m128i r0 = { a0, ... , a15 };
# __m128i r1 = { b0, ... , b15 };
# __m128i r2 = { c0, ... , c15 };
# __m128i r3 = { d0, ... , d15 };
#
# 禁じ手
# r0 = _mm_set_epi8(buf[15][0], buf[14][0], ... , buf[0][0]);
# こういう遅いプログラムはダメです。xmmレジスタの操作でカタを付けましょう。
769デフォルトの名無しさん:2009/12/17(木) 22:33:58
http://pc12.2ch.net/test/read.cgi/tech/1260532772/206
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10285.txt
#
# 必修課題1
# 3+6+9+・+99の計算を行うプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# 答えは1683です。
# ------------------------------------------------
770デフォルトの名無しさん:2009/12/17(木) 22:37:14
http://pc12.2ch.net/test/read.cgi/tech/1260532772/206
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10285.txt
#
# 必修課題2
# 10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べるプログラムを作成せよ。
# for文とインクリメント演算子、あるいはデクリメント演算子を用いなさい。実行結果の
# 例を以下に示す。
# ------------------------------------------------
# 10000以下の数を入力して下さい:1000
# 10000から10回ひくことができます。
# ------------------------------------------------
771デフォルトの名無しさん:2009/12/17(木) 22:39:51
http://pc12.2ch.net/test/read.cgi/tech/1260532772/206
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10285.txt
#
# 発展課題1
# 2−4+6−8・・・・・−100の計算を行うプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# 答えは-50です。
# ------------------------------------------------
# ヒント:一回ごとに符号を変えることを考えてみましょう(a = -a)
772デフォルトの名無しさん:2009/12/17(木) 22:43:17
http://pc12.2ch.net/test/read.cgi/tech/1260532772/206
# [1] 授業単元: プログラミング1
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10285.txt
#
# 発展課題2
# 任意の整数Xを入力すると、整数Xの階乗を算出されるプログラムを作成せよ。
# ただし、0および負の整数を入力すると、「値が不適当です。」とメッセージが出るようにする。
# 階乗はn!=1×2×3・・・×nで表される。実行結果の例を以下に示す。
# ------------------------------------------------
# 整数を入力して下さい:5
# 5の階乗は120です。
# ------------------------------------------------
# ヒント:if文の中にfor文やwhile文を入れ込むこともできます。
773デフォルトの名無しさん:2009/12/17(木) 22:55:39
>>769
% Prolog

'3+6+9+・+99の計算'(_合計) :-
  '3+6+9+・+99の計算'(3,_合計).

'3+6+9+・+99の計算'(99,99) :- !.
'3+6+9+・+99の計算'(N,Sum) :-
  N3 is N + 3,
  '3+6+9+・+99の計算'(N3,Sum3),
  Sum is Sum3 + N.
774デフォルトの名無しさん:2009/12/17(木) 22:56:51
>>769
% Prolog


'3+6+9+・+99の計算'(_合計) :-
  findsum(S,(for(1,N,33),S is N * 3),_合計).
775デフォルトの名無しさん:2009/12/17(木) 23:12:27
>>770
% Prolog

'10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べる' :-
  write('任意の数を入力してください :'),get_integer(N),
  '10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べる'(10000,N,_回数),
  write_formatted('引くことのできる回数は%t回です。\n',[_回数]).

'10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べる'(M,N,0) :- M < N,!.
'10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べる'(M,N,_回数) :-
  M1 is M - N,
  '10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べる'(M1,N,_回数1),
  _回数 is _回数1 + 1.
776デフォルトの名無しさん:2009/12/17(木) 23:36:19
>>771
% Prolog

'2−4+6−8・・・・・−100の計算'(_合計) :-
  '2−4+6−8・・・・・−100の計算+'(1,2,_合計).

'2−4+6−8・・・・・−100の計算'(_,100,-100) :-
'2−4+6−8・・・・・−100の計算'(M,N,_合計) :-
  M2 is M * -1,
  N2 is N + 2,
  '2−4+6−8・・・・・−100の計算'(M2,N2,_合計2),
  _合計 is _合計2 + N * M.



 
777デフォルトの名無しさん:2009/12/17(木) 23:37:55
>>771 訂正一ヶ所
% Prolog

'2−4+6−8・・・・・−100の計算'(_合計) :-
  '2−4+6−8・・・・・−100の計算'(1,2,_合計).

'2−4+6−8・・・・・−100の計算'(_,100,-100) :-
'2−4+6−8・・・・・−100の計算'(M,N,_合計) :-
  M2 is M * -1,
  N2 is N + 2,
  '2−4+6−8・・・・・−100の計算'(M2,N2,_合計2),
  _合計 is _合計2 + N * M.
778デフォルトの名無しさん:2009/12/17(木) 23:43:24
>>772
% Prolog

'n!'(1,1).
'n!'(N,X) :- N1 is N - 1,'n!'(N1,Y),X is N * Y.
779デフォルトの名無しさん:2009/12/17(木) 23:46:51
http://pc12.2ch.net/test/read.cgi/tech/1260532772/209
# [1] 授業単元:Cプログラミング入門
# [2] 問題文(含コード&リンク):
# 五目並べの作成
# 主に終了判定関数、コンピューターによる着手の生成関数の作成
# サンプルプログラム:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin
/joyful/img/10289.txt
#
780デフォルトの名無しさん:2009/12/17(木) 23:49:57
http://pc12.2ch.net/test/read.cgi/tech/1260532772/210
# 【質問テンプレ】
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10290.txt
#
# 名前と点数のデータを持っているリスト構造をソートさせたいのです。
#
# (名前) (点数)
# 骨川スネ夫 50
# 野比のび太 0
# 出木杉英才 100
# 剛田たけし 20
# 源静香 80
#
# のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、
# 点数でソートしたい時は0から順に並び替え、画面に出力させたいのですが、
# そもそもあいうえお順でソートさせる方法が分からず、
# 名前と点数を同時に動かす方法も思いつかず、提出期限間近になってしまいました。
# どうかお願いします。
#
# //漢字でソートは無理だから漢字名とは別に表示させずにひらがなで名前のデータを入れておくのでしょうか?
781デフォルトの名無しさん:2009/12/18(金) 00:17:53
>>769
使用言語: Yorick

> sum(indgen(3:99:3))
1683
782デフォルトの名無しさん:2009/12/18(金) 02:17:22
>>769
使用言語: Scilab

-->sum(3:3:99)
ans =

1683.
783デフォルトの名無しさん:2009/12/18(金) 02:26:34
>>771
使用言語: Scilab

-->a=2:2:100;
-->sum((-1)^(0:(length(a)-1)) .* a)
ans =

- 50.
784デフォルトの名無しさん:2009/12/18(金) 05:08:57
http://pc12.2ch.net/test/read.cgi/tech/1260532772/216
# [1] 授業単元: オペレーティングシステム
# [2] 問題文(含コード&リンク):
#  1. 引数にファイル名を指定すると,そのファイルのサイズとファイルの種類(一般ファイル,デ
#    ィレクトリ,パイプ等),そして最終変更時刻を表示するコマンド(fview という名称とする)を作
#    成せよ.ただし,引数には,複数のファイルを指定できるようにすること.また,fstat システム
#    コールを用いること.
#
#    実行
#    $ fview aaa.txt bbb.txt ccc.txt …
#    ヒント
#    ファイルの種類は,fstat 構造体メンバのst_mode の上位4 ビットで表わされる.
785デフォルトの名無しさん:2009/12/18(金) 05:10:42
http://pc12.2ch.net/test/read.cgi/tech/1260532772/216
# [1] 授業単元: オペレーティングシステム
# [2] 問題文(含コード&リンク):
#  2. 引数に指定した複数のテキストファイルの内容を結合して,一つのファイルにまとめるコマ
#    ンド(catfiles という名称とする)を作成せよ.ただし,まとめた内容を格納するファイル名は,
#    “concat.txt”とすること.ただし,cat コマンドをsystem 関数の内部で呼ぶような構成は認め
#    ない.システムコールとしては,open,close,read,write を用いること.また,結合してまとめ
#    た結果を格納するファイルが存在しない場合には,creat システムコールを用いて生成するこ
#    と.
#
#    実行
#    $ catfiles aaa.txt bbb.txt ccc.txt …
786デフォルトの名無しさん:2009/12/18(金) 06:05:59
>>780
% Prolog

名前と点数のデータを持っているリスト構造をソートする(_整列鍵) :-
  _整列鍵 = 名前,
  findall([_ひらがな名,_名前,_点数],(データ(_名前,_点数),漢字ひらがな変換(_名
前,_ひらがな名)),L),
  sort(L,L1),
  member([_,_名前2,_点数2],L1),
  write_formatted('%t %t\n',[_名前2,_点数2]),
  fail.
名前と点数のデータを持っているリスト構造をソートする(_整列鍵) :-
  _整列鍵 = 点数,
  findall([_点数,_名前],データ(_名前,_点数),L),
  sort(L,L1),
  member([_点数2,_名前2],L1),
  write_formatted('%t %t\n',[_名前2,_点数2]),
  fail.
名前と点数のデータを持っているリスト構造をソートする(_).
787デフォルトの名無しさん:2009/12/18(金) 06:40:52
>>784
% Prolog
program :-
  user_parameters(_パス名ならび),
  write('パス名,サイズ,種類,最終変更時刻\n'),
  ファイル情報を表示する(_パス名ならび),
  halt.

ファイル情報を表示する([]) :- !.
ファイル情報を表示する([_パス名|R]) :-
  ファイル情報を得る(_パス名,_サイズ,_種類,_最終変更時刻),
  write_formatted('%t,%t,%t,%t,%t\n',[_パス名,_サイズ,_種類,_最終変更時刻]),
  ファイル情報を表示する(R).

ファイル情報を得る(_パス名,_サイズ,_種類,_最終変更時刻) :-
  get_file_info(_パス名,[dev(Dev),ino(Ino),mode(Modes),nlink(Nlink),uid(Uid),uname(Uname),gid(Gid),gname(Gname),size(_サイズ),atime(Atime),mtime(Mtime),ctime(_最終変更時刻),blksize(Blksize),blocks(Blocks)]),
  member(FI,Modes),
  sub_atom(FI,0,2,_,if),
  ファイル種類(FI,_種類).

ファイル種類(ifblk,ブロックファイル).
ファイル種類(ifchr,キャラクタファイル).
ファイル種類(ififo,パイプ).
ファイル種類(ifreg,一般ファイル).
ファイル種類(ifdir,ディレクトリ).
ファイル種類(iflnk,シンボリックリンク).
788デフォルトの名無しさん:2009/12/18(金) 06:54:46
>>785
% Prolog
program :-
  user_parameters(_パス名ならび),
  open('concat.txt',write,Output1),
  close(Output1),
  open('concat.txt',append,Output),
  ファイルを書き加える(Output,_パス名ならび),
  close(Output),
  halt.

ファイルを書き加える(Output,[]) :- !.
ファイルを書き加える(Output,[_パス名|R]) :-
  open(_パス名,read,Input),
  get_char(C),
  一文字づつ書き加える(Input,Output,C),
  close(Input),
  ファイルを書き加える(Output,R).

一文字づつ書き加える(_,_,end_of_file) :- !.
一文字づつ書き加える(Input,Output,C) :-
  put_char(Output,C),
  get_char(Input,C2),
  一文字づつ書き加える(Input,Output,C2).
789デフォルトの名無しさん:2009/12/18(金) 06:58:38
>>769
使用言語: maxima

(%i429) sum(i*3,i,3/3,99/3);
(%o429) 1683
790デフォルトの名無しさん:2009/12/18(金) 07:00:54
>>771
使用言語: maxima

(%i433) sum(2*i*(-1)^(i-1),i,2/2,100/2);
(%o433) - 50
791デフォルトの名無しさん:2009/12/18(金) 07:13:13
>>769
使用言語: J

+/3*>:i.33
1683
792デフォルトの名無しさん:2009/12/18(金) 07:13:56
>>771
使用言語: J

-/+:>:i.50
_50
793デフォルトの名無しさん:2009/12/18(金) 07:39:17
>>769
使用言語: R

> sum(seq(3,99,3))
[1] 1683
794デフォルトの名無しさん:2009/12/18(金) 07:40:04
>>771
使用言語: R

> sum(c(seq(2,98,4),seq(-4,-100,-4)))
[1] -50
795デフォルトの名無しさん:2009/12/18(金) 10:50:57
>>771
使用言語: Yorick

> sum(grow(indgen(2:98:4),indgen(-4:-100:-4)))
-50
796デフォルトの名無しさん:2009/12/18(金) 11:25:59
http://pc12.2ch.net/test/read.cgi/tech/1260532772/226
# 上記を参考に、malloc関数を用いて、氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する、任意の人数の処理が可能な、プログラムを、malloc.cという名前で作成せよ。
# malloc.cをVisual Studioで実行して(5名以上入力)、実行結果をmalloc.c内の文末に「コメント行」として記載せよ。(コメント行を追加後も、ビルド可能か再確認)
#
797デフォルトの名無しさん:2009/12/18(金) 11:28:33
>>796
% Prolog
% Prologにはmalloc()はさすがにない。assertz/2で代用する。

氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する :-
  get_line(Line),
  氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line),
  学生(_氏名,_学籍番号,_身長),
  write_formatted('%t,%t,%t\n',[_氏名,_学籍番号,_身長]),
  fail.
氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する.

氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(end_of_file) :- !.
氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line) :-
  split(Line,[' '],[_氏名,_学籍番号,_身長]),
  assertz(学生(_氏名,_学籍番号,_身長)),
  get_line(Line2),
  氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する(Line2).
798デフォルトの名無しさん:2009/12/18(金) 12:37:03
>>725
むしろprologのコード眺めるために来てるな俺はw
799デフォルトの名無しさん:2009/12/18(金) 12:46:17
次の事項を,自分の言葉で証明せよ
挿入整列法は,平均の場合約N2/4回の比較と約N2/4回の半交換(移動)を行う.最悪の場合は,それぞれその2倍になる
800デフォルトの名無しさん:2009/12/18(金) 13:01:31
>>786
% 漢字ひらがな変換/2はPrologの処理系にライブラリとして存在する、というわけにはいかない。
% 私は以下のようなインチキをして使っている。

漢字ひらがな変換(_漢字含み文字列,_ひらがな文字列) :-
  concat_atom(['echo "',_漢字含み文字列,'" | kakasi -JH'],S),
  shs(S,_ローマ字含み文字列ならび),
  _ローマ字含み文字列ならび = [_ひらがな文字列|_] .

shs(S,L) :-
  system(S,user_input,Input),
  get_lines(Input,L),
  close(Input).
801デフォルトの名無しさん:2009/12/18(金) 13:28:21
>>769
使用言語: Haskell

Prelude> sum [3,6..99]
1683
802デフォルトの名無しさん:2009/12/18(金) 13:29:46
>>771
使用言語: Haskell

Prelude> foldr (-) 0 [2,4..100]
-50
803デフォルトの名無しさん:2009/12/18(金) 14:30:25
>>769
使用言語: Io

Io> s:=0;for(i,3,99,3,s=s+i);s
==> 1683
Io> 1 to(33) map(v,v*3) sum
==> 1683
804デフォルトの名無しさん:2009/12/18(金) 14:31:16
>>771
使用言語: Io

Io> s:=0;for(i,2,100,2,s=s+i*(-1)**(i/2+1))
==> -50
Io> s:=0;for(i,100,2,-2,s=i-s)
==> -50
Io> 2 toBy(100,2)asList reverseReduce(s,v,s-v)
==> -50
805デフォルトの名無しさん:2009/12/18(金) 14:35:45
>>771
% Prolog こういうリスト表記は思いつきっぽくて嫌だな。

:- op(200,xfx,(..)).

sum([A,B..C],X) :-
  F is B - A,
  D is (C // F) - 1,
  findsum(U,(for(0,N,D),U is A + (N * F)),X).
806806:2009/12/18(金) 14:38:03
% ごめんリンク間違えた。
>>801
% Prolog こういうリスト表記は思いつきっぽくて嫌だな。

:- op(200,xfx,(..)).

sum([A,B..C],X) :-
  F is B - A,
  D is (C // F) - 1,
  findsum(U,(for(0,N,D),U is A + (N * F)),X).
807デフォルトの名無しさん:2009/12/18(金) 14:43:58
http://pc12.2ch.net/test/read.cgi/tech/1260532772/233
# [1] 授業単元:if文とfor文
# [2] 問題文(含コード&リンク):キーボードから6つの数値を入力し、
# 最大値を表示するプログラムを作成
# ? キーボードから入力する数値例:25 , 6 , 45, 18 , 57, 5
# [5] その他の制限:
# ? for文を用いてキーボードから値を読み込みながら,
# それまでに読み込んだ値の最大値maxと比較し,
# もし大きければmaxの値を更新する
# for(i=?;i<=?;?){
# scanf(?????);
# if( ? > max) ???????;
# }
808デフォルトの名無しさん:2009/12/18(金) 15:12:31
>>807
% Prolog 非決定性のオペがrawmodeでうまくいくかは疑問。ここのところのテーマであるappend型で書いてみる。
最大値を表示する(Max) :-
  rawmode,
  get_code(Code),
  整数として確定する(Code,N),
  これまでの最大値を表示する(N,N,Max).
最大値を表示する(_) :- norawmode.

これまでの最大値を表示する(N,Max,Max). /* 表示するならここ */
これまでの最大値を表示する(N,Max1,Max).
  N >= Max1,
  get_code(Code),
  整数として確定する(Code,N2),
  これまでの最大値を表示する(N2,N,Max).
これまでの最大値を表示する(N,Max1,Max).
  N < Max1,
  get_code(Code),
  整数として確定する(Code,N2),
  これまでの最大値を表示する(N2,Max1,Max).

整数として確定する(32,0).
整数として確定する(10,0) :- !,fail.
整数として確定する(Code,N) :- \+(Code=10),\+(Code=32),
  N1 is N - 48,
  get_code(Code2),
  整数として確定する(Code2,N2),
  N is N2 * 10 + N1.
809デフォルトの名無しさん:2009/12/18(金) 16:01:13
>>806
他のリスト生成の指示が初期値、終了値、増分値なのに
たいしてこれだけ初期値、初期値+増分値、終了値なのが
例による指示という感じで、ちょっと面白いと思いました。
810デフォルトの名無しさん:2009/12/18(金) 16:16:55
>>809
思いつきと感じるのもそこだと思うのですが、確かに面白いですね。
昔々、QBEという関係言語族の例題型の言語あって、それは表計算のような
矩形の枠にいくつか情報を入力するとそれを補間するようにデータが表示
されるというものでした。プログラミング言語の文法にも陽にこのような
情報補間による解法というのがもっとあってもいいかも知れない。
811デフォルトの名無しさん:2009/12/18(金) 16:47:06
加害者:太田花江
愛知県在住 26歳 女
誕生日:1983年8月29日
碧南市本郷町
事故日:9月1日
事故車両:黄色のエッセ
事故状況:http://www.pref.aichi.jp/police/koutsu/map/image/syousai/H21_36okazaki-12.gif
被害者:小林○○さん

事故車両と現場の写真
http://www.city.okazaki.aichi.jp/secure/2848/12.pdf

顔写真
http://up3.viploader.net/ippan/src/vlippan046402.jpg


事故状況:http://www.pref.aichi.jp/police/koutsu/map/image/syousai/H21_36okazaki-12.gif
812デフォルトの名無しさん:2009/12/18(金) 19:42:41
>>808
の使い方ですが、
?- 最大値を表示する(Max).23
Max = 23;345
Max = 345;11
Max = 345;369
Max = 369;77
というように進むのですが、「キーボードから6つの数値を」の
部分が述語定義に組み込まれていませんでした。これを組み込んだ
ものを次に書きます。収容な述語にはカウンタを付加しなくてなり
ません。
813デフォルトの名無しさん:2009/12/18(金) 19:54:56
>>807
% Prolog 入力整数は最大6個までになりました。大変微妙な位置に
% カウント6が割り込みました。ここだと無駄な7つ目の読み込みを避けることができます。

最大値を表示する(Max) :-
  rawmode,
  get_code(Code),
  整数として確定する(Code,N),
  これまでの最大値を表示する(1,N,N,Max).
最大値を表示する(_) :- norawmode.

これまでの最大値を表示する(_,N,Max,Max). /* 表示するならここ */
これまでの最大値を表示する(6,N,_,_) :- !,fail.
これまでの最大値を表示する(M,N,Max1,Max).
  N >= Max1,
  get_code(Code),
  整数として確定する(Code,N2),
  M2 is M + 1,
  これまでの最大値を表示する(M2,N2,N,Max).
これまでの最大値を表示する(M,N,Max1,Max).
  N < Max1,
  get_code(Code),
  整数として確定する(Code,N2),
  M2 is M + 1,
  これまでの最大値を表示する(M2,N2,Max1,Max).
814デフォルトの名無しさん:2009/12/18(金) 23:21:53
>>769
使用言語: Lua

> s=0;for i=3,99,3 do s=s+i end;print(s)
1683
815デフォルトの名無しさん:2009/12/18(金) 23:22:43
>>771
使用言語: Lua

> s=0;for i=100,2,-2 do s=i-s end;print(s)
-50
816デフォルトの名無しさん:2009/12/19(土) 03:22:06
http://pc12.2ch.net/test/read.cgi/tech/1260532772/250
# [1] 授業単元:C言語初級 可変長引数
# [2] 問題文(含コード&リンク):
# 下記のような関数を作れ。
#  scanfをfgetsとsscanfを組み合わせた関数
#
#  int mscanf(int num , const char*str , const char*format, ...)
#  num:最大文字数 str:scanfでいうところの第一引数 format:scanfでいうところの第二引数以降
#  戻り値はscanfと同じにする。
817デフォルトの名無しさん:2009/12/19(土) 04:04:42
# [1] 授業単元:Prolog初級
# [2] 問題文(含コード&リンク): 以下のような不完全な形式の情報が与えられる
# ことが分かっている。この情報をファイルから読み取り、利用しやすい述語と
# して自動的に定義したい。ファイル名と定義する述語名を引数として、情報を
# 解析して、情報を利用し易くする述語を自動的に定義する述語を定義しなさい。
#
# 加害者:間魔手小奈
# 埼玉県在住 21歳 女
# 誕生日:1988年2月29日
# 所沢市並木町
# 事故日:7月31日
# 事故車両:白色のマツダクーペ
# 事故状況:http://www.pref.saitama.jp/police/
# 被害者: 小平正雄
818デフォルトの名無しさん:2009/12/19(土) 05:37:38
http://pc12.2ch.net/test/read.cgi/tech/1260972593/39
# フォームのテキストボックスに入力された文字列(英数字のみ)を取得し、1文字ずつ16進数に変換し、その総和を計算したいのですが良い方法はありますか?
#
# 【例】
# テキストボックスに"12"と入力されたとき、0x31 + 0x32を計算して0x63とする。
#
# また、3桁の16進数となった時は下2桁のみ取得します。
# 取得した2桁の16進数は各桁に該当する英数字を文字もしくは文字列で取得(総和が0x63ならば"6"と"3"をそれぞれ取得)します。
#
# 文字列をGetBytesで変換後バイト型配列に格納し、
# BitConvertで弄るなど考えましたが上手くいきません。
819デフォルトの名無しさん:2009/12/19(土) 06:12:02
>>818
% Prolog
'16進アルファベット'(['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']).
'0..15'([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]).

'16進加算レジスタの生成' :-
  '16進アルファベット'(_16進アルファベット),
  '0..15'(_0から15),
  重複組み合わせ(_16進アルファベット,2,[A,B]),
  list_nth(N1,_16進アルファベット,A),
  list_nth(N1,_0から15,M1),
  list_nth(N2,_16進アルファベット,B),
  list_nth(N2,_0から15,M2),
  Div is (M1+M2) // 16,
  mod is (M1+M2) mod 16,
  char_code(C,Div),
  char_code(D,Mod),
  '16進加算レジスタのassertz'(A,B,C,D),
  fail.
'16進加算レジスタの生成'.

'16進加算レジスタのassertz'(A,A,C,D) :-
  assertz('16進加算レジスタ'(A,B,C,D)),!.
'16進加算レジスタのassertz'(A,B,C,D) :-
  assertz('16進加算レジスタ'(A,B,C,D)),
  assertz('16進加算レジスタ'(B,A,C,D)),!.

:- '16進加算レジスタの生成'.
820デフォルトの名無しさん:2009/12/19(土) 06:18:08
>>819 間違えた。訂正します。mod->Modとその後の数値->16進表記変換のところです。
% Prolog
'16進アルファベット'(['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']).
'0..15'([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]).

'16進加算レジスタの生成' :-
  '16進アルファベット'(_16進アルファベット),
  '0..15'(_0から15),
  重複組み合わせ(_16進アルファベット,2,[A,B]),
  list_nth(N1,_16進アルファベット,A),
  list_nth(N1,_0から15,M1),
  list_nth(N2,_16進アルファベット,B),
  list_nth(N2,_0から15,M2),
  Div is (M1+M2) // 16,
  Mod is (M1+M2) mod 16,
  list_nth(N3,'0..15',Div),list_nth(N3,_16進アルファベット,C),
  list_nth(N4,'0..15',Mod),list_nth(N4,_16進アルファベット,D),
  '16進加算レジスタのassertz'(A,B,C,D),
  fail.
'16進加算レジスタの生成'.

'16進加算レジスタのassertz'(A,A,C,D) :-
  assertz('16進加算レジスタ'(A,B,C,D)),!.
'16進加算レジスタのassertz'(A,B,C,D) :-
  assertz('16進加算レジスタ'(A,B,C,D)),
  assertz('16進加算レジスタ'(B,A,C,D)),!.

:- '16進加算レジスタの生成'.
821デフォルトの名無しさん:2009/12/19(土) 06:36:47
>>818
% Prolog 実際の加算処理です

'16進数を意味する二桁文字列同士の加算'(_文字列1,_文字列2,_繰り上がり,_16進加算された文字列) :-
  sub_atom(_文字列1,0,1,_,_文字列1_1),
  sub_atom(_文字列2,0,1,_,_文字列2_1),
  '16進加算レジスタ'(_文字列1_1,_文字列2_1,_,_文字列3_1),
  sub_atom(_文字列1,1,1,_,_文字列1_2),
  sub_atom(_文字列2,1,1,_,_文字列2_2),
  '16進加算レジスタ'(_文字列1_2,_文字列2_2,_繰り上がり1,_文字列3_2),
  '16進加算レジスタ'(_繰り上がり1,_文字列3_1,_繰り上がり,_文字列4_1),
  concat_atom([_文字列4_1,_文字列3_2],_16進加算された文字列).
822デフォルトの名無しさん:2009/12/19(土) 06:39:53
>>818
使用言語: J

f=:monad def '_2{.''0123456789ABCDEF''{~16#.inv+/a.i.y'
f '12'
63
f 'A123'
D7
823デフォルトの名無しさん:2009/12/19(土) 07:06:20
>>817
% Prolog 変な書き込みに反応してみたのは、これが最も典型的なPrologプログラミングのスタイルだから。

':の前の情報を鍵として述語を構成する'(_ファイル名,_述語名) :-
  get_chars(_ファイル名,Chars),
  concat_atom(Chars,S),
sPLIT(S,['\n',' ',':'],L1),
  append(LX,['\n',_鍵,':'|LY],L1),
  鍵に対応する情報を取り出す(LY,_情報),
  P =.. [_述語名,_鍵,_情報],
  assertz(P),
  fail.
':の前の情報を鍵として述語を構成する'(_,_).

鍵に対応する情報を取り出す([_,':'|_],_) :- !,fail.
鍵に対応する情報を取り出す([A|R],X) :-
member(A,[' ','\n']),
  鍵に対応する情報を取り出す(R,X),!.
鍵に対応する情報を取り出す([A|R],A).
鍵に対応する情報を取り出す([_|R],A) :- 鍵に対応する情報を取り出す(R,A).
824デフォルトの名無しさん:2009/12/19(土) 07:36:28
>>822
>>820->>821のPrologのコードとは対照的に短いね。
825デフォルトの名無しさん:2009/12/19(土) 09:47:28
>>819->>821
極力、ルールを見せない?
データベースで処理してるように見せる、というのがPrologのスタイルなんですか?
予め、データベースを生成することがプログラミングなのだと?
826デフォルトの名無しさん:2009/12/19(土) 10:13:05
>>825
うーーん。
外延的な定義を好む。フラットな定義を好む。ヨーロッパスタイルと
言うのでしょうか。私を含めてそういうプログラムを良しとする人は
多いですね。好まれる理由は、
1) 非決定性の述語にし易い。
2) 双方向性を保ちやすい。
3) 定義から帰納的に新しい定義を見つけやすい。
それ以前に、データこそすべて的な世界観の人が多いのでしょうが。
827デフォルトの名無しさん:2009/12/19(土) 12:15:29
>>818
使用言語: Lua

function f(x)
s=0
for i=1,#x do s=s+x:byte(i) end
b=("%X"):format(s)
print(b:sub(#b-1))
end

> f("12")
63
> f("A123")
D7
828デフォルトの名無しさん:2009/12/19(土) 12:34:54
>>818
使用言語: maxima

(%i439) f(s):=printf(true,"~X~%",mod(lsum(i,i,map(cint,charlist(s))),255));

(%i440) f("12");
63
(%i441) f("A123");
D7
829デフォルトの名無しさん:2009/12/19(土) 12:50:38
>>818
使用言語: Arc

arc> (def f(s) (coerce (mod (sum int (coerce s 'cons)) 255) 'string 16))

arc> (f "12")
"63"
arc> (f "A123")
"d7"
830デフォルトの名無しさん:2009/12/19(土) 13:01:21
>>818
使用言語: Io

Io> f:=method(a,s:=0;a foreach(v,s=s+v);(s%255)asString toBase(16))

Io> f("12")
==> 63
Io> f("A123")
==> d7
831デフォルトの名無しさん:2009/12/19(土) 14:00:23
>>818
使用言語: Yorick

> func f(s){return swrite(format="%x",sum(strchar(s))%255);}
> f("12")
"63"
> f("A123")
"d7"
832デフォルトの名無しさん:2009/12/19(土) 15:01:20
http://pc12.2ch.net/test/read.cgi/tech/1248012902/621
# http://ime.nu/www.dotup.org/uploda/www.dotup.org473124.zip
#
# 0から360までの整数をランダムに10個発生させ、その整数を角度(弧度法)と
# みなしたとき、その(sin)が最大となる整数を表示するプログラムを作成せよ。
833デフォルトの名無しさん:2009/12/19(土) 16:44:33
>>832
% Prolog

'0から360までの整数をランダムに10個発生させ、その整数を角度(弧度法)とみなしたとき、その(sin)が最大となる整数を表示する'(_角度) :-
  findmax([W,U],(for(1,N,10),U is random mod 361,write_formatted('%t,',[U]),W is sin(U/180)),[Max,U2]),
  write_formatted('\nsin(x)に最大値を与えたのは%t\n',[U2]).
834デフォルトの名無しさん:2009/12/19(土) 16:47:38
>>833 (>>832)
% Prolog トップレベルの引数を削るのを忘れていた。

'0から360までの整数をランダムに10個発生させ、その整数を角度(弧度法)とみなしたとき、その(sin)が最大となる整数を表示する' :-
  findmax([W,U],(for(1,N,10),U is random mod 361,write_formatted('%t,',[U]),W is sin(U/180)),[Max,U2]),
  write_formatted('\nsin(x)に最大値を与えたのは%t\n',[U2]).
835デフォルトの名無しさん:2009/12/19(土) 17:15:58
>>832
使用言語: J

]a=:?10#360
200 276 240 219 157 69 188 84 44 243
a/:|90-a
84 69 44 157 188 200 219 240 243 276
0{a/:|90-a
84
836デフォルトの名無しさん:2009/12/19(土) 17:23:02
>>819
% Prolog 動かそうとしたら途中でfailになった。10-11行目。'0..15' が間違い。_0から15 ですね

'16進加算レジスタの生成' :-
  '16進アルファベット'(_16進アルファベット),
  '0..15'(_0から15),
  重複組み合わせ(_16進アルファベット,2,[A,B]),
  list_nth(N1,_16進アルファベット,A),
  list_nth(N1,_0から15,M1),
  list_nth(N2,_16進アルファベット,B),
  list_nth(N2,_0から15,M2),
  Div is (M1+M2) // 16,
  Mod is (M1+M2) mod 16,
  list_nth(N3,_0から15,Div),list_nth(N3,_16進アルファベット,C),
  list_nth(N4,_0から15,Mod),list_nth(N4,_16進アルファベット,D),
  '16進加算レジスタのassertz'(A,B,C,D),
  fail.
'16進加算レジスタの生成'.
837デフォルトの名無しさん:2009/12/19(土) 17:31:20
>>819
% Prolog さらに一ヶ所エラー発見。

'16進加算レジスタのassertz'(A,A,C,D) :-
assertz('16進加算レジスタ'(A,A,C,D)),!. /* A,B,C,D -> A,A,C,D */
'16進加算レジスタのassertz'(A,B,C,D) :-
assertz('16進加算レジスタ'(A,B,C,D)),
assertz('16進加算レジスタ'(B,A,C,D)),!.
838デフォルトの名無しさん:2009/12/19(土) 17:32:42
>>819 すみません。書き直し。

'16進加算レジスタのassertz'(A,A,C,D) :-
  assertz('16進加算レジスタ'(A,A,C,D)),!. /* A,B,C,D -> A,A,C,D */
'16進加算レジスタのassertz'(A,B,C,D) :-
  assertz('16進加算レジスタ'(A,B,C,D)),
  assertz('16進加算レジスタ'(B,A,C,D)),!.
839デフォルトの名無しさん:2009/12/19(土) 18:28:33
>>695
使用言語: J

H=:i.@(,&2)`(({&0 2 1,0 2,{&1 0 2)@$:@<:)@.*
hanoi=:dyad def '(|:H y){x'

'ABC' hanoi 3
AACABBA
CBBCACC
'ABC' hanoi 5
AACABBAACCBCAACABBABCCBBAACABBA
CBBCACCBBAABCBBCACCABAACCBBCACC
840デフォルトの名無しさん:2009/12/20(日) 05:56:17
http://pc12.2ch.net/test/read.cgi/tech/1260532772/280
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10294.txt
#
# 0〜10までの数のうち、任意の数字を3回まで入力して正解の数を当てる、数当てゲー
ムを作成せよ。当てる数は0〜10までのうち何でも構わない。実行結果の例を以下に示す

# <当たった場合>
# 0〜10までの数を入力して下さい。
# 5
# もっと小さい数です。
# あと2回挑戦することができます。
# 1
# もっと大きい数です。
# あと1回挑戦することができます。
# 3
# 大正解です。
841デフォルトの名無しさん:2009/12/20(日) 05:57:53
>>840 のつづきです。
# <当たらない場合>
# 0〜10までの数を入力して下さい。
# 5
# もっと小さい数です。
# あと2回挑戦することができます。
# 1
# もっと大きい数です。
# あと1回挑戦することができます。
# 4
# もっと小さい数です。
# あと0回挑戦することができます。
# 残念!!不正解でした。
842デフォルトの名無しさん:2009/12/20(日) 06:01:15
http://pc12.2ch.net/test/read.cgi/tech/1260532772/280
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10294.txt
#
# 必修課題3
# 0.2+0.4+0.6+・・・・・+10.0の計算を行うプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# 答えは255.0です。
# ------------------------------------------------
843デフォルトの名無しさん:2009/12/20(日) 06:03:55
http://pc12.2ch.net/test/read.cgi/tech/1260532772/280
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10294.txt
#
# 必修課題2
# 任意の点数を入力し、その点数が0〜59点であれば「不可」、60〜69点であれば「可」、70〜79点であれば「良」、80〜100点であれば「優」、これら以外の点数を入力した場合、「換算できません」と表示されるプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# 何点ですか?:85
# 優です。
# ------------------------------------------------
844デフォルトの名無しさん:2009/12/20(日) 06:10:13
http://pc12.2ch.net/test/read.cgi/tech/1260532772/280
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10294.txt
# 必修課題1
# 任意の直径(cm)を入力した時に、その円周を算出するプログラムを作成せよ。円周率πは3.141592654とする。実行結果の例を以下に示す。
# ------------------------------------------------
# 直径は?:5
# 直径5cmの円の円周は15.707963cmです。
# ------------------------------------------------
845デフォルトの名無しさん:2009/12/20(日) 06:55:03
>>844
% Prolog

:- op(700,xfx,は).

'円周率πは3.141592654とする' :-
  asserta((関数定義(π,_値) :- _値 = 3.141592654)).

'任意の直径(cm)を入力した時に、その円周を算出する' :-
  write('直径は?:'),
  get_line(Line),
  atom_to_term(Line,_直径,_),
  '任意の直径(cm)を入力した時に、その円周を算出する'(_直径,_円周),
  write_formatted('直径%tcmの円の円周は%tcmです。 \n',[_直径,_円周]).
'任意の直径(cm)を入力した時に、その円周を算出する'(_直径,_円周) :-
  _円周 は _直径 * π.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

関数定義(_式,_値) :- _値 is _式.

_値 は _式 :- 関数定義(_式,_値).

:- '円周率πは3.141592654とする'.
846デフォルトの名無しさん:2009/12/20(日) 09:25:02
>>843
使用言語: J

f=:(60 10 10 21#'不可';'可';'良';'優');@{~]
f 0 59 60 69 70 79 80 100
不可
不可





847デフォルトの名無しさん:2009/12/20(日) 11:45:12
>>845 訂正。
% Prolog は/2の定義に不足がありました。

_値 は _式 :-
  functor(_式,_関数,2),
  arg(1,_式,_引数1),
  arg(2,_式,_引数2),
  _値1 は _引数1,
  _値2 は _引数2,
  _式2 =..[_関数,_値1,_値2],
  _値 は _式2.
_値 は _式 :-
  functor(_式,_関数,1),
  arg(1,_式,_引数1),
  _値1 は _引数1,
  _式1 =..[_関数,_引数1],
  _値 は _式1.
_値 は _式 :- 関数定義(_式,_値).
848デフォルトの名無しさん:2009/12/20(日) 11:57:34
>>845 またまた訂正。
% Prolog >>847だと停止しませんね。

_値 は _式 :-
  functor(_式,_関数,2),
  arg(1,_式,_引数1),
  arg(2,_式,_引数2),
  _値1 は _引数1,
  _値2 は _引数2,
  _式2 =..[_関数,_値1,_値2],
  関数定義(_式2,_値).
_値 は _式 :-
  functor(_式,_関数,1),
  arg(1,_式,_引数1),
  _値1 は _引数1,
  _式1 =..[_関数,_引数1],
  関数定義(_式1,_値).
_値 は _式 :- 関数定義(_式,_値).
849デフォルトの名無しさん:2009/12/20(日) 12:19:17
>>845
どういう意図なのか。
πに拘ったコードと考えればいいのかな?
850デフォルトの名無しさん:2009/12/20(日) 16:35:13
>>843
使用言語: R

f <- function(n){
a[0:59]<-"不可"
a[60:69]<-"可"
a[70:79]<-"良"
a[80:100]<-"優"
a[n]
}

> f(55)
[1] "不可"
851デフォルトの名無しさん:2009/12/20(日) 16:48:31
>>849
>>844の仕様から円周を計算する述語の定義は

円周(_直径,_円周) :- _円周 is _直径 * 3.141592654.

でよい。>>845は「円周率πは3.141592654とする。」という一文に拘った定義ですね。
仕様の文章に沿ってできるだけ情報量を落とさないように定義していくと、こんな
感じかなというのが>>845で、単なる一例ですね。このようにプログラム表現が拡散
していくことを評して散文的プログラミングと「Prologでまったりスレ」では表現
しました。仕様の文体、受け止める人の言語感覚によってプログラム表現が変化し
ますから。
852デフォルトの名無しさん:2009/12/20(日) 20:05:13
>>844
使用言語: J
Jにはエンジニアリング表記みたいにかけるpiのリテラル表記がある。
1p2 は 1*pi^2 を表す。また、 o. を単項演算子として使うとpiの倍数を返す。

5p1
15.708

f=:o.
f 5
15.708
853デフォルトの名無しさん:2009/12/20(日) 22:12:32
>>840
% Prolog

'0〜10までの数のうち、任意の数字を3回まで入力して正解の数を当てる、数当てゲーム' :-
  _正解 is random mod 11,
  数の入力(_数),
  '3回まで入力して正解の数を当てる'(3,_数,_正解).

'3回まで入力して正解の数を当てる'(_,_数,_数) :-
  write('大正解!!!\n'),!.
'3回まで入力して正解の数を当てる'(1,_数1,_正解) :-
  write('残念!!不正解でした。\n'),!.
'3回まで入力して正解の数を当てる'(N,_数1,_正解) :-
  診断(_数1,_正解,_診断),
  write_formatted('%t\n',[_診断]),
  N1 is N - 1,
  write_formatted('あと%t回挑戦することができます。\n',[N1]),
  数の入力(_数2),
  '3回まで入力して正解の数を当てる'(N1,_数2,_正解),!.

診断(_数,_正解,'もっと大きい数です。\n') :- _数 < _正解,!.
診断(_数,_正解,'もっと小さい数です。\n') :- _数 > _正解,!.

数の入力(_数) :- repeat,write('0〜10までの数を入力して下さい。\n'),get_integer(_数),_数 >= 0, _数 =< 10,!.
854デフォルトの名無しさん:2009/12/20(日) 22:34:31
>>842
% Prolog

'0.2+0.4+0.6+・・・・・+10.0の計算を行う' :-
  findsum(V,(for(1,N,50),V is N * 0.2),Sum),
  write_formatted('%t\n',[Sum]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'0.2+0.4+0.6+・・・・・+10.0の計算を行う' :-
  等差数列の累計(0.2, 50.0, 0.2, 0.0, Sum),
  write_formatted('%t\n',[Sum]).

等差数列の累計(V1,Max,_,Sum,Sum) :- V1 > Max,!.
等差数列の累計(V1,Max,V,Sum1,Sum) :-
  Sum2 is Sum1 + V1,
  V2 is V1 + V,
  等差数列の累計(V2,Max,Sum2,Sum).
855デフォルトの名無しさん:2009/12/20(日) 22:58:55
http://pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2a(数式の読み込みと表示)
#
# 課題 2a と 2b では,算術式を読み,表示し,値を求めるプログラムを作る.
#
# 限られた時間内で数式処理の本質部分を効率よく学ぶために,
# 入力できる算術式の構文を,次の BNF で定めるものに限る.
#
# 定数 ::= 0 | 1 | … | 9
# 変数 ::= a | b | … | z | A | B | … | Z
# 算術式 ::= 定数
# | 変数
# | (算術式+算術式)
# | (算術式*算術式)
#
# つまり,1桁の定数や1文字の変数の和や積からなる式が入力である.
#
# 入力された算術式を読み込み,2分木データとして格納し,そのデータをもとに
# 入力と同じ算術式を表示する,という処理(下図)を繰り返すプログラムを作れ.
#
856デフォルトの名無しさん:2009/12/20(日) 23:01:43
http://pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2b(数式の値の計算)
#
# 課題 2a のプログラムに,算術式の値を計算して表示する機能を追加せよ.
# ただし,変数の値は全て1であるとして,式の値を求めること.
#
# 例えば,入力が (2*3) と (x+(y+z)) の場合,次のような出力をすればよい.
# show: に続いて入力された算術式を,eval: に続いて算術式の値を表示している.
#
# (2*3) ←入力
# show: (2*3)
# eval: 6
#
# (x+(y+z)) ←入力
# show: (x+(y+z))
# eval: 3
#
# まず,算術式の値を求める関数 eval_exp()(exp.c にある)を完成させる.
# 十分な数の検査データを使って動作の正しさを確かめよ.
#
857デフォルトの名無しさん:2009/12/20(日) 23:08:29
http://pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2c(数式データの基本操作)
# 算術式の値を変えずに括弧をくくり直す簡単な式変形を考える.例えば,式
# (1+(2+3))
# (a*(b*c))
# ((i*x)+((j*y)+(k*z)))
# の括弧を左にくくり直すと,それぞれ,次の式になる.
# ((1+2)+3)
# ((a*b)*c)
# (((i*x)+(j*y))+(k*z))
# 括弧を左にくくり直せる (A+(B+C)) や (A*(B*C)) の形の算術式を
# ((A+B)+C) や ((A*B)*C) の形にする式変形は,式に対応する木を
# 「左に転回」する変形と捉えられる(下図).
#
# http://www.cs.info.mie-u.ac.jp/~toshi/lectures/tree/exp012.png → http://www.cs.info.mie-u.ac.jp/~toshi/lectures/tree/exp013.png
#
# この操作を実行する関数 rotate_left_exp()(exp.c にある)を完成させよ.
# この関数を使い,可能な場合にだけ算術式の括弧を左にくくり直す関数
# assoc_left() を ex2.c に作って動作確認せよ.
858デフォルトの名無しさん:2009/12/21(月) 04:15:39
http://pc12.2ch.net/test/read.cgi/tech/1260532772/310
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):
# 課題 関数(再帰)最大公約数
#  キーボードから自然数を2つ入力し、それらの最大公約数と最小公倍数を表示するプログラムを作成しなさい。
# ただし、最大公約数の計算は関数(再帰)を用いること。最大公約数を計算する関数の名前はgcdとすること。
#
# 実行結果
# 自然数を2つ入力して下さい.
# 3243 6578
# 3243と6578の最大公約数は23,最小公倍数は 927498 です。
859デフォルトの名無しさん:2009/12/21(月) 04:21:24
http://pc12.2ch.net/test/read.cgi/tech/1248012902/632
# 【 課題 】
# 氏名(string)、ふりがな(string)、携帯番号(string)、メールアドレス(string)
# をフィールドとして持つクラスAddressBookを定義せよ。
# クラス内に、ふりがなで辞書順に並べ替えるためのcompareToを定義せよ。
# 外部に,TelNoSortという、電話番号(文字列)を辞書順に並び変えるためのメソッドを
# 作成せよ。
# メイン・プログラムで、AddressBookクラスの配列(ArrayList)を定義し、
# 以下の動作をおこなうプログラムを作れ。
# 3人分のデータをキーボードから入力し、リストに代入する。
# ・配列に代入されたデータをふりがな順に、見やすく出力する。
# ・配列に代入されたデータを電話番号順に、見やすく出力する。
# 入力、出力には、for文を使うこと。
860デフォルトの名無しさん:2009/12/21(月) 05:11:19
#【 課題 】
#「0.2+0.4+0.6+・・・・・+10.0の計算を行うプログラムを作成せよ。」と
# いう課題文が与えられたとする。
# この文を、公差数列 0.2,0.4,0.6...10.0の和を計算する課題であると認識する
# ことができる最小限のプログラムを示せ。
861デフォルトの名無しさん:2009/12/21(月) 06:32:44
http://pc12.2ch.net/test/read.cgi/tech/1260532772/330
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# キーボードから数を入力として受け取り、その個数分のint型データをキーボードから受け取り、
# それらの最大値を画面に出力するプログラムをcallocを用いて書け。
862デフォルトの名無しさん:2009/12/21(月) 07:06:58
>>843
% Prolog
:- op(600,fx,その点数が).
:- op(550,xfx,点であれば).
:- op(500,xfx,〜).

'任意の点数を入力し、その点数が0〜59点であれば「不可」、60〜69点であれば「可」
、70〜79点であれば「良」、80〜100点であれば「優」、これら以外の点数を入力した場
合、「換算できません」と表示する' :-
  任意の点数を入力し(_点数),
  その点数 が _点数 であれば _診断,
  write_formatted('%t\n',[_診断]).

任意の点数を入力し(_点数) :- write('何点ですか? '),get_integer(_点数).

その点数が _点数 点であれば _診断 :-
  その点数が _下限〜_上限 点であれば _診断1,
  _点数>=_下限,
  _点数=<_上限,
  concat_atom([_診断1,'です。'],_診断),!.
その点数が _ 点であれば 換算できません.

その点数が 0〜59 点であれば 不可.
その点数が 60〜69 点であれば 可.
その点数が 70〜79 点であれば 良.
その点数が 80〜100 点であれば 優.
863デフォルトの名無しさん:2009/12/21(月) 07:11:28
>>843 訂正。
% Prolog トップの述語名が不適切なところで改行してしまった。
:- op(600,fx,その点数が).
:- op(550,xfx,点であれば).
:- op(500,xfx,〜).

'任意の点数を入力し、その点数が0〜59点であれば「不可」、60〜69点であれば「可」、70〜79点であれば「良」、80〜100点であれば「優」、これら以外の点数を入力した場合、「換算できません」と表示する' :-
  任意の点数を入力し(_点数),
  その点数 が _点数 であれば _診断,
  write_formatted('%t。\n',[_診断]).

任意の点数を入力し(_点数) :- write('何点ですか? '),get_integer(_点数).

その点数が _点数 点であれば _診断 :-
  その点数が _下限〜_上限 点であれば _診断1,
  _点数>=_下限,
  _点数=<_上限,
  concat_atom([_診断1,'です'],_診断),!.
その点数が _ 点であれば 換算できません.

その点数が 0〜59 点であれば 不可.
その点数が 60〜69 点であれば 可.
その点数が 70〜79 点であれば 良.
その点数が 80〜100 点であれば 優.
864デフォルトの名無しさん:2009/12/21(月) 12:32:35
>>863 一ヶ所間違ってた。「点であれば」というオペレータでなくてはいけない。

その点数 が _点数 であれば _診断, -> その点数 が _点数 点であれば _診断,
865デフォルトの名無しさん:2009/12/21(月) 15:08:10
>>843 書き直します。viの表示だと全角の前後のスペースが正しく空いているのかよくわからない。
% Prolog
:- op(600,fx,その点数が).
:- op(550,xfx,点であれば).
:- op(500,xfx,〜).

'任意の点数を入力し、その点数が0〜59点であれば「不可」、60〜69点であれば「可」
、70〜79点であれば「良」、80〜100点であれば「優」、これら以外の点数を入力した場
合、「換算できません」と表示する' :-
  任意の点数を入力し(_点数),
  その点数が _点数 点であれば _診断,
  write_formatted('%t\n',[_診断]).

任意の点数を入力し(_点数) :- write('何点ですか? '),get_integer(_点数).

その点数が _点数 点であれば _診断 :-
  その点数が _下限〜_上限 点であれば _診断1,
  _点数>=_下限,
  _点数=<_上限,
  concat_atom([_診断1,'です。'],_診断),!.
その点数が _ 点であれば 換算できません.

その点数が 0〜59 点であれば 不可.
その点数が 60〜69 点であれば 可.
その点数が 70〜79 点であれば 良.
その点数が 80〜100 点であれば 優.
866デフォルトの名無しさん:2009/12/21(月) 18:14:05
>>859
% Prolog (その一) 例によってオブジェクト指向にはなりません。

'3人分のデータをキーボードから入力し、ふりがな順に、見やすく出力する :-
  '3人分のデータをキーボードから入力し、リストに代入する'(3,_データならび),
  鍵位置指定昇順整列([2],_データならび,_整列したならび),
  見やすく出力する(_整列したならび).
 
'3人分のデータをキーボードから入力し、リストに代入する'(0,[]) :- !.
'3人分のデータをキーボードから入力し、リストに代入する'(N,[[_氏名,_ふりがな,_携帯番号,_メールアドレス]|R]) :-
  get_line(Line),
  split(Line,[','],[_氏名,_ふりがな,_携帯番号,_メールアドレス]),
  N1 is N - 1,
  '3人分のデータをキーボードから入力し、リストに代入する'(N1,R).

見やすく出力する([]) :- !.
見やすく出力する([[_氏名,_ふりがな,_携帯番号,_メールアドレス]|R]) :-
  write_formatted('%20s,%20s,%12s,%30s\n',[_氏名,_ふりがな,_携帯番号,_メールアドレス]),
  見やすく出力する(R).
867デフォルトの名無しさん:2009/12/21(月) 18:16:11
>>859
% Prolog (その二)

鍵位置指定昇順整列(_鍵の位置ならび,_対象ならび,_整列したならび) :-
  鍵情報の付加(_鍵の位置ならび,_対象ならび,_鍵を付加したならび),
  sort(_鍵を付加したならび,_鍵を付加して整列したならび),
  length(_鍵の位置ならび,Len),
  鍵情報の除去(Len,_鍵を付加して整列したならび,_整列したならび).

鍵情報の付加([],_対象ならび,_対象ならび) :- !.
鍵情報の付加([_鍵の位置|R1],_対象ならび,[_鍵|R2]) :-
  list_nth(_鍵の位置,_対象ならび,_鍵),
  鍵情報の付加(R1,_対象ならび,R2).

鍵情報の削除(_鍵の項目数,[],[]) :- !.
鍵情報の削除(_鍵の項目数,[L1|R1],[L2|R2]) :-
  先頭からn要素(_鍵の項目数,L1,_,L2),
  鍵情報の削除(_鍵の項目数,R1,R2).

先頭からn要素(0,L,[],L) :- !.
先頭からn要素(N,[A|R1],[A|R2],R3) :-
  M is N - 1,
  先頭からn要素(M,R1,R2,R3).
868デフォルトの名無しさん:2009/12/21(月) 18:27:10
>>861
% Prolog

キーボードから数を入力として受け取り、その個数分のint型データをキーボードから受け取り、それらの最大値を画面に出力する :-
  キーボードから数を入力として受け取り(_数),
  _個数 is truncate(_数),
  findall(_データ,(for(1,N,_個数),get_integer(_データ)),_データならび),
  max(_データならび,_最大値),
  write_formatted('入力されたデータの最大値は%tです\n',[_最大値]).

キーボードから数を入力として受け取り(_数) :-
  repeat,
  get_line(Line),
  atom_to_term(Line,_数,_),
  number(_数),!.
869デフォルトの名無しさん:2009/12/21(月) 20:44:37
>>609
% Prolog どこが頭でどこが尾なのかわからなくなってしまった。

キャラクタがバイトをして財布がいっぱいになったら銀行へいく(_財布1,_財布2,_貯金1,_貯金2) :-
財布がいっぱいになったら(_財布1),
銀行で貯金をする(_財布1,_財布2,_貯金1,_貯金2),!.
キャラクタがバイトをして財布がいっぱいになったら銀行へいく(_財布1,_財布2,_貯金1,_貯金2) :-
キャラクタがバイトをして(_貯金1,_貯金3),
キャラクタがバイトをして財布がいっぱいになったら銀行へいく(_財布3,_財布2,_貯金1,_貯金2).

キャラクタがバイトをして(_貯金1,_貯金2) :- _貯金2 is _貯金 + 1.

財布がいっぱいになったら(_財布) :- いっぱいになったら(_財布).

いっぱいになったら(_財布) :- 財布の許容量(_財布の許容量), _財布 >= _財布の許容量,!.

銀行で貯金をする(_財布1,_財布2,_貯金1,_貯金2) :- 手持ちを0にし(_財布1,_財布2),貯金が1増える(_貯金1,_貯金2).

手持ちを0にし(_財布1,_財布2) :- _財布2 = 0.

貯金が1増える(_貯金1,_貯金2) :- _貯金2 is _貯金1 + 1.
870デフォルトの名無しさん:2009/12/21(月) 20:48:11
>>609
% Prolog (その二)
目標金額まで繰り返し、到達したらその金がなくなるまで(_目標金額,_貯金1,_貯金2) :-
  目標金額に到達する(_貯金1,_目標金額),
  その金がなくなるまで家で寝る(_貯金1,_貯金2).
 
その金がなくなるまで(_貯金1,0) :- _貯金1 =< 0,!.
その金がなくなるまで(_貯金1,_貯金2) :-
  家で寝る(_貯金1,_貯金3),
  その金がなくなるまで(_預金3,_預金2).

家で寝る(_貯金1,_貯金2) :- 貯金が1減る(_貯金1,_貯金2).

貯金が1減る(_貯金1,_貯金2) :- _貯金2 is _貯金1 - 1.

手持ちを0にし、貯金が1増える(_財布1,_財布2,_貯金1,_貯金2) :- _財布2 = 0,_貯金2 is _貯金1 + 1.

財布の許容量は3(_財布の許容量) :- 財布の許容量(_財布の許容量).

財布の許容量(3).

目標貯金額は5(_目標貯金額) :- 目標貯金額(_目標貯金額).

目標貯金額(5).
871デフォルトの名無しさん:2009/12/22(火) 06:25:50
少々ズルしてるところはあるけど、部品はこれでできたから、後はゲームのmain部分を
組み立てる。このゲームだと、member型の非決定性の述語をトップにもってきて、
ステッパーの動きをさせて、毎度、財布の中身と、貯金を引数で戻すようにする。
その間の動作(例えば寝る)も引数に戻るようにできれば本当はよい。
872デフォルトの名無しさん:2009/12/22(火) 07:29:29
>>871
ゲームと解釈したのかw 私はシミュレーションだと思ったが・・・
873デフォルトの名無しさん:2009/12/22(火) 08:19:17
初代信長の野望みたいなゲームなのかと。
874デフォルトの名無しさん
http://pc12.2ch.net/test/read.cgi/tech/1260532772/365
# [1] 授業単元:初級プログラミング
# [2] 問題文(含コード&リンク):マインスイーパーを作ってください。
# ・縦の列はABC...で、横の列は123...で表示し、座標を繰り返し入力する
# ・枡の大きさは自由である(難易度ごとに大きさを選べる等要工夫)
# ・地雷の位置は毎回ランダムであること
# ・指定(入力)した座標には周囲の地雷の数を表示させる
# ・地雷のある座標を入力するか、全ての安置を入力することでクリアとする
# ・その他、工夫等が見られると加点