最初のスレは512Kbyte越えで終了。
今回は、Prolog,lisp,Haskell,Ocaml,Erlangなどがバランスよく
現れるように配慮して進めます。
>>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).
>>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 またまた間違い。
'reverse(s)'(S,_反転されたS) :-
atom_chars(S,L1),
反転(L1,L2),
atom_chars(_反転されたS,L2).
>>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).
>>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).
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ビット)に変換したものとする。
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 プログラムのテキストをコピーして下のテキスト入力フィールドへ出力結果と共に貼り付けて提出すること。
http://pc12.2ch.net/test/read.cgi/tech/1255709298/566 # [1]授業単元 C言語実習
# [2]コマンドラインで指定された英数字と空白、タブ、改行記号
# のみから構成されるテキストファイルに含まれる単語の頻度を
# アルファベット順に出力するプログラム。
# 単語とは英数字のみで構成されているものを指す。
# 一つの単語が1回現れた時は部分単語すべてが現れたものとする。
# 部分単語とは、その単語の連続する部分文字列のことである。
# 授業で述べた多重ハッシュテーブルを利用すること。
# 行の長さ、行の総数、単語の長さに制限は無いが、頻度は
# 32bit整数(符号付き)で正の範囲に表せるものとする。
>>21 多重ハッシュテーブル、部分単語ともに分かりません。
授業受けてみたいですね。
部分単語の解釈は私もそれ以外に思いつかない。
>>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))))
>>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 % 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,['+','-','*','/'])).
>>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.
>>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).
>>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).
>>29 してはいけないところに改行が入ってしまった。
構造追加_2(-1,Random) :- retract(索引番号起点(_索引起点番号)),assertz(索引番号起点(Random)),assertz(索引番号終点(Random)),!.
構造追加_2(N,Random) :- assertz(索引終点,Random)),retract(index(N,W2,_)),assertz(index(N,W2,Random)),!.
>>17 問題文1
:- op(600,xf,個目).
'整数 N を入力すると a から N個目までのアルファベットを全て表示'(N個目) :-
for(1,M,N),put_code(96+M),M=N.
>>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.
>>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 (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.
>>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)).
>>36 もう一つ訂正
% 最後に ! を入れて置きましょう。
isPrime(1) :- !.
isPrime(N) :- \+((for(2,M,N//2),0 is N mod M)),!.
>>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).
>>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.
>>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)).
>>3 のようなオブジェクト指向の課題は今後ESPで書くからちょっと待って。もう忘れた・・・
>>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.
>>3 % ESP (その二)
class 誕生 has
attribute 誕生日,時刻,立会い医師または助産婦,誕生にまつわるエピソード;
end.
class 死亡 has
attribute 死亡時刻,確認医師,死因,死亡に至る経過,辞世,墓の在り処;
end.
class 遺伝子 has
attribute 遺伝子;
end.
>>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 % 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 % 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).
>>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.
>>51 さらに訂正
二進数/2の第二引数は整数のリストだから、atom_chars/2は使えない。整数はatomと別扱い。
concat_atom/2を使えばよいが、ISO標準ではないから、
>>51 の第二案は使わず、第一案のwrln/1を直すのがよいだろう。
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]までの値が改行区切りで表示されること
>>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).
>>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).
http://sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
# 3.以下のプログラムを作成
# 3x3マスのマルバツゲームのボードを作成
# ○側と×側が交互に2次元座標上の位置を入力
# 入力後、毎回ボードを表示する
# たて、よこ、斜めのいずれかに○か×が3つ並んだ
# 時点でプログラムを終了
>>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).
>>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 訂正
% 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),!.
>>65 もう一ヶ所訂正。上から四行目、括弧閉じがひとつ足らなかった。
findavg(K,(for(1,M,N),get_line(Input,Line),(Line=end_of_file,!,fail;atom_to_term(Line,K,_))),Avg),
>>67 % Prolog 課題1
'実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納した
後、整列し(順番はどちらでもかまいません)、出力する' :-
get_chars(_文字ならび),
sort(_文字ならび,_整列した文字ならび),
atom_chars(_整列した文字列,_整列した文字ならび),
write_formatted('%t\n',[_整列した文字列]).
>>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).
>>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 % 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).
http://pc12.2ch.net/test/read.cgi/tech/1255709298/694 # [1] 授業単元:画像処理
# [2] 問題文(含コード&リンク):
# ブレゼンハムのアルゴリズムを用いて、ウインドウ内に線分を描画するプログラムを作成しなさい。
# 動作の仕様は2通りの中から選びなさい。(どちらでもよい)
#
# 仕様1(マウスの左ボタンと右ボタンを使用する。候補線を表示はなし。)
# マウスの左ボタンクリック 線分の始点座標の指定
# マウスの右ボタンクリック 線分の終点座標の指定及び線分の描画
#
# 仕様2(マウスの左ボタンだけで操作する。候補線を表示する。)
# マウスの左ボタンクリック 線分の始点座標の指定、及び線分の描画開始
# マウスの移動 始点から線分を絶えず候補として描画。(古い線分は消す)
# マウスの左ボタンクリック 線分の終点座標の確定。線分を描画。
#
# ただし、ライブラリの点を描画するAPI関数を使って線分を引くこと。直線を引くAPI関数を使ってはならない。
>>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).
78 :
77:2009/11/10(火) 01:23:55
>>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).
>>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). /* ここも直しました *
>>75 の問題文は以下。 (Cのソースを読まないと何をやってるか分からない)
# 初めて呼損が起こるまでに確率できた通信回数を評価したい。
# 次のプログラムに追加して、以下の方法で評価を行うプログラムを完成させてください。
#
# 1、ランダムに送受信ノードを決定する
# 2、与えられた送受信ノード間の経路を決定する
# (a)その経路上の全てのリンクに空き容量がある場合、それらを1Mbpsだけ減少させ、「確率できた通信回数」を1増やし、手続き1に戻る
# (b)その経路上に空き容量のないリンクが存在する場合、呼損とし、その時点までの「確率できた通信回数」を記録して手続き3に進む。
# 3、全リンクの空き容量を初期状態に戻し、手続き1に戻る
# 4、1〜3の手続きを1000回行い、「初めて呼損が起こるまでに確立できた通信回数」の平均を算出する。
>>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列).
抽出ならびの初期化([[],[],[],[],[],[],[],[],[],[]]).
>>84 行数制限にかかるので、ちょっとズルをしているが、本来は
位置指定によるならびの置換/4 (これ未定義!)の所はカウントしながら再帰処理を
するところ。
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] その他の制限 :
>>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).
>>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,_ガンマ補正).
>>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,_ガンマ補正).
>>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,_ガンマ補正).
>>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).
>>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 % Prolog
'数値を1から10まで出力する。ただし、5まで出力した時点で一度改行する' :-
for(1,N,10),
write(N),
'ただし、5まで出力した時点で一度改行する'(N),
N = 10.
'ただし、5まで出力した時点で一度改行する'(5) :- nl,!.
'ただし、5まで出力した時点で一度改行する'(_).
>>96 % Prolog
t :- for(1,N,10),write(N),t(N),N=10.
t(5) :- nl,!.
t(_).
>>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).
>>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 % 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.
素数である(_).
>>17 NB.J言語
NB.問題1
f=:a.{~97+i.
>f 6
abcdef
>>17 NB.J言語
NB.問題2
f=:verb def '+/a*+./0=3 5|"0 1 [a=.>:i.y'
>f 10
33
>f 100
2418
>>109 % Prolog
meibo(L) :-
findall(L2,(get_line(Line),split(Line,[','],L2)),L).
>>110 end_of_fileを認識させるのを忘れた!
membo(L) :-
findall(L2,(get_line(Line),(Line=end_of_file,!,fail;split(Line,[','],L2))),L).
>>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
>>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',[_表示する副文字列]).
119 :
デフォルトの名無しさん:2009/11/18(水) 07:10:05
>>114 python
input1 = 'C'
input2 = 'Q'
str = 'GHIJKLMABCDERSTUVWFNOPQXYZ'
print str[str.index('C'):str.index('Q')+1]
>>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)
>>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')
>>114 % Prolog 実際にはライブラリから述語sub_atom/10を使って、
%
http://nojiriko.asia/prolog/t264_u.html '2つの文字に挟まれた副文字列'(_文字列,_第一文字目,_第二文字目,_副文字列) :-
sub_atom(_文字列,_,1,_,_,_第一文字目,_残り文字列,_,_,_),
sub_atom(_残り文字列,_,1,_,_副文字列,_第二文字目,_,_,_,_).
% 表示は省略した。
>>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 % 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',[_氏名,_電話番号ならび,_アドレス]).
>>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.
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 におけるエラーメッセージは不要)
>>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').
>>130 [4] Prologには配列がないため、中間位置要素を得るのに必ず逐次的に
リストを手繰る必要がある。したがって、この問題の解として意味の
あるプログラムを作ることはできない。
http://pc12.2ch.net/test/read.cgi/tech/1258158172/157 # [1] 授業単元: アルゴリズム&アプリケーション
# [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。
# 各行の情報は、
# 顧客名,前月繰越高,当月入金高,当月売上高,締め日付
# であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。
# 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。
# さて更新プログラムのバグから、或る月の前月繰越高が
# その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。
# 不整合になった以降の情報が正しく、
# それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、
# 1) 不整合部分を探し
# 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。
# ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、
# その後、元のcsvファイルに書き戻しなさい。
# [5] その他の制限: 日付などの持ち方は自由に工夫してよい。
>>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).
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度の出来栄え」
#
# です
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は素数ではない(同上).
#
>>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度の出来栄え').
>>142 % Prolog 第二段階w たとえば・・
ここ数年で一番出来が良い(_年産) :-
出来が良い(_年産,_出来具合),
ここ数年(_年産,Term),
findall(_出来具合2,(member(_年産2,Term),ボージョレ・ヌーボー(_年産2,_出来具合2)),_ここ数年のボージョレ・ヌーボー出来具合ならび),
max(_ここ数年のボージョレ・ヌーボー評価ならび,_出来具合).
>>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.
>>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).
>>141 % Prolog
'prime(n) を使用して,1000以下の素数をすべて表示する' :-
for(1000,N,1),
prime(N,'True'),
write_formatted('%t\n',[N]),
N = 1.
'prime(n) を使用して,1000以下の素数をすべて表示する'.
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関数を利用し,キーボードから気温と湿度の値を入力すると,
# 不快指数の値によって体感を示す言葉を表示するプログラムを作成しよう.
>>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.
>>148 一行大事な所が抜けていた
# 不快指数 〜55 〜60 〜65 〜70 〜75 〜80 〜85 85〜
# 体感 寒い 肌寒い 快適 快適 快適 やや不快 不快 不快でたまらない
>>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.
>>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 参照
>>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 参照
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回を上限とする。
>>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 % 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(_列,_行の値ならび,_値).
>>161 順列だと [1,1],[2,2],[3,3] が入らないからだめでしょう。
これが入ってるのは何て云ったかな?
>>162 そうだった! これまでも間違えたところがあったかな・・
「重複順列」。
重複順列(L,N,X) :- length(X,N),重複順列(L,X).
重複順列(L,[]).
重複順列(L,[A|R]) :- member(A,L),重複順列(L,R).
を定義しておく。その上で。
>>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 % 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.
>>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).
>>170 % Prolog これだと何も起こらない
標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する :-
user_paramegers(L),
findall(N,(member(A,L),atom_to_term(A,N,_)),L2),
get_chars(Chars),
標準入力の文字列に含まれるタブをコマンドラインで与えたサイクルのタブストップでスペースに変換する(_タブストップサイクル,_タブストップサイクル,Chars,X),
put_chars(X).
日歩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 % 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']).
>>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).
>>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).
>>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 % 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]),!.
>>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.
九九表示.
>>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.
九九表示.
>>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{|}~
>>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
>>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.
九九表示.
>>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).
>>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(_列,_行の値ならび,_値).
>>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).
>>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).
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)を利用して各学生の全てのデータを席次順に表示する。
>>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.
'各学生の全てのデータを席次順(昇順)に表示'.
>>194 % Prolog 少し重いが、以下の処理の方が一般的。
'各学生の全てのデータを席次順(昇順)に表示' :-
findall([_学年,_席次,_学籍番号,_名前,_欠席日数,_学年,_席次],学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),L1),
sort(L1,L2),
member([_,_,_学籍番号,_名前,_欠席日数,_学年,_席次],L2),
write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]),
fail.
'各学生の全てのデータを席次順(昇順)に表示'.
>>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.
>>197 訂正 トップレベル これでは N が入力できていない!
c132_308(N) :-
c132_308(N,0,_操作した回数,N,_最大値),
write_formatted('%t,%t\n',[_操作した回数,_最大値]).
# [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)を繰り返す
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# タイピングプログラムを作る。
# プログラムの流れは、英単語1行1個ずつ10個入ったファイルを作り、
# 1.テキストファイル名を入れる
# 2.テキストファイルの1行目が表示される
# 3.タイピングをする(ミスをするともう1回タイピングさせる)
# 4.1行目が終わると、2行目が表示され、またタイピングをする
# 5.10問おわったら、かかった時間とミスした回数が出力される
# [1]授業単元 プログラム演習
# [2]問題文:一行に「文字列」,「文字列」,「文字列」,「整数」
# というふうに4つの属性がそれぞれコンマで区切られたファイルを構造体に読み込み
# (ここまでは出来ました)、その2番目の属性に現れる全ての相異なる単語の出現頻度を求め、標準出力に書き出す。
# ここで単語は出現した順に並べる。また大文字は小文字に読み替え、区別しない。また単語のうちa,the,by,for,in,on,of,to,withは除外し、カウントしない。
# [1] 課題
# [2] 問題文:文字型配列 str1[10] str2[10]を宣言し、これに好きな
# 文字列をキーボードから入力し、それぞれの文字を順
# に1文字ずつ交互に取り出し出力しなさい。
>>203 % Prolog
文字を順に1文字ずつ交互に取り出す(Atom1,Atom2,Char) :-
sub_atom(Atom1,_,1,R,Char1),
sub_atom(Atom2,_,1,R,Char2),
(Char = Char1; Char = Char2).
>>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 % 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).
>>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).
>>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).
>>203 NB.J言語
f=:;/@[;@,@|:@,:;/@]
'123' f 'abc'
1a2b3c
'123' f 'abcdefg'
1a2b3cdefg
>>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
>>205 NB.J言語
NB.
NB.課題2
load 'misc'
(":@[,':','*'#~])/"1>/:~nubcount ?100#10
0:*************
1:*************
2:*******
3:***************
4:***************
5:*****
6:*******
7:**********
8:******
9:*********
>>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).
#
http://codepad.org/JEzL3ZJ7 は以下のコメント付加した。これを参考にナップザックプログラムを復元せよ。
# /** ナップザックの個数 */
# /** ナップザック */
# /** 全てのナップザックの総重量 */
# /**
# * このナップザック問題を解く機械を初期化する
# */
# /**
# * ナップザックの内容を全て表示する
#
# /**
# * 全ナップザックの総重量を計算し,capacityに格納する
# */
# /**
# * ナップザックに入れることができる要素
# * @author おーさー
# *
# */
# /** 要素のID */
# /** 要素の重さ,ランダムに決定 */
# /** 要素の価値,ランダムに決定 */
# /**
# * この要素を初期化する
# * @param givenId 要素のID
# */
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の結果の表示
>>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).
>>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
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)
# がどのように展開されるかを示すし、考察を加えよ。
#
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 を出力表示する。
#
>>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).
>>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,_学年ならび).
>>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).
http://pc12.2ch.net/test/read.cgi/tech/1258320456/43 # 正多角形を表現するクラスPolygonを定義し,いくつかのインスタンスを生成して表示せよ.メソッドも実行して結果を示すこと.
#
# ・辺の数と1辺の長さをアトリビュートとして持つ (コンストラクタは引数として辺の数と1辺の長さを取る)
# ・printすると次のように表示される
# [Polygon] 辺の数: 5, 辺の長さ: 100
# ・周囲の長さを返すメソッド(perimeter)を持つ (引数なし)
#
>>229 % ESP
class Polygon has
:create(Class,Obj,_辺の数,_辺の長さ) :-
:new(Class,Obj),
Obj!辺の数 := _辺の数,
Obj!辺の長さ := _辺の長さ;
instance
attribute 辺の数,辺の長さ;
:perrimeter(OBJ,_周囲の長さ) :-
_周囲の長さ := OBJ!辺の長さ * OBJ!辺の数;
end.
>>224 仕様追加
#
# データはキーボードから点数を入力で。
# 表は、
# 番号| 国語 数学 英語 |最高 |最低 |平均
# 1 | | | |
# 2 | | | |
# (中 略)
# 5 | | | |
# ――――――――――――――――――――――――――――――
# 最高 |
# 最低 |
# 平均 |
# 表はこんな感じで。
# 最低点の表示もお願いします。
>>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,年],_和暦).
>>236 一ヶ所間違えた。訂正。
西暦和暦応答(_西暦) :-
findall(_和暦,明治以降の西暦和暦変換(_西暦,_和暦),L),
concat_atom(L,',',S),
write_formatted('%t->%t\n',[_西暦,S]).
>>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,_順位ならび).
>>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);
>>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 % 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]).
>>203 maxima
短い文字列の方に合わせてしまうが、そういう仕様ということで。
f(a,b):=simplode(join(charlist(a),charlist(b)),"");
(%i4)f("123","asdfgh");
(%o4) 1a2s3d
(%i5)
>>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).
>>245 改行してはいけないところに改行が入ってしましました。
stack_opration/3に集中していますから、直して読んでください。
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
#
>>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).
>>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).
>>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).
>>248 % Prolog
索引の保護(_文名,_保護ファイル,_索引ならび) :-
assertz(索引(_文名,_索引ならび)),
tell(_保護ファイル),
listing(索引),
told.
索引の定義(_文名,_保護ファイル,_索引ならび) :-
reconsult(_保護ファイル),
索引(_文名,_索引ならび).
http://pc12.2ch.net/test/read.cgi/tech/1258320456/45 # Polygonをスーパークラスとして,正三角形(Triangle),正四角形(Square)を表現するクラスをそれぞれ定義せよ.
#
# ・辺の長さのみを引数に与えてインスタンスを生成する
# ・自身の面積を計算して結果を返すメソッドarea()を持つ
# √3 = 1.73 としてよい
# メインルーチンでは,実際にインスタンスを生成し,各インスタンスについて,インスタンス自身,周囲の長さ,面積の3項目を表示するようにせよ.
>>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.
http://pc12.2ch.net/test/read.cgi/tech/1170662552/284 # 過去の株価を利用したシミュレーションプログラム。
# 具体的には、データとして興味のある某銘柄の日柄(日別に始値、高値、安値、終値、出来高)
# を10年分オープンオフィスの表計算calcにyahooファイナンスから入手しました。
# 例えば、このデータを使って特定の日にその株を1000株買い、以降10円上がれば売り
、売り値から
# 10円下がればまた買い、その買値より10円下がれば買い増し(仮の現金残高がなくな
るまで)し、
# それぞれは買値より10円上がると売る。
# 持ち株がなくなると、高値から1割下がったところからまた始める。
# というようなことを繰り返すと、いくらの利益でいくらの買値ので
# どれぐらい持ち株になった状態かを結果としてだすものです。
#
>>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).
>>256 % Prolog 3個の整数を得るには以下のやり方もある。
'3個の整数を得る'(L) :-
findall(_整数,(for(1,N,3),write('整数%t:',[N]),get_integer(_整数)),L).
>>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.
>>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).
とすれば中に入ります。ただ、この手の先読み的手法がわかりやすいかどうか。
>>258 % Prolog これもいろんな定義が何度も出てきました。for/3を使うのは
% あまりProlog的な感じがしませんが、使うことはあります。
長方形を作りましょう :-
write('横幅 :'),get_integer(_横幅),
write('高さ :'),get_integer(_高さ),
for(1,M,_高さ),
for(1,N,_横幅),
write('*'),
N = _横幅,
nl,
M = _高さ.
>>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)
>>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).
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.
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/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)についてそれぞれ独立にテストしたコードを作成すること
>>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)),!.
>>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 に書いておきます。
>>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],_変換された文字列).
>>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).
>>273 % Prolog
string型の引数を二つ与えて大文字小文字を区別せずそれが同じものかどうかを判定(_
文字列1,_文字列2,同じもの) :-
to_lower(_文字列1,_小文字化された文字列),
to_lower(_文字列2,_小文字化された文字列),!.
string型の引数を二つ与えて大文字小文字を区別せずそれが同じものかどうかを判定(_,
_,同じものではない).
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で上書きしたいのですが、
# どの様に書くのが一般的なのでしょうか。
>>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).
>>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,_持株数).
>>286 ぎゃーっ。
これを読んでくれる人はいないだろうけれど、ひとこと。
なぜ、一日のシミュレーション/9 とそれとそっくりの
一日のシミュレーションの二/7 があるのか、
その違いは何か、それぞれどんな働きをしているのか。
>>289 すみません。化けました。要するに星の「ピラミッド」です。
>>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).
>>291 % 以下のように書く人が多い。速くてスマートだが、二本のどちらの
% リストの処理中か分からず、述語を発展させのが困難で私は嫌い。
文字ならびから文字を順に1文字ずつ交互に取り出す([Char|R],Chars2,Char).
文字ならびから文字を順に1文字ずつ交互に取り出す([_|L1],L2,Char) :-
文字ならびから文字を順に1文字ずつ交互に取り出す(L2,L1,Char).
>>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).
>>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]).
>>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]).
>>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]).
>>296 数値演算処理がlength/2に隠蔽されていていいコードですね。でもさすがに、
length/2 + all/2 とか
concat_atom/2 + write_formatted/2 はひとつのユーティリティ述語に纏めた
方がいいと思いますよ。そろそろ。
>>297 all/2 や concat_atom/2 は既にそれに当たるんだけど。できる限り、
汎用述語を増やさないというか、あっても使わないのがPrologのスタイルだけど、
たしかにここまで頻繁に現れるとなると「そろそろ」かも知れない。
>>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]).
>>289 main = readLn >>= \n -> putStr $ unlines [replicate (n-i) ' ' ++ replicate (2*i-1) '*' | i <- [1..n]]
>>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
>>283 import System.Environment (getArgs)
main = getArgs >>= print . sum . map read
>>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).
http://pc12.2ch.net/test/read.cgi/tech/1258158172/458 # [1] 基礎プログラミング実習
#
# [2]99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,
# またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ.
# 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY=
#
# 変換された文字列はABCabc***SdfGH**X**yy*です.
#
# 追伸:
# ちなみにどうやらアスキーコードを使うらしいです。
# 大文字のコードに32を足せば小文字のコードになるとか言ってました。
# これを使わなければいけないようです。
# あとライブラリ関数は使用不可です。
# 文字列とかやったの初めてです。
#
>>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)
もっとメモリがあれは実行できるのかどうかは、わかりません。
>>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).
>>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,!.
>>289 NB. J言語
f=:monad def'''-*''(1!:2&2)@#~(,.<:@+:@(y&-))|.i.y'
f 5
----*
---***
--*****
-*******
*********
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[]と値段配列[]にデータを入力する。
>>258 NB. J言語
f=:,$'*'"_
3 f 5
*****
*****
*****
>>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),!.
>>182 使用言語:maxima
printf(true,"~{~{~4d~}~%~}",makelist(makelist(i*j,j,1,10),i,1,10));
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)に戻る。
http://pc12.2ch.net/test/read.cgi/tech/1258320456/47 # 【 課題 】四人四首問題。「かるた部」の練習の一環として、
# 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに
# しました。四枚とは、
# やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな
# やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし
# やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば
# やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり
# ルールは、
# 1) 二人ゲームである。
# 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。
# 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。
# 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。
#
# [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。
# つぎに、読み札の順番を決めます。これはこの段階では表示しません。
# 一首、読み、それを表示し、
# 1) 空札 : 何文字目まで読まれてそれがわかったか
# 2) 相手札 : 同上
# 3) 自分札 : 同上
# を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。
# 4) 二つのモードで作りなさい
# 1) 読まれた札を二人とも記憶している。
# 2) 読まれた札は忘れてしまう。
# 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。
>>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
>>314 NB. J言語
f=:monad def';(,'' * ''&;)/<@":"0 q:y'
f 11111
41 * 271
f 11111111
11 * 73 * 101 * 137
>>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
>>17 問題1
使用言語: R
f <- function (n) {substr("abcdefghijklmnopqrstuvwxyz",1,n)}
> f(6)
[1] "abcdef"
> f(30)
[1] "abcdefghijklmnopqrstuvwxyz"
>>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.
>>321 % Prolog 初期設定されたというところが微妙。Prologだと・・・かな
初期設定された文字列の順序を逆に並べ替える :-
retract('(初期)設定文字列'(_文字列)),
文字列の反転(_文字列,_反転された文字列),
asserta('(初期)設定文字列'(_反転された文字列)).
文字列の反転(_文字列,_反転された文字列) :-
atom_chars(_文字列,Chars),
reverse(Chars,RChars),
atom_chars(_反転された文字列,RChars).
>>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
>>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
>>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
>>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>
>>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 % 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]).
>>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]).
>>257 >>331 使用言語: maxima
pow4(n):=n*n*n*n;
(%i15) pow4(6);
(%o15) 1296
>>258 >>332 使用言語: maxima
showwaster(a,b):=(c:smake(b,"*"),for i thru a do print(c));
(%i1) showwaster(3,15);
***************
***************
***************
>>257 >>331 使用言語: Arc
(def pow4 (n) (* n n n n))
arc> (pow4 7)
2401
>>258 >>332 使用言語: Arc
(def showwaster (a b) (for i 1 a (for j 1 b (pr "*")) (prn) ))
arc> (showwaster 5 8)
********
********
********
********
********
nil
>>305 -- Haskell
import Data.Char
main = getLine >>= putStrLn . map convert
convert c | isUpper c = toLower c
| isLower c = toUpper c
| otherwise = '*'
>>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
>>257 >>331 使用言語: 十進BASIC
DEF pow4(n)=n*n*n*n
PRINT pow4(8)
END
実行結果
4096
>>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"
>>258 >>332 使用言語: 十進BASIC
SUB showwaster(a,b)
PRINT REPEAT$(REPEAT$("*",b)&CHR$(10),a)
END SUB
CALL showwaster(5,3)
END
実行結果
***
***
***
***
***
>>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
>>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',[_預金年度,_元利合計]),!.
>>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*
>>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
>>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
ASPで九九を表示するプログラム
For nextやtableタグを使用して
どなたか助けて
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マスで同時に納めていく方法がしたいです。
できたー。aspというよりhtmlが不勉強でしたorz
>>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>"
多分これでいいかと思うのだけど
間違ってたり簡略できたら指摘してほしいな
Forの間に<td>がひとつくる。正解ですね。
>>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)}
]
>>358 今日では閉じタグの省略は、あまり歓迎されていないので注意。
>>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
>>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
>>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).
>>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],_位置).
>>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
>>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
>>365 アーカイブの方見せてもらったけど、この手のやつは、親が(ここでは読み手ということになるけど)、サーバーにないと面白くない。
このプログラムだと、そこから、一字ずつ取ってくる。あるいは、競技者も
サーバーのモードで次の文字を待ち受けている。
そういう風に作れませんか?
>>367 シミュレーションの域を越えるな。ほとんどゲーム。
面白いからやってみるけど。
その前にもうすこし、人間の思考に近づけなくちゃね。
369 :
368:2009/12/01(火) 16:35:50
>>370 一行目は関係ありません。無視してください。
>>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,_平均値).
>>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本来のスタイルではない。
>>370 課題(2)
% Prolog
任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力(_数字文字列,_桁数,_整数) :-
atom(_数字文字列),
sub_atom(_数字文字列,0,Len,0,_数字文字列),
min([Len,_桁数],Min),
sub_atom(_数字文字列,Len-Min,Min,_,_副文字列),
atom_to_term(_副文字列,_整数,_),
integer(_整数).
>>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],_平均値).
>>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
>>370 課題(2)
使用言語: 十進BASIC
DEF f(n,d)=MOD(INT(n/10^(d-1)),10)
PRINT f(123456789,4)
END
実行結果
6
>>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.
>>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
>>370 課題(2)
使用言語: J
f=:dyad def '".(<:y){|.":x'
123456789 f 3
7
>>370 課題(2)
使用言語: Arc
(def f(n d) (mod (trunc (/ n (expt 10 (- d 1)))) 10))
arc> (f 123456789 2)
8
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 と同じ値です.
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 さんがそれぞれ何回勝ったかを出力するプログラムを作成せよ.
>>370 課題(2)
使用言語: Io
f:=method(n,d,n asString reverse at(d-1) asCharacter asNumber)
Io> f(12345,2)
==> 4
>>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).
>>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
>>389 使用言語: J
f=:*/@("."0@":)
f 29
18
f 87
56
>>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).
>>114 使用言語: J
f=:dyad def '(([}.[:i.[:>:])//:~x i.y){x'
'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'CQ'
CDERSTUVWFNOPQ
'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'AZ'
ABCDERSTUVWFNOPQXYZ
'GHIJKLMABCDERSTUVWFNOPQXYZ' f 'ZQ'
QXYZ
>>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))))
>>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個ずつ区切って表示'(_).
>>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
http://pc12.2ch.net/test/read.cgi/tech/1258320456/52 # 【 課題 】和歌について考察する問題。
# 歌 ... こぬ人を待つほの浦の夕凪はやくやもしほの身もこがれつつ (定家)
# これはかなり複雑なうたです。
# 人をまつとは「待つ」であり、「松」です。まつ帆だからです。松の姿に似た帆です。
# もちろん松は浦の背景でもあります。浦は夕凪ですから心は風を「待って」もいます。
# 風はありませんから、待ってもこぬ人なのです。風があの人なのかそれとも帆船なのか
# 微妙です。浦は「浦」であると同時に心の「裏」であり、あの人(風)の気持ちを「占」なふ、
# うらでもあります。
# 「焼くや」(やいているのだろうか)とは、恋に焦がれて身を焼いているのであり、
# やくやもしほとは藻塩(自分)が陽にあぶられ、渇き、焼かれ、煙でいぶされ、さらに
# 煮られ、再び乾かされというような、製塩法の愛の地獄絵であり、身もこがれという
# 言葉には「藻」がここでも含まれています。製塩の煙は夕凪の浦に実際に漂って
# いるのかもしれません。
# 以上のような、この歌に含まれる語とそれからくる連想をプログラムで表現しなさい。
>>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
>>398 どうでもいいことだけど、
夕凪は ではなくて 夕凪に ではなかったかな。
>>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
>>258 >>332 使用言語: Io
showwaster:=method(a,b,a repeat("*"repeated(b)println))
Io> showwaster(6,6)
******
******
******
******
******
******
>>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).
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回書きこみ終了
# 以下のコードではシミュレーション範囲は読み取れているが乱数発生時に反映されていない
# また、水分子の位置も毎回同じになっている→これを改善したい
>>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)
>>398 % Prolog これは相当大変。木構造にでも纏めればいいのかな。
歌('こぬ人を待つほの浦の夕凪はやくやもしほの身もこがれつつ').
歌音('こぬひとをまつほのうらのゆうなぎにやくやもしおのみもこがれつつ').
音通(も,藻).
音通(_語,_部分的な語) :-
sub_atom(_語,_,_,_,_部分的な語),
\+(_部分的な語==[]).
連想(藻塩,地獄絵).
連想(藻塩,陽光).
連想(藻塩,干す).
連想(藻塩,焼く).
連想(藻塩,煙).
連想(藻塩,灰).
連想(藻塩,煮る).
連想(藻塩,製塩).
連想(製塩,潮汲み).
連想(潮汲み,海女).
連想(浦,海女).
連想(焼く,煙).
連想(凪,煙).
>>397 つづき
連想(凪,煙).
連想(藻,塩).
連想(身,藻).
連想(焦がれ,恋).
連想(焦がれ,焦げる).
連想(焦がれ,木枯らし).
連想(木枯らし,寂しい).
連想(木枯らし,冬).
連想(焼く,焦がれ).
連想(焦がれ,人).
連想(藻,海).
連想(海,帆).
連想(凪,風).
連想(凪,浦).
連想(風,帆).
連想(松,帆).
連想(松,緑).
連想(浦,帆).
連想(占い,裏).
連想(裏,心).
連想(占い,恋).
連想(裏,背信).
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文, 条件式(三項演算子?:)は使ってはなら
# ない。三項演算子以外の各種演算子と変数は自由に使って良い。
>>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).
>>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).
>>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).
>>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).
>>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).
>>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).
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で出力すると分子/分母の形式で出力する。
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ファイルの名前がフォルダ名と違っていますが気にしないでください。
# 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければ と思います。
# [1] 授業単元:fortran
# [2] 問題文(含コード&リンク):配列を使わずに平均値、分散、標準偏差を表示せよ
# データ数nとn個のデータを入力し、平均値、分散、標準偏差を標示せよ。なおn≧5である。
# dimension、if、go toを使ってはいけない。
>>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 % 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.
>>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.
>>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 揚げては見たが何をやりたいのかさっぱりわからん。
>>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).
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 #
>>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).
>>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).
>>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).
>>434 % Prolog
0から1までのdouble型の数字を20個乱数によって生成し、小さい順に表示する :-
findall(F,(for(1,N,20),F is (random mod 7717) / 7717),L1),
バブルソートによって小さい順に(L1,L2),
writeln(L2).
>>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).
>>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).
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に無い場合-->何もしない
>>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)).
>>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に無い場合-->何もしない'(_社員番号),!.
>>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'(_,_社員番号,_)).
>>445 >>446 Prolog以外の言語ではまずお目にかかれない構成のプログラムですね。
仕様の条件に矛盾がないことが絶対の条件です。そこをパスしていれば
仕様の文言にそれぞれ集中できますから、書きやすくなりますね。
>>436 例えばラグランジェ法で数値微分するプログラムを書いて、
Xを0.1刻みで値を求めて、sin(X) + X * cos(X) のそれぞれの値と
比較するという意味でしょう。
>>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 % 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)),_総和).
>>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)),_総和).
>>453 さらに間違い。
4行目は writeになっていますが、write_formatted/2です。
>>432 % Prologはオブジェクト指向言語ではないので、よい答えは作れません。現実に
% Prologでこのようなことが起こるためにはそれぞれがサーバーとして起動していて、
%%%%%%%%%%% 山田 サーバー (この場合はクライアントとして) %%%%%%%%%%%%%%%%
先生(国語,遠藤).
先生に成績を問い合わせる(国語,_応答) :-
先生(国語,_先生),
_先生 :: 国語の成績は何点でしょうか(山田,_応答).
%%%%%%%%%%% 遠藤 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
国語の成績は何点でしょうか(_生徒,_応答) :-
事務局 :: 係はだれですか(成績問い合わせ,_係),
_係 :: 生徒の成績は何点でしょうか(遠藤,_生徒,国語,_応答).
%%%%%%%%%% 事務局 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
係はだれですか(成績問い合わせ,defaultOffice).
%%%%%%%%%%% defaultOffice サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%
生徒の成績は何点でしょうか(_先生,_生徒,_科目,_応答) :-
成績簿(_生徒,_科目,_成績),
concat_atom([_生徒,の,_科目,の成績は,_成績,点です],_応答).
成績簿(yamada,国語,78).
成績簿(yamada,数学,57).
のようなメッセージ交換が行われる必要があります。
>>432 書き直し
%%%%%%%%%%% 山田 サーバー (この場合はクライアントとして)%%%%%%%%%%%%%%%%%%%%%
先生(国語,遠藤).
先生に成績を問い合わせる(国語,_応答) :-
先生(国語,_先生),
_先生 :: 国語の成績は何点でしょうか(山田,_応答).
メッセージ受信(_宛先,_メッセージ) :- assertz(メッセージ(_宛先,_メッセージ)).
%%%%%%%%%%% 遠藤 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
国語の成績は何点でしょうか(_生徒,_応答) :-
事務局 :: 係はだれですか(成績問い合わせ,_係),
_係 :: 生徒の成績は何点でしょうか(遠藤,_生徒,国語,_応答).
%%%%%%%%%% 事務局 サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
係はだれですか(成績問い合わせ,defaultOffice).
%%%%%%%%%%% defaultOffice サーバー %%%%%%%%%%%%%%%%%%%%%%%%%%%%
生徒の成績は何点でしょうか(_先生,_生徒,_科目,_応答) :-
成績簿(_生徒,_科目,_成績),
concat_atom([_生徒,の,_科目,の成績は,_成績,点です],_応答).
成績簿(yamada,国語,78).
成績簿(yamada,数学,57).
>>457 www
成績簿(山田,国語,78).
成績簿(山田,数学,57).
ですね。
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 の担当者を持つ業務名を取り出すにはどのようにす
# れば良いのでしょうか?
>>459 % Prolog
?- 業務テーブル(A,X),業務担当テーブル(A,設計,'P101'),業務テーブル(A,検査,'P103').
>>460 まちがってる!
?- 業務テーブル(A,X),業務担当テーブル(A,設計,'P101'),業務担当テーブル(A,検査,'P103').
% 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.
テーブルを述語として定義(_,_).
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
>>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]).
>>463 訂正
f1の定義の三行目は
N < Max,
にしないと、バックトラックしてきた場合に終わらなくなりますね。
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 結果を表示する
>>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).
http://pc11.2ch.net/test/read.cgi/db/1252492296/314 # ユーザーが複数の資格を持っているというありがちなテーブル構成があるのですが、
# 「資格1または資格2を持っているユーザー」の検索はできるのですが、
# 「資格1と資格2」を両方持っているユーザー」の検索ができません。
#
# テーブル構成はこんな感じです。
#
# ユーザーテーブル
# [ユーザーID、名前]
# 001,山田
# 002,鈴木
#
# 資格テーブル
# [ユーザーID、資格]
# 001,資格1
# 001,資格2
# 002,資格1
>>468 % Prolog
ユーザーID('001',山田).
ユーザーID('002',鈴木).
資格('001',資格1).
資格('001',資格2).
資格('002',資格1).
'「資格1と資格2」を両方持っているユーザー'(X) :-
setof(_名前,(資格(_ユーザーID,資格1),資格(_ユーザーID,資格2),ユーザーID(_ユーザーID,_名前)),X).
>>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
>>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
>>412 使用言語: J
c=:65 97+/i.26
f=:monad def '(a.i.y){(3|."1 c{a.)c}a.'
f 'AbcXyz'
DefAbc
>>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
>>17 問題1
使用言語: tcl
proc f {n} {string range " abcdefghijklmnopqrstuvwxyz" 1 $n}
% f 30
abcdefghijklmnopqrstuvwxyz
% f 7
abcdefg
>>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
>>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です。
>>17 問題1
使用言語: UWSC
print f(9)
print f(30)
FUNCTION f(n)
RESULT = copy("abcdefghijklmnopqrstuvwxyz",1,n)
FEND
実行結果
abcdefghi
abcdefghijklmnopqrstuvwxyz
123456
12345
1234
123
12
1
>>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
>>17 問題1
使用言語: なでしこ
●f(n)
「abcdefghijklmnopqrstuvwxyz」の1から n 文字抜き出して表示。
f(5)
実行結果
abcde
>>17 問題1
使用言語: APL(A+)
$mode ascii
f n : 'abcdefghijklmnopqrstuvwxyz'[iota n min 26]
f 6
abcdef
f 30
abcdefghijklmnopqrstuvwxyz
>>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
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
#
>>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,_元利合計).
>>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秒です。
>>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
>>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
>>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(_整数),!.
>>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]).
>>47 使用言語: J
smoutput\.'Hello, world!'
Hello, world!
ello, world!
llo, world!
lo, world!
o, world!
, world!
world!
world!
orld!
rld!
ld!
d!
!
>>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桁の文字列).
>47
使用言語: J
間違えました。後ろから削るんだった。
smoutput@|.\.|.'Hello, world!'
Hello, world!
Hello, world
Hello, worl
Hello, wor
Hello, wo
Hello, w
Hello,
Hello,
Hello
Hell
Hel
He
H
>>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(_閾値).
>>45 使用言語: J
fact=:*/@(>:@i.)
,.fact"0 i.11
1
1
2
6
24
120
720
5040
40320
362880
3628800
>>501 % Prolog せっかく述語定義したのだから、これに置き換えてください。
閾値以下の学生をリストから削除する(_学生リスト,_判定後の学生リスト,_削除メッセージ) :-
閾値を読み込む(_閾値),
....
>>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
>>207 使用言語: Io
f:=method(s1,s2,n,s1 asMutable atInsertSeq(n,s2))
Io> f("12345","AB",3)
==> 123AB45
>>114 使用言語: Io
f:=method(s1,s2,s1 .."GHIJKLMABCDERSTUVWFNOPQXYZ"between(s1,s2).. s2)
Io> f("C","Q")
==> CDERSTUVWFNOPQ
>>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).
>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).
>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 % Prolog
平成元号年を入力して,西暦年を表示 :-
get_integer(_平成元号年),
_西暦年 is 1988 + _平成元号年,
write_formatted('平成%t年は西暦%t年です\n',[_平成元号年,_西暦年]).
>>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]).
>>17 問題1
使用言語: Xtal
f:fun(n)"abcdefghijklmnopqrstuvwxyz".split("").take(n).join("");
ix:005>f(8).p;
abcdefgh
ix:006>f(30).p;
abcdefghijklmnopqrstuvwxyz
>>510 使用言語: Xtal
f:fun(n)%f"平成%d年は、西暦%d年です。"(n,1988+n);
ix:003>f(21).p;
平成21年は、西暦2009年です。
>>517 % Prolog
'SELECTした全レコードのN番目カラムを文字列連結したものを得る'(T/_属性の数,N,_連結した文字列) :-
length(L,_属性の数),
P =.. [T|L]),
findall(X,(call(P),list_nth(N,L,X)),_解ならび),
concat_atom(_解ならび,_連結した文字列).
>>516 % Prolog
有向グラフに於いて到達可能(A,B) :-
有向グラフ(A,B),!.
有向グラフに於いて到達可能(A,B) :-
有向グラフ(A,C),
有向グラフに於いて到達可能(C,B).
>>510 使用言語: J
f=:monad def ' ''平成'',(":y),''年は、西暦'',(":1988+y),''年です。'' '
f 10
平成10年は、西暦1998年です。
>>510 使用言語: 十進BASIC
SUB f(n)
PRINT "平成";n;"年は、西暦";1988+n;"年です。"
END SUB
CALL f(15)
END
実行結果
平成 15 年は、西暦 2003 年です。
>>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).
鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
ガウス行列に変形([[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]).
>>523 ゴミが残ってしまった。
% Prolog
鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
ガウス行列に変形([[1,1,_鶴と亀の頭の合計],[2,4,_鶴と亀の足の合計]],L1),
既約ガウス行列に変形(L1,[[_,_,_鶴の何羽],[_,_,_亀何匹]]),
write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]).
>>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]).
>>524 >>510 まだ間違いがあった。
% Prolog
鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :-
催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計),
催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計),
ガウス行列に変形([[1,1,_鶴と亀の頭の合計],[2,4,_鶴と亀の足の合計]],L1),
既約ガウス行列に変形(L1,[[_,_,_鶴何羽],[_,_,_亀何匹]]),
write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]).
% 未完成だけど(マイナスが出てくるとエラーになることがある)行列の変形は
%
http://nojiriko.asia/prolog/Gauss_gyoretsu_ni_henkei.html
>>511 使用言語: J
f=:('鶴の数 = ',:'亀の数 = '),.":@,.@%.&(1 1,:2 4)
f 3 8
鶴の数 = 2
亀の数 = 1
f 20 64
鶴の数 = 8
亀の数 = 12
>>495 REBOLのソースなんて初めて見た。ありがとう。
>>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
>>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
>>174 問題2
使用言語: J
f=:;@((]\:+/"1)@=<@#])@tolower
f 'aSddAdsAsfdaDfdfDF'
dddddddaaaaffffsss
f 'AAbbbCCccddDdd'
dddddccccbbbaa
>>17 問題1
使用言語: REBOL
>> f: func[n][copy/part "abcdefghijklmnopqrstuvwxyz" n]
>> f 6
== "abcdef"
>> f 30
== "abcdefghijklmnopqrstuvwxyz"
>>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で構造体配列に近いものを作り述語定義する(_).
>>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で構造体配列に近いものを作り述語定義する(_).
>>534 訂正
% Prolog
prologで構造体配列に近いものを作る(L),,
==>
prologで構造体配列に近いものを作る(L),
>>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.
>>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 % Prolog
'N件の整数型データを配列に入力し、その平均値を出力する' :-
write('データ数:'),
get_integer(N),
findavg(I,(for(1,M,N),write_formatted('%t番目 値:',[M]),get_integer(I)),_平
均値),
write_formatted('平均=%t\n',[_平均値]),!.
>>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',[_平均値]),!.
>>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
>>370 課題(2)
使用言語: REBOL
>> f: func [n d] [mod (to-integer n / power 10 (d - 1)) 10]
>> f 123456789 4
== 6
>>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
>>47 使用言語: R
> f <- function(s){write(substring(s,1,(nchar(s)):1),"")}
> f("substring")
substring
substrin
substri
substr
subst
subs
sub
su
s
>>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 % 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,[_,_自分]),!.
>>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
>>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).
>>370 課題(2)
使用言語: R
> f <- function(n,d){(n%/%10^(d-1))%%10}
> f(123456789,3)
[1] 7
>>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 % 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).
>>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).
>>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
>>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).
>>558 sort/2 の直後、reverse/2の直後でそれぞれ最初の4データまでに
[_スコア,_自分]が出現するかどうか検査するともう少し速くはなる。
>>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を出力(_).
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
#
# となります。よろしくお願いします。
>>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 % 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以外の要素が一種類しか存在しない'.
>>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
>>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 % 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).
>>17 問題1
使用言語: Yacas
In> f(n):="abcdefghijklmnopqrstuvwxyz"[1 .. Min(n,26)]
Out> True
In> f(6)
Out> "abcdef"
In> f(30)
Out> "abcdefghijklmnopqrstuvwxyz"
>>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
>>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
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分法の他に,ニュートン法もある.
#
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
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 です.
>>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).
>>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).
>>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).
>>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),!.
>>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 を参照
>>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 を参照
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 …
# のような数表を自分で指定したファイルに出力するプログラムを作成しなさい。
#
>>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 参照
>>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)).
>>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)).
>>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),!.
>>598 匿名変数は・・・。全部が匿名変数だという解釈で済んでしまう。
>>598 それから、'SPLIT'/3の定義がないけど、
?- 'SPLIT'(abcdefg,[b,e],X).
X = [a,b,cd,e,fg]
でいいのかい?
>>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).
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内の文末に「コメント行」と
して記載せよ 。
>>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.
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回打ち込んでメニューそれぞれの個数と合計を出力する感じです。
>>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,' ',_合計数量,_合計金額]).
>>605 % Prolog その2
メニュー番号と数量を10回打ち込む([]).
メニュー番号と数量を10回打ち込む([L1|R]) :-
get_split_line([' ',','],L1),
メニュー番号と数量を10回打ち込む(R).
http://pc12.2ch.net/test/read.cgi/tech/1245017721/12 # 実際の問題を簡単にした問題例です。
#
# 流れ:
# キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
# ということを目標金額まで繰り返し、到達したらその金がなくなるまで
# 家でごろ寝し、なくなったらまた働く
#
# キャラクタは
# ・バイトをする : 手持ちが1増える
# ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
# ・家で寝る : 貯金が1減る
# の状態を取ります。
# 財布の許容量は3、目標貯金額は5とします。
#
>>615 % Prolog
'5教科'(国語).
'5教科'(算数).
'5教科'(理科).
'5教科'(社会).
'5教科'(英語).
'5教科のテストの点数を入力し、それらの合計点を算出して表示する' :-
'5教科のテストの点数を入力し、それらの合計点を算出'(_合計点),
write_formatted('合計点は%t点です\n',[_合計点]).
'5教科のテストの点数を入力し、それらの合計点を算出'(_合計点) :-
findsum(_点数,('5教科'(_教科),催促付き整数入力('%t : ',[_教科],_点数)),_合計点).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
催促付き整数入力(_表示パターン,_催促情報ならび,_整数) :-
write_formatted(_表示パターン,_催促情報ならび),
get_integer(_整数),!.
催促付き整数入力(_催促,_整数) :-
write(_催促),
get_integer(_整数),!.
>>614-
>>616 結構微妙で楽しいね。'3教科'が国語・数学・英語で、'5教科'は
国語・算数・理科・社会・英語なのか。それが常識? ではなさそう。
それとも、この小学校私立かな。結局、3教科の方は手を付けず、
>>615 だけは実行結果の「例」からリバースエンジニアリングすることにした。
そもそも実行結果の例から仕様を改竄する態度を教育していいものかという疑問は残る。
>>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 型データへのポインタを戻り値として返す
すみません。肝心な部分が切れてしまった。あと二行追加です。
# 関数 branch() と leaf() を使って,算術式を表す2分木のデータを生成し,
# 各2分木の根へのポインタを,Tree * 型の変数に格納せよ.
>>612 二番目の課題です。
# ●基本課題 1b (2分木を扱う再帰関数の作成)
#
# 2分木の「高さ」を求める関数 height() を作れ.
# また,十分な数の検査データを作り,動作の正しさを検証せよ.
http://pc12.2ch.net/test/read.cgi/tech/1260532772/6 # 問題5
# 英字アルファベット大文字を入力すると、その文字の小文字が表示されるようなプログラムを作成せよ。実行結果の例を以下に示す。
# ------------------------------------------------
# アルファベットの大文字を入力して下さい:A
# 小文字はaです。
# ------------------------------------------------
>>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]).
>>623 途端に間違えた。 訂正。
英字アルファベット大文字を入力すると、その文字の小文字が表示される :-
write('大文字をいれてください :'),
rawmode,
get_char(CC),
'A,a...Z,z'(CC,Cc),
put_char(Cc),
norawmode,
write_formatted('小文字は%tです。\n',[Cc]).
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月の末日
# にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒
# は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する
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です。
>>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 % 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.
>>630 訂正
% ! が必要ですね。
センチメートル・インチ変換(X,Y) :-
\+(var(X)),
Y is X / 2.54,!.
センチメートル・インチ変換(X,Y) :-
\+(var(Y)),
X is Y * 2.54.
>>631 そのカットなんですが
センチメートル・インチ変換(X,Y) :-
\+(var(X)),!,
Y is X / 2.54.
の位置に入れるのとどちらが正しい?というか普通ですか。
>>632 グリーンカットとレッドカットというような分類があって、
確か「Prologの技芸」などに詳しい説明があったと思います。
>>631 はグリーンカットかな。実は私は詳しく知りません。
忘れました。一般に ! を最後に書くことが多いと思いますが、それは、
1) .. p(_) :- p1,!,p2,p3, .. p7.
2) .. p(_) :- p1,p2,p3, .. p7,!.
2) の方が無駄なバックトラックが少なくなるからです。同時にp1から
p7がどんな性質の目標であったとしても、このp(_)は決定性の述語で
あることが明確になります。システム(処理系)とこのソースの読み手に
そのことを伝えるためのカットだと思えばよいでしょう。
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')
#
# とできますが、複数列の場合にもこういうふうにまとめて書く方法がないかと思いまして・・・
>>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).
638 :
635: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).
>>623 何をやっているのか、わかりません。真ん中あたりにある
:- から始まる行はなんですか?
>>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 などにも極端なコードが見られます。
ここではソースを読む人のために予め小さなプログラムを作ってソースを生成して
しまっています。このコードをキーボードから入力するのはさすがに億劫ですが、
プログラムを先に働かせて、視覚的なプログラムコードを用意します。
どちらも、本来実行時に計算されるであろうことと類似の計算を予め実行して
しまって、プログラマにとってより好ましいと感じるソースコードを生成して
いるという点で共通しています。
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]
>>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月11日に朝食で食パンを350円 買い
# 休日の2009年12月11日にJumpという本を240円 買った
# の形式にしましょう。入力項目の出現順もある程度自由ということで。
>>17 問題1
使用言語: Axiom
f(n)=="abcdefghijklmnopqrstuvwxyz"(1..min(n,26))
(20) -> f(6)
(20) "abcdef"
(21) -> f(30)
(21) "abcdefghijklmnopqrstuvwxyz"
>>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
>>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+
>>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
>>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です.
>>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
>650
問題の番号間違えました。
>>592でした。
>>627 使用言語: J
f=:monad def '%:+/*:| -/_2,\y'
f 0 0 1 1
1.41421
f 0 1 2 3
2.82843
>>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)
>>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],_解析した文要素),!.
有意な要素の収集(_,解析した文要素,_解析した文要素) :- !.
>>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],_解析した文要素),!.
有意な要素の収集(_,解析した文要素,_解析した文要素) :- !.
>>656 訂正します。有意な要素の収集の第二定義(節)
有意な要素の収集(L,L1,_解析した文要素) :-
member(X,[年,月,日,円],
\+(member([X,_],L1)),
append(_,[A,X|_],L),
'整数か?ただし全角文字は整数に変換する'(A,N),
有意な要素の収集(L,[[X,N]|L1],_解析した文要素),!.
有意な要素の収集(L,[[N,X]|L1],_解析した文要素),!.
% 月ではなくてXでなくてはいけません。
>>658 % Prolog
ある整数Xを入力した時に、それを3で割った商と余りを算出する(N,_余り) :-
length(L,N),
'3で割った商と余りを算出する'(L,_余り).
'3で割った商と余りを算出する'([_,_,_|R],_余り) :-
'3で割った商と余りを算出する'(R,_余り).
'3で割った商と余りを算出する'(L,_余り) :- length(L,_余り).
>>659(
>>658) 済みません。訂正。
% Prolog
ある整数Xを入力した時に、それを3で割った商と余りを算出する(X,_商,_余り) :-
length(L,X),
'3で割った商と余りを算出する'(L,[],_商,_余り).
'3で割った商と余りを算出する'([_,_,_|R],L1,_商,_余り) :-
'3で割った商と余りを算出する'(R,[_|L1],_商,_余り).
'3で割った商と余りを算出する'(L,L1,_商,_余り) :- length(L1,_商),length(L,_余り).
>>17 問題1
使用言語: Scilab
-->function out=f(n)
--> out=part('abcdefghijkmnopqrstuvwxyz',1:n)
-->endfunction
-->f(6)
ans =
abcdef
-->f(30)
ans =
abcdefghijkmnopqrstuvwxyz
>>658 使用言語: J
J言語では、%は除算で、|が剰余です。
f=:monad def '(,(y-3&*))<.y%3'
f 35
11 2
>>661 Scilab 初めて見ました。ありがとうございます。
>>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.
>>654 % Prolog (その一)
'元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-
write('元号の頭文字,年,月,日 :'),
get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]).
'元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-
'元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),
元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),
元年の西暦は(_元号,_元年の西暦年),
_西暦年 is _元年の西暦年 + _年 - 1,
その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),
write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]).
その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-
年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),
_日数 is _前月末日までの日数 + _日.
年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-
N is _月 - 1,
findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数).
>>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) :- \+(うるう年(_年)).
>>666 訂正
% Prolog
元年の西暦は(明治,1868).
元年の西暦は(大正,1912).
元年の西暦は(昭和,1926).
元年の西暦は(平成,1989).
>>665 訂正 のに->の
'元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-
'元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),
元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号年の元号の頭文字),
元年の西暦は(_元号,_元年の西暦年),
_西暦年 is _元年の西暦年 + _年 - 1,
その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),
write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]).
>>666 ここも訂正 のに->の
元号の頭文字をローマ字変換した時の最初の文字(明治,m).
元号の頭文字をローマ字変換した時の最初の文字(大正,t).
元号の頭文字をローマ字変換した時の最初の文字(昭和,s).
元号の頭文字をローマ字変換した時の最初の文字(平成,h).
>>594 使用言語: J
f=:p:@i.@(_1&p:)
f 30
2 3 5 7 11 13 17 19 23 29
>>257 >>331 使用言語: MaTX
Func Integer pow4(n)
Integer n;
{
return n*n*n*n;
}
MaTX (6) pow4(77)
ans = 35153041
>>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
>>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
>>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.
>>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
>>658 ;; Common Lisp
(defun div3 (num)
(let ((a (floor (/ num 3))))
(cons a (- num (* a 3)))))
http://pc12.2ch.net/test/read.cgi/tech/1260532772/83 # [1] 授業単元: Cプログラム応用A
# [2] 問題文(含コード&リンク):
# 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。
# ただし、同じ長さの単語がある場合最初に見つけた一つでいい。
#
# ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。
# ただし、単語の長さは100文字以内と考えていい。
#
>>677 % Prolog
指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初に出てくる単語,_最後に出てくる単語,_最も長い単語) :-
get_lines(_ファイル,Lines),
concat_atom(Lines,S),
split(S,[' ','\t','\n'],_単語ならび),
sort(_単語ならび,_整列された単語ならび),
append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),
findmax(_長さ,(member(_単語,_整列された単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最も長い単語).
679 :
678:2009/12/14(月) 07:49:58
>>678 これだと、先頭が大文字の単語が先に並んでしまうのか。あとで訂正します。
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
>>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,!.
>>680 % Prolog
txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示する :-
get_lines(_ファイル名,Lines),
'N個組'(3,Lines,_情報ならび),
member([_都道府県名,_人口,_面積],_情報ならび),
write_formatted('%t %t %t\n',[_都道府県名,_人口,_面積]),
fail.
txtファイルからデータを読み込み、人口順に並べ替えて、都道府県名、人口、面積を1行に表示する.
>>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).
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 というような代入を参考にして考えてみる
>>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
>>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
http://pc12.2ch.net/test/read.cgi/tech/1260532772/112 # 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
# ポーカーゲーム(の一部)をC言語にて作成する。
#
# ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
# カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
# プレイヤは配られたカードの中から交換するものを選択できるようにする。
# ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
# プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
# 表示、カードの選択は標準入出力を利用してください。
#
>>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])).
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
691 :
690:2009/12/14(月) 20:18:26
>>690 id name taxfree
id data price
id name data price
のdataはdateの間違いだと思います。
>>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 のものをまず表示し、最新日付のデータか、最新日付が無い場合一番近い日付のデータを表示する'.
http://pc12.2ch.net/test/read.cgi/tech/1260532772/125 # [1] 計算物理
# [2]
# �原点に静止していた電子を考える。ここに直線偏光した電磁波が入射してきたとき、電
# 子の運動の様子を計算せよ。円偏光のときはどうか。磁場の力は無視してよい。
#
# �地球をめぐる衛星は、大気の摩擦を受けて少しづつ落下する。この様子を計算せよ。値
# は実際の値を入れなくともよいが、摩擦を受けつつ地球の重力を受けてまわる様子を正し
# く微分方程式であらわし、それを解け。
#
# �有限の広さの薄い電極をもつ平行平板コンデンサーの周りの電場(電位)を計算し、可
# 視化する。平行平板コンデンサーの内部では一様な電場ができることはよく知られている。
# しかし端の電場はどのようにずれているのであろうか。
# (コンデンサーよりも十分大きい設置した箱型の境界を考える。その中にコンデンサーの極
# 板をおき、片方に電圧をかけて境界条件のように取り扱えばよい。)
>>257 >>331 使用言語: Yorick
> func f(n){return n*n*n*n;}
> f(7)
2401
> f(500)
-1924509440
>>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
>>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'(_,_,_).
>>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).
>>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),!.
>>17 問題1
使用言語: Yorick
> func f(n){return strpart("abcdefghijklmnopqrstuvwxyz",1:n);}
> f(6)
"abcdef"
> f(30)
"abcdefghijklmnopqrstuvwxyz"
>>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,_受け取った情報).
>>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をする必要はなかった。それから_受け取った情報がトップレベルに接続していなかったからそこも訂正。
% 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,_受け取った情報).
>>704 % Prolog 例えば以下のように進みます。ここでは一回の通信ごとに停止させています。
?- クライアント一般型('192.9.168.2',10111,必勝石とりゲーム,X).
X = 石石石石石石石石石石石石石石石石石石石石石;
X = 石石石石石石石石石石石石石石石石石;
...
X = 石石石;
yes
?-
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;
#
# イメージとしては↑のように扱いたいのです。もしや不可能でしょうか?
>>706 % Prolog
pb([test1,0],10).
pb([test1,1],20).
pb([test2,0],100).
pb([test2,1],200).
>>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 % 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 を参照してください
>>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
>>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
>713
あー。また問題番号、間違えました。
>>710 です。
>>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).
>>710 使用言語: 十進BASIC
FOR i=3 TO 500 STEP 3
PRINT USING "#####": i;
IF MOD(i,10)=0 THEN PRINT
NEXT I
PRINT
END
>>658 使用言語: maxima
f(n):=[a:fix(n/3),n-a*3];
(%i120) f(35);
(%o120) [11, 2]
(%i121) f(1234567);
(%o121) [411522, 1]
>>710 使用言語: maxima
for i:3 thru 500 step 3 do printf(true,"~5d~[~%~]",i,mod(i,10)+1);
>>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個ずつ表示する'
>>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
>>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').
Prolog多いな・・・・
本当に使われてない言語なんだなカワイソス
C言語/C++なら毎日のように宿題があるのに
Prolog講座の宿題ってどんなものになるんだろう。
「Prologの宿題片付けますスレ」立てたら、書き込みあるかな。
>>710 使用言語: Io
for(i,3,500,3,write(i asString(5,0),if(i mod(10)==0,"\n","")))
>>681 使用言語: Io
s:=0;for(i,1,10,s=s+i*i;for(j,2,i,write(j,"^2 + "));writeln(i,"^2 = ",s))
>>681 使用言語: Io
うーん、実行結果を省略したら、またまちがえた。
s:=0;for(i,1,10,s=s+i*i;for(j,2,i,write(j-1,"^2 + "));writeln(i,"^2 = ",s))
>>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
>>732 str_chnum(_文字列,_文字,_個数) :-
count(sub_atom(_文字列,_,1,_,_文字),_個数).
>>731 % Prolog 代入はできないから、この程度
二行を空白をはさんで連結する :-
get_line(Str1),
get_line(Str2),
concat_atom([Str1,Str2],' ',Str),
write_formatted('%t\n',[Str]),
>>731 使用言語: maxima
(%i216) f(s1,s2):=(s1:concat(s1," ",s2),print(s1));
(%i217) f("123","abc");
123 abc
>>732 使用言語: maxima
(%i257) str_chnum(s,c):=slength(s)-slength(ssubst("",c,s));
(%i258) str_chnum("123123111","1");
(%o258) 5
>>731 使用言語: J
str1=:'123'
str2=:'abc'
str1=:str1,' ',str2
smoutput str1
123 abc
>>732 使用言語: J
f=:+/@E.
'm' f 'maxima'
2
'c' f 'maxima'
0
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
# の数値解をオイラー法によって求めよ。
#
>>370 課題(2)
使用言語: maxima
(%i262) f(n,d):=(a:string(n),charat(a,slength(a)-d+1));
(%i263) f(123456789,4);
(%o263) 6
>>731 使用言語: Xtal
ix:001>str1:"123";
ix:002>str2:"abc";
ix:003>str1=str1~" "~str2;
ix:004>str1.p;
123 abc
>>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
>>731 使用言語: Io
Io> str1:="123"
==> 123
Io> str2:="abc"
==> abc
Io> str1=str1 .. " " .. str2
==> 123 abc
Io> str1 println
123 abc
==> 123 abc
>>732 使用言語: Io
Io> f:=method(s,c,s size-(s asMutable removeSeq(c))size)
Io> f("123111","1")
==> 4
>>731 使用言語: Arc
arc> (= str1 "123")
"123"
arc> (= str2 "abc")
"abc"
arc> (= str1 (+ str1 " " str2))
"123 abc"
arc> (prn str1)
123 abc
"123 abc"
>>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
>>731 使用言語: R
> str1<-"123"
> str2<-"abc"
> str1<-paste(str1," ",str2,sep="")
> cat(str1,"\n")
123 abc
>>732 使用言語: R
> str_chnum<-function(s,c)nchar(s)-nchar(gsub(c,"",s))
> str_chnum("123123111","1")
[1] 5
>>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 % Prolog 本当は擬似プログラムを解析して述語に変換するプログラムとしたいね。
% 今は、
1週間の売り上げの合計を計算する問題 :-
get_lines('sales.dat',Lines),
findsum(N,(member(A,Lines),atom_to_term(A,N,_)),Sum),
write_formatted('%t\n',[Sum]).
>>751 使用言語: J
(1!:1)<'sales.dat'
1000
2000
3000
smoutput +/".;._2 toJ(1!:1)<'sales.dat'
6000
>>726 Prolog講座と宿題はなんかピンとこないな。少なくとも丸投げはいないだろw
全国の大学に100以上Prolog講座があるそうだから、書き込みくらいはありそう
だけど。
>>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です。
>>756 使用言語: J
f=:monad define
a=.2+<.2^.y
smoutput (":a),'日目に',(":2^<:a),'個の細胞数になります。'
)
f 10000
15日目に16384個の細胞数になります。
f 100000
18日目に131072個の細胞数になります。
>>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です。
>>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個の細胞数になります。
>>731 使用言語: Yorick
> str1="123"
> str2="abc"
> str1=str1+" "+str2
> write,str1
123 abc
>>732 使用言語: Yorick
> func str_chnum(s,c){a=strchar(s);return sum(a==c);}
> str_chnum("123123111",'1')
5
>>755 % Prolog
初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,Sum) :-
findsum(N,for(X,N,Y),Sum).
>>756 % Prolog
細胞生物が翌日には2分裂して2細胞になる(N日目,N日目,_今日の細胞数,_今日の細胞数).
細胞生物が翌日には2分裂して2細胞になる(N1,_何日目,今日の細胞数,_細胞数) :-
N2 is N + 1,
_翌日の細胞数 is _今日の細胞数 * 2,
細胞生物が翌日には2分裂して2細胞になる(N2,_何日目,_翌日の細胞数,_細胞数).
?- 細胞生物が翌日には2分裂して2細胞になる(1,_何日目,1,_細胞数),_細胞数 > 10000.
>>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になるかも知れない。
% シングルクォーツで囲めばこのようなことは起こらない。
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 % 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.
>>769 % Prolog
'3+6+9+・+99の計算'(_合計) :-
findsum(S,(for(1,N,33),S is N * 3),_合計).
>>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.
>>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.
>>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.
>>772 % Prolog
'n!'(1,1).
'n!'(N,X) :- N1 is N - 1,'n!'(N1,Y),X is N * Y.
>>769 使用言語: Yorick
> sum(indgen(3:99:3))
1683
>>769 使用言語: Scilab
-->sum(3:3:99)
ans =
1683.
>>771 使用言語: Scilab
-->a=2:2:100;
-->sum((-1)^(0:(length(a)-1)) .* a)
ans =
- 50.
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 ビットで表わされる.
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 …
>>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.
名前と点数のデータを持っているリスト構造をソートする(_).
>>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,シンボリックリンク).
>>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).
>>769 使用言語: maxima
(%i429) sum(i*3,i,3/3,99/3);
(%o429) 1683
>>771 使用言語: maxima
(%i433) sum(2*i*(-1)^(i-1),i,2/2,100/2);
(%o433) - 50
>>769 使用言語: J
+/3*>:i.33
1683
>>771 使用言語: J
-/+:>:i.50
_50
>>769 使用言語: R
> sum(seq(3,99,3))
[1] 1683
>>771 使用言語: R
> sum(c(seq(2,98,4),seq(-4,-100,-4)))
[1] -50
>>771 使用言語: Yorick
> sum(grow(indgen(2:98:4),indgen(-4:-100:-4)))
-50
http://pc12.2ch.net/test/read.cgi/tech/1260532772/226 # 上記を参考に、malloc関数を用いて、氏名、学籍番号、身長の入力を行い、さらに、ユーザからの入力終了指示を受けたら、全ての入力データを画面に出力する、任意の人数の処理が可能な、プログラムを、malloc.cという名前で作成せよ。
# malloc.cをVisual Studioで実行して(5名以上入力)、実行結果をmalloc.c内の文末に「コメント行」として記載せよ。(コメント行を追加後も、ビルド可能か再確認)
#
>>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).
>>725 むしろprologのコード眺めるために来てるな俺はw
次の事項を,自分の言葉で証明せよ
挿入整列法は,平均の場合約N2/4回の比較と約N2/4回の半交換(移動)を行う.最悪の場合は,それぞれその2倍になる
>>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).
>>769 使用言語: Haskell
Prelude> sum [3,6..99]
1683
>>771 使用言語: Haskell
Prelude> foldr (-) 0 [2,4..100]
-50
>>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
>>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
>>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).
806 :
806: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).
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) ???????;
# }
>>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.
>>806 他のリスト生成の指示が初期値、終了値、増分値なのに
たいしてこれだけ初期値、初期値+増分値、終了値なのが
例による指示という感じで、ちょっと面白いと思いました。
>>809 思いつきと感じるのもそこだと思うのですが、確かに面白いですね。
昔々、QBEという関係言語族の例題型の言語あって、それは表計算のような
矩形の枠にいくつか情報を入力するとそれを補間するようにデータが表示
されるというものでした。プログラミング言語の文法にも陽にこのような
情報補間による解法というのがもっとあってもいいかも知れない。
>>808 の使い方ですが、
?- 最大値を表示する(Max).23
Max = 23;345
Max = 345;11
Max = 345;369
Max = 369;77
というように進むのですが、「キーボードから6つの数値を」の
部分が述語定義に組み込まれていませんでした。これを組み込んだ
ものを次に書きます。収容な述語にはカウンタを付加しなくてなり
ません。
>>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).
>>769 使用言語: Lua
> s=0;for i=3,99,3 do s=s+i end;print(s)
1683
>>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で弄るなど考えましたが上手くいきません。
>>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進加算レジスタの生成'.
>>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進加算レジスタの生成'.
>>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進加算された文字列).
>>818 使用言語: J
f=:monad def '_2{.''0123456789ABCDEF''{~16#.inv+/a.i.y'
f '12'
63
f 'A123'
D7
>>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).
>>819-
>>821 極力、ルールを見せない?
データベースで処理してるように見せる、というのがPrologのスタイルなんですか?
予め、データベースを生成することがプログラミングなのだと?
>>825 うーーん。
外延的な定義を好む。フラットな定義を好む。ヨーロッパスタイルと
言うのでしょうか。私を含めてそういうプログラムを良しとする人は
多いですね。好まれる理由は、
1) 非決定性の述語にし易い。
2) 双方向性を保ちやすい。
3) 定義から帰納的に新しい定義を見つけやすい。
それ以前に、データこそすべて的な世界観の人が多いのでしょうが。
>>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
>>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
>>818 使用言語: Arc
arc> (def f(s) (coerce (mod (sum int (coerce s 'cons)) 255) 'string 16))
arc> (f "12")
"63"
arc> (f "A123")
"d7"
>>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
>>818 使用言語: Yorick
> func f(s){return swrite(format="%x",sum(strchar(s))%255);}
> f("12")
"63"
> f("A123")
"d7"
>>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]).
>>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]).
>>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
>>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進加算レジスタの生成'.
>>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)),!.
>>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)),!.
>>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 のつづきです。
# <当たらない場合>
# 0〜10までの数を入力して下さい。
# 5
# もっと小さい数です。
# あと2回挑戦することができます。
# 1
# もっと大きい数です。
# あと1回挑戦することができます。
# 4
# もっと小さい数です。
# あと0回挑戦することができます。
# 残念!!不正解でした。
>>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
不可
不可
可
可
良
良
優
優
>>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.
_値 は _式 :- 関数定義(_式,_値).
>>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,_値).
_値 は _式 :- 関数定義(_式,_値).
>>845 どういう意図なのか。
πに拘ったコードと考えればいいのかな?
>>843 使用言語: R
f <- function(n){
a[0:59]<-"不可"
a[60:69]<-"可"
a[70:79]<-"良"
a[80:100]<-"優"
a[n]
}
> f(55)
[1] "不可"
>>849 >>844の仕様から円周を計算する述語の定義は
円周(_直径,_円周) :- _円周 is _直径 * 3.141592654.
でよい。
>>845は「円周率πは3.141592654とする。」という一文に拘った定義ですね。
仕様の文章に沿ってできるだけ情報量を落とさないように定義していくと、こんな
感じかなというのが
>>845で、単なる一例ですね。このようにプログラム表現が拡散
していくことを評して散文的プログラミングと「Prologでまったりスレ」では表現
しました。仕様の文体、受け止める人の言語感覚によってプログラム表現が変化し
ますから。
>>844 使用言語: J
Jにはエンジニアリング表記みたいにかけるpiのリテラル表記がある。
1p2 は 1*pi^2 を表す。また、 o. を単項演算子として使うとpiの倍数を返す。
5p1
15.708
f=:o.
f 5
15.708
>>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,!.
>>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).
http://pc12.2ch.net/test/read.cgi/tech/1260532772/310 # [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):
# 課題 関数(再帰)最大公約数
# キーボードから自然数を2つ入力し、それらの最大公約数と最小公倍数を表示するプログラムを作成しなさい。
# ただし、最大公約数の計算は関数(再帰)を用いること。最大公約数を計算する関数の名前はgcdとすること。
#
# 実行結果
# 自然数を2つ入力して下さい.
# 3243 6578
# 3243と6578の最大公約数は23,最小公倍数は 927498 です。
http://pc12.2ch.net/test/read.cgi/tech/1248012902/632 # 【 課題 】
# 氏名(string)、ふりがな(string)、携帯番号(string)、メールアドレス(string)
# をフィールドとして持つクラスAddressBookを定義せよ。
# クラス内に、ふりがなで辞書順に並べ替えるためのcompareToを定義せよ。
# 外部に,TelNoSortという、電話番号(文字列)を辞書順に並び変えるためのメソッドを
# 作成せよ。
# メイン・プログラムで、AddressBookクラスの配列(ArrayList)を定義し、
# 以下の動作をおこなうプログラムを作れ。
# 3人分のデータをキーボードから入力し、リストに代入する。
# ・配列に代入されたデータをふりがな順に、見やすく出力する。
# ・配列に代入されたデータを電話番号順に、見やすく出力する。
# 入力、出力には、for文を使うこと。
#【 課題 】
#「0.2+0.4+0.6+・・・・・+10.0の計算を行うプログラムを作成せよ。」と
# いう課題文が与えられたとする。
# この文を、公差数列 0.2,0.4,0.6...10.0の和を計算する課題であると認識する
# ことができる最小限のプログラムを示せ。
>>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 点であれば 優.
>>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 一ヶ所間違ってた。「点であれば」というオペレータでなくてはいけない。
その点数 が _点数 であれば _診断, -> その点数 が _点数 点であれば _診断,
>>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 点であれば 優.
>>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).
>>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).
>>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(_数),!.
>>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.
>>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).
少々ズルしてるところはあるけど、部品はこれでできたから、後はゲームのmain部分を
組み立てる。このゲームだと、member型の非決定性の述語をトップにもってきて、
ステッパーの動きをさせて、毎度、財布の中身と、貯金を引数で戻すようにする。
その間の動作(例えば寝る)も引数に戻るようにできれば本当はよい。
>>871 ゲームと解釈したのかw 私はシミュレーションだと思ったが・・・
初代信長の野望みたいなゲームなのかと。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/365 # [1] 授業単元:初級プログラミング
# [2] 問題文(含コード&リンク):マインスイーパーを作ってください。
# ・縦の列はABC...で、横の列は123...で表示し、座標を繰り返し入力する
# ・枡の大きさは自由である(難易度ごとに大きさを選べる等要工夫)
# ・地雷の位置は毎回ランダムであること
# ・指定(入力)した座標には周囲の地雷の数を表示させる
# ・地雷のある座標を入力するか、全ての安置を入力することでクリアとする
# ・その他、工夫等が見られると加点