1 :
デフォルトの名無しさん :
2010/03/08(月) 08:19:03 前回スレは512Kbを越えたため、終了しました
bを小文字で書くほど無知なくせにスレを立ててる件。 とつっこまれて bit だとか言い出す。
ついでに言うと、2ちゃんねるの容量制限は512kないし500Kだぞw
それはともかくスレ立て依頼しておいてなんといういいぐさだよ
>>2
>>3 えーーっ これは、スレを立てる依頼をした私を
>>1 さんが
からかって追記したんだと思った。
# bit誌の話題が出たところで、1977年11月号同雑の記事から。 # ロール・エンティティモデルは、ロールとエンティティの2つの概念を両者とも # 認識することを提案している。さて、 # 以下に、22項目の語が提示してあるが、それがエンティティを表す概念なのか、 # ロールを表す概念なのかを分類していただきたい。 # # 鶏 複合部品 自動車 ビルディング 母 子 依頼人 会社 顧客 # 医師 従業員 雇主 馬 法律家 所有者 単純部品 人 財産 # 株主 供給者 官庁 部品 # # これらがどちらに分類されるかを示すプログラムを書きなさい。 # -- "鶏が先か卵が先か" チャールズ・W・バックマン による --
# 同じく1977年11月号 "マイクロコンピュータそのII プログラミングの基礎(まとめ)" から # <<本として出版されていたら御免なさい。>> # 数あてゲーム # 1) 出題者は適当な4桁の数字(a)を決める。 # 2) 解答者は出題者の決めた数字を予想して出題者に数字(b)を示す。 # 3) 出題者は解答者の提示した数字を見て、次のヒントを出題者に知らせる。 # a,bの両方に含まれる数字の数(c) # aとbの対応する桁の数字が一致した数(d) # 4) 解答者は出題者が示したヒントからbを訂正して 2) に戻る。 # # ゲームは正解を得るまでに何回のヒントを得たかによって判定されるので # ヒントを得る回数が最少になるように努力するプログラムを作りなさい。
>>7 >>5 はともかく
>>6 の数当てゲームは、少なくともここ一・二年出てこなかった
じゃないかな。
出てる出てないの問題じゃない。スレ違い。 ついでに言うと、このような形で雑誌の問題をそのまま掲載するのは、 著作権保護法にも違反してる。
>>9 著作権の問題については、おっしゃる通りなので、恐縮して載せている。
共立出版の不利益になるケースではまったくないので雑誌については
いいだろうという判断。私がbit誌を度々取り上げるのは、このような
ジャンルの雑誌が復刊して欲しいから。
スレ違いについてはこのスレのこれまでの歴史をみれば、まったく
見当違いであることがわかる。
>>5 % Prolog
エンティティ(鶏).
ロール(複合部品).
エンティティ(自動車).
エンティティ(ビルディング).
ロール(母).
ロール(子).
ロール(依頼人).
エンティティ(会社).
ロール(顧客).
エンティティ(医師).
ロール(従業員).
ロール(雇主).
エンティティ(馬).
ロール(法律家).
ロール(所有者).
ロール(単純部品).
エンティティ(人).
ロール(財産).
ロール(株主).
ロール(供給者).
エンティティ(官庁).
エンティティ(部品).
著作権保護法ってどこにあるんですか? 外国の法律ですか?
どうして自分で質問して自分で答えるの? こんなの宿題じゃないじゃん。 Prologやりたいんなら、Prologスレ行けばいいのに。
>>12 つか君の国籍は?
もし日本に住んでるんなら、引用と転載の違いぐらい知っておいたほうがいいよ。
>>13 宿題スレは春休み、夏休み、冬休み期間は題材がなくなるから、
過去のおもしろそうな問題をdatから探し出したり、自分で問題を
考えたり、本や雑誌に課題を求めたりする。その他の期間の過半の
出所は「C/C++で宿題片付けます」スレだから「宿題」であるかどうかは
そちらの問題で、ここは見たことのないソースが溢れればそれでよい。
>>16 もう一ヶ月も経てば、また宿題が出始めますから、
ぜひ、問題を解いて、このスレに載せてください。
私は、関数型言語のコードを待っています。
>>14 で、著作権保護法ってどこにあるんですか?
http://pc11.2ch.net/test/read.cgi/db/1252492296/613 # <ユーザ情報テーブル>
# ID,氏名,住所
# 1,ユーザ1,青森県〜〜〜
# 2,ユーザ2,青森県〜〜〜
# 3,ユーザ3,北海道〜〜〜
# 4,ユーザ4,宮城県〜〜〜
# 5,ユーザ5,岩手県〜〜〜
# ・・・
# <都道府県テーブル>
# ID,都道府県
# 1,北海道
# 2,青森県
# 3,岩手県
# 4,宮城県
# 5,秋田県
# ・・・
# この2つのテーブルから、クエリを使用して、都道府県別のユーザ数を取得(カウント)したいのですが、教えていた
だけませんでしょうか? 上記の5レコードで説明しますと、以下のような結果が望みです。
# 都道府県,人数
# 北海道,1
# 青森県,2
# 岩手県,1
# 宮城県,1
# 秋田県,0
http://pc12.2ch.net/test/read.cgi/tech/1263824755/891 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# 行列のrankを求める関数 rank( ) を実装せよ
# (提示ソースコードは後記)
#
# include <iostream>
# #include <cstdlib>
# using namespace std;
#
# #define ROWS 5
# #define COLS 4
#
# int rank( double array[ROWS][COLS] )
# {
#
# }
#
>>20 の続き
# int main( )
# {
# srand( time(NULL) );
#
# double array[ROWS][COLS];
#
# for( int r=0; r<ROWS; ++r ){
# for( int c=0; c<COLS; ++c ){
# array[r][c] = rand( );
# }
# }
#
# rank( array );
#
# return 0;
# }
>>19 % Prolog
都道府県別のユーザ数一覧 :-
write('都道府県,人数\n'),
都道府県別のユーザ数を取得(_都道府県,_人数),
write_formatted('%t,%t\n',[_都道府県,_人数]),
fail.
都道府県別のユーザ数一覧.
都道府県別のユーザ数を取得(_都道府県,_人数) :-
都道府県(_,_都道府県),
count((ユーザ情報(_,_,住所),sub_atom(_住所,0,_,_,_都道府県)),_人数).
前スレにかこうとしてできなかったもの
http://pc12.2ch.net/test/read.cgi/tech/1261443439/790 使用言語:J
bubbleSort=:(([ (<. , >.) {.@]) , }.@])/^:_
insertionSort=:((>: # ]) , [ , < #])/
quickSort=:(($:@(<#[) ; (=#[) ,&< $:@(>#[)) ({~ ?@#)) ^: (1<#)
siftDown=: 4 : 0
's e'=. x
z=.y
c=.s
while. e > c=.1+2*s=.c do.
if. e > 1+c do. if. c <&({&z) c+1 do. c=.c+1 end. end.
if. s <&({&z) c do. z=. z {`(|.@[)`]}~ c,s else. break. end.
end.
z
)
heapSort =: 3 : 0
if. 1>: c=. # y do. y return. end.
z=. (] siftDown ~c,~[)&.>/ (<y),~]&.>i.1+<.-:c-2
> (](] siftDown {`(|.@[)`]}~) 0,[)&.>/ z,~]&.>1+i.c-1
)
rt=:6!:2
a=:?~1000
10 rt 'bubbleSort a' NB.1000個のデータでソートを10回行いその平均値を秒で返す
4.91614
10 rt 'heapSort a'
0.337704
10 rt 'quickSort a'
0.0169458
10 rt 'insertionSort a'
0.0110285
>>20 使用言語:J
rank=: monad define
SIZE=.|.{(;(<: # y), 2)$ 2#}.- >: i. # y
MAT=. SIZE {. L:0 y
(#y) - {. I. 1e_10 < | ;(-/ . * L:0 MAT)
)
rank 4 5$0 0 0 0 0,0 0 2 0 0,0 1 0 1 1,0 4 3 4 0
3
>>20 使用言語:maxima
(%i22) a:matrix([0, 0, 0, 0, 0],[0, 0, 2, 0, 0],[0, 1, 0, 1, 1],[0, 4, 3, 4, 0]);
[ 0 0 0 0 0 ]
[ ]
[ 0 0 2 0 0 ]
[ ]
[ 0 1 0 1 1 ]
[ ]
[ 0 4 3 4 0 ]
(%i23) rank(a);
(%o23) 3
>>20 使用言語:R
> a <- matrix(c(0, 0, 0, 0, 0,0, 0, 2, 0, 0,0, 1, 0, 1, 1,0, 4, 3, 4, 0),4,5,byrow=T)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 2 0 0
[3,] 0 1 0 1 1
[4,] 0 4 3 4 0
> qr(a)$rank
[1] 3
>>21 (
>>20 )
% Prolog 下のようにしておいた方が無難なんだろうか。
行列の階数(_行列,_階数) :-
ガウス行列に変形(_行列,_ガウス行列),
count((member(L,_ガウス行列),\+('すべての要素が0か0.0'(L))),_階数).
'すべての要素が0か0.0'([]).
'すべての要素が0か0.0'([0|R]) :-
'すべての要素が0か0.0'(R).
'すべての要素が0か0.0'([0.0|R]) :-
'すべての要素が0か0.0'(R).
>>30 % Prolog 「10個の」をどう反映させればよいか解らない・・・
保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取る(_保存済みのメモ帳,L) :-
get_chars(_保存済みのメモ帳,Chars),
findall(N,(for(1,M,5),数字にヒットするまでランダムにならびを探す(Chars,N)),L).
数字にヒットするまでランダムにならびを探す(L,N) :-
length(L,Len),Len > 0,
repeat,
M is (random mod Len) + 1,
list_nth(M,L,A),
member(A,['0','1','2','3','4','5','6','7','8','9']),!.
http://pc11.2ch.net/test/read.cgi/db/1252492296/631 # MYSQL使ってます。
# id キーワード
# 1 りんご
# 2 みかん
# 3 りんご
# のようにDBに登録されてるキーワードが多い順に例えばヒット件数トップ10のキーワードを
# 抜き出したいのですがどのように書いたらいいでしょうか?
# 件数少ないうちは今までにないキーワードがでたら全検索で数えるって繰り替えそうと思ったんですけど、
# 件数多くなったら効率的に書かないとまずいかなと思いまして。
>>30 使用言語:J
この問題文では、詳細がさっぱりわかりません。
data=:45 97 8 21 51 64 24 62 46 3
(5?10){data
3 45 97 46 21
>>33 (
>>30 )
# 数値を一行に一つずつ十行メモ帳に書き込みこれを保存する。
# このファイルを参照することによってこのうち5個の数値をランダムに取り出すプログラムを作りなさい。
% とするべきですね。
>>34 % Prolog
十行の数値が書かれたメモ帳を保存し、このファイルから5個の数値をランダムに取り出す(_保存済みのメモ帳,_5個の数値ならび) :-
get_lines(_保存済みのメモ帳,Lines),
findall(N,(for(1,M,5),ならびからランダムに数値を取り出す(Lines,N)),_5個の数値ならび).
ならびからランダムに数値を取り出す(L,N) :-
length(L,Len),Len > 0,
repeat,
M is (random mod Len) + 1,
list_nth(M,Lines,A),
atom_to_term(A,N,_),
number(N),!.
>>36 % Prolog
pgmファイルヘッダ(_pgmファイル,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :-
open(_pgmファイル,read,Input,[type(binary)]),
pgmヘッダの読み取り(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル),
close(Input),!.
pgmファイルヘッダの読み取り(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :-
マジックナンバー(Input,_マジックナンバー),
画像の幅方向サイズ(Input,_画像の幅方向サイズ),
画像の幅方向サイズ(Input,_画像の幅方向サイズ),
画像の高さサイズ(Input,_画像の高さサイズ),!.
マジックナンバー(Input,_マジックナンバー) :-
findall(Y,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;char_code(Y,X))),L),
concat_atom(L,_マジックナンバー),!.
画像の幅方向サイズ(Input,_画像の幅方向サイズ) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の幅方向サイズ,L),!.
画像の高さサイズ(Input,_画像の高さサイズ) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の高さサイズ,L),!.
画像の最大階調レベル(Input,_画像の最大階調レベル) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の最大階調レベル,L),!.
'Whitespace'(X) :- X < 48,X >57,!.
>>37 (
>>36 ) 訂正
% Prolog 'Whitespace'/2の定義を間違えた。それから述語名を入れ替えます。
pgmファイルヘッダの読み取り(_pgmファイル,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :-
open(_pgmファイル,read,Input,[type(binary)]),
pgmヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル),
close(Input),!.
pgmファイルヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :-
マジックナンバー(Input,_マジックナンバー),
画像の幅方向サイズ(Input,_画像の幅方向サイズ),
画像の幅方向サイズ(Input,_画像の幅方向サイズ),
画像の高さサイズ(Input,_画像の高さサイズ),!.
マジックナンバー(Input,_マジックナンバー) :-
findall(Y,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;char_code(Y,X))),L),
concat_atom(L,_マジックナンバー),!.
画像の幅方向サイズ(Input,_画像の幅方向サイズ) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の幅方向サイズ,L),!.
画像の高さサイズ(Input,_画像の高さサイズ) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の高さサイズ,L),!.
画像の最大階調レベル(Input,_画像の最大階調レベル) :-
findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L),
number_codes(_画像の最大階調レベル,L),!.
'Whitespace'(X) :- X < 48.
'Whitespace'(X) :- X > 57.
>>39 % Prolog
時間昇降順で表示するwho(_昇降順) :-
shs(who,L),
時間昇降順で表示するwho(L,L1),
wrln(L1).
時間昇降順で表示するwho(_昇降順,L,_時間昇降順who) :-
findall([_時刻,_行],(member(L1,L),時刻を取り出す(_行,_時刻)),_時刻を先頭に付加したwho),
昇降順に整列(_昇降順,_時刻を先頭に付加したwho,_時間昇降順who).
時刻を取り出す(_行,_時刻) :-
split(_行,[' '],L1),
append(L2,[_分秒|L3],L1),
sub_atom(_分秒,_,1,_,':'),
last(L2,_年月日),
sub_atom(_年月日,_,1,_,'-'),
concat_atom([B,' ',A],_時刻),!.
昇降順に整列(昇順,_時刻を先頭に付加したwho,_時間昇降順who) :-
整列(_時刻を先頭に付加したwho,_整列した時刻を先頭に付加したwho),
findall(_行,member([_,_行],_整列した時刻を先頭に付加したwho),_時間昇降順who).
昇降順に整列(降順,_時刻を先頭に付加したwho,_時間昇降順who) :-
整列(_時刻を先頭に付加したwho,_整列した時刻を先頭に付加したwho),
reverse(_整列した時刻を先頭に付加したwho,_整列しかつ反転した時刻を先頭に付加したwho),
findall(_行,member([_,_行],_整列しかつ反転した時刻を先頭に付加したwho),_時間昇降順who).
>>32 % Prolog (その一)
キーワード数の上位10位までを表示 :-
findall([M,N],カウンタカウンタ(M,N),L1),
sort(L1,L2),
reverse(L2,L3),
上位10位まで(L3,L),
キーワード数の上位10位までを表示(L).
キーワード数の上位10位までを表示([]) :- !.
キーワード数の上位10位までを表示([M|R]) :-
キーワードカウンタ(_キーワード,M),
キーワード表示(_キーワード),
fail.
キーワード数の上位10位までを表示(R).
キーワード表示(_キーワード) :-
キーワード(ID,_キーワード),
write_formatted('%t,%t\n',[ID,_キーワード]).
上位10位まで([],_,[]) :- !.
上位10位まで(_,Count,[]) :- Count >= 10,!.
上位10位まで([[M,N]|R1],Count1,[M|R2]) :-
Count2 is Count1 + N,
上位10位まで(R1,Count2,R2).
>>32 % Prolog (その二)
キーワードカウンタを準備する :-
abolish(キーワードカウンタ/2),
キーワード(Id,_キーワード),
キーワードカウンタ((+),_キーワード),
fail.
キーワードカウンタを準備する.
キーワードカウンタ((+),_キーワード) :-
retract(キーワードカウンタ(_キーワード,_現在のカウント)),
_加算されたカウント is _現在のカウント + 1,
カウンタカウンタの更新((-),_現在のカウント)
カウンタカウンタの更新((+),_加算されたカウント),
asserta(キーワードカウンタ(_キーワード,_加算されたカウント)),!.
キーワードカウンタ((+),キーワード) :-
asserta(キーワードカウンタ(_キーワード,1)),
カウンタカウンタの更新((+),1),!.
カウンタカウンタの更新((+),M) :-
retract(カウンタカウンタ(M,N)),
N2 is N + 1,
asserta(カウンタカウンタ(M,N2)),!.
カウンタカウンタの更新((+),M) :- asserta(カウンタカウンタ(M,1)).
カウンタカウンタの更新((-),M) :-
retract(カウンタカウンタ(M,N)),
N1 is N - 1,
asserta(カウンタカウンタ(M,N1)),!.
http://pc12.2ch.net/test/read.cgi/tech/1263824755/945 # Bairstow Samples 名無しさん - 2010/03/17(Wed) 19:00 No.10560 10560.zip
# [1] 授業単元: 数値解析
# [2] 問題文(含コード&リンク): n=10の多項式をベアストウ法(Bairstow’s Method)により解析するプログラムを書くこと。
# N=coefficients r,s= initial value
# 繰り返しの際にはじめのr,s,b,cと△r、△s、エラーの値をプリントする。一定の値に集中するまで続ける。
# (Convergence)一点に集まった値がでたら、次は二次公式をするために同様の作動を繰り返す。この時rとsは自動的に割り出されなければならない。ルーツが見つかるまで全てのプロセスを繰り返す。
# ある犬が数を # "ひとつ" "ふたつ" "たくさん"と認識するとします。 # なにか具体的なものを抽象してdで表すとして、 # この犬の数認識を、 # "ひとつ","ふたつ","たくさん"と"d"を用いて定義せよ。
>>46 % Prolog
ある犬の数の認識(ひとつ,[d]).
ある犬の数の認識(ふたつ,[d,d]).
ある犬の数の認識(たくさん,[d,d|R]) :- \+(R=[]).
>>46 % Prolog すぐに思い浮かぶ定義としては以下のものがあるけれど、犬の直感からは遠い定義だと思う。
ある犬の数の認識(ひとつ,[d]).
ある犬の数の認識(ふたつ,[d,d]).
ある犬の数の認識(たくさん,[d,d|R]) :- ひとつ(R).
ある犬の数の認識(たくさん,[d,d|R]) :- ある犬の数の認識([d|R]).
%
>>47 も []をゼロと解釈すると、とてもあり得ない定義、かも。
>>48 訂正 (
>>46 )
% Prolog 最終節の本体まちがえた。
ある犬の数の認識(ひとつ,[d]).
ある犬の数の認識(ふたつ,[d,d]).
ある犬の数の認識(たくさん,[d,d|R]) :- ひとつ(R).
ある犬の数の認識(たくさん,[d,d|R]) :- ある犬の数の認識(たくさん,[d|R]).
>>48 もう一度訂正
ある犬の数の認識(ひとつ,[d]).
ある犬の数の認識(ふたつ,[d,d]).
ある犬の数の認識(たくさん,[d,d|R]) :- ある犬の数の認識(ひとつ,R).
ある犬の数の認識(たくさん,[d,d|R]) :- ある犬の数の認識(たくさん,[d|R]).
% でした。恐縮。
>>44 使用言語:J
f=:monad def ';(2<#y){a:,<(2{.y),_2{.y'
f 'ba'
f 'basic'
baic
f 'bas'
baas
>>45 使用言語:J
f=:monad def '({.y),''*''(I.(}.={.)y)}}.y'
f 'asasas'
as*s*s
f'aa'
a*
f'a'
a
>>44 % Prolog
文字列が与えられたとして、その最初の2文字と最後の2文字を結合した新たな文字列(_文字列,_結合した文字列) :-
sub_atom(_文字列,0,2,_,_文字列1),
sub_atom(_文字列,_,2,0,_文字列2),
atom_concat(_文字列1,_文字列2,_結合した文字列).
文字列が与えられたとして、その最初の2文字と最後の2文字を結合した新たな文字列(_文字列,_結合した文字列) :-
ただし文字列の長さが2文字以下の時は、新たな文字列は空文字となる(_文字列,_結合した文字列
ただし文字列の長さが2文字以下の時は、新たな文字列は空文字となる(_文字列,'') :-
sub_atom(_文字列,_,N,_,_文字列),
N =< 2.
>>45 % Prolog
'文字列が与えられたとして、その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換した新たな文字列'(_文字列,_置換した文字列) :-
atom_chars(_文字列,[_最初の文字|_残り文字ならび]),
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_最初の文字,_残り文字列,_二文字目以降の置換した文字ならび),
atom_chars(_置換した文字列,[_最初の文字列|_二文字目以降の置換した文字ならび]).
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_,[],[]) :- !.
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_最初の文字,[_最初の文字|R1],['*'|R2]) :-
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_最初の文字,R1,R2),!.
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_最初の文字,[A|R1],[A|R2]) :-
'その最初の文字と同じ文字がそれ以後に現れた場合、それをすべて*に置換'(_最初の文字,R1,R2).
>>44 使用言語:R
f <- function(s){
a <- nchar(s)
if(a<=2)"" else paste(substr(s,1,2),substr(s,a-1,a),sep="")
}
> f("ba")
[1] ""
> f("basic")
[1] "baic"
> f("bas")
[1] "baas"
>>45 使用言語:R
f <- function(s){
n <- nchar(s)
a <- substr(s,1,1)
paste(a,gsub(a,"*",substr(s,2,n)),sep="")
}
> f("asasas")
[1] "as*s*s"
> f("aa")
[1] "a*"
> f("a")
[1] "a"
>>44 使用言語:Io
Sequence f:=method(if(size <= 2,"",slice(0,2).. slice(-2)))
Io> "basic" f
==> baic
Io> "ba" f
==>
Io> "bas" f
==> baas
>>45 使用言語:Io
Sequence f:=method((a:=slice(0,1)) .. slice(1) asMutable replaceSeq(a,"*"))
Io> "asasas" f
==> as*s*s
Io> "aa" f
==> a*
Io> "a" f
==> a
http://pc12.2ch.net/test/read.cgi/tech/1267796762/11 # 【 課題 】任意の画像A(形式.ppm)と画像B(形式.ppm)を用意する。
# 画像A上の任意の4点の座標をマウスのクリックにより取得し、その4点を結んだ四角形の形、大きさにBを変形し、
# AとBを合成した画像Cを描画し、それを、ppmファイルで出力せよ。
# なお、画像の変形には逆マッピング変換(inverse mapping)とバイリニア補完(bilinear interpolation)を使うこと。
# 変形に際し、Java Advanced Imaging のようなAPIを使ってはならない。
#
>>44 使用言語:Lua
f=function(s)
if (#s<=2) then return "" else return s:sub(1,2)..s:sub(#s-1) end
end
> =f("ba")
> =f("basic")
baic
> =f("bas")
baas
>>45 使用言語:Lua
f=function(s)
a=s:sub(1,1)
return a..(s:sub(2):gsub(a,"*"))
end
> =f("asasas")
as*s*s
> =f("aa")
a*
> =f("a")
a
>>44 使用言語:Arc
(def f (s)
(let n (len s)
(if (<= n 2) "" (+ (cut s 0 2) (cut s (- n 2))))
)
)
arc> (f "ba")
""
arc> (f "basic")
"baic"
arc> (f "bas")
"baas"
>>45 使用言語:Arc
(def f(s)
(let a (cut s 0 1)
(+ a (subst "*" a (cut s 1)))
)
)
arc> (f "asasas")
"as*s*s"
arc> (f "aa")
"a*"
arc> (f "a")
"a"
>>64 >>44 使用言語:J
問題文の訂正にあわせて変更しました。
f=:monad def ';(1<#y){a:,<(2{.y),_2{.y'
f 'b'
f 'ba'
baba
f 'bas'
baas
f 'basic'
baic
>>64 >>44 使用言語:R
問題文の訂正にあわせて変更しました。
f <- function(s){
a <- nchar(s)
if(a<2)"" else paste(substr(s,1,2),substr(s,a-1,a),sep="")
}
> f("b")
[1] ""
> f("ba")
[1] "baba"
> f("bas")
[1] "baas"
> f("basic")
[1] "baic"
>>64 >>44 使用言語:Io
問題文の訂正にあわせて変更しました。
Sequence f:=method(if(size < 2,"",slice(0,2).. slice(-2)))
Io> "b" f
==>
Io> "ba" f
==> baba
Io> "bas" f
==> baas
Io> "basic" f
==> baic
>>64 >>44 使用言語:Lua
問題文の訂正にあわせて変更しました。
f=function(s)
if (#s<2) then return "" else return s:sub(1,2)..s:sub(#s-1) end
end
> =f("b")
> =f("ba")
baba
> =f("bas")
baas
> =f("basic")
baic
>>64 >>44 使用言語:Arc
問題文の訂正にあわせて変更しました。
(def f (s)
(let n (len s)
(if (< n 2) "" (+ (cut s 0 2) (cut s (- n 2))))
)
)
arc> (f "b")
""
arc> (f "ba")
"baba"
arc> (f "bas")
"baas"
arc> (f "basic")
"baic"
>>64 >>44 使用言語:Scilab
function r=f(s)
n=length(s)
if n<2 then
r=""
else
r=part(s,1:2)+part(s,n-1:n)
end
endfunction
-->f("b")
ans =
-->f("ba")
ans =
baba
-->f("bas")
ans =
baas
-->f("basic")
ans =
baic
>>45 使用言語:Scilab
function r=f(s)
a=part(s,1)
r=a+strsubst(part(s,2:length(s)),a,"*")
endfunction
-->f("asasas")
ans =
as*s*s
-->f("aa")
ans =
a*
-->f("a")
ans =
a
http://pc12.2ch.net/test/read.cgi/tech/1267796762/13 # 【 課題 】
# ○県、市別に男女の人数をクロス集計するプログラムを作成せよ。
#
# 千葉県 柏市 男
# 千葉県 松戸市 男
# 埼玉県 さいたま市 女
# 千葉県 柏市 男
# 埼玉県 越谷市 男
# 千葉県 松戸市 男
# 埼玉県 岩槻市 女
# 千葉県 柏市 女
# 埼玉県 さいたま市 女
#
# [実行例](男の場合)
# ,柏市,松戸市,さいたま市,越谷市,岩槻市
# 千葉県,2,2,0,0,0
# 埼玉県,0,0,0,1,0
#
# [実行例](女の場合)
# ,柏市,松戸市,さいたま市,越谷市,岩槻市
# 千葉県,1,0,0,0,0
# 埼玉県,0,0,2,0,1
http://pc11.2ch.net/test/read.cgi/db/1252492296/688 # Oracle10gを使用しています。
#
# <生徒テーブル>
# 生徒ID, 生徒名称, クラスID, 好きな教科ID,
# 1, 鈴木, A, 1
# 2, 田中, B, 1
# 3, 佐藤, c, 2
#
# <教科テーブル>
# 教科ID, 教科名称
# 1, 国語
# 2, 数学
# 3, 理化
#
# <クラステーブル>
# クラスID, クラス名称
# a, Aクラス
# b, Bクラス
# c, Cクラス
#
# 上記2つのテーブルから、
# 各教科でクラス毎に何人が好きな教科としているか以下のような形で取得します。
#
# 教科, Aクラス内での人数, B〜, C〜, …
# 国語, 1, 1, 0, …
# 数学, 0, 0, 1, …
# 理化, 0, 0, 0, …
#
>>74 // compile-time C++
#include <iostream>
template <unsigned int N>
struct from_binary { static const unsigned int value = 2*from_binary<N/10>::value + N%10; };
template <>
struct from_binary <0> { static const unsigned int value = 0; };
template <unsigned int N>
struct to_binary { static const unsigned int value = 10*to_binary<(N/2)>::value + N%2; };
template <>
struct to_binary <0> { static const unsigned int value = 0; };
template <unsigned int N>
class bitcount {
private:
static const unsigned int N1 = (N & 0x55) + (N
>>1 & 0x55);
static const unsigned int N2 = (N1 & 0x33) + (N1
>>2 & 0x33);
public:
static const unsigned int value = (N2 & 0x0F) + (N2
>>4 & 0x0F);
};
template <unsigned int N>
struct t74 { static const unsigned int value = (0xFF << bitcount<N>::value) & 0xFF; };
int main()
{
std::cout << to_binary<t74<from_binary<101110>::value>::value>::value << std::endl;
return 0;
}
間違えた s/bitcount<N>::value/(8-bitcount<N>::value)/
>>74 % Prolog
二進数表現の全ての1であるビットを左側に寄せてシフトする([],[]) :- !.
二進数表現の全ての1であるビットを左側に寄せてシフトする([0|R1],[1|R3]) :-
残りの最初の1と置換する(R1,R2),
二進数表現の全ての1であるビットを左側に寄せてシフトする(R2,R3).
二進数表現の全ての1であるビットを左側に寄せてシフトする([0|R1],[0|R1]) :- !.
二進数表現の全ての1であるビットを左側に寄せてシフトする([1|R1],[1|R2]) :-
二進数表現の全ての1であるビットを左側に寄せてシフトする(R1,R2).
残りの最初の1と置換する([1|R1],[0|R1]) :-!.
残りの最初の1と置換する([0|R1],[0|R2]) :-
残りの最初の1と置換する(R1,R2).
>>77 (
>>74 )
% Prolog 書き直し
二進数表現の全ての1であるビットを左側に寄せてシフトする([],[]) :- !.
二進数表現の全ての1であるビットを左側に寄せてシフトする([0|R1],[1|R3]) :-
残りの最初の1と置換する(R1,R2),
二進数表現の全ての1であるビットを左側に寄せてシフトする(R2,R3).
二進数表現の全ての1であるビットを左側に寄せてシフトする([0|R1],[0|R1]) :- !.
二進数表現の全ての1であるビットを左側に寄せてシフトする([1|R1],[1|R2]) :-
二進数表現の全ての1であるビットを左側に寄せてシフトする(R1,R2).
残りの最初の1と置換する([1|R1],[0|R1]) :-!.
残りの最初の1と置換する([0|R1],[0|R2]) :-
残りの最初の1と置換する(R1,R2).
>>72 % Prolog
○県、市別に男女の人数をクロス集計する(_性別) :-
findall(_県名,県・市・男女(_県,_,_),_重複を許した県名ならび),
sort(_重複を許した県名ならび,_整列した重複しない県名ならび),
findall(_都市名,県・市・男女(_,_都市名,_),_重複を許した都市名ならび),
sort(_重複を許した県名ならび,_整列した重複しない都市名ならび),
concat_atom(_整列した重複しない都市名ならび,',',_都市名行表示),
write_formatted(',%t\n',[_都市名行表示]),
member(_県名,_整列した重複しない県名ならび),
findall(_人数,( member(_都市名,_整列した重複しない都市名),
count(_県名,_都市名,_性別),_人数)),
_人数ならび),
concat_atom([_県名|_人数ならび],_行表示),
write_formatted('%t\n',[_行表示]),
fail.
○県、市別に男女の人数をクロス集計する(_性別).
>>73 % Prolog
各教科でクラス毎に何人が好きな教科としているか以下のような形で取得(_クラス毎好きな教科の人数ならび) :-
findall(_クラスID,クラステーブル(_クラスID,_),_クラスIDならび),
findall(_教科ID,教科テーブル(_教科ID,_),_教科IDならび),
findall([_教科ID_2,_クラスID_2,_人数],
( member(_教科ID_2,_教科IDならび),
member(_クラスID_2,_クラスIDならび),
count(生徒テーブル(_,_,_クラスID_2,_教科ID_2),_人数)),
_クラス毎好きな教科の人数ならび).
>>74 (
>>73 )
% Prolog 述語名変更(削り忘れた)
各教科でクラス毎に何人が好きな教科としているか(_クラス毎好きな教科の人数ならび) :-
....
% 「以下のような形で」のような表現をラベルにどう取り込むかは研究課題。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/972 # 【質問テンプレ】
# [1] 授業単元:C言語演習
# [2] 問題文(含コード&リンク):
# typedef struct Position
# {
# double x,y,z;
# }Position;
#
# typedef struct Triangle
# {
# Position p1,p2,p3;
# }Triangle;
#
# 第1引数のTriangle型で示される3角板の中の、第2引数に最も近い座標を返す関数
# Position GetNearestPosition( Triangle *tri, Position *tgt );
# を作成しなさい。
>>83 % Prolog
'AごとにBが最大となるレコードのCを得る'(A,B,C) :-
findsetof(A,'SAMPLE'(A,_,_)),
findmax([B,A,C],'SAMPLE'(A,B,C),[B,A,C]).
% findsetof/2 は
http://nojiriko.asia/prolog/findsetof.html 参照
86 :
デフォルトの名無しさん :2010/03/25(木) 12:15:58
>>83 -- Haskell
import Data.List (groupBy, maximumBy)
import Data.Ord (comparing)
import Data.Function (on)
fst3 (x,_,_) = x
snd3 (_,x,_) = x
t83 = map ((a,_,c) -> (a,c)) . map (maximumBy (comparing snd3)) . groupBy ((==) `on` fst3)
main = print . t83 $ sample
where
sample = [(1,3,'a'), (1,5,'b'), (2,8,'c'), (2,4,'d'), (2,6,'e'), (3,3,'f'), (3,1,'g')]
>>83 % Prolog
集約項の最大値(Query,_集約引数ならび,_集約対象引数,_選択項引数ならび) :-
findsetof(_集約引数ならび,Query),
findmax([_集約対象引数|_選択項引数ならび],Query,[_集約対象引数|_選択項引数ならび]).
?- 集約項の最大値('SAMPLE'(A,B,C),[A],B,[A,B,C]).
A = 1,
B = 5,
C = b;
A = 2,
B = 8,
C = c;
A = 3,
B = 3,
C = f;
no
?-
>>73 % Prolog
各教科でクラス毎に何人が好きな教科としているか(_各教科クラスごとに好きな教科人数ならび) :-
findsetof([_教科ID],クラステーブル(_クラスID,_)),
findall([_クラスID,_教科ID,_度数],
集約項度数((クラステーブル(_クラスID,_),教科テーブル(_教科ID,_),生徒テーブル(_,_,_クラスID,_教
科ID)),[_クラスID,_教科ID],_度数),
_各教科クラスごとに好きな教科人数ならび).
集約項の度数(Query,_集約引数,_度数) :-
findsetof(_集約引数,Query),
count(Query,_度数).
>>74 使用言語:J
f=:dyad def '([:#.x{.1#~+/)#:y'
8 f 86
240
(8#2)#:86
0 1 0 1 0 1 1 0
(8#2)#:240
1 1 1 1 0 0 0 0
「左端」はbit数で変わってしまうので、bit数も引数にしました。
>>74 使用言語:J
A=:;/1 1 2 2 2 3 3
B=:;/3 5 8 4 6 3 1
C=:' ' cutopen 'a b c d e f g'
]data=:A,.B,.C
+-+-+-+
|1|3|a|
+-+-+-+
|1|5|b|
+-+-+-+
|2|8|c|
+-+-+-+
|2|4|d|
+-+-+-+
|2|6|e|
+-+-+-+
|3|3|f|
+-+-+-+
|3|1|g|
+-+-+-+
/:~(#~[:~:{."1)\:~data
+-+-+-+
|1|5|b|
+-+-+-+
|2|8|c|
+-+-+-+
|3|3|f|
+-+-+-+
>>83 使用言語:C#
class Program
{
static void Main(string[] args)
{
var table = new[] {new { A = 1, B = 3, C = "a" },
new { A = 1, B = 5, C = "b" },
new { A = 2, B = 8, C = "c" },
new { A = 2, B = 4, C = "d" },
new { A = 2, B = 6, C = "e" },
new { A = 3, B = 3, C = "f" },
new { A = 3, B = 1, C = "g" }};
var ary = table.GroupBy(t => t.A)
.Select(g => new { A = g.Key, B = g.Max(t => t.B) })
.Join(table, t => t.A, t => t.B, (t, t2) =>
new
{
A = t2.A,
B = t2.B,
C = t2.C
});
foreach (var a in ary)
Console.WriteLine(a.ToString());
Console.ReadLine();
}
}
>>82 使用言語:J
g=:dyad def '%:+/"1*:x-y'
f=:dyad def '{.x/:x g"1 y'
T=:3 3$1 1 0, 2 3 0, 4 3 0
T f 1 2 4
1 1 0
>>74 使用言語:Io
f:=method(n,b,
n asString toBase(2) alignLeft(b, "0") sort reverse fromBase(2)
)
Io> f(86,8)
==> 240
JとかIoって趣味でさわってるんですか?
Prologも?
prolog は問題をだしている人だと思います。
>>97 99%のPrologコードは私が書いています。このスレでは仕様から
直感的に得られるプログラムパターン上のラベル(述語名、論理変数名)に
仕様の断簡を載せたらどうなるかを、露悪"趣味"的に追求しています。
したがってここのコードは趣味として書かれています。職業的には
この25年間Prolog以外のコードを書いたことはありません。
http://pc12.2ch.net/test/read.cgi/tech/1197620454/385 # 問題文:
# 1、10個の文字を1つずつ入力し、それらを入力した順に
# 並べて表示
# 2、10個の文字を1つずつ入力し、それらを入力した順と逆順に
# 並べて表示
# 3、5文字以上の長さの文字列を入力し、4番目の文字と5番目の文字を入れ替えて表示
# 4、10個の1桁の整数を入力し、それらを大きい順に並べて表示
# 5、10個の1桁の整数を入力し、その中から最も大きい3個を入力した順に表示
# 6、1桁の整数の入力を、同じ数が3回入力されるまで繰り返す
# 7、1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す
http://pc12.2ch.net/test/read.cgi/tech/1197620454/200 # 練習問題
# ・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
# 80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
# と表示されるプログラムを作成しなさい。
#
# 例) 25(enter押下)
# 90(enter押下)
# 73(enter押下)
# END (enter押下)
#
# 25 normal
# 90 verygood
# 73 good
http://pc12.2ch.net/test/read.cgi/tech/1197620454/179 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 正方行列を入力したら逆行列を計算し出力するプログラムを作成せよ。
# 起動後にコンソールに「行列のサイズを入力してください」と表示し、サイズを入力したら、
# 「行列要素を入力してください」と表示し、行列の1行分の要素をカンマ区切りで1行ずつ入力する。
# 結果は、コンソールに「逆行列は次の通りです」と表示し、
# 逆行列を各自が見やすいと思う方法で体裁を整えて表示せよ。
# 逆行列が存在しない場合は「解無し」と表示せよ。
>>101 % Prolog
'数値を複数回入力し、最後に"END"と入力された後、それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示されるプログラム' :-
'数値を複数回入力し、最後に"END"と入力'(L),
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'(L),
'数値を複数回入力し、最後に"END"と入力'(L) :-
findall(_数値,(repeat,get_line(_行),(_行='END',!,fail;atom_to_term(_行,_,_数値),integer(_数値))),L),!.
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'([]) :- !.
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'([N|R]) :-
N >= 80,
write('%t verygood\n',[N]),
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'(R),!.
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'([N|R]) :-
N < 80,N >= 60,
write('%t good\n',[N]),
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'(R),!.
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'([N|R]) :-
N < 60,
write('%t normal\n',[N]),
'それぞれに対し80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"と表示する'(R),!.
>>100 % Prolog 課題 1、
'10個の文字を1つずつ入力し、それらを入力した順に並べて表示' :-
'10個の文字を1つずつ入力'(L),
それらを入力した順に並べて表示(L).
'10個の文字を1つずつ入力'(L) :-
findall(_文字,(for(1,_,10),一つずつ入力(_文字)),L).
一つずつ入力(_文字) :- get_line(_行),sub_atom(_行,0,1,_,_文字)),!.
一つずつ入力(_文字) :- 一つずつ入力(_文字).
それらを入力した順に並べて表示([]) :- !.
それらを入力した順に並べて表示([A|R]) :-
write_fromatted('%t',[A]),
それらを入力した順に並べて表示(R).
>>101 (
>>100 ) 訂正
% Prolog 間違えた。(さて、どこが訂正されたのでしょう?)
'10個の文字を1つずつ入力し、それらを入力した順に並べて表示' :-
'10個の文字を1つずつ入力'(L),
それらを入力した順に並べて表示(L).
'10個の文字を1つずつ入力'(L) :-
findall(_文字,(for(1,_,10),一つずつ入力(_文字)),L).
一つずつ入力(_文字) :- get_line(_行),sub_atom(_行,0,1,0,_文字)),!.
一つずつ入力(_文字) :- 一つずつ入力(_文字).
それらを入力した順に並べて表示([]) :- !.
それらを入力した順に並べて表示([A|R]) :-
write_fromatted('%t',[A]),
それらを入力した順に並べて表示(R).
>>108 (
>>100 )
>>101 ではなくて
>>107 でした。
% Prolog それらを順に並べて表示/1 は、こんなのもあるかも。
それらを入力した順に並べて表示([]) :- 最後改行せずに終わります.
それらを入力した順に並べて表示([A|R]) :-
write_fromatted('%t',[A]),
それらを入力した順に並べて表示(R).
最後改行せずに終わります.
>>107 % Prolog 2、
'10個の文字を1つずつ入力し、それらを入力した順と逆順に並べて表示' :-
'10個の文字を1つずつ入力し'(L1),
それらを入力した順と逆順に並べて(L1,L2),
表示(L2).
'10個の文字を1つずつ入力し'(L) :-
findall(_文字,(for(1,_,10),一つずつ入力(_文字)),L).
それらを入力した順と逆順に並べて(L1,L2) :- reverse(L1,L2).
表示([]) :- 最後改行せずに終わります,!.
表示([A|R]) :- write(A),表示(R).
>>100 % Prolog 3、 4番目、5番目の位置関係(連続していて4<5)が理解できている場合
'5文字以上の長さの文字列を入力し、4番目の文字と5番目の文字を入れ替えて表示' :-
'5文字以上の長さの文字列を入力し'(L1),
'4番目の文字と5番目の文字を入れ替えて'(L1,L2),
表示(L2).
'5文字以上の長さの文字列を入力し'(L) :-
get_line(_行),
sub_atom(_行,0,_文字数,0,_行),
文字数 >= 5,
atom_chars(_行,L),!.
'5文字以上の長さの文字列を入力し'(L) :- '5文字以上の長さの文字列を入力し'(L).
'4番目の文字と5番目の文字を入れ替えて'(L1,L2) :-
length(L0,3),
append(L0,[_4番目,_5番目|R],L1),
append(L0,[_5番目,_4番目|R],L2),!.
>>111 % Prolog
'一般にM番目要素とN番目要素を入れ替える時は'(M,N,L1,L2) :-
M < N,
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(1,M,N,L1,L2),!.
'一般にM番目要素とN番目要素を入れ替える時は'(M,N,L1,L2) :-
M >= N,
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(1,N,M,L1,L2),!.
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(M,M,N,[_M番目|R1],[_N番目|R2]) :-
M2 is M + 1,
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(M2,N,_M番目,_N番目,R1,R2),!.
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(M1,M,N,[A|R1],[A|R2]) :-
M2 is M1 + 1,
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(M2,M,N,R1,R2).
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(N,N,_M番目,_N番目,[_N番目|R],[_M番目|R]) :- !.
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(N1,N,_M番目,_N番目,[A|R1],[A|R2]) :-
N2 is N1 + 1,
'一般にM番目要素とN番目要素を入れ替える時はカウンタを一つ追加して'(N2,N,_M番目,_N番目,R1,R2).
>>112 % Prolog さすがに読み難い!!
'M番目要素とN番目要素を置換'(M,N,L1,L2) :-
M < N,
'M番目要素とN番目要素を置換'(1,M,N,L1,L2),!.
'M番目要素とN番目要素を置換'(M,N,L1,L2) :-
M >= N,
'M番目要素とN番目要素を置換'(1,N,M,L1,L2),!.
'M番目要素とN番目要素を置換(M,M,N,[_M番目|R1],[_N番目|R2]) :-
M2 is M + 1,
'M番目要素とN番目要素を置換'(M2,N,_M番目,_N番目,R1,R2),!.
'M番目要素とN番目要素を置換'(M1,M,N,[A|R1],[A|R2]) :-
M2 is M1 + 1,
'M番目要素とN番目要素を置換'(M2,M,N,R1,R2).
'M番目要素とN番目要素を置換'(N,N,_M番目,_N番目,[_N番目|R],[_M番目|R]) :- !.
'M番目要素とN番目要素を置換'(N1,N,_M番目,_N番目,[A|R1],[A|R2]) :-
N2 is N1 + 1,
'M番目要素とN番目要素を置換'(N2,N,_M番目,_N番目,R1,R2).
>>100 % Prolog 7、
'1桁の整数の入力を、同じ数が3回入力されるまで繰り返す' :-
'1桁の整数の入力'(N),
'1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,[]).
'1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,L) :-
count(member(N,L),2),!.
'1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,L) :-
'1桁の整数の入力'(N2),
'1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N2,[N|L]).
'1桁の整数の入力'(_1桁の整数) :-
get_integer(_1桁の整数),
_1桁の整数 >= 0,
_1桁の整数 < 10,!.
'1桁の整数の入力'(_1桁の整数) :- '1桁の整数の入力'(_1桁の整数).
>>100 % Prolog 7、
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す' :-
'1桁の整数の入力'(N),
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N,[]).
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N,L) :-
\+(member(N,L)),
length(L,9),!.
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N,L) :-
\+(member(N,L)),
\+(length(L,9)),
'1桁の整数の入力'(N2),
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N2,[N|L]),!.
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N,L) :-
member(N,L),
'1桁の整数の入力'(N2),
'1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す'(N2,L).
'1桁の整数の入力'(_1桁の整数) :-
get_integer(_1桁の整数),
_一桁の整数 >= 0,
_一桁の整数 < 10,!.
'1桁の整数の入力'(_1桁の整数) :- '1桁の整数の入力'(_1桁の整数).
>>104 % Prolog (2)
ヘロンの公式(_三角形の辺1,_三角形の辺2,_三角形の辺3,_三角形の面積) :-
_三角形の辺1 < _三角形の辺2 + _三角形の辺3,
_三角形の辺2 < _三角形の辺1 + _三角形の辺3,
_三角形の辺3 < _三角形の辺1 + _三角形の辺2,
S is (_三角形の辺1+_三角形の辺2+_三角形の辺3) / 2,
_三角形の面積 is sqrt(S * (S - _三角形の辺1) * (S - _三角形の辺2) * (S - _三角形の辺3)).
ヘロンの公式(_三角形の辺1,_三角形の辺2,_三角形の辺3,_三角形の面積) :-
write('三角形として構成できません\n'),fail.
>>104 % Prolog (1)
分数の加算(_分子1/_分母1,_分子2/_分母2,_分子/_分母) :-
A is _分母1 * _分母2,
B is _分子1 * _分母2 + _分子2 * _分母1,
約分(B/A,_分子/_分母).
約分(B/A,_分子/_分母) :-
最大公約数(B,A,C),
_分子 is B // C,
_分母 is A // C.
>>103 % Prolog
方行列を入力したら逆行列を計算し出力するプログラム :-
催促付き整数入力('行列のサイズを入力してください ',_サイズ),
write('行列要素を入力してください\n'),
findall(L,(for(1,N,_サイズ),get_split_line([','],L)),_行列),
逆行列(_行列,_逆行列),
行列の表示(_逆行列).
逆行列(_行列,_逆行列) :-
length(_行列,N),
単位行列(N,L),
行列の結合(_行列,L,_行列の二),
既約ガウス行列に変形(_行列の二,_既約ガウス行列),
変数正方行列(1,N,_逆行列),
行列の結合(_,_逆行列,_既約ガウス行列) .
行列の表示([]) :- !.
行列の表示([L|R]) :-
行列要素の表示(L),
行列の表示(R).
行列要素の表示([]) :- !.
行列要素の表示([A]) :- write_formatted('%6t\n',[A]),!.
行列要素の表示([A|R]) :-
write_formatted('%6t,',[A]),
行列要素の表示(R).
% 単位行列/2,行列の結合/3,規約ガウス行列に変形/2,変数正方行列/3は
%
http://nojiriko.asia/prolog/gyakugyouretsu.html を参照してください
>>119 (
>>103 ) 訂正
% Prolog
正方行列を入力したら逆行列を計算し出力するプログラム :-
催促付き整数入力('行列のサイズを入力してください ',_サイズ),
write('行列要素を入力してください\n'),
findall(L,(for(1,N,_サイズ),get_split_line([','],L)),_行列),
逆行列(_行列,_逆行列),
行列の表示(_逆行列).
逆行列(_行列,_逆行列) :-
length(_行列,N),
単位行列(N,L),
行列の結合(_行列,L,_行列の二),
既約ガウス行列に変形(_行列の二,_既約ガウス行列),
変数正方行列(1,N,_逆行列),
行列の結合(_,_逆行列,_既約ガウス行列) .
行列の表示([]) :- !.
行列の表示([L|R]) :-
行列要素の表示(L),
行列の表示(R).
行列要素の表示([]) :- !.
行列要素の表示([A]) :- write_formatted('%6t\n',[A]),!.
行列要素の表示([A|R]) :-
write_formatted('%6t,',[A]),
行列要素の表示(R).
% 単位行列/2,行列の結合/3,規約ガウス行列に変形/2,変数正方行列/3は
%
http://nojiriko.asia/prolog/gyakugyouretsu.html を参照してください
>>102 % Prolog その一
形態素解析サーバー(juman).
形態素解析(ファイル,File,L) :-
形態素解析サーバー(_形態素解析サーバー),
concat_atom(['cat ',File,' | ',_形態素解析サーバー],S),
sh(S,L1),
形態素解析(L1,L2),
形態素解析_3(L2,L) .
形態素解析(文,S,L) :-
tmpnam(File),tell(File),write_formatted('%t',[S]),told,
形態素解析(ファイル,File,L) .
形態素解析([],[]) :- !.
形態素解析([['EOS'|_]|_],[]) :- !.
形態素解析([[A|_],['@',B|_]|R],[R1_1|R3]) :-
形態素解析_2(R,R1,R2),
形態素解析_2_重複削除([A,B|R1],[],R1_1),
形態素解析(R2,R3),!.
形態素解析([[A|_]|R],[B|R2]) :-
形態素解析サーバー(mecab),
split(A,['\t'],AL),
AL = [B|_],
形態素解析(R,R2),!.
形態素解析([[A|_]|R],[A|R2]) :-
形態素解析サーバー(juman),
形態素解析(R,R2),!.
>>102 % Prolog その二
形態素解析_2([],[],[]) :- !.
形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!.
形態素解析_2([[(@),A|_]|R],[A|R2],R3) :-
形態素解析_2(R,R2,R3),!.
形態素解析_2_重複削除([],L1,L) :-
reverse(L1,L),!.
形態素解析_2_重複削除([A|R],Y,X) :-
member(A,Y),
形態素解析_2_重複削除(R,Y,X),!.
形態素解析_2_重複削除([A|R],Y,X) :-
\+(member(A,Y)),
形態素解析_2_重複削除(R,[A|Y],X).
>>105 -- Haskell とりあえず Queue を使って
import Data.Array (Array, listArray, bounds, inRange, (!))
import Data.Set (Set)
import qualified Data.Set as S
newtype Queue a = Q ([a],[a])
data Cell = Open | Blocked deriving Eq
empty = Q ([],[])
singleton x = Q ([],[x])
isEmpty (Q (f,r)) = null f && null r
put (Q (f,r)) x = Q (x:f,r)
get (Q (f,x:r)) = (x,Q (f,r))
get (Q (f,[])) = get $ Q ([],(reverse f))
solveMaze maze = bfs S.empty $ singleton [start]
where
(start,goal) = bounds $ maze
bfs s q
| isEmpty q = Nothing
| otherwise = case get q of
(path@(pos:_),q')
| pos == goal -> Just (reverse path)
| S.member pos s -> bfs s q'
| otherwise -> bfs (S.insert pos s) $ foldl (\q p -> put q (p:path)) q' $ around pos
around (row,col) = filter (\p -> inRange (bounds maze) p && maze!p == Open) [(row-1,col), (row,col-1), (row,col+1), (row+1,col)]
main = do
cs <- getContents
let (l,m) = break (== '\n') cs
[row,col] = words l
maze = listArray ((1,1),(read row,read col)) . map (\c -> if c == '.' then Open else Blocked) . filter (/= '\n') $ m
print . solveMaze $ maze
>>102 % Prolog
文を入力し、その文の中の(_重複しない単語ならび,_語彙ならび,_単語出現頻度ならび),!.
形態素解析を利用して各単語の出現頻度を求める(_文,_単語出現頻度ならび) :-
形態素解析(文,_文,_語彙ならび),
各単語の出現頻度を求める(_語彙ならび,_単語出現頻度ならび),!.
各単語の出現頻度を求める(_語彙ならび,_単語出現頻度ならび) :-
重複しない単語ならびを得る(_語彙ならび,_重複しない単語ならび),
findall([_語彙,_出現頻度],単語の出現頻度を得る(_重複しない単語ならび,_語彙ならび,_語彙,_出現頻度)),_単語出現頻度ならび).
重複しない単語ならびを得る(_語彙ならび,_重複しない単語ならび) :-
setof(_語彙,member(_語彙,_語彙ならび),_重複しない単語ならび).
単語の出現頻度を得る(_重複しない単語ならび,_語彙ならび,_語彙,_出現頻度) :-
member(_語彙,_重複しない単語ならび),
count(member(_語彙,_語彙ならび),_出現頻度).
>>124 (
>>102 )
% Prolog 一行目にゴミが入ってしまった。
形態素解析を利用して各単語の出現頻度を求める(_文,_単語出現頻度ならび) :-
形態素解析(文,_文,_語彙ならび),
各単語の出現頻度を求める(_語彙ならび,_単語出現頻度ならび),!.
各単語の出現頻度を求める(_語彙ならび,_単語出現頻度ならび) :-
重複しない単語ならびを得る(_語彙ならび,_重複しない単語ならび),
findall([_語彙,_出現頻度],単語の出現頻度を得る(_重複しない単語ならび,_語彙ならび,_語彙,_出現頻度)),_単語出現頻度ならび).
重複しない単語ならびを得る(_語彙ならび,_重複しない単語ならび) :-
setof(_語彙,member(_語彙,_語彙ならび),_重複しない単語ならび).
単語の出現頻度を得る(_重複しない単語ならび,_語彙ならび,_語彙,_出現頻度) :-
member(_語彙,_重複しない単語ならび),
count(member(_語彙,_語彙ならび),_出現頻度).
>>125 (
>>102 ) 訂正
% Prolog 括弧閉じが一つ多いところがあった。
各単語の出現頻度を求める(_語彙ならび,_単語出現頻度ならび) :-
重複しない単語ならびを得る(_語彙ならび,_重複しない単語ならび),
findall([_語彙,_出現頻度],単語の出現頻度を得る(_重複しない単語ならび,_語彙ならび,_語彙,_出現頻度),_単語出現頻度ならび).
% Prolog 7、( 3回入力されるまで繰り返すと言って置きながら、Lの中に2個存在する場合に % 終了する定義は好ましくない) '1桁の整数の入力を、同じ数が3回入力されるまで繰り返す' :- '1桁の整数の入力'(N), '1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,[N]). '1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,L) :- count(member(N,L),3),!. '1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N,L) :- '1桁の整数の入力'(N2), '1桁の整数の入力を、同じ数が3回入力されるまで繰り返す'(N2,[N2|L]). '1桁の整数の入力'(_1桁の整数) :- get_integer(_1桁の整数), _1桁の整数 >= 0, _1桁の整数 < 10,!. '1桁の整数の入力'(_1桁の整数) :- '1桁の整数の入力'(_1桁の整数).
>>127 は
>>114 に対するコメントでした。それから課題は
>>100 Prolog 6、
仕様に存在しない文字は極力(組込述語等は除く)使わないようにしようということ。
文章のなかに内在しないロジックも。
>>100 % Prolog 5、
'10個の1桁の整数を入力し、その中から最も大きい3個を入力した順に表示' :-
'10個の1桁の整数を入力し'(L),
その中から最も大きい3個を(L,L_3),
入力した順に表示(L_3).
'10個の1桁の整数を入力し'(L) :-
findall([_整数,Nth],(for(1,Nth,10),'1桁の整数を入力'(_整数)),L).
その中から最も大きい3個を(L1,[A,B,C]) :-
sort(L1,L2),
reverse(L2,[A,B,C|_]),!.
入力した順に表示([[N_x,Nth_x],[N_y,Nth_y],[N_z,Nth_z]]) :-
sort([[Nth_x,N_x],[Nth_y,N_y],[Nth_z,N_z]],[[_,N1],[_,N2],[_,N3]]),
write_formatted('%t %t %t\n',[N1,N2,N3]).
'1桁の整数の入力'(_1桁の整数) :-
get_integer(_1桁の整数),
_1桁の整数 >= 0,
_1桁の整数 < 10,!.
'1桁の整数の入力'(_1桁の整数) :- '1桁の整数の入力'(_1桁の整数).
>>100 % Prolog 4、
'10個の1桁の整数を入力し、それらを大きい順に並べて表示' :-
'10個の1桁の整数を入力し'(_10個の1桁の整数ならび),
それらを大きい順に並べて(_10個の1桁の整数ならび,_大きい順に並べられた10個の1桁の整数ならび),
表示(_大きい順に並べられた10個の1桁の整数ならび).
'10個の1桁の整数を入力し'(_10個の1桁の整数ならび) :-
findall(_1桁の整数,(for(1,_,10),'1桁の整数を入力'(_1桁の整数)),_10個の1桁の整数ならび).
それらを大きい順に並べて(_整数ならび,_大きい順に並べた整数ならび) :-
sort(_整数ならび,_小さい順に並べた整数ならび),
reverse(_小さい順に並べた整数ならび,_大きい順に並べた整数ならび),!.
表示([]) :- !.
表示([_1桁の整数|R]) :- write_formatted('%t ',[_1桁の整数]),表示(R).
'1桁の整数の入力'(_1桁の整数) :-
get_integer(_1桁の整数),
_1桁の整数 >= 0,
_1桁の整数 < 10,!.
'1桁の整数の入力'(_1桁の整数) :- '1桁の整数の入力'(_1桁の整数).
>>105 -- Haskell
-- リストを Stack として使った
limport Data.Array (Array, listArray, bounds, inRange, (!))
import Data.Set (Set)
import qualified Data.Set as S
data Cell = Open | Blocked deriving Eq
solveMaze :: Array (Int,Int) Cell -> Maybe [(Int,Int)]
solveMaze maze = dfs S.empty $ [[start]]
where
(start,goal) = bounds $ maze
dfs :: Set (Int,Int) -> [[(Int,Int)]] -> Maybe [(Int,Int)]
dfs s [] = Nothing
dfs s (path@(pos:_):stk)
| pos == goal = Just (reverse path)
| S.member pos s = dfs s stk
| otherwise = dfs (S.insert pos s) $ map (:path) (around pos) ++ stk
around :: (Int,Int) -> [(Int,Int)]
around (row,col) = filter (\p -> inRange (bounds maze) p && maze!p == Open) [(row+1,col), (row,col+1), (row,col-1), (row-1,col)]
main = do
cs <- getContents
let (l,m) = break (== '\n') cs
[row,col] = words l
maze = listArray ((1,1),(read row,read col)) . map (\c -> if c == '.' then Open else Blocked) . filter (/= '\n') $ m
print . solveMaze $ maze
http://pc11.2ch.net/test/read.cgi/db/1252492296/745 # <社員テーブル>
# 社員番号,名前,ランク,部署コード
# -------------------------------
# 1,鈴木一郎,A,01
# 2,鈴木二郎,A,01
# 3,鈴木三郎,B,01
# 4,鈴木四郎,A,02
# 5,鈴木五郎,A,03
#
# ↑の社員テーブルから、
# 同じ部署にBランクの社員がいないレコードを
# 取得したいです。
#
# <結果>
# 社員番号,名前,ランク,部署コード
# -------------------------------
# 4,鈴木四郎,A,02
# 5,鈴木五郎,A,03
>>132 % Prolog
同じ部署にBランクの社員がいないレコード(_社員番号,_名前,_ランク,_部署コード) :-
findsetof([_社員番号,_名前,_部署],社員テーブル(_社員番号,_名前,'B',_部署),_除外対象鍵ならび),
社員テーブル(_社員番号,_名前,_ランク,_部署コード),
自身を除き同じ部署にBランクの社員のいないレコード(_除外対象鍵ならび,_社員番号,_名前,_ランク,_部署コード).
自身を除き同じ部署にBランクの社員のいないレコード(_除外対象鍵ならび,_社員番号,_名前,_ランク,_部署コード) :-
member([_社員番号2,_名前2,_部署コード],_除外対象鍵ならび),
\+((_社員番号=_社員番号2,_名前=_名前2)),
!,fail.
自身を除き同じ部署にBランクの社員のいないレコード(_除外対象鍵ならび,_社員番号,_名前,_ランク,_部署コード).
麻雀の手牌が入力として与えられたとき、「待ち」を出力するプログラムを書いてください。
- 字牌なし・萬子のみの想定、つまり、いわゆる「チンイツ」限定で結構です(プログラミングの本質的にはこの限定でまったく問題ないため)
- 1〜9の数字13個からなる文字列を受け取り、できている順子・刻子・アタマを()、待ちの部分を[]でくくって出力してください
- 面前かつ槓子は存在しない前提でOKです
- ()[]の出力順は自由ですが、順序だけが違うものは同一視してください(例:111222を刻子2つで構成するとき、(111)(222)が(222)(111)に入れ替わるだけのものは同一解答とします)
- 多面待ちのときも含めすべての待ちを出力してください
- 待ちがないときは何も出力しないでください
出力例
1112224588899 :
単純なケースです。45を軸にする両面の待ちなので、(111)(222)(888)(99)[45]になります。
1122335556799 :
“99”をアタマの両面か“55”“99”のシャボであるので、(123)(123)(555)(99)[67]、(123)(123)(55)(567)[99]、(123)(123)(99)(567)[55]が正解です。
1112223335559 :
待ちは“9”単騎ですが、(123)(123)(123)(555)[9]と(111)(222)(333)(555)[9]の2つあります。
1223344888999 :
1-4の“ノベタン”待ちですが、4をアタマにしての[23]待ちと、1単騎、4単騎で3個の答えになります。
1112345678999 :
「九蓮宝燈」という役です。1〜9すべてが待ちになっています。これに正しく答えが出るのであれば、プログラムはほぼ正しいでしょう。
ttp://www.itmedia.co.jp/enterprise/articles/1004/03/news002_2.html
>- 待ちがないときは何も出力しないでください 待ち牌が手牌の中に4枚既にあるときは?
>- 面前かつ槓子は存在しない前提でOKです 4枚あっても槓していないケースは?
>>104 問(1)
使用言語:J
f=:dyad define
a=.(1{x)*1{y
b=.+/x*|.y
b(+.%~,)a
)
1 2 f 3 4
5 4
9 20 f 31 4
41 5
>>104 問(2)
使用言語:J
f=:monad define
if. *./({.<+/@}.)(i.3)|."0 1 y do.
%:*/(+/@:-:-0&,)y
else.
smoutput 'not triangle'
end.
)
f 3 4 5
6
f 6 7 8
20.3332
f 9 10 20
not triangle
http://pc11.2ch.net/test/read.cgi/db/1252492296/751 #
# 年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが、
#
# 年月日 金額
# 20080402 200
# 20080404 200
# 20090401 100
# 20090401 500
# 20090404 300
#
# とあった場合、↓にしたいです
#
# 年月日 今年度合計 前年度合計
# 20090401 600 0
# 20090402 0 200
# 20090404 300 200
#
# 両年度金額が無い場合は表示無しで、年月日は8桁の数値型です。
# うるう年は考慮しなくて構いません。
>>140 % Prolog [1]
ヒストグラム(_サンプルならび) :-
最初に縦棒の限界数を決めよう(_サンプルならび,_限界数),
'次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび),
転置(_度数表示ならび,_転置した度数表示ならび),
ヒストグラム表示(_転置した度数表示ならび).
最初に縦棒の限界数を決めよう(_サンプルならび,_限界数) :-
findmax(U,count(member(U,_サンプルならび)),_限界数).
'次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび) :-
findall(_度数表示,
(for(0,N,9),count(member(N,_サンプルならび),_度数),
'空白要素が先に来るように反転した*ならびの生成'(_度数,1,_限界数,[],_度数表示))
, _度数表示ならび).
'空白要素が先に来るように反転した*ならびの生成'(_,N,_限界数,X,X) :- N > _限界数,!.
'空白要素が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :-
N > _度数,
N2 is N + 1,
'空白要素が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,[' '|Y],X).
'空白要素が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :-
N =< _度数,
N2 is N + 1,
'空白要素が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,['*'|Y],X).
ヒストグラム表示([]) :- !.
ヒストグラム表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),ヒストグラム表示(R).
>>139 % Prolog
年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが :-
初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび),
見出しです,
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(_重複しない年月日ならび).
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([]) :- !.
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([_年月日|R]) :-
_前年同日 is _年月日 - 10000,
ある年月日の金額合計(_年月日,_金額合計),
その前年同日の金額合計(_前年同日,_前年同日金額合計),
年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計),
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(R).
初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび) :-
findsetof(_年月日,テーブル(_年月日,_),_重複しない年月日ならび).
見出しです :-
write_formatted('%8s %10s %10s\n',[年月日,今年度合計,前年度合計]).
ある年月日の金額合計(_年月日,_金額合計) :- findsum(_金額,(テーブル(_年月日,_金額),_金額合計).
その前年同日の金額合計(_前年同日,_前年同日金額合計) :- findsum(_前年同日金額,(テーブル(_前年同日,_前年同日金額),_前年同日金額合計).
年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計) :-
write_formatted('%t %10.0f %10.0f\n',[_年月日,_今年度合計,_前年度合計]).
>>142 (
>>139 ) 訂正
% Prolog 引数表現に誤りがありました。それから述語の定義順も変えます。
年月日と金額を持ったテーブルがあります。前年度合計と今年度合計を出したいのですが :-
初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび),
見出しです,
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(_重複しない年月日ならび).
初めに重複しない年月日ならびを取り出します(_重複しない年月日ならび) :-
findsetof(_年月日,テーブル(_年月日,_),_重複しない年月日ならび).
見出しです :-
write_formatted('%8s %10s %10s\n',[年月日,今年度合計,前年度合計]).
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([]) :- !.
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します([_年月日|R]) :-
_前年同日 is _年月日 - 10000,
ある年月日の金額合計(_年月日,_今年度合計),
その前年同日の金額合計(_前年同日,_前年度合計),
年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計),
重複しない年月日ならびから順に年月日を取り出し今年度合計と前年度合計を計算して表示します(R).
ある年月日の金額合計(_年月日,_金額合計) :- findsum(_金額,(テーブル(_年月日,_金額),_金額合計).
その前年同日の金額合計(_前年同日,_前年同日金額合計) :- findsum(_前年同日金額,(テーブル(_前年同日,_前年同日金額),_前年同日金額合計).
年月日と今年度合計と前年度合計を表示します(_年月日,_今年度合計,_前年度合計) :-
write_formatted('%t %10.0f %10.0f\n',[_年月日,_今年度合計,_前年度合計]).
>>140 % Prolog [2] これは既出
http://nojiriko.asia/prolog/t266.html 1〜30までの整数の中のすべての素数を求める([1|L]) :-
素数生成(30,L).
素数生成(N,X) :-
findall(M,for(2,M,N),L),
エラトステネスの篩(L,X).
エラトステネスの篩([],[]) :- !.
エラトステネスの篩([A|R1],[A|R2]) :-
エラトステネスの篩(A,R1,L),
エラトステネスの篩(L,R2).
エラトステネスの篩(_,[],[]) :- !.
エラトステネスの篩(N,[A|R1],R2) :-
0 is A mod N,
エラトステネスの篩(N,R1,R2),!.
エラトステネスの篩(N,[A|R1],[A|R2]) :-
エラトステネスの篩(N,R1,R2).
>>140 % Prolog [3]
'二次方程式 ax2+bc+c=0の係数abcを入力し、解があるかどうかなどを判定し「実数解無し」・「実数解は一つ」・「実数解は2つ」のどちらかを出力する'(A,B,C,実数解は無し) :- B * B - 4 * A * C < 0,!.
'二次方程式 ax2+bc+c=0の係数abcを入力し、解があるかどうかなどを判定し「実数解無し」・「実数解は一つ」・「実数解は2つ」のどちらかを出力する'(A,B,C,実数解は一つ) :- (B * B - 4 * A * C = 0;B * B - 4 * A * C = 0.0),!.
'二次方程式 ax2+bc+c=0の係数abcを入力し、解があるかどうかなどを判定し「実数解無し」・「実数解は一つ」・「実数解は2つ」のどちらかを出力する'(A,B,C,実数解は2つ) :- B * B - 4 * A * C > 0,!.
>>140 [1]
使用言語:J
f=:monad define
a=.i.10
b=.(,.+/"1 a=/y)#'*'
(":,.a),.' ',.b
)
f ?20#10
0 **
1 ***
2 **
3 *
4 ****
5 *
6 ***
7
8 ***
9 *
>>140 [1]
使用言語:maxima
f(x):=(a:make_array(fixnum,10),
for v in x do a[v]:a[v]+1,
for i:0 thru 9 do printf(true,"~d ~a~%",i,smake(a[i],"*"))
);
(%i42) f([1,2,4,5,6,3,0,5,7,2,7,6,2,4,2,1,8,5,3,9]);
0 *
1 **
2 ****
3 **
4 **
5 ***
6 **
7 **
8 *
9 *
>>140 % Prolog [1] 横方向
ヒストグラム(_サンプルならび) :-
for(0,N,9),
'Nの度数を星表示アトムとして表現する'(_サンプルならび,N,_星表示アトム),
write_formatted('%t %t\n',[N,_星表示アトム]),
N=9.
'Nの度数を星表示アトムとして表現する'(_サンプルならび,N,_星表示アトム) :-
count(member(N,_サンプルならび),_度数),
length(L,_度数),
要素はすべて星である(L),
星ならびを星表示アトムに変換(L,_星表示アトム),!.
要素はすべて星である(L) :- all(L,'*').
星ならびを星表示アトムに変換(L,S) :- concat_atom(L,S).
>>140 [1]
使用言語:maxima
縦版
f=:monad define
a=.i.10
b=.(,.+/"1 a=/y)#'*'
|.|:(":,.a),.b
)
f ?20#10
**
** *
** * ***
**** *****
0123456789
>>140 [1]
使用言語:R
f <- function(x){
a <- array(0,10)
for(i in x)a[i+1] <- a[i+1]+1
for(i in 0:9)cat(i," ",rep("*",a[i+1]),sep="","\n")
}
> f(sample(0:9,20,T))
0 **
1 ***
2 **
3 *
4 **
5 ****
6 ****
7
8 *
9 *
>>151 % Prolog
'AさんのPOINTよりPOINTが高いレコードの数'(_レコード数) :-
'USER_POINT'('Aさん',AさんのPOINT),
count(('USER_POINT'(_,POINT),POINT > AさんのPOINT),_レコード数).
>>140 % Prolog [4]
'10人の学生の成績を配列に入力してから、平均成績と最高成績を求めて出力する' :-
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび),
平均成績と最高成績を求めて出力する(_学生の成績ならび).
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび) :-
get_split_line([',',' '],_学生の成績ならび).
平均成績と最高成績を求めて出力する(_学生の成績ならび) :-
相加平均(_学生の成績ならび,_平均成績),
max(_学生の成績ならび,_最高成績),
write_formatted('平均成績=%t,最高成績=%t\n',[_平均成績,_最高成績]).
>>140 [3]
使用言語:maxima
f(a,b,c):=printf(ture,"実数解は~[なし~;ひとつ~;ふたつ~]~%",signum(b^2-4*a*c)+2);
(%i71) f(1,2,3);
実数解はなし
(%o71) false
(%i72) f(1,2,1);
実数解はひとつ
(%o72) false
(%i73) f(2,3,1);
実数解はふたつ
(%o73) false
>>140 % Prolog [4]
'10人の学生の成績を配列に入力してから、平均成績と最高成績を求めて出力する' :-
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび),
平均成績と最高成績を求めて出力する(_学生の成績ならび).
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび) :-
get_split_line([',',' '],_学生の成績ならび).
平均成績と最高成績を求めて出力する(_学生の成績ならび) :-
相加平均(_学生の成績ならび,_平均成績),
max(_学生の成績ならび,_最高成績),
平均成績と最高成績を出力する(_平均成績,_最高成績).
平均成績と最高成績を出力する(_平均成績,_最高成績) :-
write_formatted('平均成績=%t,最高成績=%t\n',[_平均成績,_最高成績]).
>>140 % Prolog [4]
'10人の学生の成績を配列に入力してから、平均成績と最高成績を求めて出力する' :-
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび),
平均成績と最高成績を求めて(_学生の成績ならび,_平均成績,_最高成績),
平均成績と最高成績を出力する(_平均成績,_最高成績).
カンマまたはスペース区切りで学生の成績を一行で入力する(_学生の成績ならび) :-
get_split_line([',',' '],_学生の成績ならび).
平均成績と最高成績を求めて(_学生の成績ならび,_平均成績,_最高成績) :-
相加平均(_学生の成績ならび,_平均成績),
max(_学生の成績ならび,_最高成績).
平均成績と最高成績を出力する(_平均成績,_最高成績) :-
write_formatted('平均成績=%t,最高成績=%t\n',[_平均成績,_最高成績]).
% などもあり得る。最後の定義述語は単に"出力する"の方がいいのかも知れない。
>>140 [3]
使用言語:J
f=:monad def' ;''実数解は'';(>:*(*:1{y)-*/4,0 2{y){''なし'';''ふたつ'';''ひとつ'' '
f 1 2 3
実数解はなし
f 1 2 1
実数解はふたつ
f 2 3 1
実数解はひとつ
>>151 使用言語:J
NAME=:'A';'B';'C'
POINT=:50 60 70
f=:monad def '+/((NAME i.<y){POINT)<POINT'
f 'A'
2
f 'B'
1
f 'C'
0
# (b) プログラム中で行われる実数型のデータ同士の乗算・除算の回数をそれぞれ計測して,それ # らの回数と合計回数の3 つを表示すること. # 表示例: * : 26, / : 12, total: 38 # 乗算回数および除算回数の数値はプログラムの組み方に依存する.そのため,各自で作成 # したプログラムの実行結果において,上記の表示例と同じ数値が得られるとは限らないので # 注意すること. # # 問題1で作成したプログラムlinearEq1 を改造し,絶対値が最大の係数a[pivot][i] を # ピボットa[i][i] として選択して計算するプログラムlinearEq2 を作成せよ.ただし,問題1-1 # の(a),(b) の仕様に加えて,次の仕様(c) を満たすようにすること. # (c) ピボット交換が行われたとき,交換された行と交換後の係数行列を表示すること. # 表示例: (Input) # 1.00 2.00 3.00: 4.00 # 5.00 6.00 7.00: 8.00 # 1.00 3.00 4.00: 5.00 # Exchange row 1 with row 0 # 5.00 6.00 7.00: 8.00 # 1.00 2.00 3.00: 4.00 # 1.00 3.00 4.00: 5.00
#
>>163 の補足説明
# A, B, C, D
# 1, 1, 01, 20
# 1, 2, 02, 11
# 1, 3, 04, 22
# 1, 4, 04, 21
# 1, 6, 08, 12
# 1. 7, 04, 33
# 1, 8, 09, 12
# 2, 1, 04, 80
# 3, 1, 03, 01
# の場合、(1, 6)と(2, 1)を取得したいです。
http://pc11.2ch.net/test/read.cgi/db/1252492296/789 # [TABLE1]
#
# key1 key2 data
# ------------------------------------
# AAA 01 zzz
# AAA 02 yyy
# BBB 01 xxx
# BBB 03 www
# CCC 02 vvv
# DDD 03 uuu
#
#
#
# [TABLE2]
# key1 data
# ------------------------------------
# MMM 01&02
# NNN 01only
# OOO 02only
>>165 つづき
# このようなテーブルから、以下のデータを抽出したいです。
#
# key1 key2 data1 data2
# ---------------------------------------------
# AAA 01 zzz 01&02
# BBB 01 xxx 01only
# CCC 02 vvv 02only
#
# TABLE1のKEYはkey1とkey2です。
# このTABLE1から、各key1に対して一意にデータを抽出します。
# 抽出はkey2の値が01と02のもののみを対象とし、
# 01があれば01のデータを、なければ02のデータを引っ張ってきます(data1)。
#
# さらに、各key1におけるkey2の状況?をdata2として付加したいです。
# ここではTABLE2に格納されていることにしましたが、
# 条件文で単に文字列を設定するのでも構いません。
>>162 % Prolog
'例えば、都道府県名が保存してあるフィールドに温泉万歳北海道編 など、どこかに都道府県名が入っているかもしれない文字列を与え、その文字列に都道府県名が入っているかどうかを判断させる'(_文字列) :-
都道府県名(_都道府県名),
sub_atom(_文字列,_,_,_,_都道府県名).
>>163-
>>164 % Prolog 列数(引数の数)が確定しないと、Prologの述語の参照はできない。テーブル名は論理変数_テーブル、列数はNとして引数から与えることとする。
'A, B, C, D・・・列があり、全て文字型(レコードは数値のみ) 。A, Bがプライマリーキー、Cが"04", "08", "09"のいずれかの行の中で、Dの値が最小のレコードのA, Bの組み合わせのうち、Bの値が最小のレコードすべてのA, Bを求める'(_テーブル,N,A,B) :-
length(L,N),
L =.. [_テーブル,A,B,C,D|R],
findmin([D,B,A],(P,(C = '04';C = '08',C = '09')),[D,B,A]).
>>168 (>>163-
>>164 ) 訂正
% Prolog 肝心なところを間違えた
'A, B, C, D・・・列があり、全て文字型(レコードは数値のみ) 。A, Bがプライマリーキー、Cが"04", "08", "09"のいずれかの行の中で、Dの値が最小のレコードのA, Bの組み合わせのうち、Bの値が最小のレコードすべてのA, Bを求める'(_テーブル,N,A,B) :-
N2 is N + 1,
length(L,N2),
L =.. [_テーブル,A,B,C,D|R],
findmin([D,B,A],(P,(C = '04';C = '08',C = '09')),[D,B,A]).
>>169 (>>163-
>>164 )
% Prolog それ以前に大間違い、さらに訂正
'A, B, C, D・・・列があり、全て文字型(レコードは数値のみ) 。A, Bがプライマリーキー、Cが"04", "08", "09"のいずれかの行の中で、Dの値が最小のレコードのA, Bの組み合わせのうち、Bの値が最小のレコードすべてのA, Bを求める'(_テーブル,N,A,B) :-
length(L,N),
L =.. [A,B,C,D|R],
P =.. [_テーブル|L],
findmin([D,B,A],(P,(C = '04';C = '08',C = '09')),[D,B,A]).
>>170 (>>163-
>>164 ) ごめんなさいさらに訂正
% Prolog
'A, B, C, D・・・列があり、全て文字型(レコードは数値のみ) 。A, Bがプライマリーキー、Cが"04", "08", "09"のいずれかの行の中で、Dの値が最小のレコードのA, Bの組み合わせのうち、Bの値が最小のレコードすべてのA, Bを求める'(_テーブル,N,A,B) :-
length(L,N),
L = [A,B,C,D|R],
P =.. [_テーブル|L],
findmin([D,B,A],(P,(C = '04';C = '08',C = '09')),[D,B,A]).
>>168-
>>171 そもそもプライマリーキーの認識に誤りがあることがわかりました。
後で書き直すこととします。
>>163-
>>164 % Prolog 非常に際どいというか、危ないコードになりました。これではダメですね。
'A, B, C, D・・・列があり、全て文字型(レコードは数値のみ) 。A, Bがプライマリーキー、Cが"04", "08", "09"のいずれかの行の中で、Dの値が最小のレコードのA, Bの組み合わせのうち、Bの値が最小のレコードすべてのA, Bを求める'(_テーブル,N,A,B) :-
length(L,N),
L = [A,B,C,D|R],
P =.. [_テーブル|L],
findmin([D,B],(P,(C = '04';C = '08',C = '09')),[D,B]),
P,
(C = '04';C = '08',C = '09').
>>173 カットひとつ入れればいいんじゃないかな。
findmin([D,B],(P,(C = '04';C = '08',C = '09')),[D,B]),!,
P,
(C = '04';C = '08',C = '09').
>>174 いや、そういうことではなくて、
findmin/3の中で開放されるD,Bと最終的に束縛されるD,Bを使い分けてるでしょ。
そんなことが許されてよいものかと。それから最後の
(C='04';C='08',C='09'). はちょっと見たところ必要なさそうに見える。
必要あるのですが、本当に必要かどうか、どうして必要なのかを説明しなくては
ならないところです。
>>175 すみません。私のコードよくみたら...;C='08',C='09') の間が','になってますね。
これはもちろん';'の間違いです。
http://pc11.2ch.net/test/read.cgi/db/1252492296/796 # ID|value|日付 |etc
# 01|100 |2010/4/5|10
# 01|150 |2010/4/6|20
# 02|100 |2010/4/5|30
# 02|160 |2010/4/6|40
#
# 各ID、特定の日にち2010/4/6のvalueから1日前のvalueを引いた値をdiff列に出力
# ついでに2010/4/6のetcを出力
#
# ID|diff |日付 |etc
# 01|50 |2010/4/6|20
# 02|60 |2010/4/6|40
#
# お願いします!
# 使う必要のある文法?のヒントだけでも、教えていただければ有り難いです。
>>177 % Prolog
'各ID、特定の日にちのvalueから1日前のvalueを引いた値をdiff列に出力、ついでに特定の日にちのetcを出力'(ID,定の日にち) :-
前日・今日(_前日,_特定の日にち),
見出し出力,
'ID,value,日付,etc'(_ID,_value,_特定の日にち,_etc).
前日のvalue(_ID,_前日,_前日のvalue),
_diff is _value - _前日のvalue,
write_formatted('%t | %t | %t | %t\n',[_ID,_diff,_特定の日にち,_etc]),
fail.
'各ID、特定の日にちのvalueから1日前のvalueを引いた値をdiff列に出力、ついでに特定の日にちのetcを出力'(_).
見出し出力 :-
write('ID | diff | 日付 | etc\n').
前日のValue(_ID,_前日,_前日のvalue) :-
'ID,value,日付,etc'(_ID,_前日のvalue,_前日,_),!.
前日のValue(_,_,0).
% 前日・今日/2の定義は
http://nojiriko.asia/prolog/t815.html を参照してください。
>>178 (
>>177 )
% Prolog (3ヶ所。_前日のValue -> _前日のvalue,_定日の日にち -> _特定の日にち,etcを出力(_) -> etcを出力(_,_).
'各ID、特定の日にちのvalueから1日前のvalueを引いた値をdiff列に出力、ついでに特定の日にちのetcを出力'(ID,特定の日にち) :-
前日・今日(_前日,_特定の日にち),
見出し出力,
'ID,value,日付,etc'(_ID,_value,_特定の日にち,_etc).
前日のvalue(_ID,_前日,_前日のvalue),
_diff is _value - _前日のvalue,
write_formatted('%t | %t | %t | %t\n',[_ID,_diff,_特定の日にち,_etc]),
fail.
'各ID、特定の日にちのvalueから1日前のvalueを引いた値をdiff列に出力、ついでに特定の日にちのetcを出力'(_,_).
見出し出力 :-
write('ID | diff | 日付 | etc\n').
前日のvalue(_ID,_前日,_前日のvalue) :-
'ID,value,日付,etc'(_ID,_前日のvalue,_前日,_),!.
前日のvalue(_,_,0).
% 前日・今日/2の定義は
http://nojiriko.asia/prolog/t815.html を参照してください。
>>165-
>>166 % Prolog (その一)
'TABLE1から、各key1に対してkey2の値が01と02のもののみを対象とし、01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加してTABLE2に追加して出力' :-
findsetof(_key1,('TATLE1'(_key1,_key2,_data),key2の対象は01か02のみ(_key2)),L1),
見出し,
member(_key1,L1),
'01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加'(_key1,L2),
write_formatted('%t %t %t %t\n',L2),
fail.
'TABLE1から、各key1に対してkey2の値が01と02のもののみを対象とし、01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加してTABLE2に追加して出力'.
key2の対象は01か02のみ('01') :- !.
key2の対象は01か02のみ('02') :- !.
'01があれば01のデータを、なければ02のデータを抽出し各key1におけるkey2の状況をdata2として付加'(_key1,X) :-
findall([_key1,_key2,_data],'01があれば01のデータを、なければ02のデータを抽出し'(_key1,_key2,_data),L),
各key1におけるkey2の状況(L,X),
X = [_,_,_,TABLE2data],
assertz('TABLE2'(_key1,TABLE2data)),!.
'01があれば01のデータを、なければ02のデータを抽出し'(_key1,'01',_data) :-
'TABLE1'(_key1,'01',_data).
'01があれば01のデータを、なければ02のデータを抽出し'(_key1,'02',_data) :-
'TABLE1'(_key1,'02',_data).
>>165-
>>166 % Prolog (その二)
各key1におけるkey2の状況([[_key1,'01',_data]],[_key1,'01',_data,'01only']) :- !.
各key1におけるkey2の状況([[_key1,'02',_data]],[_key1,'02',_data,'02only']) :- !.
各key1におけるkey2の状況([[_key1,'01',_data],[_key1,'02',_]],[_key1,'01',_data,'01&02']) :- !.
各key1におけるkey2の状況([[_key1,'02',_],[_key1,'01',_data]],[_key1,'01',_data,'01&02']) :- !.
見出し :-
write('key1 key2 data1 data2 \n'-----------------------------------\n').
>>160 % Prolog (a)
連立一次方程式の解(_拡大係数行列,_解) :-
行列の表示('拡大係数行列\n',_拡大係数行列),
ガウス行列に変形(_拡大係数行列,_ガウス行列),
行列の表示('ガウス行列に変形\n',_ガウス行列),
連立一次方程式の解の判定(_ガウス行列,_解).
連立一次方程式の解の判定(_ガウス行列,解が無数にある) :-
行列の階数(_ガウス行列,_ガウス行列の階数),
length(_ガウス行列,_ガウス行列の行数),
_ガウス行列の階数 < _ガウス行列の行数,!.
連立一次方程式の解の判定(_ガウス行列,解なし) :-
member(L,_ガウス行列),
append(L0,[A],L),
\+(A=0),\+(A=0.0),
'すべての要素が0か0.0である'(L0),!.
連立一次方程式の解の判定(_ガウス行列,_解ならび) :-
既約ガウス行列に変形(_ガウス行列,_既約ガウス行列),
行列の表示('既約ガウス行列に変形\n',_既約ガウス行列),
findall(_解,(member(L,_既約ガウス行列),list(L,_解)),_解ならび).
'すべての要素が0か0.0である'([]) :- !.
'すべての要素が0か0.0である'([0|R]) :- 'すべての要素が0か0.0である'(R),!.
'すべての要素が0か0.0である'([0.0|R]) :- 'すべての要素が0か0.0である'(R),!.
% 行列述語は
http://nojiriko.asia/prolog/Gauss_goretsu_ni_henkei.html 参照
>>182 % Prolog 行列の表示/2は
行列の表示(_口上,_行列) :- write(_口上),write('\n['), 行列の表示(_行列).
行列の表示([]) :- write(']\n'),!.
行列の表示([L]) :- write_formatted(' %t]\n',[L]),!.
行列の表示([L|R]) :- write_formatted(' %t\n',[L]),行列の表示(R),!.
>>186 % Prolog
コンソール上で入力した文字によって、顔文字を出力をする :-
rawmode,
get_char(X),
入力文字から顔文字に変換して表示する(X),
norawmode.
入力された文字を顔文字に変換して表示する(X) :-
zが入力されたときのみ終了(X),!.
入力された文字を顔文字に変換して表示する(X) :-
顔文字変換(X,Y),
write_formatted('%t',[Y]),
fail.
zが入力されたときのみ終了(z).
顔文字変換(a,'(^_^)') :- !.
顔文字変換(b,'(T_T) '):- !.
顔文字変換(c,' (≧∇≦) ') :- !.
顔文字変換('A','(≧Δ≦).)'):- !.
顔文字変換(_,'(?_?)').
>>187 (
>>186 )
% Prolog repeat/0を落とした。
コンソール上で入力した文字によって、顔文字を出力をする :-
rawmode,
repeat,
get_char(X),
入力文字から顔文字に変換して表示する(X),
norawmode.
入力された文字を顔文字に変換して表示する(X) :-
zが入力されたときのみ終了(X),!.
入力された文字を顔文字に変換して表示する(X) :-
顔文字変換(X,Y),
write_formatted('%t',[Y]),
fail.
zが入力されたときのみ終了(z).
顔文字変換(a,'(^_^)') :- !.
顔文字変換(b,'(T_T) '):- !.
顔文字変換(c,' (≧∇≦) ') :- !.
顔文字変換('A','(≧Δ≦).)'):- !.
顔文字変換(_,'(?_?)').
http://pc12.2ch.net/test/read.cgi/tech/1269438098/184 # [1]C言語(初心者コース)
# [2] キーボードから5つの整数を読み込み、その任意の2つの異なる数の
# 組み合わせについて和と差と積と商と剰余を出力するプログラム
# [3] OS:Windows Vista コンパイラ:Visual Studio.NET 言語:C
# [4] 5/1迄
# [5] fgets,scanf,printf sprintf strlen strcpy strcat関数は使っても良い。
# それ以外は極力使用しないこと
# scanfで取得した整数が入力された整数を表す文字列と矛盾が無いことを
# チェックすること。
# 整数計算の際に桁溢れが発生していないかチェックすること。
# (特に除数が0であるかのチェック。剰余は除数の絶対値より小さい
# 0以上の整数とする。)
# main関数以外にユーザー関数を定義しないこと(main関数だけで
# 構成)が制約条件だそうです。
>>189 % Prolog
キーボードから5つの整数を読み込み、その任意の2つの異なる数の組み合わせについて和と差と積と商と剰余を出力する :-
キーボードから5つの整数を読み込み(_5つの整数ならび),
組合せ(_5つの整数ならび,2,[N1,N2]),
_和 is N1 + N2,
_差_1 is N1 - N2,
_差_2 is N2 - N1,
_積 is N1 * N2,
_商_1 is N1 // N2,
_商_2 is N2 // N1,
_剰余_1 is N1 mod N2,
_剰余_2 is N2 mod N1,
write_formatted('組合せ={%t,%t},和=%t,(差=%t;差=%t),積=%t,(商=%t,剰余=%t;商=%t,剰余=%t)\n',[N1,N2,_和,_差_1,_差_2,_積,_商_1,_商_2,_剰余_1,_剰余_2]).
キーボードから5つの整数を読み込み(_5つの整数ならび) :-
write('5つの整数をカンマまたはスペースで区切り一行で入力してください : '),
get_split_line([' ',','],_5つの整数ならび),
'5つの整数ならび'(_5つの整数ならび),!.
キーボードから5つの整数を読み込み(_5つの整数ならび) :-
write('5つの整数が得られませんでした。もう一度入力してください。\n'),
キーボードから5つの整数を読み込み(_5つの整数ならび).
'5つの整数ならび'([_1,_2,_3,_4,_5]) :- integer(_1),integer(_2),integer(_3),integer(_4),integer(_5).
% 組合せ/3の定義は
http://nojiriko.asia/prolog/t268.html を参照してください。
>>190 ゼロ除算のチェック等は入っていません。後で仕様に近いものを書きます。
>>134 F#(その1)
open System.Text.RegularExpressions
/// リストxsから要素xを取り除く
let remove x xs =
let rec remove' res = function
| [] -> None
| y::ys when y = x -> List.fold (fun z r -> r::z) ys res |> Some
| y::ys -> remove' (y::res) ys
remove' [] xs
/// リストxsからリストrsの全要素を取り除く
let removeAll rs xs = List.fold (fun xs' r -> Option.bind (remove r) xs') (Some(xs)) rs
/// 通常の4面子1雀頭の判定
let normal hand =
/// 雀頭候補と雀頭以外の部分の全パターンを取得
let allAtama hand =
hand |> Seq.distinct |> Seq.toList
|> List.choose (fun n -> removeAll [n; n] hand |> Option.map (fun h -> ([[n; n]], h)))
/// 雀頭以外の部分から面子の全パターンを取得
let rec chooseMentu mentus = function
| [] -> [List.sort mentus]
| h::_ as hand ->
[[h .. (h + 2)]; [h; h; h]] |> List.choose (fun m ->
removeAll m hand |> Option.map (fun hs -> chooseMentu (m::mentus) hs))
|> List.concat
// 雀頭候補ごとの全面子パターンを取得
hand |> allAtama |> List.map ((<||) chooseMentu) |> List.concat
>>134 F#(その2)
/// 七対子の判定
let niconico hand =
match Seq.countBy id hand |> Seq.toList with
| count when List.forall (snd >> (=) 2) count -> [List.map (fun (n, _) -> [n; n]) count]
| _ -> []
/// 完成形の全面子mentuから特定の牌nを取り除いた「待ち」の全パターンを取得
let chooseMachi n mentu =
mentu |> List.filter (fun m -> List.exists ((=) n) m) |> Seq.distinct
|> Seq.map (fun m -> (remove m mentu |> Option.get, remove n m |> Option.get))
|> Seq.toList
/// リストの表示
let print format = List.map string >> String.concat "" >> printf format
// 入力の判定
match System.Console.ReadLine() with
| s when Regex.IsMatch(s, @"^\d{13}$") |> not -> ()
| s ->
let hand = s |> Seq.map (string >> int) |> Seq.toList
let count = Seq.countBy id hand |> Seq.toList
if List.forall (snd >> (>=) 4) count then
// 1〜9の牌を加えて14枚の状態で面子の全パターンを求め、加えた牌を取り除いて待ちにする
[for n in 1 .. 9 do
if count |> List.tryFind (fst >> (=) n) |> Option.forall (snd >> (>) 4) then
let hand' = n::hand |> List.sort
yield normal hand' @ niconico hand' |> List.map (chooseMachi n) |> List.concat]
|> List.concat |> Seq.distinct
|> Seq.iter (fun (ms, mc) -> List.iter (print "(%s)") ms; print "[%s]\n" mc)
http://pc12.2ch.net/test/read.cgi/tech/1269438098/243 # [1] 授業単元: 3DGAME
# [2] 問題文:下記
# 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)
# 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。
# ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。
# ・ 氏名で昇順、降順に並び替えてファイルに出力する。
# ・ 点数で昇順、降順に並び替えてファイルに出力する。
# ・ 各項目について修正を行えるようにする。
# ・ 点数の平均を画面に出力する。
# ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。
#
# 【画面例】
# <メニュー>
# 1 学生番号で並び替え 2.氏名で並び替え
# 3.点数で並び替え 4.修正
# 5.平均の出力 6.クラス別で出力
# ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# メニュー番号=>
# 【データ】
# 学生番号 8桁
# 氏名 12桁
# カナ 12桁
# 点数 3桁(小数点第1まで)
# クラス 3桁
# 12000001, 田中太郎, タナカタロウ, 40.5, 003
http://pc11.2ch.net/test/read.cgi/db/1252492296/813 # <基本テーブル>
# ID | 材料1ID | 材料2ID | 材料3ID
# ----------------------------
# 1 | 123 | 234 | 123
# 2 | 234 | 123 | 589
#
# <材料テーブル>
# 材料ID | 材料名(文字列)
# ---------------------
# 123 | 123の名前
# 234 | 234の名前
# 589 | 589の名前
#
# <結果>
# ID | 材料1IDの材料名 | 材料2IDの材料名 | 材料2IDの材料名
# ----------------------------------------------------
# 1 | 123の名前 | 234の名前 | 123の名前
# 2 | 234の名前 | 123の名前 | 589の名前
#
# JOINを使ってみたんですけど、SELECTの所はどう書けばいいのでしょうか?
http://pc11.2ch.net/test/read.cgi/db/1252492296/817 # [テーブルA]
# ID, AGE, GROUP
# --- ---- -----
# 1 , 10, A
# 2 , 20, A
# 3 , 30, A
# 4 , 20, B
# 5 , 40, B
# 6 , 60, B
# 7 , 10, C
# 8 , 30, C
# 9 , 50, C
# 10 , 70, C
#
# ↑のテーブルから、
# 各GROUP毎にAGEで順位付けした結果を取得したいです。
>>197 の続きです
#
# <結果>
#
# ID, AGE, GROUP, RANK
# --- ---- ----- -----
# 1 , 10, A 1
# 2 , 20, A 2
# 3 , 30, A 3
# 4 , 20, B 1
# 5 , 40, B 2
# 6 , 60, B 3
# 7 , 10, C 1
# 8 , 30, C 2
# 9 , 50, C 3
# 10 , 70, C 4
#
#
# GROUP BYを使ってみたのですが、
# どうも見当違いのSQLになってしまって。。
199 :
デフォルトの名無しさん :2010/04/19(月) 08:38:58
>>195 % Prolog 前半のファイル入力。ここでは追加にした。最初の定義はオペレータ用の簡易入力。
_学生番号+_氏名+_カナ+_点数+_クラス :-
atom(_学生番号),
atom(_氏名),
atom(_カナ),
atom(_クラス),
float(_点数),
open(_出力ファイル,append,Output),
write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]),
close(Output),!.
_学生番号+_氏名+_カナ+_点数+_クラス :-
write('学生番号,氏名,カナ,クラスはアトムでなくてはなりません。必要ならシングルクォートで囲んで入力し直してください\nまた、点数は浮動小数点数であり小数点1位まで入力してください\n'),fail.
'学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)'(_出力ファイル) :-
open(_出力ファイル,append,Output),
'学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス),
write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]),
close(Output),!.
'学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス):-
write('ガイドに従って入力し改行してください\n学生番号 : '),get_line(_学生番号),
write('氏名 : '),get_line(_氏名),
write('カナ : '),get_line(_カナ),
write('点数(少数第一位まで) : '),get_line(_点数文字列),
atom_to_term(_点数文字列,_点数,_),
write('クラス(3桁) : '),get_line(クラス),!.
>>199 (
>>195 )
% Prolog 間違えた。最初の定義ではファイル名を引数から渡していなかった。
% 先に出力ファイル/1を定義しておいて、その後、
?- assertz(出力ファイル('foo.csv')).
_学生番号+_氏名+_カナ+_点数+_クラス :-
atom(_学生番号),
atom(_氏名),
atom(_カナ),
atom(_クラス),
float(_点数),
出力ファイル(_出力ファイル),
open(_出力ファイル,append,Output),
write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]),
close(Output),!.
_学生番号+_氏名+_カナ+_点数+_クラス :-
write('学生番号,氏名,カナ,クラスはアトムでなくてはなりません。必要ならシングルクォートで囲んで入力し直してください\nまた、点数は浮動小数点数であり小数点1位まで入力してください\n'),fail.
のようにファイル名を得なくてはなりません。
>>196 % Prolog
'各GROUP毎にAGEで順位付けした結果を取得'(_各GROUP毎にAGEで順位付けした結果ならび) :-
findsetof(Group,'テーブルA'(_,_,Group),L1),
'各GROUP毎にAGEで順位付けした結果を取得'(1,L1,_各GROUP毎にAGEで順位付けした結果ならび).
'各GROUP毎にAGEで順位付けした結果を取得'(_,[],[]) :- !.
'各GROUP毎にAGEで順位付けした結果を取得'(M,[Group|R1],X) :-
findall([Age,Group],'テーブルA'(_,Age,Group),L2),
整列(L2,L3),
順序づけ(M,M2,1,L3,L4),
'各GROUP毎にAGEで順位付けした結果を取得'(M2,R1,Y),
append(L4,Y,X).
順序づけ(M,M,_,[],[]) :- !.
順序づけ(M,MX,N,[[Age,Group]|R1],[M,Age,Group,N|R2]) :-
N2 is N + 1,
M2 is M + 1,
順序づけ(M2,MX,N2,R1,R2).
>>195 % Prolog 後半部分(その一) 同一ファイルに書き戻すため、ファイル名を引数に渡していかなくてはならない。
メニューに示された機能を選択して実行するパターン(_ファイル名) :-
get_split_lines(_ファイル名,[','],L),
メニューに示された機能を実行する(_ファイル名,L).
メニューに示された機能を実行する(_ファイル名,L) :-
メニュー画面,
write('メニュー番号=> '),
get_integer(N),
機能選択(_ファイル名,N,L,_診断),
診断(_診断),!.
メニューに示された機能を実行する(_ファイル名,L) :- メニューに示された機能を実行する(_ファイル名,L).
機能選択(0,_,_,終了) :- !.
機能選択(1,_ファイル名,L,_診断) :- 学生番号で並び替え(_ファイル名,L,_診断).
機能選択(2,_ファイル名,L,_診断) :- 氏名で並び替え(_ファイル名,L,_診断).
機能選択(3,_ファイル名,L,_診断) :- 点数で並び替え(_ファイル名,L,_診断).
機能選択(4,_ファイル名,L,_診断) :- 修正(_ファイル名,L,_診断).
機能選択(5,_,L,_診断) :- 平均の出力(L,_診断),
機能選択(6,_,L,_診断) :- クラス別で出力(L,_診断).
診断(終了) :- !.
メニュー画面 :-
write('1 学生番号で並び替え 2.氏名で並び替え \n'),
write('3.点数で並び替え 4.修正 \n'),
write('5.平均の出力 6.クラス別で出力 \n'),
write('ーーーーーーーーーーーーーーーー\n').
>>203 % Prolog 友人に解答を依頼したところ掲載してよいからとメールがきました。
% AZ-Prologの並列機能を使っています。
% (その一)
/*
qsort.pl
qsort を2プロセス並列で解を求める
| ?- mlt_quick_sort([5,4,1,8,4,0,9],Ans).
A = [0,1,4,4,5,8,9]
yes
軽い説明:
mlt_send(Prc,[[Goal,ReturnValue],[Goal2,ReturnValue2]...]) Procの個数分ゴールと戻し値を設定する
mlt_receive(Proc,[ReturnValue,ReturnValue2....]) mlt_sendで起動した順、設定された戻し値がユニファイされ
る
*/
>>204 (
>>203 )
% Prolog (その二)
mlt_quick_sort([A|L],Ans):-
mlt_proc(2,prolog_c,'',consult('qsort.pl'),Proc), % 2つの子プロセスを立ち上げる
partition(A,L,Ls,Lb), % 元データを2つに分割する
mlt_send(Proc, [[qsort(Ls,X),X],[qsort(Lb,Y),Y]]), % 2つのリストを2つのプロセスで並列ソート
mlt_receive(Proc,[ Ans-[A|Else], Else-[] ]), % 結果を起動順に受け取る(上のサブゴールの X,Y )
mlt_kill(Proc). % 子プロセスを削除する
%%%%% Quick Sort %%%%%
quick_sort(List,Ans):-qsort(List,Ans-[]).
qsort([X|L],Ans-Tail):-
!,partition(X,L,Lsmall,Lbig), qsort(Lsmall,Ans-[X|Else]), qsort(Lbig,Else-Tail).
qsort([],L-L).
partition(X,[A|L],Ls,[A|Lb]):-X@<A,!,partition(X,L,Ls,Lb).
partition(X,[A|L],[A|Ls],Lb):-!,partition(X,L,Ls,Lb).
partition(_,[],[],[]).
http://pc11.2ch.net/test/read.cgi/db/1252492296/823 # mysql 5.1.38
#
# table inputdaka
# code int
# inputdate date
# data1 int
# data2 int
#
# 指定された日(その日が存在しなければ直前の日付)及びその前日の
# データを得る
#
# select inputdate,data1,data2
# from inputdaka
# where code= 9999
# and
# inputdate <= '2010-04-10'
# order by inputdate desc limit 2;
#
# mysqlで、こう書きましたが、limitが使えないRDBでは
# どうなるんですか?
>>206 % Prolog
'指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :-
inputdaka(_code,_指定された日,_data1,_data2),
_inputdate = _指定された日,!.
'指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :-
前日(_指定された日,_前日),
inputdaka(_code,_前日,_data1,_data2),
_inputdate = _前日,!.
'指定された日(その日が存在しなければ直前の日付)及びその前日のデータを得る'(_指定された日,_code,_inputdate,_data1,_data2) :-
前日(_指定された日,_前日),
前日(_前日,_前々日),
inputdaka(_code,_前々日,_data1,_data2),
_inputdate = _前々日,!.
>>191 >>190 (
>>189 )
% Prolog IF/Prologのexecption_handler/3の使い方を示します。
加算(A,B,C,_診断) :- exception_handler(C is A + B,error(E,I),true),
診断(I,_診断).
減算(A,B,C,_診断) :-
exception_handler(C is A - B,error(E,I),true),
診断(I,_診断).
乗算(A,B,C,_診断) :-
exception_handler(C is B - A,error(E,I),true),
診断(I,_診断).
除算(A,B,C,_診断) :-
exception_handler(C is A // B,error(E,I),true),
診断(I,_診断).
剰余算(A,B,C,_診断) :-
exception_handler(C is A mod B,error(E,I),true),
診断(I,_診断).
診断(I,正常終了) :- var(I),!.
診断(I,整数オーバーフロー) :-
I = _ :: [_,_,goal = (system : exception_handler(_,error(_ :: evaluation_error(int_overflow),_),_) @ user)].
診断(I,ゼロ除算エラー) :-
I = _ :: [_,_,goal = (system : exception_handler(_,error(_ :: evaluation_error(zero_divisor),_),_) @ u
ser)].
>>208 (
>>189 )
% Prolog 書き直し
% Prolog IF/Prologのexecption_handler/3の使い方を示します。
加算(A,B,C,_診断) :- exception_handler(C is A + B,error(E,I),true),診断(I,_診断).
減算(A,B,C,_診断) :- exception_handler(C is A - B,error(E,I),true),診断(I,_診断).
乗算(A,B,C,_診断) :- exception_handler(C is B - A,error(E,I),true),診断(I,_診断).
除算(A,B,C,_診断) :- exception_handler(C is A // B,error(E,I),true),診断(I,_診断).
剰余算(A,B,C,_診断) :- exception_handler(C is A mod B,error(E,I),true),診断(I,_診断).
診断(I,正常終了) :- var(I),!.
診断(I,整数オーバーフロー) :-
I = _ :: [_,_,goal = (system : exception_handler(_,error(_ :: evaluation_error(int_overflow),_),_) @ user)].
診断(I,ゼロ除算エラー) :-
I = _ :: [_,_,goal = (system : exception_handler(_,error(_ :: evaluation_error(zero_divisor),_),_) @ user)].
診断(I,I).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/274 # [1]授業単元: プログラミング
# [2] 問題文:
# unixのソケット通信を使ったTCP/IPの通信型プログラムで、まず認証の方法として
# ユーザー名とパスワードを打ち込みサーバー側が認証され、その後サーバー側からは
# クイズを出題する状態になっていて5問正解した場合(正解数はサーバー、クライアント
# 両方保持した状態)、暗証のメッセージを送信するということになっていて、
# その場合のクライアント側のプログラムを作成せよ(書き方がおかしかったら
# すいません)
>>212 % Prolog 深淵なるルール/2は未定義です。
文字列をひっくり返す関数下さい (_in,_out) :-
勘違い(_,_),
atom_chars(_in,_文字ならび),
reverse(_文字ならび,反転した文字ならび),
atom_chars(_out,_反転した文字ならび).
文字列をひっくり返す関数下さい (_in,_out) :-
深淵なるルール(_in,_out).
勘違い(おえうあい,おえういあ).
>>213 (
>>212 )
% Prolog 副目標 勘違い/2の引数は具体的であるべきでした。
文字列をひっくり返す関数下さい (_in,_out) :-
勘違い(あいうえお,おえうあい),
atom_chars(_in,_文字ならび),
reverse(_文字ならび,反転した文字ならび),
atom_chars(_out,_反転した文字ならび).
文字列をひっくり返す関数下さい (_in,_out) :-
深淵なるルール(_in,_out).
勘違い(おえうあい,おえういあ).
>>214 (
>>212 )
% Prolog もう一箇所訂正(恐縮)
文字列をひっくり返す関数下さい (_in,_out) :-
勘違い(あいうえお,おえうあい),
atom_chars(_in,_文字ならび),
reverse(_文字ならび,_反転した文字ならび),
atom_chars(_out,_反転した文字ならび).
文字列をひっくり返す関数下さい (_in,_out) :-
深淵なるルール(_in,_out).
勘違い(おえうあい,おえういあ).
>>210 % Prolog
'整数の入った配列中の、各整数の個数を出力せよ。 \n例えば、P[4]={1, 2, 3, 1} ならば出力は\n0 0 \n1 2 \n2 1
\n3 1 \n4 0 \nとなる。配列の要素数までの各整数の個数を出力すれば良い。 ' (_数値ならび) :-
要素数を数える(_数値ならび,_数値ならびの要素数),
for(0,N,_数値ならびの要素数),
count(member(N,_数値ならび),_度数),
write_formatted('%t %t\n',[N,_度数]),
N = _数値ならびの要素数.
>>211 % Prolog (その一)
'unixのソケット通信を使ったTCP/IP通信に於けるサーバー認証のクライアント側動作'(Server,Port,Socket,Input,Outp
ut) :-
サーバーとの通信を確立し(Server,Port,Socket,Input,Output),
最初にユーザー名とパスワードを打ち込み(Input,Output),
後にサーバーからの五問の質問に答える(1,Input,Output),
サーバーからの認証通知を得る(Input),!.
サーバーとの通信を確立し(Socket,Input,Output) :-
socket(internet, stream, Socket),
socket_connect(Socket, Host : Port).
open(Socket, read, Input),
open(Socket, write, Output),!.
ユーザー名とパスワードを打ち込み(Input,Output) :-
get_line(Input,'Username: '),
ユーザ名の取得(_ユーザ名),
ユーザ名の送信(Output,_ユーザ名),
get_line(Input,'Password: '),
パスワードの取得(_パスワード),
パスワードの送信(Output,_パスワード),!.
後にサーバーからの五問の質問に答える(N,Input,Output) :- N > 5,!.
後にサーバーからの五問の質問に答える(N,Input,Output) :-
サーバーからの質問を取得(Input,_質問),
質問文の表示(_質問),write_formatted('%t',[_質問]),
回答を得る(_回答),get_line(_回答),
回答の送信(Output,_回答),write_formatted(Output,'%t\n',[_回答]),
N2 is N + 1,
サーバーからの質問に答える(N2,Input,Output),!.
>>211 % Prolog (その二)
ーザ名の取得(_ユーザ名) :-
get_char(C),
ユーザ名文字ならびの取得(C,L),
atom_chars(_ユーザ名,L),!.
ユーザ名文字ならびの取得('\n',[]) :- !.
ユーザ名文字ならびの取得(A,[A|R]) :-
get_char(B),
ユーザ名文字ならびの取得(B,R).
ユーザ名の送信(Output,_ユーザ名) :-
write(Output,_ユーザ名),!.
パスワードの取得(_ユーザ名) :-
rawmode,
get_char(C),
パスワード文字ならびの取得(C,L),
atom_chars(パスワード,L),norawmode,!.
パスワード文字ならびの取得('\n',[]) :- !.
パスワード文字ならびの取得(A,[A|R]) :-
get_char(B),
put_char('*'),
パスワード文字ならびの取得(B,R).
パスワードの送信(Output,_パスワード) :-
write(Output,_パスワード),!.
>>211 % Prolog (その三)
サーバーからの認証通知を得る(Input) :-
get_line(Input,X),
認証完了(X).
認証完了(X) :-
サーバー接続完了通知文字(X),!.
認証完了(X) :-
write_formatted('認証を拒否されました:%t\n',[X]).
サーバー接続完了通知文字('OK').
質問文の表示(_質問) :-
write_formatted('%t',[_質問]),!.
回答を得る(_回答) :-
get_line(_回答),!.
回答の送信(Output,_回答) :-
write_formatted(Output,'%t\n',[_回答]),!.
>>217 (
>>211 )
% Prolog (その一) ここだけ訂正。ゴミが入っていた。
'unixのソケット通信を使ったTCP/IP通信に於けるサーバー認証のクライアント側動作'(Server,Port,Socket,Input,Outp
ut) :-
サーバーとの通信を確立し(Server,Port,Socket,Input,Output),
最初にユーザー名とパスワードを打ち込み(Input,Output),
後にサーバーからの五問の質問に答える(1,Input,Output),
サーバーからの認証通知を得る(Input),!.
サーバーとの通信を確立し(Socket,Input,Output) :-
socket(internet, stream, Socket),
socket_connect(Socket, Host : Port).
open(Socket, read, Input),
open(Socket, write, Output),!.
ユーザー名とパスワードを打ち込み(Input,Output) :-
get_line(Input,'Username: '),
ユーザ名の取得(_ユーザ名),
ユーザ名の送信(Output,_ユーザ名),
get_line(Input,'Password: '),
パスワードの取得(_パスワード),
パスワードの送信(Output,_パスワード),!.
後にサーバーからの五問の質問に答える(N,Input,Output) :- N > 5,!.
後にサーバーからの五問の質問に答える(N,Input,Output) :-
サーバーからの質問を取得(Input,_質問),
質問文の表示(_質問),
回答を得る(_回答),
回答の送信(Output,_回答),
N2 is N + 1,
サーバーからの質問に答える(N2,Input,Output),!.
>>220 % Prolog さらに間違い発見
後にサーバーからの五問の質問に答える(N,Input,Output) :- N > 5,!.
後にサーバーからの五問の質問に答える(N,Input,Output) :-
サーバーからの質問を取得(Input,_質問),
質問文の表示(_質問),
回答を得る(_回答),
回答の送信(Output,_回答),
N2 is N + 1,
後にサーバーからの五問の質問に答える(N2,Input,Output),!.
>>215 さらに訂正w
% Prolog 引数部分をまちがえた
文字列をひっくり返す関数下さい (_in,_out) :-
勘違い(おえうあい,おえういあ),
atom_chars(_in,_文字ならび),
reverse(_文字ならび,_反転した文字ならび),
atom_chars(_out,_反転した文字ならび).
文字列をひっくり返す関数下さい (_in,_out) :-
深淵なるルール(_in,_out).
勘違い(おえうあい,おえういあ).
そもそも 深淵なるルール -> 深遠なるルール でなくてはいけなっかたか。
>>212 % Prolog
深淵なるルール(_in,_out) :- 深遠なるルール(_in,_out).
深遠なるルール(_in,_out) :-
atom_chars(_in,Chars),
第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2),
atom_chars(_out,Chars2).
深遠なるルール(_in,_out) :-
atom_chars(_in,_文字ならび),
一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび),
atom_chars(_out,_一旦反転して最終二要素を置換した文字ならび).
深遠なるルール(_in,_out) :-
atom_chars(_in,_文字ならび),
文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび),
atom_chars(_out,_置換された文字ならび).
第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :-
length(L,2),
append(L,R,Chars),
reverse(R,R2),
append(R2,L,Chars2).
一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :-
reverse(_文字ならび,_反転した文字ならび),
append(L,[A,B],_反転した文字ならび),
append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび).
>>212 % Prolog (つづき)
文字置換ルールに従って文字を置換する([],[]) :- !.
文字置換ルールに従って文字を置換する([A|R1],[B|R2]) :-
文字置換ルール(A,B),
文字置換ルールに従って文字を置換する(R1,R2).
文字置換ルール(あ,お).
文字置換ルール(い,え).
文字置換ルール(う,う).
文字置換ルール(え,あ).
文字置換ルール(お,い).
>>226 % Prolog
txtファイルをfscanfで読み込んで、取得資格文字列に1が1つでも含まれる行を出力する(_txtファイル) :-
txtファイルをfscanfで読み込んで(_txtファイル,L),
取得資格文字列に1が1つでも含まれる行を出力する(L).
txtファイルをfscanfで読み込んで(_txtファイル,L) :-
get_split_lines(_txtファイル,[' '],L).
取得資格文字列に1が1つでも含まれる行を出力する([]) :- !.
取得資格文字列に1が1つでも含まれる行を出力する([[_番号,_名前,_取得資格文字列]|R]) :-
split(_取得資格文字列,[','],_取得資格指標ならび),
'1が1つでも含まれる'(_取得資格指標ならび),
取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,' ',_取得資格表示文字列),
write_formatted('%t %t %t\n',[_番号,_名前,_取得資格表示文字列]),
取得資格文字列に1が1つでも含まれる行を出力する(R),!.
取得資格文字列に1が1つでも含まれる行を出力する([_|R]) :-
取得資格文字列に1が1つでも含まれる行を出力する(R),!.
'1が1つでも含まれる'(L) :- member(1,L),!.
取得資格文字列の出力は一文字づつ間にスペースを空ける(_取得資格指標ならび,_取得資格表示文字列) :-
concat_atom(_取得資格指標ならび,' ',_取得資格表示文字列).
>>100 問(3)
使用言語:J
f=:(4 3{])3 4}]
f 'javascript'
javsacript
f '123456789'
123546789
>>212 使用言語:J
深遠なるルールの方で。
f=:2&{.,~[:|.2&}.
f ucp'あいうえお'
おえうあい
[出所]NHK eテレ 140kgの塩を、天秤を3回使って50kgと90kgに分けなさい。 天秤のおもりは、7kgと2kgがそれぞれ1個ずつ有る。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/312 # [1] 授業単元: Introduction to C++
# [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい
# (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます)
# Write a program that asks user to enter a size, N. (The maximum is 100000). Write a
# function that generates random numbers in range of 1 ~ 100 and fill an array of size N.
# You also need to count how many 1’s, 2’s, 3’s,
# 4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to
# each number should be equal. But they might be slightly off.
>>231 % Prolog
'ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする' :-
'ユーザーにサイズN(最大で100000)を入力させ'(N),
そのサイズのArray(L,N),
'1〜100までのランダムな数字で埋めた後'(L),
'N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする'(L).
'ユーザーにサイズN(最大で100000)を入力させ'(N) :-
催促付き整数入力('サイズN(最大で100000)を入力してください :',N),!.
'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'([]) :- !.
'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'([M|R]) :-
M is (random mod 100) + 1,
'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'(R).
'N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする'(L) :-
for(1,N,100),
count(member(N,L),Count),
write_formatted('%tの度数=%t\n',[Count]),
N=100.
>>232 (
>>231 )
% Prolog 訂正(引数がひとつ落ちていた)
'N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする'(L) :-
for(1,N,100),
count(member(N,L),Count),
write_formatted('%tの度数=%t\n',[N,Count]), /* ここですね */
N=100.
>>232 (
>>231 )
%Prolog 定義がひとつ抜けてた。PrologなのでArrayはリストに置き換える。
そのサイズのArray(L,N) :- length(L,N).
>>235 % Prolog
ライン([A,B,C,2],[2,E,F,G],[G,H,B,1],[1,C,E,3]).
'空いている○の中に4~12の数字を入れ、5つある線上の合計が等しくなるようにした場合、あまる数字は何と何か?なお
、同じ数字は使えません。'(_あまる数字ならび) :-
ライン(L1,L2,L3,L4),
flat([L1,L2,L3,L4],L),
未知数はいくつあるか(L,[],_重複しない変数ならび,_未知数の数),
findall(M,for(4,M,12),_候補数値ならび),
順列(_候補数値ならび,_未知数の数,_重複しない変数ならび),
加算(L1,X),加算(L2,X),加算(L3,X),加算(L4,X),
差集合(_候補数値ならび,VL,_あまる数字ならび).
未知数はいくつあるか([],L,L,N) :- length(L,N),!.
未知数はいくつあるか([V|R],L,VL,X) :-
var(V),
\+memberV(V,L),
未知数はいくつあるか(R,[V|L],VL,X),!.
未知数はいくつあるか([V|R],L,VL,X) :-
var(V),
memberV(V,L),
未知数はいくつあるか(R,L,VL,X),!.
未知数はいくつあるか([_|R],L,VL,X) :-
未知数はいくつあるか(R,L,VL,X),!.
memberV(V1,[V2|R]) :- V1==V2,!.
memberV(V,[_|R]) :- memberV(V,R).
>>231 使用言語:J
f=:monad def '(~.,.+/"1@=)/:~>:?y#100'
f 1000000
1 9947
2 9919
3 10051
4 10165
5 10127
:
:
96 9985
97 9715
98 9942
99 10171
100 10031
http://pc12.2ch.net/test/read.cgi/tech/1268699491/539 # perlの文字列置換でお知恵をお借りしたいです。
# ターゲット→@log
# 置き換え対象→[ ]で囲まれた文字列 [Feel1]〜[Feel13]までの14個
# 置き換える文字列→<img src="$html_url2/Feel$num.gif" onclick="document.getElementById('talk2').value='[Feel$num]'">
# Feelに続く数字を変数$numを使って置換処理をループしたいんですけどどうもうまくいかず・・・
http://pc12.2ch.net/test/read.cgi/tech/1269438098/326 # [1] 授業単元:プログラミング(画像処理)
# [2] 問題文:
ttp://www1.axfc.net/uploader/He/so/274810 # pass:1
# 100KB以上になってしまったので斧に上げました。
#
[問題2]
大きさがM×Nの画像をfと呼び、任意の座標(α,β)を基準として画像fを4つの短形領域S(0,0)〜S(1,1)に分割します。
S(0,0) 左上隅の座標が(0,0)で、右下の座標が(α,β)である。
S(0,1) 左上隅の座標が(0,β+1)で、右下の座標が(α,N-1)である。
S(1,0) 左上隅の座標が(α+1,0)で、右下の座標が(M-1,β)である。
S(1,1) 左上隅の座標が(α+1,β+1)で、右下の座標が(M-1,N-1)である。
分割が済んだら、S(1,1)が左上、S(1,0)が右上、S(0,1)が左下、S(0,0)が右下になる画像hを作成して下さい。
なお、任意の座標(α,β)を指定できるものとすること。
# [問題5] # ビットプレーン画像を作成する問題です。 # (1) R成分の0番目のビットプレーン画像を作成する。 # (2) 任意の色成分と任意のビットプレーン画像を作成する。 # (3) すべてのビットプレーン画像(合計24種類)を一度に作成する。 # # (1)(2)(3)の処理内容を選択できるように作成して下さい。 # # [問題1],[問題3],[問題4]は漢字のエンコードができませんでした。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/379 # [1] 授業単元: プログラム演習
# [2] 問題文(含コード&リンク):10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求めなさい。つまり、異なる2通りの数の組(a,b)と(c,d)があって、
# x = a^3 + b^3
# = c^3 + d^3
# とできる数xを表示するプログラムを実行しなさい。例えば、1027は
# 1027 = 3^3 + 10^3
# と表せますが、それ以外は表せません((3,10)と(10,3)は同じものと考える)。
>>243 使用言語:J
(I.4=+/"1=,a){~.,a=.+/~3^~>:i.<.3%:10000
1729 4104
>>243 % Prolog Jが何故あんなに短いのかわからんw
'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(L) :-
findall([A,B,C,D,X],'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(A,B,C,D,X),L1),
重複削除(L1,[],L).
'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(A,B,C,D,X) :-
findall([N,N3],(for(1,N,9999),N3 is N * N * N,N3 < 10000),L),
組合せ(L,2,[[A,A3],[B,B3]]),
X is A3 + B3,
X < 10000,
組合せ(L,2,[[C,C3],[D,D3]]),
\+(member(C,[A,B])),
\+(member(D,[A,B])),
X is C3 + D3.
重複削除([],L,L).
重複削除([[A,B,C,D,X]|R1],L2,L) :-
member([C,D,A,B,X],L2),
重複削除(R1,L2,L).
重複削除([[A,B,C,D,X]|R1],L2,L) :-
\+(member([C,D,A,B,X],L2)),
重複削除(R1,[[A,B,C,D,X]|L2],L).
>>240 確率は低くても最初の当てずっぽの答えが当たる可能性があり、
問題として成立していないと思うが。
最低何回の質問で、確実に正解できるでしょうか、という意味だろう。
>>245 % Prolog (その一)
現在時刻をアスキーアートで表示(_時:_分) :-
_時_1 is _時 // 10,
_時_2 is _時 mod 10,
_分_1 is _分 // 10,
_分_2 is _分 mod 10,
現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2).
現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2) :-
数字のアスキーアート(_時_1,L1),
数字のアスキーアート(_時_2,L2),
数字のアスキーアート(_分_1,L3),
数字のアスキーアート(_分_2,L4),
英記号のアスキーアート(';',L5),
L0 = [[0],[0],[0],[0],[0]],
同一行数の行列のappend(L1,L0,L2,LA),
同一行数の行列のappend(LA,L0,L5,LB),
同一行数の行列のappend(LB,L0,L3,LC),
同一行数の行列のappend(LC,L0,L4,LX),
アスキーアートで表示(LX).
アスキーアートで表示([]).
アスキーアートで表示([L|R]) :- concat_atom(L,S),write_formatted('%t\n',[S]),アスキーアートで表示(R).
>>249 (
>>245 )
% Prolog (その一) 間違えた
現在時刻をアスキーアートで表示(_時:_分) :-
_時_1 is _時 // 10,
_時_2 is _時 mod 10,
_分_1 is _分 // 10,
_分_2 is _分 mod 10,
現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2).
現在時刻をアスキーアートで表示(_時_1,_時_2,_分_1,_分2) :-
数字のアスキーアート(_時_1,L1),
数字のアスキーアート(_時_2,L2),
数字のアスキーアート(_分_1,L3),
数字のアスキーアート(_分_2,L4),
英記号のアスキーアート(';',L5),
L0 = [[○],[○],[○],[○],[○]],
同一行数の行列のappend(L1,L0,L2,LA),
同一行数の行列のappend(LA,L0,L5,LB),
同一行数の行列のappend(LB,L0,L3,LC),
同一行数の行列のappend(LC,L0,L4,LX),
アスキーアートで表示(LX).
アスキーアートで表示([]).
アスキーアートで表示([L|R]) :- concat_atom(L,S),write_formatted('%t\n',[S]),アスキーアートで表示(R).
>>245 % Prolog (その二)
'同一行数の行列のappend'([],[],[],[]).
'同一行数の行列のappend'([L1|R1],[L2|R2],[L3|R3],[L4|R4]) :-
append(L1,L2,L3,L4),
'同一行数の行列のappend'(R1,R2,R3,R4) .
数字のアスキーアート(0,[[○,●,○],[●,○,●],[●,○,●],[●,○,●],[○,●,○]]).
数字のアスキーアート(1,[[●,●,○],[○,●,○],[○,●,○],[○,●,○],[○,●,○]]).
数字のアスキーアート(2,[[●,●,●],[○,○,●],[●,●,●],[●,○,○],[●,●,●]]).
数字のアスキーアート(3,[[●,●,●],[○,○,●],[●,●,●],[○,○,●],[●,●,●]]).
数字のアスキーアート(4,[[○,○,●],[●,○,●],[●,●,●],[○,○,●],[○,○,●]]).
数字のアスキーアート(5,[[●,●,●],[●,○,○],[●,●,●],[○,○,●],[●,●,●]]).
数字のアスキーアート(6,[[○,●,●],[●,○,○],[●,●,●],[●,○,●],[●,●,●]]).
数字のアスキーアート(7,[[●,●,●],[●,○,●],[○,○,●],[○,●,○],[○,●,○]]).
数字のアスキーアート(8,[[○,●,○],[●,○,●],[○,●,○],[●,○,●],[○,●,○]]).
数記号のアスキーアート(':',[[○,○,○],[○,●,○],[○,○,○],[○,●,○],[○,○,○]]).
>>248 最善の戦略を示せ、くらいの意味でしょうね。
何故、質問回数を問う設定にしたのかはわからないけど。
>>253 % Prolog
'引数1に10進の1/10の位までの値(例えば45なら4.5という意味です)、引数2に目量数があったとして目量の数に四捨五入するプログラム'(M,N,X) :-
M >= 0,
N10 is N * 10,
MX is (M + (N10 // 2)) // N10,
X is (MX * N10) // 10.
'引数1に10進の1/10の位までの値(例えば45なら4.5という意味です)、引数2に目量数があったとして目量の数に四捨五入するプログラム'(M,N,X) :-
M < 0,
N10 is N * 10,
MX is (M - (N10 // 2)) // N10,
X is (MX * N10) // 10.
http://pc11.2ch.net/test/read.cgi/db/1252492296/839 # Table1
# |ID|Score|Div1|Div2|
# |1 |0.2 |1 |1 |
# |2 |0.3 |1 |2 |
# |3 |0.4 |1 |3 |
# |4 |0.2 |1 |4 |
# |5 |0.1 |2 |1 |
# |6 |0.3 |2 |3 |
#
# Table2
# |ID|Div1|
# |1 |1 |
# |1 |2 |
# |1 |3 |
# |2 |2 |
#
>>255 続き
# こういう構成で、約2000万行のTable1と約100万行のTable2について
# 1.Select Div1, Score From Table Where Div2 = 2 or Div2 = 4;
# 2.Select Div1, Score From Table Where Div2 = 5 or ... or Div2 = 9;
# :
# :
# N.・・・・;
# このようなN個のクエリを発行し、
# 得られる全ての結果から共通するDiv1の値を含む行のみを抽出、
# 得られた共通するDiv1の値を使ってTable2にjoinし、
# Table2のIDごとのScoreの合計値を取得したいのです。
# (Score値が複数回加算されるのは仕様です)
#
# 手続き的に処理をしているのですが、どうにも遅く
# 一回のSQLで素早く取得する方法はありませんでしょうか。
>>255 % Prolog 2000万件はオンメモリデータベースとしてのPrologにとっては
% 大き過ぎます。対象外の問題だと思います。部分的なアルゴリズムとしては、
'ルール1~N全てに解が存在するID'(_Div2,_ルールならび,X) :-
'ルール1~N全てに解が存在するID'(0,_Div2,_ルールならび,X).
'ルール1~N全てに解が存在するID'(N,_,[],X) :-
findall(_Div,'_Div1_temp(_Div,N),X).
'ルール1~N全てに解が存在するID'(N,_Div2,[_ルール|R],X) :-
'ルール1~N全てにとして存在するID'(N,_Div2,_ルール),
N2 is N + 1,
'ルール1~N全てに解が存在するID'(N2,_Div2,R,X).
'ルール1~N全てにとして存在するID'(0,_Div2,_ルール) :-
'Table1'(_ID,_Score,_Div1,_Div2),
call(_ルール),
\+('_Div1_temp'(_Div1,1)),
assertz('_Div1_temp'(_Div1,1)),
fail.
'ルール1~N全てに解として存在するID'(N,_Div2,_ルール) :-
N > 0,
'Table1'(_ID,_Score,_Div1,_Div2),
call(_ルール),
'_Div1_temp'(_Div1,N),
N2 is N + 1,
retract('_Div1_temp'(_Div1,N)),
assertz('_Div1_temp'(_Div1,N2)),
fail.
>>257 ミスタイプがありました。
'ルール1~N全てにとして存在するID'(0,_Div2,_ルール) :-
==>>
'ルール1~N全てに解として存在するID'(0,_Div2,_ルール) :-
「解」が抜けていました。
>>257 (
>>255 )
% Prolog 訂正です。 'ルール1~N全てに解が存在するID'/4 は
'ルール1~N全てに解が存在するID'(N,_,[],X) :-
findall(_Div1,'_Div1_temp(_Div1,N),X),
abolish('_Div1_temp'/2),!.
'ルール1~N全てに解が存在するID'(N,_Div2,[_ルール|R],X) :-
'ルール1~N全てにとして存在するID'(N,_Div2,_ルール).
'ルール1~N全てに解が存在するID'(N,_Div2,[_|R],X) :-
N2 is N + 1,
'ルール1~N全てに解が存在するID'(N2,_Div2,R,X).
>>260 % Prolog
'月〜土'([月曜,火曜,水曜,木曜,金曜,土曜]).
'月〜土までの時間割を多次元配列を用い作成する。その後出力をする。' :-
'月〜土'(_曜日ならび),
'月〜土までの時間割を多次元配列を用い作成する。'(_曜日ならび,_時間割),
'その後出力する。'(_曜日ならび,_時間割).
'月〜土までの時間割を多次元配列を用い作成する。'([],[]) :- !.
'月〜土までの時間割を多次元配列を用い作成する。'([_曜日|R1],[_曜日ごとの時間割|R2]) :-
write_formatted('%t日の時限数を入力してください : ',[_曜日]),get_integer(_時限数),
write_formatted('%t時限の教科名を順に入力してください\n'),
時限ごとの教科名の入力(1,_時限数,_曜日ごとの時間割),
'月〜土までの時間割を多次元配列を用い作成する。'(R1,R2).
時限ごとの教科名の入力(N,_時限数,[]) :- N > _時限数,!.
時限ごとの教科名の入力(N,_時限数,[_教科名|R]) :-
write_formatted('%t時限目 : ',[_教科名]),get_line(_教科名),
N2 is N + 1,
時限ごとの教科名の入力(N2,_時限数,R).
'その後出力する'([],[]) :- !.
'その後出力する'([_曜日|R1],[L|R2]) :-
length(L,_時限数),
concat_atom(L,',',_教科名ならび文字列),
write_formatted('%t日 : %t時間 %t\n',[_曜日,_時限数,_教科名ならび文字列]),
'その後出力する'(R1,R2).
>>262 % Prolog
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する' :-
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(1,0).
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果) :-
加算結果が300を超えたら表示して処理を終了する(_加算結果).
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果_1) :-
_加算結果_2 is N + _加算結果_1,
write_formatted('%t + %t = %t\n',[_加算結果_1,N,_加算結果_2]),
N2 is N + 1,
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N2,_加算結果_2).
加算結果が300を超えたら表示して処理を終了する(_加算結果) :-
_加算結果 > 300,
write_formatted('加算結果が%tとなり、300を越えました\n',[_加算結果]),!.
>>263 % Prolog !を入れる位置を間違えた。
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する' :-
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(1,0).
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果) :-
加算結果が300を超えたら表示して処理を終了する(_加算結果),!.
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果_1) :-
_加算結果_2 is N + _加算結果_1,
write_formatted('%t + %t = %t\n',[_加算結果_1,N,_加算結果_2]),
N2 is N + 1,
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N2,_加算結果_2).
加算結果が300を超えたら表示して処理を終了する(_加算結果) :-
_加算結果 > 300,
write_formatted('加算結果が%tとなり、300を越えました\n',[_加算結果]),!.
265 :
デフォルトの名無しさん :2010/04/29(木) 07:45:26
>>262 % Polog 引数を増やして、表示の仕方を改良
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する' :-
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(1,0,[]),!.
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果,_) :-
加算結果が300を超えたら表示して処理を終了する(_加算結果),!.
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N,_加算結果_1,L) :-
_加算結果_2 is N + _加算結果_1,
append(L,[N],L2),
concat_atom(L2,'+',S),
write_formatted('%t = %t\n',[S,_加算結果_2]),
N2 is N + 1,
'1+2+3・・・というように数値を加算して表示し、加算結果が300を超えたら表示して処理を終了する'(N2,_加算結果_2,L2).
加算結果が300を超えたら表示して処理を終了する(_加算結果) :-
_加算結果 > 300,
write_formatted('加算結果が%tとなり、300を越えました\n',[_加算結果]).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/416 # 数当てゲーム1 乱数当て
# プログラムで一つの整数乱数aを生成し、その値を当てさせる。
# 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。
#
# プログラムの例
# Srand (time(NULL));
# a=rand();
#
# プログラムの最初にRAND_MAXを出力したほうがわかりやすい
#
# --------------------------------------------------------------------------------
#
# 数当てゲーム2 0〜999の当て
# 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ
#
# ---------------------------------------------------------------------------------
#
# 数当てゲーム3 当て回数の制限
# さらに改善し、当てる回数に制限を付ける、例えば10回など
# 当てる度に残っている回数を表示する。回数に達するとプログラム終了
>>268 % Prolog
3つの実数の掛け算をもとめよ(_実数1,_実数2,_実数3,_実数解) :-
_実数解 is _実数1 * _実数2 * _実数3.
整数nの階乗n!をもとめよ(0,1).
整数nの階乗n!をもとめよ(1,1).
整数nの階乗n!をもとめよ(_整数n,_n!) :-
_整数nより1小さい数 is _整数n - 1,
整数nの階乗n!をもとめよ(_整数nより1小さい数,_(n−1)!),
_n! is _(n−1)! * _整数n.
'配列・実数・data[]の平均値を求めよ'(_実数のならび,_平均値) :-
相加平均(_実数のならび,_平均値).
'2つの実数 aとbの内容を入れ替えよ'(_a,_b,_b,_a).
'2つの実数 aとbの内容を入れ替えよ'(a,b) :-
retract(a(_a)),
retract(b(_b)),
assertz(a(_b)),
assertz(b(_a)).
相加平均([],N,S,M) :- M is S / N,!.
相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M).
相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M).
>>267 % Prolog
プログラム開始行はprogramからはじまることとする.
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(_プログラム) :-
get_lines(_プログラム,Lines),
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(Lines,[],Lines2),
put_lines(_プログラム,Lines2),!.
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],[],['%',A|R1]) :-
プログラム開始行はprogramからはじまることとする,
sub_atom(A,0,7,_,program),!.
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],[_|_],[A|R1]) :-
プログラム開始行はprogramからはじまることとする,
sub_atom(A,0,7,_,program),!.
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(['%'|R1],[],['%'|R2]) :-
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,[_],R2).
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(['%'|R1],[_],R2) :-
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,[_],R2).
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'([A|R1],U,[A|R2]) :-
\+(A='%'),
'プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラム'(R1,U,R2).
>>271 % Prolog 極度に読みにくいので構造だけ露にする。
プログラム開始行はprogramからはじまることとする.
u(_プログラム) :-
get_lines(_プログラム,Lines),
u(Lines,[],Lines2),
put_lines(_プログラム,Lines2),!.
u([A|R1],[],['%',A|R1]) :-
プログラム開始行はprogramからはじまることとする,
sub_atom(A,0,7,_,program),!.
u([A|R1],[_|_],[A|R1]) :-
プログラム開始行はprogramからはじまることとする,
sub_atom(A,0,7,_,program),!.
u(['%'|R1],[],['%'|R2]) :-
u(R1,[_],R2).
u(['%'|R1],[_],R2) :-
u(R1,[_],R2).
u([A|R1],U,[A|R2]) :-
\+(A='%'),
u(R1,U,R2).
>>269 % Prolog (その一)
:- op(250,xf,より大きい).
:- op(250,xf,より小さい).
履歴を持った数当てゲームサーバ :-
乱数を引き正解値を決める(_正解),
当てずっぽの数をひとつ得る(_当てずっぽの数),
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]).
履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!.
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント),
write_formatted('前に %tっていったでしょ!',[_既出のヒント]),
当てずっぽの数をひとつ得る(_次の当てずっぽの数),
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴).
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
\+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)),
_当てずっぽの数 < _正解,
write('もっと大きいよ\n'),
当てずっぽの数をひとつ得る(_次の当てずっぽの数),
履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]).
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
\+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)),
_当てずっぽの数 > _正解,
write('もっと小さいよ\n'),
当てずっぽの数をひとつ得る(_次の当てずっぽの数),
履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]).
>>269 % Prolog (その二)
乱数を引き正解値を決める(_正解) :- _正解 is random.
当てずっぽ数をひとつ得る(_当てずっぽ数) :-
repeat,
write('さあ、なににしますか? '),
get_integer(_当てずっぽ数),!.
すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :-
_当てずっぽの数 < _正解,
\+(_当てずっぽの数 > N),
findmax(M,member(M より大きい,[N より大きい|R]),Max),!.
すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :-
_当てずっぽの数 > _正解,
\+(_当てずっぽの数 < N),
findmin(M,member(M より小さい,[N より小さい|R]),Min),!.
すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :-
すでにヒントの中に含まれている(_当てずっぽの数,R,X).
>>269 % Prolog
乱数の範囲を0〜999に絞り込む(_絞り込まれた乱数値) :-
_絞り込まれた乱数値 is random mod 10000.
>>275 % Prolog ごめん。まちがえたw
乱数の範囲を0〜999に絞り込む(_絞り込まれた乱数値) :-
_絞り込まれた乱数値 is random mod 1000.
>>275 % Prolog 述語の構成がよくなかった。
乱数を引き正解値を決める(_正解値) :-
_乱数値 is random,
乱数の範囲を0〜999に絞り込む(_乱数値,_正解値).
乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :-
_絞り込まれた乱数値 is _乱数値 mod 1000.
% 0〜999という条件付けが 乱数を引き正解値を決める/1 の条件部に
% 入ってしまっていることは、好ましいことではない。
'乱数を引き正解値(0〜999)を決める'(_正解値) :-
_乱数値 is random,
乱数の範囲を0〜999に絞り込む(_乱数値,_正解値).
乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :-
_絞り込まれた乱数値 is _乱数値 mod 1000.
% という定義にするべきであろう。
http://pc11.2ch.net/test/read.cgi/db/1252492296/860 # ・DB2、バージョン9?
# ・受注データ
# ・検索範囲の期間指定をして、日別の受注件数を表示したい。
# ただし、受注がなかった場合にはその日は受注0件と表示しなければいけない。
# ・以下のような結果を得たい。
#
# 例
# 元となるテーブルが、
# 4/1 商品A
# 4/1 商品B
# 4/3 商品A
# 4/4 商品A
# 4/5 商品C
# (4/2の受注レコードはなし)
# で、
# 検索期間4/1-4/5という場合、
#
# 4/1 2件
# 4/2 0件
# 4/3 1件
# 4/4 1件
# 4/5 1件
# という結果を得たい。
>>280 % Prolog
検索範囲の期間指定をして、日別の受注件数を表示(_月/_日,_月/_日) :-
count(受注データ(_月/_日,_),_度数),
write_formatted('%t/%t %t件\n',[_月,_日,_件数]),!.
検索範囲の期間指定をして、日別の受注件数を表示(_月_1/_日_1,_月_2/_日_2) :-
前日・今日(2010/_月_1/_日_1,_/_月_3/_日_3),
count(受注データ(_月_1/_日_1,_),_度数),
write_formatted('%t/%t %t件\n',[_月_1,_日_1,_件数]),
検索範囲の期間指定をして、日別の受注件数を表示(_月_3/_日_3,_月_2/_日_2).
% 前日・今日/2 は
http://nojiriko.asia/prolog/t815.html 参照
>>281 (
>>280 )
% Prolog _度数というところを_件数に訂正します。
検索範囲の期間指定をして、日別の受注件数を表示(_月/_日,_月/_日) :-
count(受注データ(_月/_日,_),_件数),
write_formatted('%t/%t %t件\n',[_月,_日,_件数]),!.
検索範囲の期間指定をして、日別の受注件数を表示(_月_1/_日_1,_月_2/_日_2) :-
前日・今日(2010/_月_1/_日_1,_/_月_3/_日_3),
count(受注データ(_月_1/_日_1,_),_件数),
write_formatted('%t/%t %t件\n',[_月_1,_日_1,_件数]),
検索範囲の期間指定をして、日別の受注件数を表示(_月_3/_日_3,_月_2/_日_2).
>>283 % Prolog 定義述語名をシングルクォートで囲ってあるのは途中二ヶ所ピリオドが現れるから
'sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ' :-
get_split_lines('sample.txt',[' '],Ls),
findall([_身長|L1],(member(L1,Ls),list_nth(4,L1,_身長)),Ls2),
sort(Ls2,Ls3),
findall(L2,member([_|L2],Ls3),_整列されたLs),
put_lines('ans.txt',_整列されたLs).
>>285 問題出した当人が文句を付けるというのもおかしな話なのだけれども、
有給テーブル/勤務テーブルとは何だ?
これは個人の家計簿のようなものなんだろうか。個人の「管理システム」なんて
考えられないな。
# 有給テーブル
# 個人ID
# 取得日
# 日数
#
# 勤怠テーブル
# 個人ID
# 出勤時間
# 退社時間
# 勤怠区分
ではなかろうか。
>>285 は問題と解答の一部を組み合わせて新たな問題と
しているので、おかしなことになってしまったのかも知れない。
>>285 問題を作り直しました。まずは第一問。
http://pc11.2ch.net/test/read.cgi/db/1269585561/10 # ある会社では有給の最大取得可能日数を申請日の前年同日の翌日から申請日までに
# 取得した有給日数の合計としています。しかしこの有給日数は欠勤や遅刻、早退に
# よって減価します。この場合はマイナスの日数として入力されています。
# 一年以上前の取得有給日数は無効になるルールで有給の最大取得可能日数を示す
# プログラムを書きなさい。
#
# 有給テーブル
# 個人ID
# 取得日
# 日数
# 摘要
#
>>287 % Prolog
申請日の前年同日の翌日から申請日までに取得した有給日数の合計(_個人ID,_申請日,_有給の最大取得日数) :-
前年同日(_申請日,_前年同日),
findsum(_日数,( 有給テーブル(_個人ID,_取得日,_日数,_),_取得日 @> _前年同日,_取得日 @=< _申請日),
_有給の最大取得日数).
>>290 % Prolog (その一)
gcd_equal(A*F1,B*F2,GCD) :-
F1 >= F2,
最大公約数をユークリッドの互除法で求める(F1,F2,GCD),
U is (F1-F2) // GCD,
gcd_equal(1,U,A*F1,B*F2,GCD).
gcd_equal(A*F1,B*F2,GCD) :-
F2 > F1,
最大公約数をユークリッドの互除法で求める(F2,F1,GCD),
U is (F2-F1) // GCD,
gcd_equal(1,U,B*F2,A*F1,GCD).
>>290 % Prolog (その一)
gcd_equal(A*F1,B*F2,GCD) :-
F1 >= F2,
最大公約数をユークリッドの互除法で求める(F1,F2,GCD),
U is (F1-F2) // GCD,
gcd_equal(1,U,A*F1,B*F2,GCD).
gcd_equal(A*F1,B*F2,GCD) :-
F2 > F1,
最大公約数をユークリッドの互除法で求める(F2,F1,GCD),
U is (F2-F1) // GCD,
gcd_equal(1,U,B*F2,A*F1,GCD).
>>290 % Prolog (その二)
gcd_equal(N,U,A*F1,B*F2,GCD) :-
U2 is U * N,
0 is (U2 * F2 + GCD) mod F1,
B is U2 * (-1),
A is (U2 * F2 + GCD) // F1,
GCD is A * F1 + B * F2.
gcd_equal(N,U,A*F1,B*F2,GCD) :-
U2 is U * N,
0 is (U2 * F2 - GCD) mod F1,
A is (U2 * F2 - GCD) // F1 * (-1),
B is U2,
GCD is A * F1 + B * F2.
gcd_equal(N,U,A*F1,B*F2,GCD) :-
U2 is U * N,
0 is (U2 * F1 + GCD) mod F2,
A is U2 * (-1),
B is (U2 * F2 + GCD) // F2,
GCD is A * F1 + B * F2.
gcd_equal(N,U,A*F1,B*F2,GCD) :-
U2 is U * N,
0 is (U2 * F1 - GCD) mod F2,
B is (U2 * F1 - GCD) // F2 * (-1),
A is U2,
GCD is A * F1 + B * F2.
gcd_equal(N,U,A*F1,B*F2,GCD) :-
N2 is N + 1,
gcd_equal(N2,U,A*F1,B*F2,GCD).
>>290 % Prolog (その三)
最大公約数をユークリッドの互除法で求める(M,N,N) :-
0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
Mod is M mod N,
最大公約数をユークリッドの互除法で求める(N,Mod,X).
http://pc11.2ch.net/test/read.cgi/db/1252492296/877 # T_USER T_HOGE T_MAG T_USER
# ID|NUM ID MAG ID|NUM
# --|---- -- -- --|----
# A | 100 A 100 .→→→ A | 300
# B | 100 A update結果 B | 200
# C | 100 B C | 100
#
# 「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果を
# T_USER.NUMに対し加算するUPDATE文を書きたいのですが
# どうすればよいでしょうか。IDはVARCHAR型です。
>>296 % Prolog
「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文 :-
「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文(_),
fail.
「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文.
「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文(ID) :-
'T_MAG'(MAG),
retract('T_USER'(ID,NUM)),
count('T_HOGE'(ID),Count),
NUM2 is NUM + MAG * Count,
assertz('T_USER'(ID,NUM2)).
>>297 (
>>296 ) 訂正
% Prolog よく見たら述語名のなかにピリオドが含まれていた。
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :-
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_),
fail.
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'.
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文(ID)' :-
'T_MAG'(MAG),
retract('T_USER'(ID,NUM)),
count('T_HOGE'(ID),Count),
NUM2 is NUM + MAG * Count,
assertz('T_USER'(ID,NUM2)).
>>298 (
>>296 ) さらに訂正
% Prolog
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :-
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_),
fail.
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'.
'「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(ID) :-
'T_MAG'(MAG),
retract('T_USER'(ID,NUM)),
count('T_HOGE'(ID),Count),
NUM2 is NUM + MAG * Count,
assertz('T_USER'(ID,NUM2)).
http://pc12.2ch.net/test/read.cgi/tech/1217773415/821 # COBOL?のコピー句をツリー状のデータ構造に起こしたいと思ってます。
# 簡易的に書くと
# 連番 名前 深さレベル
# 1 aaa 1
# 2 bbb 2
# 3 ccc 2
# 4 ddd 3
# 5 eee 2
# の様な構造から、例えばaaaという名前でアクセスすると自分の直下のbbb,ccc,eeeが取得でき、cccは
# 次の連番に深さ3のdddがあるので、結果的にbbbdddeeeを取得できる。
# bbbを取ろうとした場合は、次の行が同レベルのcccなので純粋にbbbを取得できる。
# というような感じです。
>>300 % Prolog
copy句(_名前,_コピー句) :-
copy句データ構造(_連番,_名前,_深さレベル),
_直下のレベル is _深さレベル + 1,
_次の連番 is _連番 + 1,
copy句データ構造(_次の連番,_名前,_直下の深さレベル),
次の連番が直下レベル(_直下のレベル,_コピー句),!.
copy句(_名前,_名前).
次の連番が直下レベル(_直下のレベル,_コピー句) :-
findall(_コピー句_2,
( copy句データ構造(_,_名前,_直下の深さレベル),
copy句(_名前,_コピー句_2)),
_コピー句ならび),
concat_atom(_コピー句ならび,_コピー句),!.
>>302 % Prolog
キーボードより入力した4桁の数値を逆転させて表示 :-
get_integer(_整数),
'整数を逆転して先頭からの零を排除する。先頭が零でない場合は4桁の頭部零文字列に変換'(_整数,_逆転した4桁の数値文字列),
write_formatted('%t\n',[_逆転した数値文字列]).
'整数を逆転して先頭からの零を排除する。先頭が零でない場合は4桁の頭部零文字列に変換'(_整数,_逆転した4桁の数値文字列),
write_formatted('%t\n',[_逆転した数値文字列]).
'整数を逆転して先頭からの零を排除する。先頭が零でない場合は4桁の頭部零文字列に変換'(_整数,_逆転した4桁の数値文字列) :-
number_chars(_整数,Chars),
末尾の零ならびを排除かつ頭部に零を詰める(4,Chars,_4桁の数値文字列),
reverse(_4桁の数値文字列,_逆転した4桁の数値文字列).
末尾の零ならびを排除かつ頭部に零を詰める(_,_文字ならび,[]) :-
all(_文字ならび,0),!.
末尾の零ならびを排除かつ頭部に零を詰める(0,_文字ならび,_文字ならび) :- !.
末尾の零ならびを排除かつ頭部に零を詰める(_桁,_文字ならび,['0'|_未決定ならび]) :-
_桁 > 0,
_残り桁 is _桁 - 1,
末尾の零ならびを排除かつ頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび).
>>303 (
>>302 ) 訂正
% Prolog 第一節 0 -> '0'
末尾の零ならびを排除かつ頭部に零を詰める(_,_文字ならび,[]) :-
all(_文字ならび,'0'),!.
末尾の零ならびを排除かつ頭部に零を詰める(0,_文字ならび,_文字ならび) :- !.
末尾の零ならびを排除かつ頭部に零を詰める(_桁,_文字ならび,['0'|_未決定ならび]) :-
_桁 > 0,
_残り桁 is _桁 - 1,
末尾の零ならびを排除かつ頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび).
http://pc12.2ch.net/tech/1268979408/209 # 文字列の変換問題。
#
# CHAPTER01=00:00:00.000
# CHAPTER01NAME=第一部 オープニング
# CHAPTER02=00:09:13.400
# CHAPTER02NAME=オラはにんきもの
#
# こういうのを
#
# TRACK 01 AUDIO
# TITLE "第一部 オープニング"
# INDEX 01 00:00:00
# TRACK 02 AUDIO
# TITLE "オラはにんきもの"
# INDEX 01 09:13:40
#
# こうしたいんですが
>>305 訂正
http://pc12.2ch.net/test/read.cgi/tech/1268979408/209 # 文字列の変換問題。
#
# CHAPTER01=00:00:00.000
# CHAPTER01NAME=第一部 オープニング
# CHAPTER02=00:09:13.400
# CHAPTER02NAME=オラはにんきもの
#
# こういうのを
#
# TRACK 01 AUDIO
# TITLE "第一部 オープニング"
# INDEX 01 00:00:00
# TRACK 02 AUDIO
# TITLE "オラはにんきもの"
# INDEX 01 09:13:40
#
# こうしたいんですが
>>306 % Prolog INDEX の 01 の処理がわからない。
変換規則('TRACK',Lines,TRACK,S) :-
member(_文,Lines),
sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
append(L0,['='|R2],TL),
\+(append(_,['N','A','M','E'],L0)),
concat_atom(L0,TRACK),
concat_atom(['TRACK',' ',TRACK,' ','AUDIO'],S).
変換規則('TITLE',Lines,TRACK,S) :-
member(_文,Lines),
sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
append(L1,['='|R],TL),
append(L0,['N','A','M','E'|R2],L1),
concat_atom(L0,TRACK),
concat_atom(R,TITLE),
concat_atom([' ','TITLE',' "',TITLE,'"'],S).
変換規則('INDEX',Lines,TRACK,S) :-
member(_文,Lines),
sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
append(L0,['='|R2],TL),
\+(append(_,['N','A','M','E'],L0)),
concat_atom(L0,TRACK),
concat_atom(R2,TIME),
concat_atom([' ','INDEX',' 01 ',TIME],S).
>>306 % Prolog
変換(_ファイル名) :-
get_lines(_ファイル名,Lines),
変換規則('TRACK',Lines,TRACK,S1),
変換規則('TITLE',Lines,TRACK,S2),
変換規則('INDEX',Lines,TRACK,S3),
write_formatted('%t\n%t\n%t\n',[S1,S2,S3]),
fail.
変換(_).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/543 # [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# コンソール上でキーボードから次のような標準入力を与えるとする。
# 10+2
# すると、演算結果が出力するようなプログラムを記述せよ。
# 四則演算( +, -, *, / )に対応させること
#
# 言語に備わった解析・計算機能を利用するのではなく、
# 文字列を解析して式を生成する部分もプログラムとして書くこと。
# C言語の以下の関数に相当する関数等は使用して構わない。
# 文字列をコピーする関数( strcpy, strncpy )
# 文字列を連結する関数( strcat, strncat )
# 文字列の比較を行う関数( strcmp, strncmp )
# 文字列の長さを調べる関数( strlen )
# 文字を検索する関数( strchr )
# 文字列を整数値に変換する関数( atoi )
FORTRANの課題です。 下の数値データを入力して平均値、最大値、および最小値を判定するプログラムを作りなさい。 8.88 12.34 35.52 33.5 5.1 6.13 6.18 10.15 11.22 35.16 どなたか教えてくれないでしょうか?
http://pc11.2ch.net/test/read.cgi/db/1252492296/889 # 質問です。DBMSはOracle10gです。
#
# ユニークな数値IDをキーとしたテーブルがあります。
# IDは連続した値にはなりません。
#
# ID | hoge
# ----+---------
# 001 | aaa
# 003 | bbb
# 047 | ccc
# 084 | ddd
# 120 | eee
# 401 | fff
# 645 | ggg
#
# IDは1000万まで取り得ます。
# ここから、1〜1000万までの間で、テーブルに存在しないIDのみを取り出すには
# どのように書いたら良いでしょうか?
>>311 % Prolog
'1〜1000万までの間で、テーブルに存在しないIDのみを取り出す'(ID) :-
for(1,ID,10000000),
\+(テーブル(ID,_)).
>>309 % Prolog
コンソール上でキーボードから標準入力として得られた文字列を解析して式を生成して評価する(_式,_値) :-
コンソール上でキーボードから次のような標準入力を得る(_行),
atom_chars(_行,Chars),
項(Chars,_式),
_値 is _式.
コンソール上でキーボードから次のような標準入力を得る(_行) :- get_line(_行).
項(Chars,_項) :-
append(L0,[_演算子|R],Chars),
append(_,[_演算子|_],['+','-','*','/']),
_項=..[_演算子,_項1,_項2],
項(L0,_項1),
項(R,_項2).
項(Chars,_項) :- concat_atom(Chars,_項).
>>313 (
>>309 ) 訂正
% Prolog
コンソール上でキーボードから標準入力として得られた文字列を解析して式を生成して評価する(_式,_値) :-
コンソール上でキーボードから標準入力を得る(_行),
atom_chars(_行,Chars),
式(Chars,_式),
_値 is _式.
コンソール上でキーボードから標準入力を得る(_行) :- get_line(_行).
式(Chars,_式) :-
append(L0,[_演算子|R],Chars),
append(_,[_演算子|_],['+','-','*','/']),
_項=..[_演算子,_項1,_項2],
式(L0,_項1),
式(R,_項2).
式(Chars,_項) :- concat_atom(Chars,_項).
>>313 これだと、
3 * 4 + 5
が
3 * (4 + 5) と解釈されるのではないか?
>>317 % Prolog
モジュラス10ウェイト3(_数値ならび,_チェックデジット) :-
モジュラス10ウェイト3(_数値ならび,_,Sum),
_チェックデジット is 10 - (Sum mod 10),!.
モジュラス10ウェイト3([A],3,B) :-
B is A * 3,!.
モジュラス10ウェイト3([A|R],N,Sum) :-
モジュラス10ウェイト3(R,M,Sum_1),
モジュラス10ウェイト3トグル(M,N),
Sum is Sum_1 + A * N,!.
モジュラス10ウェイト3トグル(3,1) :- !.
モジュラス10ウェイト3トグル(1,3) :- !.
>>321 % Prolog
'文字列を10文字幅にして、足りない部分は先頭に''0''を付ける'(_文字列,_先頭に0を付加した文字列) :-
atom_chars(_文字列,Chars),
length(L,10),
append(L0,Chars,L),
all(L0,'0')
atom_chars(_先頭に0を付加した文字列,L).
>>320 % Prolog
'ニュートン法を用いてf(x)=e^(-x)-x^2=0の根を求める'(X) :-
'高次代数方程式の解法(ニュートン法)'(0,4,1.0,X).
f(X,Y) :-
Y is exp(-X)-X*X.
df(X,Y) :-
Y is -exp(-X)-2*X.
'高次代数方程式の解法(ニュートン法)'(Max,Max,X,X) :- !.
'高次代数方程式の解法(ニュートン法)'(N,Max,X1,X) :-
f(X1,Y),
df(X1,Y2),
X2 is X1 - Y / Y2,
N2 is N + 1,
'高次代数方程式の解法(ニュートン法)'(N2,Max,X2,X).
>>315 確かに。
>>314 (
>>309 ) 訂正
% Prolog ただし、()を含まないレベル。
'コンソール上でキーボードから標準入力として得られた文字列を解析して式を生成して評価する'(_式,_値) :-
コンソール上でキーボードから次のような標準入力を得る(_行),
atom_chars(_行,Chars),
式(Chars,_式),
_値 is _式.
コンソール上でキーボードから次のような標準入力を得る(_行) :- get_line(_行).
式(Chars,_項) :-
append(L0,[_演算子|R],Chars),
append(_,[_演算子|_],['+','-']),
_項=..[_演算子,_項1,_項2],
式(L0,_項1),
式(R,_項2),!.
式(Chars,_項) :-
append(L0,[_演算子|R],Chars),
append(_,[_演算子|_],['*','/']),
_項=..[_演算子,_項1,_項2],
式(L0,_項1),
式(R,_項2),!.
式(Chars,_項) :- concat_atom(Chars,_項).
>>310 平均だけ。
integer n
real x(10),y,z,
data x,n/8.88,12.34,35.52,33.5,5.1,6.13,6.18,10.15,11.22,35.16/
call(heikin(x,n,y,z)
write(*,620) 'heikin = ',z
end
subroutine heikin(x,n,y,z)
integer m,n
real x(n),y,z
y=0.
do 10 m=1,n
y=y+x(m)
10 continue
z=y/n
return
end
http://pc12.2ch.net/test/read.cgi/tech/1269438098/603 # 意個数の整数を標準入力(キーボード)から入力し、
# 入力された整数の個数
# 平均値(小数点以下 1 桁まで表示)
# 最大値
# 最小値
# を標準出力(ディスプレイ)に表示するプログラムを作成せよ。
# ただし、9999が入力されたら入力を終了するものとし、9999は入力個数、平均値、最
# 大値、最小値には含めない。
# また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、
# 最小値=0が出力されるようにする。
>>326 % Prolog
'意個数の整数を標準入力(キーボード)から入力し、入力された整数の個数 、平均値(小数点以下 1 桁まで表示) 、最大値、最小値を標準出力(ディスプレイ)に表示する' :-
findall(X,(repeat,get_integer(N),(N=9999,!,fail;true)),L),
\+(L=[]),
length(L,_整数の個数),
avg(L,_平均値),
max(L,_最大値),
min(L,_最小値),
write_formatted('入力された整数の個数 = %t\n平均値 = %.1f\n最大値 = %t\n最小値 = %t\n',[_整数の個数,_平均値,_最大値,_最小値]),!.
'意個数の整数を標準入力(キーボード)から入力し、入力された整数の個数 、平均値(小数点以下 1 桁まで表示) 、最大値、最小値を標準出力(ディスプレイ)に表示する' :-
write_formatted('入力された整数の個数 = %t\n平均値 = %.1f\n最大値 = %t\n最小値 = %t\n',[0,0.0,0,0]),!
>>327 (
>>326 )
% Prolog 訂正 (本体最初のfindall/3の第一引数をNに直した)
'意個数の整数を標準入力(キーボード)から入力し、入力された整数の個数 、平均値(小数点以下 1 桁まで表示) 、最大値、最小値を標準出力(ディスプレイ)に表示する' :-
findall(N,(repeat,get_integer(N),(N=9999,!,fail;true)),L),
\+(L=[]),
length(L,_整数の個数),
avg(L,_平均値),
max(L,_最大値),
min(L,_最小値),
write_formatted('入力された整数の個数 = %t\n平均値 = %.1f\n最大値 = %t\n最小値 = %t\n',[_整数の個数,_平均値,_最大値,_最小値]),!.
'意個数の整数を標準入力(キーボード)から入力し、入力された整数の個数 、平均値(小数点以下 1 桁まで表示) 、最大値、最小値を標準出力(ディスプレイ)に表示する' :-
write_formatted('入力された整数の個数 = %t\n平均値 = %.1f\n最大値 = %t\n最小値 = %t\n',[0,0.0,0,0]),!
>>329 % Prolog
'キーボードから int 型変数aに値を入力し、aの値を 2 進数に変換して画面に表示する(ただし、aに負の値が入力された場合には、再入力させるものとする。 ' :-
repeat,
get_integer(_a),
_a >= 0,
二進数(_a,_二進数ならび),
append(_,[0|R],_二進数ならび),
二進数表示文字列(_二進数ならび,_二進数表示文字列),
write_formatted('a(decimal)=%t\na(binary) =%t\n',[_a,_二進数表示文字列]),!.
二進数(_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).
二進数表示文字列(L,_二進数表示文字列) :-
二進数表示文字列_2(L1,L2),
concat_atom(L2,_二進数表示文字列).
二進数表示文字列_2([],[]) :- !.
二進数表示文字列_2([1|R1],['1'|R2]) :- 二進数表示文字列_2(R1,R2).
二進数表示文字列_2([0|R1],['0'|R2]) :- 二進数表示文字列_2(R1,R2).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/48 # 【 課題 】
ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/959.zip # 【 形態 】1. Javaアプリケーション(main()で開始) or 2. Applet
# 【 補足 】一つの物をつくるのですが、何回かに分けて提出です。pdfファイルを見ていただければわかると思います。
# 問題:
# 一定の幅と高さをもつボードがある。図 1のようにボード上には左上隅を原点とする座標系
# (x座標、y座標)が定義されているとする。この時、つぎの条件を満たすように二辺の長
# さ(幅と高さ)と左上の位置を表す座標をもつ長方形をボード上に配置するプログラムを作
# 成せよ。座標系の単位はピクセルとする。ボードの大きさは最終版では指定したアプレットの
# 大きさに依存して決定する。CUIの場合には固定値でよい。例えば 600×500。
# (1)
# 配置に関する以下の操作を行うことができる。各操作の名前には下線が引かれている。
# a)幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する。create
# b)長方形 Rを指定して、Rを現在位置から指定したx方向の距離 x 0,y方向の距離 y 0だけ移動する。move
# c)長方形 Rを指定して、指定した幅の倍率 mxで幅を、高さの倍率 myで高さをそれぞれ拡大または縮小する。倍率は有限小数で与えるものとする。幅・高さ・座標の値はMathクラスの roundメソッドを使用して決定する。expand/shrink
# d)長方形 Rを指定して削除する。delete
# e)ボード上の長方形をすべて削除する。deleteAll
# f) 2つの長方形 R1と R2を指定し、R1と R2の重なり部分を抽出し、新たな長方形 R3
# として配置する。intersect
>>332 % Prolog
'ランダムなアルファベットから成る、最大長255個の文字列を作成し表示する。作る文字列の長さははじめに入力すること。' :-
'作る文字列の長さははじめに入力する'(N),
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,L),
表示する(L),!.
'作る文字列の長さははじめに入力すること'(N) :-
repeat,
催促付き整数入力('文字列の長さ(255以下)を整数で入力してください : ',N),
N > 0,
N =< 255,!.
'作る文字列の長さははじめに入力すること'(N) :-
write('入力された値は整数でないか範囲(0-255)から外れています\n'),
'作る文字列の長さははじめに入力すること'(N).
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(0,[]) :- !.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,[A|R]) :-
M is random mod 65536,
アルファベット(A,M),
N1 is N - 1,
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N1,R),!.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,X) :-
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,X).
アルファベット(A,N) :- char_code(A,N).
表示する([]) :- !.
表示する([A|R]) :- write(A),表示する(R).
>>334 (
>>332 )
% Prolog 「こと」が抜けましたw
'ランダムなアルファベットから成る、最大長255個の文字列を作成し表示する。作る文字列の長さははじめに入力すること。' :-
'作る文字列の長さははじめに入力すること'(N),
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,L),
表示する(L),!.
>>334 (
>>332 )
% Prolog さらに間違い(repeat/0を削り忘れた)を発見。書き直します。
'ランダムなアルファベットから成る、最大長255個の文字列を作成し表示する。作る文字列の長さははじめに入力すること。' :-
'作る文字列の長さははじめに入力すること'(N),
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,L),
表示する(L),!.
'作る文字列の長さははじめに入力すること'(N) :-
催促付き整数入力('文字列の長さ(255以下)を整数で入力してください : ',N),
N > 0,
N =< 255,!.
'作る文字列の長さははじめに入力すること'(N) :-
write('入力された値は整数でないか範囲(0-255)から外れています\n'),
'作る文字列の長さははじめに入力すること'(N).
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(0,[]) :- !.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,[A|R]) :-
M is random mod 65536,
アルファベット(A,M),
N1 is N - 1,
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N1,R),!.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,X) :-
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(N,X).
アルファベット(A,N) :- char_code(A,N).
表示する([]) :- !.
表示する([A|R]) :- write(A),表示する(R).
>>338 % Prolog
'30個の要素を持つ配列に小数をキーボードから代入し,それらを小さい順にソートし,その結果をモニタに出力する' :-
'30個の要素を持つ配列に小数をキーボードから代入し'(L1),
それらを小さい順にソートし(L1,L2),
その結果をモニタに出力する(L2).
'30個の要素を持つ配列に小数をキーボードから代入し'(L) :-
findall(X,(for(1,N,30),read(X)),L).
それらを小さい順にソートし(L1,L2) :- それらを小さい順にソートし(L1,[],L2).
それらを小さい順にソートし([],L,L) :- !.
それらを小さい順にソートし([V|R],L1,L2) :-
挿入(V,L1,L3),
それらを小さい順にソートし(R,L3,L2).
挿入(V,[],[V]) :- !.
挿入(V,[V1|R1],[V,V1|R1]) :- V =< V1,!.
挿入(V,[V1|R1],[V1|R2]) :-
V > V1,
挿入(V,R1,R2).
その結果をモニタに出力する([]) :- !.
その結果をモニタに出力する([V|R]) :- write_formatted('%f\n',[V]),その結果をモニタに出力する(R).
>>336 (
>>332 )
% Prolog 'ランダムなアルファベットから成る、最大長255個の文字列を作成し/0
% 引数を減らしてみた。 生成する要素数が255以下のように少数に限定されている場合は、要素がすべて変数のリストを生成しておいてその変数と単一化していくことでも求めるリストを生成できる。
'ランダムなアルファベットから成る、最大長255個の文字列を作成し表示する。作る文字列の長さははじめに入力すること。' :-
'作る文字列の長さははじめに入力すること'(N),
length(L,N),
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(L),
表示する(L),!.
'作る文字列の長さははじめに入力すること'(N) :-
催促付き整数入力('文字列の長さ(255以下)を整数で入力してください : ',N),
N > 0,
N =< 255,!.
'作る文字列の長さははじめに入力すること'(N) :-
write('入力された値は整数でないか範囲(0-255)から外れています\n'),
'作る文字列の長さははじめに入力すること'(N).
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'([]) :- !.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'([A|R]) :-
M is random mod 65536,
アルファベット(A,M),
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(R),!.
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(L) :-
'ランダムなアルファベットから成る、最大長255個の文字列を作成し'(L).
アルファベット(A,N) :- char_code(A,N).
表示する([]) :- !.
表示する([A|R]) :- write(A),表示する(R).
>>340 のような使い方の述語の代表として、all/2を挙げよう。
all([A],A).
all([A|R],A) :- all(R,A).
この述語はfoo/1が以下のように定義済みだとして、
foo([6,6,6,6]).
?- foo(L),all(L,6).
L = [6,6,6,6]
yes
?- foo(L),all(L,X).
L = [6,6,6,6],
X = 6
yes のように使われるのだろうが、
?- length(L,4),foo(L,6).
L = [6,6,6,6]
yes
?- のように使うこともできる。
>>340 の ランダムなアルファベットから成る、最大長255個の文字列を作成し/1 は
この最後の使い方に相当する。
それから
>>340 の解説で ランダムなアルファベットから成る、最大長255個の文字列を作成し/0 となっていますが /1 の間違い。
>>337 % Prolog 取り敢えず、データ部をRGB値ならびに切り取った後の処理。
像のヒストグラム(RGB値ならび) :-
画像のヒストグラム(RGB値ならび,_ヒストグラムならび),
ヒストグラム(_ヒストグラムならび).
画像のヒストグラム(RGB値ならび,_ヒストグラムならび) :-
findall(N,(for(0,N,31),count((member(_値,RGB値ならび),_値 >= N * 8,_値 < (N + 1) * 8),Count)),L),
max(L,Max),
findall(L1,(member(J,L),length(L1,Max),Length(L2,J),append(L0,L2,L1),all(L0,' '),all(L1,'*')),L4),
転置(L4,_ヒストグラムならび).
ヒストグラム([]) :- !.
ヒストグラム([L|R]) :-
concat_atom(L,S),
write_formatted('%t\n',[S]),
ヒストグラム(R).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/627 # [1] 授業単元: C言語
# [2] 問題文: 1〜9までの値の整数 n を入力として受け取り、実行例のように、その n を高さとした二等辺三角形を出力するプログラムを作成しなさい。
# なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。
#
# 実行例
#
# 1から9までの整数を入力:6
# 1
# 22
# 333
# 4444
# 55555
# 666666
# 55555
# 4444
# 333
# 22
# 1
#
# 1から9までの整数を入力:11
# 入力する数は1から9までです
#
>>343 % Prolog
'1〜9までの値の整数 n を入力として受け取り、実行例のように、その n を高さとした二等辺三角形を出力するプログラムを作成しなさい。' :-
'1〜9までの値の整数 n を入力として受け取り、'(N),
'その n を高さとした二等辺三角形を出力する'(N).
'1〜9までの値の整数 n を入力として受け取り、'(N) :-
repeat,
催促付き整数入力('1から9までの整数を入力:',N),
'1〜9までの値の整数'(N),!.
'1〜9までの値の整数(N) :- N >= 1,N =< 9,!.
'1〜9までの値の整数(N) :- 'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N),fail.
'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N) :- write('入力する数は1から9までです \n').
'その n を高さとした二等辺三角形を出力する'(N) :- 'その n を高さとした二等辺三角形を出力する'(1,N),
'その n を高さとした二等辺三角形を出力する'(N,N) :- !.
表示する数値列(N,N,S),!.
write_formatted('%t\n',[S]),!.
'その n を高さとした二等辺三角形を出力する'(M,N) :-
\+(M = N),
表示する数値列(M,N,S),
write_formatted('%t\n',[S]),
M2 is M + 1,
'その n を高さとした二等辺三角形を出力する'(M2,N),
write_formatted('%t\n',[S]),!.
>>344 (
>>343 )
% Prolog 間違い。訂正。
'1〜9までの値の整数 n を入力として受け取り、実行例のように、その n を高さとした二等辺三角形を出力するプログラムを作成しなさい。' :-
'1〜9までの値の整数 n を入力として受け取り、'(N),
'その n を高さとした二等辺三角形を出力する'(N).
'1〜9までの値の整数 n を入力として受け取り、'(N) :-
repeat,
催促付き整数入力('1から9までの整数を入力:',N),
'1〜9までの値の整数'(N),!.
'1〜9までの値の整数(N) :- N >= 1,N =< 9,!.
'1〜9までの値の整数(N) :- 'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N),fail.
'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N) :- write('入力する数は1から9までです \n').
'その n を高さとした二等辺三角形を出力する'(N) :- 'その n を高さとした二等辺三角形を出力する'(1,N),
'その n を高さとした二等辺三角形を出力する'(N,N) :-
表示する数値列(N,S),
write_formatted('%t\n',[S]),!.
'その n を高さとした二等辺三角形を出力する'(M,N) :-
表示する数値列(M,S),
write_formatted('%t\n',[S]),
M2 is M + 1,
'その n を高さとした二等辺三角形を出力する'(M2,N),
write_formatted('%t\n',[S]),!.
表示する数値列(M,S) :- length(L,M),all(L,M),concat_atom(L,S),!.
http://pc12.2ch.net/test/read.cgi/tech/1269438098/630 # [1] プログラミング演習課題
# [2] 画像ファイル情報を表す構造体hBitmapは次の定義を持つ。
# typedef struct{
# char signature[7];
# int width,height;//縦横のピクセル数
# int pixels; //ピクセル情報 (0,0)(0,1)..(0,width-1),(1,0),(1,1),...,(1,width-1),...という風に並ぶ。エンデ
ィアンはビッグエンディアンとする
# }hBitmap;
# sigunatureには文字列"hBitmap"が終端の¥0を含めて格納されるものとする
# ピクセルは32ビットの色情報で上位8ビットは0 0~7ビットは赤
# 8~15ビットは青 16~23ビットは緑を表す。(各成分は256段階の色情報を
# 持つ)
# 2次元座標平面[-0.5,0.5]X[0.5,0.5]を大きさ600x600のビットマップに対応させ
# そこで次の不等式が作る領域を指定された色で塗りつぶした画像ファイルを
# 上記構造体をファイルにバイナリ保存する形で作成するプログラムを作れ
# (1)(x-0.25)^2+y^2<=0.5^2 (x+0.25)^2+y^2<=0.5^2
# (2)x^2+(y-0.125)^2=0.01^2
# (3)x^2+y^2=0.025^2
# (4)x^2+(y+0.3)^2=0.03^2
# (5)それ以外
# (1)の塗りつぶし色 R=255 G=0 B=200
# (2)の塗りつぶし色 R=255 G=0 B=180
# (3)の塗りつぶし色 R=240 G=0 B=220
# (4)の塗りつぶし色 R=180 G=180 B=180
# (5)の塗りつぶし色 R=G=B=255
<A HREF="
http://nojiriko.asia/prolog/index.html ">このディレクトリの索引</A>
http://pc12.2ch.net/test/read.cgi/tech/1269438098/641 # このスレの住民の方には楽勝かもしれませんがお願いします
#
# 場合の数を計算するときに、いわゆる「nCr」というものを使うことがある。これは、順番を特に決めない場合、n個のものからr個のものを取り出す場合をいい、
# 7C5 = 7! / (7-5)!5!
# である。nCrであれば
# nCr = n! / (n-r)!r! (但し、0≦r≦n)
#
# この数を計算したい。
# 1. nとrを入力させる。
# 2. n!を計算させる
# 3. (n-r)!を計算させる
# 4. r!を計算させる
# 5. (2)/(3)/(4)を計算する
#
# しかしn!と(n-r)!がかなりの部分まで重複することを利用すれば、かなり計算の手間を省くことができる
# 1から5の手順まで守ったプログラムと手間を省いたプログラムをそれぞれ作成しなさい
#
>>348 % Prolog
nCr(N,R,X) :-
階乗(N,U1),
V is N - R,
階乗(V,U2),
階乗(R,U3),
X is U1 // U2 // U3.
%%%%%%%%%%%%%%%%%%%%%%%%%%%
nCr(N,R,X) :-
U is N - R + 1,
階乗(U,N,K1),
階乗(R,K2),
X is K1 // K2 .
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
階乗(M,N,1) :- M > N,!.
階乗(M,N,X) :-
M2 is M + 1,
階乗(M2,N,Y),
X is M * Y.
階乗(0,1) :- !.
階乗(1,1) :- !.
階乗(N,X) :-
N2 is N - 1,
階乗(N2,Y),
X is N * Y,
asserta((階乗(N,X) :- (!))).
http://pc11.2ch.net/test/read.cgi/db/1252492296/908 # TEAMが1 で、
# NAMEにaを含むデータを上位にして、
# SCOREの多い順に取り出したいのですが、
# どう書けばいいですか?お願いします。
#
# これを
# ID|TEAM|NAME|SCORE
# --+----+----+-----
# 1 | 1 | aaa | 200
# 2 | 2 | abb | 50
# 3 | 1 | ccc | 300
# 4 | 1 | daa | 400
# 5 | 1 | eae | 100
# 6 | 1 | fff | 800
#
# ↓こうしたい
# ID|TEAM|NAME|SCORE
# --+----+----+-----
# 4 | 1 | daa | 400
# 1 | 1 | aaa | 200
# 5 | 1 | eae | 100
# 6 | 1 | fff | 800
# 3 | 1 | ccc | 300
>>351 % Prolog
'TEAMが1でSCOREの多い順に取り出したい'(_SCOREの多い順ならび) :-
'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ),
'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび),!.
'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび) :-
降順整列(_aを含む鍵付きデータ,_降順に整列したaを含む鍵付きデータ),
降順整列(_aを含まない鍵付きデータ,_降順に整列したaを含まない鍵付きデータ),
鍵を除去しながら結合する(_降順に整列したaを含む鍵付きデータ,_降順に整列したaを含まない鍵付きデータ,_SCOREの多い順ならび).
'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ) :-
findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),'NAMEにaを含む(NAME)),_aを含む鍵付きデータ),
findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),\+('NAMEにaを含む'(NAME))),_aを含まない鍵付きデータ),!.
'NAMEにaを含む'(NAME) :- sub_atom(NAME,_,1,_,a),!.
鍵を除去しながら結合する([],[],[]) :- !.
鍵を除去しながら結合する([],Y,X) :- 鍵を除去しながら結合する(Y,[],X),!.
鍵を除去しながら結合する([[_|L]|R1],Y,[L|Z]) :- 鍵を除去しながら結合する(R1,Y,Z).
>>353 % Prolog
'キーボードからCのソース・プログラム名(fname.c)を入力し、そのプログラムの行番号付テキスト・ファイルを、別名のファイル(fname.txt)で表示する。ただし、ファイル名のframeの部分は共通にする' :-
write('ファイル名を入力してください : '),
get_line(_ファイル名),
concat_atom([_ファイル名,'.c'],File1),
get_lines(File1,L1),
'そのプログラムの行番号付テキスト・ファイルを'(1,L1,L2),
'別名のファイル(fname.txt)で表示する'(File2,L2),!.
'そのプログラムの行番号付テキスト・ファイルを'(_,[],[]) :- !.
'そのプログラムの行番号付テキスト・ファイルを'(N,[Line|R1],[S|R2]) :-
write_formatted_atom('%06d %t',[N,Line],S),
N2 is N + 1,
'そのプログラムの行番号付テキスト・ファイルを'(N2,R1,R2).
'別名のファイル(fname.txt)で表示する'(_ファイル名,L) :-
concat_atom([_ファイル名,'.txt'],File),
put_lines(File,L).
>>349 後半の情報が切れてしまった。再掲
http://pc12.2ch.net/test/read.cgi/tech/1269438098/642 # [1] 授業単元:ロボット制御
# [2] 問題文:
# 3次元空間座標(x,y,z)の数値を与えると、
# ロボットの関節の角度(A,B,C)を計算するプログラムを作成する。
#
# L1,L2はロボットの腕の長さでL1:69.8/L2:77.35が与えられています。
#
# また、それぞれの変換公式は
# C= ±(プラスマイナス) arccos(((x^2+y^2+x^2)-(L1^2+L2^2))/(2*L1*L2))
# B= arcsin(y/(L1+L2*cos(C)))
# A= arctan(x/(-z)) ±(マイナスプラス) arccos(((L1+L2*cos(C))*cos(B))/root(x^2+y^2))
# で、ABCは動作幅が制限されています。
# Cの動作幅は-30<= C <=127 [deg]
# Bの動作幅は-15<= B <=93 [deg]
# Aの動作幅は-120<= A <=135 [deg]
#
# 最初にCを出すと値がプラスマイナスの2種類が出るため、
# 条件に当てはまる最適値を選んでradに変換した上でBに代入して計算、
# Bの値をAに代入した上で、出てきた二つの値から最適値を選んで
# 結果を出力するのだと思うのですが、どのような条件式を書けばよいのでしょうか?
#
# 最適値の選び出し方の動作アルゴリズムだけでも結構ですのでお願いします。
356 :
デフォルトの名無しさん :2010/05/14(金) 15:13:42
>>347 % Prolog
'5匹の羊と5匹の狼を1匹ずつひとつの檻に入れる。羊の数を狼の数が超えると羊が食べられるのでNG。上の条件で羊と狼
を全頭檻に入れられる順番の組み合わせを全通り出力する'(X) :-
_狼ならび=[_,_,_,_,_],
_羊ならび=[_,_,_,_,_],
檻の中の構成(_狼ならび,_羊ならび,[],[],X).
檻の中の構成(L,[],_狼の数,_羊の数,L) :- all(L,狼).
檻の中の構成([_|R1],L,_狼の数,_羊の数,[狼|R]) :-
羊の方が多い(_狼の数,_羊の数),
檻の中の構成(R1,L,[_|_狼の数],_羊の数,R).
檻の中の構成(L,[_|R2],_狼の数,_羊の数,[羊|R]) :-
羊と狼が同数か羊の方が多い(_狼の数,_羊の数),
檻の中の構成(L,R2,_狼の数,[_|_羊の数],R).
羊の方が多い(_狼ならび,_羊ならび) :- append(_狼ならび,R,_羊ならび),\+(R=[]),!.
羊と狼が同数か羊の方が多い(_狼ならび,_羊ならび) :- append(_狼ならび,_,_羊ならび),!.
>>356 (
>>347 )
% Prolog 変なところで改行されてしまったので書き直し。
'5匹の羊と5匹の狼を1匹ずつひとつの檻に入れる。羊の数を狼の数が超えると羊が食べられるのでNG。上の条件で羊と狼を全頭檻に入れられる順番の組み合わせを全通り出力する'(X) :-
_狼ならび=[_,_,_,_,_],
_羊ならび=[_,_,_,_,_],
檻の中の構成(_狼ならび,_羊ならび,[],[],X).
檻の中の構成(L,[],_狼の数,_羊の数,L) :- all(L,狼).
檻の中の構成([_|R1],L,_狼の数,_羊の数,[狼|R]) :-
羊の方が多い(_狼の数,_羊の数),
檻の中の構成(R1,L,[_|_狼の数],_羊の数,R).
檻の中の構成(L,[_|R2],_狼の数,_羊の数,[羊|R]) :-
羊と狼が同数か羊の方が多い(_狼の数,_羊の数),
檻の中の構成(L,R2,_狼の数,[_|_羊の数],R).
羊の方が多い(_狼ならび,_羊ならび) :- append(_狼ならび,R,_羊ならび),\+(R=[]),!.
羊と狼が同数か羊の方が多い(_狼ならび,_羊ならび) :- append(_狼ならび,_,_羊ならび),!.
http://pc12.2ch.net/test/read.cgi/tech/1269438098/680 # [1] 制御工学
# [2] 問題文:dy/dx=(1-y)/15の微分方程式をルンゲクッタ法を用いてx=0〜100までの値を求めよ。
# [5] その他の制限:初期値は0で、刻み幅は任意です。
# コード、計算結果をプリントして提出、また計算結果をグラフにして提出しなければならないので、ファイル形式で保存できるようにして欲しいです。
#
# プログラミングの授業ではないのに急に出されて困っています。
# よろしくお願い致します。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/681 # [1] 授業単元: プログラム
# [2] 問題文(含コード&リンク): 以下のようにプログラムを作成してください。バブルソートという名前です
# 0に34 1に3 2に11 3に28 4に17が入っています。
# (1)0番と1番の値を比べ、0番が大きいなら、入れ替える→(2)順に1番と2番、2番と3番…と比べて、(1)と同様の処理 を行う→(3)端まで行ったら0番に戻って、n-1番までで(1)と(2)を繰り返す(ここの例ではn=4)
#
>>363 % Prolog 直ぐに思いつく定義は下の二通り。括弧の処理(注釈の処理)はどうすればよいか?
プログラミングをやる理由は?(1,'職業プログラマー(仕事)').
プログラミングをやる理由は?(2,'学生(授業・研究等)').
プログラミングをやる理由は?(3,'趣味(サークル活動、同人活動等で二人以上で活動)').
プログラミングをやる理由は?(4,'趣味(個人的活動)').
プログラミングをやる理由(1,'職業プログラマー(仕事)').
プログラミングをやる理由(2,'学生(授業・研究等)').
プログラミングをやる理由(3,'趣味(サークル活動、同人活動等で二人以上で活動)').
プログラミングをやる理由(4,'趣味(個人的活動)').
>>361 % Prolog 相関係数(その一)
値位置(名前,[_名前,_,_,_],_名前).
値位置(英語,[_,_英語,_,_],_英語).
値位置(数学,[_,_,_数学,_],_数学).
値位置(物理,[_,_,_,_物理],_物理).
成績(学生1,80,50,60).
成績(学生2,60,70,80).
成績(学生3,50,80,90).
成績(学生4,60,75,80).
成績(学生5,50,90,75).
科目間の相関係数(_科目1,_科目2,_相関係数) :-
findall(_点数,(成績(A,B,C,D),値位置(_科目1,[A,B,C,D],_点数)),_科目1の点数ならび),
findall(_点数,(成績(A,B,C,D),値位置(_科目2,[A,B,C,D],_点数)),_科目2の点数ならび),
相関係数(_科目1のならび,_科目2の点数ならび,_相関係数).
>>361 % Prolog 相関係数(その二)
相関係数(_科目1の点数ならび,_科目2の点数ならび,_相関係数) :-
length(_科目1の点数ならび,Len),
相加平均(_科目1の点数ならび,_科目1の相加平均),
相加平均(_科目2の点数ならび,_科目2の相加平均),
共分散(_科目1の点数ならび,_科目2の点数ならび,_共分散),
標準偏差(_科目1の点数ならび,Len,_科目1の相加平均,0.0,_科目1の標準偏差),
標準偏差(_科目2の点数ならび,Len,_科目2の相加平均,0.0,_科目2の標準偏差),
_相関係数 is _共分散 / (_科目1の標準偏差 * _科目2の標準偏差).
共分散(_標本ならび1,_標本ならび2,_共分散) :-
length(_標本ならび1,Len),
length(_標本ならび2,Len),
相加平均(_標本ならび1,_標本ならび1の相加平均),
相加平均(_標本ならび2,_標本ならび2の相加平均),
共分散(_標本ならび1,_標本ならび2,Len,_標本ならび1の相加平均,_標本ならび2の相加平均,0.0,_共分散).
共分散([],[],Len,_,_,S,_共分散) :- _共分散 is S / Len,!.
共分散([A|R1],[B|R2],Len,_相加平均1,_相加平均2,S1,_共分散) :-
U is (A-_相加平均1) * (B-_相加平均2),
S2 is S1 + U,
共分散(R1,R2,Len,_相加平均1,_相加平均2,S2,S),!.
>>366 % Prolog 相加平均を共分散/3の中で二重に計算している。この部分も共分散/7の方を使って。
相関係数(_科目1の点数ならび,_科目2の点数ならび,_相関係数) :-
length(_科目1の点数ならび,Len),
相加平均(_科目1の点数ならび,_科目1の相加平均),
相加平均(_科目2の点数ならび,_科目2の相加平均),
共分散(_科目1の点数ならび,_科目2の点数ならび,Len,_科目1の相加平均,_科目2の相加平均,0.0,_共分散),
標準偏差(_科目1の点数ならび,Len,_科目1の相加平均,0.0,_科目1の標準偏差),
標準偏差(_科目2の点数ならび,Len,_科目2の相加平均,0.0,_科目2の標準偏差),
_相関係数 is _共分散 / (_科目1の標準偏差 * _科目2の標準偏差).
>>361 % Prolog 偏差値
各学生の合計点の偏差値(_各学生の合計点の偏差値) :-
findall(_名前,成績(_名前,_,_,_),_名前ならび),
標本を集める(_母集合),
偏差値(_母集合,_偏差値ならび),
名前と符合させる(_名前ならび,_偏差値ならび,_各学生の偏差値).
偏差値(_母集合,_偏差値ならび) :-
相加平均(_母集合,_算術合計),
標準偏差(_母集合,_標準偏差),
findall(_偏差値,(member(_値,_母集合),偏差値(_値,_相加平均,_標準偏差,_偏差値)),_偏差値ならび).
偏差値(_標本値,_相加平均,_標準偏差,_偏差値) :-
_偏差値 is 10 * (_標本値 - _相加平均) / _標準偏差 + 50.0.
各学生の合計点の総和(_合計点の総和) :-
findsum(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_合計点の総和).
各学生の合計点(_名前,_各学生の合計点) :-
成績(_名前,_英語,_数学,_物理),
_各学生の合計点 is _英語 + _数学 + _物理.
標本を集める(_母集合) :-
findall(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_母集合).
名前と符合させる([],[],[]) :- !.
名前と符合させる([A|R1],[B|R2],[[A,B]|R3]) :- 名前と符合させる(R1,R2,R3)
>>368 % Prolog 訂正 「合計点の」の抜けていました。それから名前と符合させる/3の第二節の最後のピリオドが落ちています。
各学生の合計点の偏差値(_各学生の合計点の偏差値) :-
findall(_名前,成績(_名前,_,_,_),_名前ならび),
標本を集める(_母集合),
偏差値(_母集合,_偏差値ならび),
名前と符合させる(_名前ならび,_偏差値ならび,_各学生の合計点の偏差値).
<A HREF="
http://nojiriko.asia/prolog/index.html ">このディレクトリの索引</A>
http://pc12.2ch.net/test/read.cgi/tech/1269438098/740 # [1] 授業単元:繰り返し+条件分岐+一次元配列 処理
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10603.txt #
# int uriage[12]={20,30,10,80,90,40,60,70,50,30,40,90}
#
# で定義された配列データを逆順に出力するプログラムを作成せよ。
#
# 例:90 40 30 50 70 ... 20
http://pc11.2ch.net/test/read.cgi/db/1252492296/912 # 文章の中に特定キーワードがあるかどうかを探し、一致した場合そのキーワードを取得する
# SQLを作成したいのですが、(たとえるなら逆LIKEのようなイメージ)上手くいきません。
#
# テーブル名:T_DIC(InnoDB,UTF-8)
# KEYWORD
# -------
# 'ぬるぽ'
# 'めるぽ'
# 'nullpo'
#
# これに対し、'お前の母ちゃんぬるぽ!nullpo!'のキーワードに対する応答を下記のようにしたいのです。
#
# KEYWORD
# -------
# 'ぬるぽ'
# 'nullpo'
#
>>370 % Prolog 高名な reverse述語定義 をふたつ。
reverse(L1,L2) :- reverse(L1,[],L2).
reverse([],L,L).
reverse([A|R],L1,L2) :- reverse(R,[A|L1],L2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
reverse([],[]).
reverse([A|R1],L) :- reverse(R1,L1),append(L1,[A],L).
>>372 % Prolog
文章の中に特定キーワードがあるかどうかを探し、一致した場合そのキーワードを取得する(_文章,_文章の中に含まれたキーワードならび) :-
findall(KEYWORD,('T_DIC'(KEYWORD),文章の中にキーワードを含む(_文章,KEYWORD)),_文章の中に含まれたキーワードならび).
文章の中にキーワードを含む(_文章,KEYWORD) :- sub_atom(_文章,_,_,_,KEYWORD),!.
>>376 >>371 このようなasciiコード表述語なくして、
asciiコード【表】を生成することは不可能。
空欄だらけの表になってしまう。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/774 # [1] 授業単元: 映像メディア処理
# [2] 問題文(含コード&リンク):
# 入力した画像を3〜16値階調にする多値ディザ法のプログラムを作りなさい。
#
# [5] その他の制限:
# グレースケールの画像をロードし、image_in[256][256]という配列に保存してあります。
# これに多値ディザ法を適用し、image_out[256][256]に出力させたいです。
# ロード部分は問題無いので、多値ディザ法を行う部分をお願いします。
>>380 % Prolog (その一) 題意から少しズレるが普通はこういう風に作ると思う。
科目(1,'prolog初級').
科目(2,'自然言語の論理学').
科目(3,'関数型言語').
科目(4,'C#講習').
科目のグレード・ポイント(1,4.0).
科目のグレード・ポイント(2,4.0).
科目のグレード・ポイント(3,2.0).
科目のグレード・ポイント(4,1.0).
点数評価値(_点数,4) :- _点数 >= 90,_点数 =< 100,!.
点数評価値(_点数,3) :- _点数 >= 80,_点数 < 90,!.
点数評価値(_点数,2) :- _点数 >= 70,_点数 < 80,!.
点数評価値(_点数,1) :- _点数 >= 60,_点数 < 70,!.
点数評価値(_点数,0) :- _点数 < 60,!.
>>380 % Prolog (その二)
'点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は1,60以下は0)'(GPA) :-
write('科目番号をリストで入力しなさい : ),
read(_科目番号ならび),
点数を入力する(_科目番号ならび,_点数ならび),
'GPAの計算'(_点数ならび,GPA).
点数を入力する([],[]) :- !.
点数を入力する([_科目番号|R1],[[_科目番号,_点数]|R2]) :-
科目(_科目番号,_科目),
write_formatted('%tの点数を入力してください : '),
get_integer(_点数),
点数を入力する(R1,R2).
'GPAの計算'(_点数ならび,GPA) :-
length(_点数ならび,N),
'GPAの計算'(_点数ならび,0.0,X),
GPA is X / N.
'GPAの計算'([],X,X) :- !.
'GPAの計算'([[_科目番号,_点数]|R1],S1,S2) :-
点数評価値(_点数,_点数評価値),
科目のグレード・ポイント(_科目番号,_科目のGP値),
S2 is S1 + _点数評価値 * _科目のGP値,
'GPAの計算'([[_科目番号,_点数]|R1],S1,S2).
>>383 (
>>380 )
% Prolog 間違えた。
'GPAの計算'(_点数ならび,GPA) :-
findsum(_科目のグレード・ポイント,科目のグレード・ポイント(_,_科目のグレード・ポイント),_科目のグレード・ポイントの合計),
'GPAの計算'(_点数ならび,0.0,X),
GPA is X / _科目のグレード・ポイントの合計.
>>379 % Prolog Prologに配列はないからリストで表現してみる。例えばこのようになる。
a(3.14).
c(_).
要素数nの実数型配列cの要素全てにaを入力する(_n) :-
retract(c(_)),
a(V),
length(L,_n),
all(L,V),
assertz(c(L)).
all([],_).
all([V|R],V) :- all(R,V).
>>378 % Prolog
'長さが32の0と1の列se7e6・・・e1e0d1d2d3・・・d23を入力して、このビット列の表す実数値(実数表現の仕方はIEEE規格754に従うものと仮定する)'(_ビット列を表すならび,X) :-
IEEE規格754(_ビット列を表すならび,X).
IEEE規格754([S,1,0,0,0,0,0,0,0|R],無限大) :- all(R,0),!.
IEEE規格754([S,1,0,0,0,0,0,0,0|R],非数) :- \+(all(R,0)),!.
IEEE規格754([S,1,1,1,1,1,1,1,1|R],_実数値) :-
二進数から整数へ変換(R,M),
_実数値 is (-1) ^ S * M * 2 ^ (-127) + 1.
IEEE規格754([S|L],_実数値) :-
length(L0,7),
append([L0,R],L),
二進数から整数へ変換(L0,E),
二進数から整数へ変換(R,M),
_実数値 is (-1) ^ S * (1 + M) * 2 ^ E,!.
二進数から整数へ変換(_二進数ならび表現,_整数表現) :- 二進数から整数へ変換(_二進数ならび表現,_,_整数表現).
二進数から整数へ変換([N],1,N).
二進数から整数へ変換([0|R],M,N) :-
二進数から整数へ変換(R,M1,N),
M is M1 * 2,!.
二進数から整数へ変換([1|R],M,N) :-
二進数から整数へ変換(R,M1,N2),
M is M1 * 2,
N is M + N2,!.
>>362 % Prolog
拡大係数行列を既約ガウス行列に変形して連立一次方程式の解を得る(_変数名ならび,_拡大係数行列,_解ならび) :-
既約ガウス行列に変形(_拡大係数行列,_既約ガウス行列),
解の収集(_変数名ならび,_既約ガウス行列,_解ならび).
解の収集([],[],[]) :- !.
解の収集([_変数名|R1],[_行|R2],[_変数名=X|R3]) :-
last(_行,X),
解の収集(R1,R2,R3).
% 既約ガウス行列に変形/2は
http://nojiriko.asia/prolog/Gauss_gyoretsu_ni_henkei.html 参照
http://pc12.2ch.net/test/read.cgi/tech/1269438098/776 # [1] 授業単元:プログラミング
# [2] 問題文:
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10608.txt #
# グレースケール画像の輝度値を量子化し、量子化された画像を量子化レベルに応じて疑似カラー化します。
# 表1で規定された量子化レベルに合わせて疑似カラー画像を作成してください。
# ただし各量子化レベルに対する疑似カラー設定値(RGB)を入力できるようにすること。
#
# 表1:
# 量子化レベル |0 |1 |2 |3 |4 |5 |6 |7 |
# 輝度値の範囲 |0-31 |32-63 |64-95 |96-127 |128-159 |160-191 |192-223 |224-255 |
# 疑似カラー設定|255,0,0|255,160,0|190,255,0|30,255,0|0,255,130|0,220,255|0,60,255|100,0,255|
>>389 % Prolog (その一)
グレースケール画像の輝度を量子化して擬似カラー画像に変換する(_グレースケールファイル,_擬似カラー画像ファイル) :-
グレースケールファイルをヘッダとデータに分解(_グレースケールファイル,_グレースケール画像ヘッダ部文字ならび,_グレースケール画像データ部値ならび),
グレースケールから擬似カラー画像ヘッダに変換(_グレースケール画像ヘッダ部文字ならび,_擬似カラー画像ヘッダ部文字ならび),
グレースケール画像の輝度値を量子化し、量子化された画像を量子化レベルに応じて疑似カラー化する(_グレースケール画像データ部値ならび,_擬似カラー画像データ部値ならび),
open(_擬似カラー画像ファイル,write,Ouput),
put_chars(Output,_擬似カラー画像ヘッダ部文字ならび),
close(Output),
open(_擬似カラー画像ファイル,append,Ouput2,[type=binary]),
put_bytes(Output2,_擬似カラー画像データ部値ならび),
close(Output2),!.
グレースケール画像の輝度値を量子化し、量子化された画像を量子化レベルに応じて疑似カラー化する([],[]) :- !.
グレースケール画像の輝度値を量子化し、量子化された画像を量子化レベルに応じて疑似カラー化する([_グレースケール画素の輝度|R1],[R,G,B|R2]) :-
輝度範囲(_量子化レベル,_輝度範囲下限,_輝度範囲上限),
_グレースケール画素の輝度 >= _輝度範囲下限,
_グレースケール画素の輝度 =< _輝度範囲上限,
擬似カラー設定(_量子化レベル,R,G,B),
グレースケール画像の輝度値を量子化し、量子化された画像を量子化レベルに応じて疑似カラー化する(R1,R2).
>>389 % Prolog (その二)
量子化レベル(0).
量子化レベル(1).
量子化レベル(2).
量子化レベル(3).
量子化レベル(4).
量子化レベル(5).
量子化レベル(6).
量子化レベル(7).
擬似カラー設定(0,255,0,0).
擬似カラー設定(1,255,160,0).
擬似カラー設定(2,190,255,0).
擬似カラー設定(3,30,255,0).
擬似カラー設定(4,0,255,130).
擬似カラー設定(5,0,220,255).
擬似カラー設定(6,0,60,255).
擬似カラー設定(7,100,0,255).
輝度値の範囲(0,0,31).
輝度値の範囲(1,32,63).
輝度値の範囲(2,64,95).
輝度値の範囲(3,96,127).
輝度値の範囲(4,128,159).
輝度値の範囲(5,160,191).
輝度値の範囲(6,192,223).
輝度値の範囲(7,224,255).
>>358 % Prolog
'dy/dx=(1-y)/15の微分方程式をルンゲクッタ法を用いてx=0〜100までの値を求める'(L) :-
ルンゲ・クッタ法(0.0,100,0.0,1.0,L).
f(X,Y,Z) :- Z is (1.0 - Y) / 15.
ルンゲ・クッタ法(X,M,_,_,[]) :- X >= M,!.
ルンゲ・クッタ法(X,M,Y,H,[[X,Y2]|R]) :-
f(X,Y,Z1),C1 is Z1 * H,
f(X + H / 2.0,Y + C1 / 2.0,Z2),C2 is Z2 * H,
f(X + H / 2.0,Y + C2 / 2.0,Z3),C3 is Z3 * H,
f(X + H ,Y + C3,Z4),C4 is Z4 * H,
D is (C1 + 2.0 * C2 + 2.0 * C3 + C4) / 6.0,
Y2 is Y + D,
X2 is X + H,
ルンゲ・クッタ法(X2,M,Y2,H,R).
http://pc11.2ch.net/test/read.cgi/db/1252492296/922 # 売上データベースがあって、主テーブルの項目は、売上番号、得意先名、日付。
# 明細テーブルの項目は、明細番号、売上番号、商品、個数。売上番号で1対多でリンクしています。
# 商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力したいです。
# ただし得意先名は同名を1とカウントしたいのです。
# SELECT 明細.商品, Sum(明細.個数) AS 個数計, Count(主.得意先) AS 得意先計
# FROM 主 INNER JOIN 明細 ON 主.売上番号 = 明細.売上番号
# WHERE 主.日付 Between '5/1/2010' And '5/4/2010'
# GROUP BY 明細.商品
# HAVING 明細.商品='えんぴつ' or 明細.商品='筆';
# とすると、得意先計が複数カウント(同名は1とならない)してしまいます。
# どのように書いたらよいのでしょうか。
>>393 % Prolog
'商品(複数)と日付を指定して、 商品名 個数計 得意先計の一覧を出力する'(_商品ならび,_日付下限,_日付上限,X) :-
findall([_商品,_個数,_得意先名],(主(_売上番号,_得意先名,_日付),明細(_明細番号,_売上番号,_商品,_個数),member(_商品,_商品ならび),_日付@>=_日付下限,_日付@=<_日付上限),_選択ならび),
findsetof([_商品,_得意先名],member([_商品,_個数,_得意先名],_選択ならび),_鍵ならび),
findall([_商品,_個数計,_得意先名],(member([_商品,_得意先名],_鍵ならび),findsum(_個数,member([_商品,_個数,_得意先名],_選択ならび),_個数計)),X).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/801 # [1] 授業単元:プログラミング演習
# [2] 問題文:
# テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上
# 実行例
#
# 84 <--キーボードから点数入力
# 84点 <--入力した点数を表示
# 95
# 95点
# 48
# 48点
# 66
# 66点
# 80
# 80点
# 999 <--データの終わり(999点とは表示しない)
# 合計点=373点
# 平均点=74.6点
# 受験者数=5名
# 合格者数=4名
>>396 % Prolog
テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終
わりの999(999点と表示しない)合格者は60点以上 :-
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび),
合計点(_点数ならび,_合計点),
平均点(_点数ならび,_平均点),
受験者数(_点数ならび,_受験者数),
合格者数(_点数ならび,_合格者数),
表示する('合計点=%t点\n平均点=%t名\n受験者数=%t名\n合格者数=%t名\n',[_合計点,_平均点,_受験者数,合格者数]).
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび) :-
催促付き整数入力('点数を入力してください(データの終わりの999) : ',_点数),
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,_点数ならび).
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[]) :-
'ただし、データの終わりの999(999点と表示しない)'(_点数),!.
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[_点数|R]) :-
write_formatted('%t点\n',[_点数]),
get_integer(_次の点数),
'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_次の点数,R).
合計点(_点数ならび,_合計点) :- sum(_点数ならび,_合計点).
平均点(_点数ならび,_平均点) :- avg(_点数ならび,_平均点).
受験者数(_点数ならび,_受験者数) :- length(_点数ならび,_受験者数).
合格者数(_点数ならび,_合格者数) :- count((member(_点数,_点数ならび),_点数>=60),_合格者数).
表示する(Format,_値ならび) :- write_formatted(Format,_値ならび).
>>395 % Prolog ディレクトリをget_byte/2できるPrologはないと思う。シェル経由で呼び出してみる。
指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス) :-
指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび),
一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス,_ディレクトリの情報ならび).
指定したディレクトリの情報を取得(_ディレクトリのパス,_ディレクトリの情報ならび) :-
concat_atom(['ls -l ',_ディレクトリのパス],S),
shs(S,_ディレクトリ情報ならび),!.
一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのパス) :-
write_formatted('%%% ディレクトリ=%t %%%\n',[_ディレクトリのパス]),
一覧を表示する(_ディレクトリのパス),
サブディレクトリがあればその一覧も表示する。(_ディレクトリのパス).
一覧を表示する([]) :- write('\n'),!.
一覧を表示する([_行|R]) :- write_formatted('%t\n',[_行]),一覧を表示する(R).
サブディレクトリがあればその一覧も表示する([]) :- !.
サブディレクトリがあればその一覧も表示する([_行|R]) :-
sub_atom(_行,0,1,_,d),
ディレクトリのパスを取得(_行,_ディレクトリのパス),
指定したディレクトリの一覧を表示する。サブディレクトリがあればその一覧も表示する(_ディレクトリのバス),
サブディレクトリがあればその一覧も表示する(R),!.
サブディレクトリがあればその一覧も表示する([_|R]) :- サブディレクトリがあればその一覧も表示する(R).
ディレクトリのパスを取得(_行,_ディレクトリのパス) :- split(_行,[' '],L),last(L,_ディレクトリのパス).
>>359 % Prolog
バブルソート(L1,L2) :- バブルソート(L1,[],L2).
バブルソート([],L,L) :- !.
バブルソート([A|R1],L1,L) :- バブルソート(A,R1,R2,L1,L2),バブルソート(R2,L2,L).
バブルソート(A,[],[],L1,[A|L1]) :- !.
バブルソート(A,[B|R1],[A|R2],L1,L2) :- A @=< B,バブルソート(B,R1,R2,L1,L2).
バブルソート(A,[B|R1],[B|R2],L1,L2) :- A @> B,バブルソート(A,R1,R2,L1,L2),!.
>>403 % Prolog
'直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :-
A == B,
C is sqrt(A ^ 2 + B ^ 2).
'直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :-
B > A,
C is sqrt(B ^ 2 + A ^ 2).
'直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :-
B > A,
C is sqrt(B ^ 2 - A ^ 2).
'直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :-
A > B,
C is sqrt(A ^ 2 + B ^ 2).
'直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :-
A > B,
C is sqrt(A ^ 2 - B ^ 2).
ラジアン値(_角度0〜180,_ラジアン値) :- _ラジアン値 is pi * _角度0〜180 / 180.
sin(_角度0〜180,Sin値) :- ラジアン値(_角度0〜180,_ラジアン値),Sin値 is sin(_ラジアン値).
cos(_角度0〜180,Cos値) :- ラジアン値(_角度0〜180,_ラジアン値),Cos値 is cos(_ラジアン値).
>>404 % Prolog
π(3.141592).
ラジアン値(_角度0〜180,_ラジアン値) :-
_角度0〜180>=0,
_角度0〜180=<180,
π(Pi),
_ラジアン値 is Pi * _角度0〜180 / 180.
http://pc12.2ch.net/test/read.cgi/tech/1261057499/814 # Schemeの課題なのですが、
#
# リストLと数nを引数として受け取り,nをLの末尾に追加する関数add-to-tailを定義しなさい.
# ;; (add- to-tail (list 0 1 2) 3) should return (list 0 1 2 3)
#
# 今回の授業ではlistの扱いを学び、再帰関数作成を主に扱っていたので、おそらく再帰関
# 数を用いて作成せよ、という事なのでしょうが、全く糸口が掴めません。
# restやfirstしか教わってないので、この二つを用いてadd-to-tailを組むにはどうすれば良
# いのでしょうか。何かヒントのようなものをお願いします。
# ちなみに、色々ググってみたら、append手続きというものを使えば一応は出来たのですが、
# 再帰関数を使っていないので、おそらく評価して貰えないと思います。
>>406 % Prolog
add_to_tail([],N,[N]).
add_to_tail([A|R1],N,[A|R2]) :-
add_to_tail(R1,N,R2).
http://pc12.2ch.net/test/read.cgi/tech/1273368706/94 # 9×9の2次元配列を3×3の小さなブロック9個で区切り左上から
# 0,1,2,
# 3,4,5,
# 6,7,8,と番号をつけるとします。
# 各番号のブロックにある数字を足し、1次元の配列にブロック内の数の合計を保存したいです。
# 以下のプログラムを書いた場合、1次元の配列の添え字を工夫すると簡単にプログラミングできる
# と聞いたのですが、どうしても思いつきません。アドバイスお願いします。
#
# (i=0;i<10;i++)
# (j=0;j<10;j++)
# total[ここの添え字を工夫]=data[i][j];
#
# totalを2次元配列にする方法は思いつくのですが、1次元に保存する方法がどうしてもわかりません。
# よろしくお願いします。
>>408 % Prolog
各ブロックの合計数を保存する(_9マス,_保存合計値ならび) :-
findall(S,(
'9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス),
flat(_3マス,L1),
加算(L1,Sum),
S is truncate(Sum)),
_保存合計値ならび).
'9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス) :-
for(0,N,8),
U is (N // 3) * 3,
U1 is U + 1,
U2 is U1 + 2,
V is (N mod 3) * 3,
V1 is V + 1,
V2 is V1 + 2,
findall(L1,
( for(U1,M,U2),list_nth(M,_9マス,L),
findall(A,(for(V1,M2,V2),list_nth(M2,L,A)),L1)),
_3マス).
http://pc11.2ch.net/test/read.cgi/db/1252492296/933 # DEFENDANT GUILT JOROR
# -----------+-------+--------
# HOGE | 1 | FOO
# HOGE | 0 | BAR
# HOGE | 1 | BAZ
# FUGA | 1 | FOO
# FUGA | 1 | BAR
# FUGA | 1 | BAZ (T_JUDGEテーブル)
#
# 上記のテーブルにDEFENDANTで絞込をかけた結果、GUILTに一つでも0がある場合
# 1行も取得せず、全部1の場合はそのまま一覧を返す場合どのようなSQLを書けば
# よいでしょうか?この場合、HOGEで絞り込むと0行、FUGAなら3行と言う具合です。
>>410 % Prolog
'T_JUDGEテーブル'('HOGE',1,'FOO').
'T_JUDGEテーブル'('HOGE',0,'BAR').
'T_JUDGEテーブル'('HOGE',1,'BAZ').
'T_JUDGEテーブル'('FUGA',1,'FOO').
'T_JUDGEテーブル'('FUGA',1,'BAR').
'T_JUDGEテーブル'('FUGA',1,'BAZ').
'T_JUDGEテーブルにDEFENDANTで絞込をかけた結果、GUILTに一つでも0がある場合1行も取得せず、全部1の場合はそのまま一覧を返す'(_DEFENDANT,_GUILT,_JOROR) :-
findsetof(_DEFENDANT,('T_JUDGEテーブル'(_DEFENDANT,_GUILT,_JOROR),\+(_GUILT=0)),L1),
findsetof(_DEFENDANT,('T_JUDGEテーブル'(_DEFENDANT,_GUILT,_JOROR),_GUILT=0),L2),
差集合(L1,L2,L3),
member(_DEFENDANT,L3),
T_JUDGEテーブル(_DEFENDANT,_GUILT,_JOROR).
412 :
デフォルトの名無しさん :2010/05/21(金) 21:39:56
413 :
デフォルトの名無しさん :2010/05/21(金) 21:40:59
http://pc12.2ch.net/test/read.cgi/tech/1269438098/838 # [1] 授業単元:応用情報プログラミング
# [2] 問題文(含コード&リンク):
#
# ・main関数で三つのint型変数a,b,cを宣言し、キーボードでから値を入力せよ。
# ・そして三つの変数を大きい順に入れ替える関数sortingを作成せよ。
# ・関数sortingは変数a,b,cのアドレスを引数として受け取ること。返却値は持たない。
# ・関数sorting内では、2つの変数の大きさを比べ、値を入れ替えるためのint型変数tmpを宣言すること。
# ・値の大きさの比較は,aとb、aとc、bとcの三回行う。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/842 # [1] 授業単元:自学
# [2] 問題文(含コード&リンク):擬似乱数を用いて大吉(excellent luck)中吉(good luck)吉(good luck)凶(bad luck)
大凶(worst luck)を出力し
# それぞれの項目のコード4,3,2,1,0を返す関数fortune()を作成せよ
# ただしそれぞれの項目が現れる確立は順に5.0,20.0,50.0,20.0,5.0%とする。
# またこの関数を用いて2000回のサンプリングを行ったときそれぞれの項目の出現割合を出力するプログラムを作成し
上記の割合とほぼ同じ値が得られていることを検証せよ。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/855 # [1] 授業単元: プログラム演習
# [2] 問題文(含コード&リンク): 2×2行列Aと二次元ベクトルxとの積Axを計算する関数linear_trans()を実装しなさい。ただし、関数linear_trans()は以下のような仕様とする。
# void linear_trans(double matA [2][2], double vecx[2], double vecy[2])
# {
# /*matA × vecx = vecy を実装*/
# }
#
http://pc11.2ch.net/test/read.cgi/db/1252492296/935 # テーブル tb_mastr tb_office tb_area
# master_id office_code area_code
# name office_name area_name
# office_id
# area_id
#
# のテーブルがあり、office_idでtb_officeのoffice_nameを取得し、area_idでtb_areaのarea_nameを
# 取得したいのですが、2つ以上のテーブルを結合?させる場合どのように記述すれば
# いいのでしょうか?
#
# 1対1なら以下の記述でできるのですが、同時にarea_idにarea_codeを割り当てる記述が
# 見つからなくて困っています。
>>419 % Prolog
2つ以上のテーブルを結合事例 :-
write('master_id,name,office_name,area_id\n------------------------------------------------------\n'
),
'office_idでtb_officeのoffice_nameを取得し、area_idでtb_areaのarea_nameを取得'(_master_id,_name,_office_name,_area_name),
write_formatted('%t,%t,%t,%t\n',[_master_id,_name,_office_name,_area_name]),
fail.
2つ以上のテーブルを結合事例.
'office_idでtb_officeのoffice_nameを取得し、area_idでtb_areaのarea_nameを取得'(_master_id,_name,_office_name,_area_name) :-
tb_master(_master_id,name,_office_id,_area_id),
_office_id = _office_code,
tb_office(_office_code,_office_name),
_area_code = _area_id,
tb_area(_area_code,_area_name).
>>414 % Prolog
素数である(N) :-
Max is truncate(sqrt(N)),
for(2,M,Max),
Mod is N mod M,
Mod = 0,!,
fail.
素数である(_).
>>414 % Prolog 書き直し。
素数である(N) :-
Max is truncate(sqrt(N)),
for(2,M,Max),
Mod is N mod M,
Mod = 0,!,
fail.
素数である(_).
>>424 % Prolog
5個の値を入力してその中にひとつでも偶数があれば『偶』、奇数しかなければ『奇』と出力する :-
for(1,N,5),
get_integer(N),
0 is N mod 2,
write('偶\n'),!.
5個の値を入力してその中にひとつでも偶数があれば『偶』、奇数しかなければ『奇』と出力する :-
write('奇\n').
>>425 % Prolog
3人の成績を入力すると最高点を出力する :-
3人の成績を入力すると(L),
最高点を出力する(L).
3人の成績を入力すると(L) :-
findall(N,for(1,M,3),get_integer(N)),L).
最高点を出力する(L) :-
最高点(L,_最高点),
write('最高点は %t点です\n',[_最高点]).
最高点([A|R],X) :- 最高点(R,A,X) .
最高点([],X,X) :- !.
最高点([A|R],B,X) :- A @> B,最高点(R,A,X),!.
最高点([_|R],A,X) :- 最高点(R,A,X).
http://pc12.2ch.net/test/read.cgi/tech/1269438098/886 # おしえてください!!!
# {
# int a;
# printf("西暦年を入力してください ");
# scanf("%d", &a);
# if (a%400==0 || (a%4==0 && n%100 !=0))
# printf("西暦%d年は,うるう年です \n" ,a );
# else
# printf("西暦%d年は,うるう年ではありません \n" ,a);
# }
# のプログラムを論理演算子(&&,||)無しでお願いします!!
>>430 % Prolog
うるう年かどうか :-
催促付き整数入力('西暦年を入力してください ',_年),
うるう年かどうか(_年).
うるう年かどうか(_年) :-
うるう年(_年),
write_formatted('西暦%d年は,うるう年です \n" ,[_年]).
うるう年かどうか(_年) :-
\+(うるう年(_年)),
write_formatted('西暦%d年は,うるう年ではありません \n" ,[_年]).
うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- \+(0 is _年 mod 4),fail.
>>415 % Prolog
fortune(_サンプリング回数,_出現割合ならび) :-
_サンプリング回数 > 0,
M is random mod 100,
_サンプリング回数の一 is _サンプリング回数 - 1,
fortune(_サンプリング回数の一,_出現割合ならびの一),
fortune(M,_出現割合ならびの一,_出現割合ならび).
fortune(0,[]).
fortune(N,[X|R],[Y|R]) :- 分布(大吉,N1,N2),N >= N1,N =< N2,Y is X + 1,!.
fortune(N,[A,X|R],[A,Y|R]) :- 分布(中吉,N1,N2),N >= N1,N =< N2,Y is X + 1,!.
fortune(N,[A,B,X|R],[A,B,Y|R]) :- 分布(吉,N1,N2),N >= N1,N =< N2,Y is X + 1,!.
fortune(N,[A,B,C,X|R],[A,B,C,Y|R]) :- 分布(凶,N1,N2),N >= N1,N =< N2,Y is X + 1,!.
fortune(N,[A,B,C,D,X|R],[A,B,C,D,Y|R]) :- 分布(大凶,N1,N2),N >= N1,N =< N2,Y is X + 1,!.
分布(大吉,0,4).
分布(中吉,5,24).
分布(吉,25,74).
分布(凶,75,94).
分布(大凶,95,99).
>>418 % Prolog (その一)
三角形の角度(_辺1,_辺2,_辺3,_辺1の対角の角度,_辺2の対角の角度,_辺3の対角の角度) :-
辺の対角(_辺1,_辺2,_辺3,_辺1の対角の角度),
辺の対角(_辺2,_辺1,_辺3,_辺2の対角の角度),
辺の対角(_辺3,_辺2,_辺1,_辺3の対角の角度).
三角形の面積(_辺1,_辺2,_辺3,_面積) :-
S1 is (_辺1+_辺2+_辺3) / 2,
_面積 is sqrt(S1 * (S1 - _辺1) * (S1 - _辺2) * (S1 - _辺3)).
三角形の高さ(_辺1,_辺1,_辺2,_辺3,_高さ) :-
三角形の面積(_辺1,_辺2,_辺3,_三角形の面積),
_高さ is _三角形の面積 / _辺1 * 2.
>>418 % Prolog (その二)
辺の対角(_辺,_辺2,_辺3,_対角) :-
三角形の面積(_辺,_辺2,_辺3,_三角形の面積),
_高さ is _三角形の面積 / _辺 * 2,
_cos値1 is _高さ / _辺2,
_cos値2 is _高さ / _辺3,
_ラジアン角1 is acos(_cos値1),
_ラジアン角2 is acos(_cos値2),
辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角).
辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :-
(_辺2 ^ 2 - _高さ ^ 2) =< (_辺 ^ 2),
(_辺3 ^ 2 - _高さ ^ 2) =< (_辺 ^ 2),
_対角 is 180 * (_ラジアン角1 + _ラジアン角2) / pi.
辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :-
(_辺2 ^ 2 - _高さ ^ 2) > (_辺 ^ 2),
_対角 is 180 * (_ラジアン角1 - _ラジアン角2) / pi.
辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :-
(_辺3 ^ 2 - _高さ ^ 2) > (_辺 ^ 2),
_対角 is 180 * (_ラジアン角2 - _ラジアン角1) / pi.
>>436 (
>>418 )
% Prolog 訂正。
>>436 だと誤差が大きくなってしまうかな。
辺の対角(_辺,_辺2,_辺3,_対角) :-
三角形の面積(_辺,_辺2,_辺3,_三角形の面積),
_高さ is _三角形の面積 / _辺 * 2,
_ラジアン角1 is acos(_高さ / _辺2),
_ラジアン角2 is acos(_高さ / _辺3),
辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角).
>>438 補足
# こんな入力・出力例でいいの?
#
# Input:
#
# 2
# 1,1,murayama
# 1,2,sugano
# 3,3,koizumi
# 3,4,abe
# 5,5,hatoyama
# 6,6,ozawa
#
# Output:
#
# #1
# Rep. Name: murayama
# Rep. Attendance: 1
# Group: 001
# Group Attendance: 2
#
# #2
# Rep. Name: koizumi
# Rep. Attendance: 1
# Group: 003
# Group Attendance: 2
>>441 % Prolog
'10マスある双六で1〜6のランダムの値だけ進むのを繰り返してゴールを目指す。ぴったりじゃないと余った分引き返す。'(_双六のマス表現) :-
双六のマス(0,11,_双六のマス表現).
双六のマス(Goal,Goal,_双六のマス表現) :- 双六のマス表現(N,Goal,_双六のマス表現),!.
双六のマス(N,Goal,_双六のマス表現) :- 双六のマス表現(N,Goal,_双六のマス表現).
双六のマス(N,Goal,_双六のマス表現) :-
M is (random mod 6) + 1,
双六のマス判定(N,Goal,M,N2),
双六のマス(N2,Goal,_双六のマス表現).
双六のマス判定(N,Goal,M,N2) :-
N + M =< Goal,
N2 is N + M,!.
双六のマス判定(N,Goal,M,N2) :-
N + M > Goal,
N1 is N + M - Goal,
N2 is N - N1,!.
双六のマス表現(0,_,'|スタート◎| _ _ _ _ _ _ _ _ _ _ |ゴール|\n') :- !.
双六のマス表現(Goal,Goal,'|スタート| _ _ _ _ _ _ _ _ _ _ |◎ゴール|\n') :- !.
双六のマス表現(N,Goal,_双六のマス表現) :-
N1 is N - 1,'N個の_ '(N1,S1),
N2 is Goal - N - 1,'N個の_ '(N2,S2),
concat_atom(['|スタート| ',S1,'◎',S2,' |ゴール|\n'],_双六のマス表現),!.
'N個の_ '(N) :- length(L,N1),all(L,'_ '),concat_atom(L,S),!.
http://pc12.2ch.net/test/read.cgi/tech/1269438098/921 # [1]授業単元:プログラミング
# [2]問題文:(1)scanfにより3つの正の整数a,b,cの値を入力する。
# (2)(i,j)要素がj+(a-1)*iであるa×b行列を定義する。
# (3)(i,j)要素がj-(b-1)*iであるb×c行列を定義する。
# (4)2つの行列の積を計算し、結果を表示する。
# [3]環境:windows,C++
# [4]期限:5月25日
# [5]なし
#
# よろしくおねがいします。
>>443 % Prolog
'(4)2つの行列の積を計算し、結果を表示する' :-
'3つの正の整数a,b,cの値を入力する'(_a,_b,_c),
'(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列1),
'(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列2),
行列の積(_行列1,_行列2,_行列の積),
行列の表示(_行列の積).
'3つの正の整数a,b,cの値を入力する'(_a,_b,_c) :-
get_split_line([' '],[_a,_b,_c]).
'(i,j)要素がj+(a-1)*iであるa×b行列を定義する'(_a,_b,_行列) :-
findall(L2,(for(1,_i,_a),findall(U,(for(1,_j,_b),U is _j + ( _a - 1 ) * _i),L2)),_行列).
'(i,j)要素がj-(b-1)*iであるb×c行列を定義する'(_b,_c,_行列) :-
findall(L2,(for(1,_i,_b),findall(U,(for(1,_j,_c),U is _j - ( _b - 1 ) * _i),L2)),_行列).
% 行列の積/2と行列の表示/1は
http://nojiriko.asia/prolog/c135_921.html を参照してください。
>>444 % Prolog
エンターキーを押せば次の処理に進める :- repeat,get_line('').
>>447 (
>>444 )
% Prolog これはマズかった。
エンターキーを押せば次の処理に進める :- repeat,get_line(''),!.
>>445 % Prolog
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示' :-
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計),
write_formatted('nの最大値=%t,そのときの合計=%t\n',[_nの最大値,_合計]).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計) :-
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(1,_nの最大値,0,_合計).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n,_nの最大値,_合計1,_合計) :-
_n2 is _n + 1,
_合計2 is _合計1 + _n,
_合計2 < 100,
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n2,_nの最大値,_合計2,_合計).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_nの最大値,_合計,_合計).
>>449 (
>>445 )
% Prolog 大間違い。
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示' :-
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計),
write_formatted('nの最大値=%t,そのときの合計=%t\n',[_nの最大値,_合計]).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計) :-
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(1,_nの最大値,0,_合計).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n,_nの最大値,_合計1,_合計) :-
_n2 is _n + 1,
_合計2 is _合計1 + _n,
_合計2 =< 1000,
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n2,_nの最大値,_合計2,_合計).
'1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_nの最大値,_合計,_合計).
>>451 % Prolog
'num0からnum50までの連番でフィールドがあるのですが、この中で、レコードの値が0より大きいものをSELECTするには
どうしたらいいでしょうか?'(_フィールド名・値ならび) :-
テーブル(_num0,_num1,_num2,_num3,_num4,_num5,_num6,_num7,_num8,_num9,_num10,
_num11,_num12,_num13,_num14,_num15,_num16,_num17,_num18,_num19,_num20,
_num21,_num22,_num23,_num24,_num25,_num26,_num27,_num28,_num29,_num30,
_num31,_num32,_num33,_num34,_num35,_num36,_num37,_num38,_num39,_num40,
_num41,_num42,_num43,_num44,_num45,_num46,_num47,_num48,_num49,_num50),
findall([_フィールド名,X],(
for(0,N,50),list_nth(N,[_num0,_num1,_num2,_num3,_num4,_num5,_num6,_num7,_num8,_num9,_num10,
_num11,_num12,_num13,_num14,_num15,_num16,_num17,_num18,_num19,_num20,
_num21,_num22,_num23,_num24,_num25,_num26,_num27,_num28,_num29,_num30,
_num31,_num32,_num33,_num34,_num35,_num36,_num37,_num38,_num39,_num40,
_num41,_num42,_num43,_num44,_num45,_num46,_num47,_num48,_num49,_num50],X),
X > 0,
concat_atom([num,N],_フィールド名)),
_フィールド名・値ならび).
>>452 (
>>451 )
% Prolog また間違えた。list_nth/3 は1から数えます。
'num0からnum50までの連番でフィールドがあるのですが、この中で、レコードの値が0より大きいものをSELECTするには
どうしたらいいでしょうか?'(_フィールド名・値ならび) :-
テーブル(_num0,_num1,_num2,_num3,_num4,_num5,_num6,_num7,_num8,_num9,_num10,
_num11,_num12,_num13,_num14,_num15,_num16,_num17,_num18,_num19,_num20,
_num21,_num22,_num23,_num24,_num25,_num26,_num27,_num28,_num29,_num30,
_num31,_num32,_num33,_num34,_num35,_num36,_num37,_num38,_num39,_num40,
_num41,_num42,_num43,_num44,_num45,_num46,_num47,_num48,_num49,_num50),
findall([_フィールド名,X],(
for(0,N,50),
N1 is N + 1,
list_nth(N1,[_num0,_num1,_num2,_num3,_num4,_num5,_num6,_num7,_num8,_num9,_num10,
_num11,_num12,_num13,_num14,_num15,_num16,_num17,_num18,_num19,_num20,
_num21,_num22,_num23,_num24,_num25,_num26,_num27,_num28,_num29,_num30,
_num31,_num32,_num33,_num34,_num35,_num36,_num37,_num38,_num39,_num40,
_num41,_num42,_num43,_num44,_num45,_num46,_num47,_num48,_num49,_num50],X),
X > 0,
concat_atom([num,N],_フィールド名)),
_フィールド名・値ならび).
>>451 % Prolog
'num0からnum50までの連番でフィールドがあるのですが、この中で、レコードの値が0より大きいものをSELECTするには
どうしたらいいでしょうか?'(_フィールド名・値ならび) :-
length(L,51),
P =.. [テーブル|L],
call(P),
findall([_フィールド名,X],(
for(0,N,50),
N2 is N + 1,
list_nth(N2,L,X),
X > 0,
concat_atom([num,N],_フィールド名)),
_フィールド名・値ならび).
>>454 (
>>451 )
% Prolog 改行が変なところに入ってしまった。
'num0からnum50までの連番でフィールドがあるのですが、この中で、レコードの値が0より大きいものをSELECTするにはどうしたらいいでしょうか?'(_フィールド名・値ならび) :-
length(L,51),
P =.. [テーブル|L],
call(P),
findall(_フィールド名,(
for(0,N,50),
N2 is N + 1,
list_nth(N2,L,X),
X > 0,
concat_atom([num,N],_フィールド名)),
_フィールド名・値ならび).
http://pc11.2ch.net/test/read.cgi/db/1252492296/960 # ID|A|B|C|
# ---------
# 1 |1|2|3|
# 2 |3|4|5|
# 3 |7|8|9| (テーブルFOO)
#
# select FOO.ID,FOO.C from FOO,(select 1 AS EXPR) AS A
# where FOO.A = A.EXPR or FOO.B = A.EXPR or FOO.C = A.EXPR;
#
# こんなかんじで得たCの内容を1のところにセットして
# 該当する行を全てリストアップするSQLはどう書けばよいでしょうか?
>>456 % Prolog
'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C1) :-
'FOO'(ID,A,B,C),
'1のところをCの値に置換'(A,B,C,A1,B1,C1).
'1のところをCの値に置換'(1,B,C,A1,B1,C1) :- '1のところをCの値に置換の一'(C,B,C,C,B1,C),!.
'1のところをCの値に置換'(A,1,C,A1,B1,C1) :- '1のところをCの値に置換の一'(A,C,C,A1,C,C),!.
'1のところをCの値に置換'(A,B,1,A,B,1) :- \+(A=1),\+(B=1),!.
'1のところをCの値に置換の一'(1,B,C,C,B1,C) :- '1のところをCの値に置換の一'(C,B,C,C,B1,C),!.
'1のところをCの値に置換の一'(A,1,C,A1,C,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C,C),!.
'1のところをCの値に置換の一'(A,B,C,A,B,C).
>>457 (
>>456 )
% Prolog 訂正。
'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-
'FOO'(ID,A,B,C),
'1のところをCの値に置換'(A,B,C,A1,B1).
'1のところをCの値に置換'(A,B,1,A,B) :- !.
'1のところをCの値に置換'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!.
'1のところをCの値に置換'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!.
'1のところをCの値に置換の一'(1,B,C,C,B1) :- '1のところをCの値に置換の一'(C,B,C,C,B1),!.
'1のところをCの値に置換の一'(A,1,C,A1,C) :- '1のところをCの値に置換の一'(A,C,C,A1,C),!.
'1のところをCの値に置換の一'(A,B,C,A,B).
>>456 % Prolog
'A,B,Cいずれかに1がある行の1のところにCをセットした行'(ID,A1,B1,C) :-
'FOO'(ID,A,B,C),
'1のところをCの値に置換'(A,B,C,A1,B1).
'1のところをCの値に置換'(A,B,1,A,B) :- !.
'1のところをCの値に置換'(1,1,C,C,C) :- !.
'1のところをCの値に置換'(1,B,C,C,B) :- !.
'1のところをCの値に置換'(A,1,C,A,C) :- !.
>>461 これも「C/C++の宿題片付けます 135代目」からの出題です。スレが
もうすぐdatに行くのと、問題文が長すてここに転記できないため、
コピーさせていただきました。
>>429 % prolog (実は元の問題文に文字種は英半角のみとありました) バランスの悪い問題です。
文字種(英小文字,a,z).
文字種(英大文字,'A','Z').
入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力する(_テキストファイル,_出力ファイル) :-
findall(_文字種,文字種(_文字種,_,_),_文字種ならび),
get_chars(_テキストファイル,Chars),
文字を種類別に使用回数を表示し(Chars,_文字種ならび,L),
降順にソートし出力する(_出力ファイル,Chars).
文字を種類別に使用回数を表示し(_,[],[]) :- !.
文字を種類別に使用回数を表示し(Chars,[_文字種|R1],[[_使用回数,_文字種]|R2]) :-
count((member(A,Chars),文字種(_文字種,C1,C2),A @>= C1,A @=< C2),_使用回数),
write_formatted('%t %t回\n',[_文字種,_使用回数]),
文字を種類別に使用回数を表示し(Chars,R1,R2).
降順にソートし出力する(_出力ファイル,L) :-
降順にソートし(L,L2),
open(_出力ファイル,write,Output),
出力する(Output,L2),
close(Output),!.
降順にソートし(L,L2) :- sort(L,L1),reverse(L1,L2),!.
出力する(Output,[]) :- !.
出力する(Output,[[_使用回数,_文字種]|R]) :- write_formatted(Output,'%t %t回\n',[_文字種,_使用回数]),出力する(Output,R).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/2 # [1] 授業単元:プログラミング演習
# [2] 問題文:単価と数量を入力するごとに金額を表示し、データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。なお、入力データのの終わりは単価0とする。
# 実行例
# 300 2 <ーーデータ入力
# 300*2=600円 <ー表示
# 250 5
# 250*5=1250円
# 100 1
# 100*1=100円
# 1500 2
# 1500*2=3000円
# 350 4
# 350*4=1400円
# 0 0 <ーーデータの終わり
# 合計金額 6350円 <ーー合計表示
# 1000円札 7枚 <ーー1000円札の枚数表示
# 釣り銭 650円 <ーー釣り銭の金額表示
>>466 % Prolog (その一)
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら、それ以降は奇数のみの和の計算に切り替える。 そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して偶数の和と奇数の和を表示させる。 :-
get_integer(N1),get_integer(N2),
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N1,N2,_偶数の和),
get_integer(N3),get_integer(N4),
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N3,N4,_奇数の和),
偶数の和と奇数の和を表示させる。(_偶数の和,_奇数の和),
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N1,N2,0) :-
'もし2回連続して奇数が読み込まれたら'(N1,N2),!.
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N1,N2,_偶数の和) :-
偶数(N1),
get_integer(N3),
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N2,N3,_偶数の和の二),
_偶数の和 is _偶数の和の二 + N,!.
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N1,N2,_偶数の和) :-
奇数(N1),
get_integer(N3),
キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら(N2,N3,_偶数の和).
>>466 % Prolog (その二)
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N3,N4,0) :- 偶数が2回連続読み込まれたら(N3,N4),!.
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N3,N4,_合計) :- 奇数が2回連続読み込まれたら(N3,N4),_合計 is N3 + N4,!.
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N3,N4,_合計) :- 奇数(N3),偶数(N4),
get_integer(N5),
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N4,N5,_合計の二),
_合計 is _合計の二 + N3.
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N3,N4,_合計) :- 偶数(N3),奇数(N4),
get_integer(N5),
それ以降は奇数のみの和の計算に切り替える。そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して(N4,N5,_合計).
もし2回連続して奇数が読み込まれたら(N1,N2) :- 奇数(N1),奇数(N2).
奇数が2回連続して読み込まれたら(N1,N2) :- 偶数(N1),偶数(N2).
偶数が2回連続して読み込まれたら(N1,N2) :- 奇数(N1),奇数(N2).
偶数(N) :- 0 is N mod 2.
奇数(N) :- 1 is N mod 2.
偶数の和と奇数の和を表示させる。(_偶数の和,_奇数の和) :- write_formatted('偶数の和 = %t\n奇数の和 = %t\n',[_偶数の和,奇数の和]).
>>467 % Prolog
単価と数量を入力するごとに金額を表示し、データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。なお、入力データのの終わりは単価0とする。 :-
単価と数量の入力(_単価,_数量),
'単価と数量を入力(入力データの終わりは単価0とする)するごとに金額を表示し、'(_単価,_数量,_合計金額),
データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。
'単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(0,_,0) :- !.
'単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(_単価,_数量,_合計金額) :-
_金額 is _単価 * _数量,
write_formatted('%t * %t = %t円\n',[_単価,_数量,_金額]),
単価と数量の入力(_単価_2,_数量_2),
'単価と数量を入力(入力データのの終わりは単価0とする)するごとに金額を表示し、'(_単価_2,_数量_2,_合計金額_2).
_合計金額 is _合計金額_2 + _金額,!.
単価と数量の入力(_単価,_数量) :-
get_line(Line),
単価と数量の入力(Line,_単価,_数量).
単価と数量の入力(Line,0,0) :- split(Line,[' '],[0]),!.
単価と数量の入力(Line,_単価,_数量) :- split(Line,[' '],[_単価,_数量]).
データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。(_合計金額) :-
0 is _合計金額 mod 1000,
_千円札の枚数 is _合計金額 // 1000,
write_formatted('千円札の枚数 %t枚,釣り銭 %t円\n',[_千円札の枚数,0]),!.
データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。(_合計金額) :-
\+(0 is _合計金額 mod 1000),
_千円札の枚数 is (_合計金額 // 1000) + 1,
_釣り銭 is 1000 * _千円札の枚数 - _合計金額,
write_formatted('千円札の枚数 %t枚,釣り銭 %t円\n',[_千円札の枚数,0]),!.
>>464 % Prolog (その一)
三目ならべ :- 三目ならべ(○,[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]).
三目ならべ(_手番,LL) :-
勝ちパターン(LL),
write_formatted('%tの勝ちです\n',[_手番]),!.
三目ならべ(_手番,LL) :-
flat(LL,L),
\+(member(' ',L)),
write('引き分けです\n'),!.
三目ならべ(○,LL) :-
着手(○,_行,_列),
list_nth(_行,LL,L2),
list_nth(_列,L1,' '),
ならびの位置指定置換(_列,○,L1,L2).
ならびの位置指定置換(_行,L2,LL,LL2),
三目ならべ(×,LL2).
三目ならべ(×,LL) :-
着手(×,_行,_列),
list_nth(_行,LL,L1),
list_nth(_列,L1,' '),
ならびの位置指定置換(_列,×,L1,L2),
ならびの位置指定置換(_行,L2,LL,LL2),
三目ならべ(○,LL2).
着手(_手番,_行,_列) :-
repeat,write_formatted('%tの手番です。行,列を入力してください : ',[_手番]),
get_line(Line),split(Line,[' ',','],[_行,_列]),!.
>>464 % Prolog (その二)
勝ちパターン([[○,○,○],_,_]).
勝ちパターン([_,[○,○,○],_]).
勝ちパターン([_,_,[○,○,○]).
勝ちパターン([[○,_,_],[○,_,_],[○,_,_]]).
勝ちパターン([[_,○,_],[_,○,_],[_,○,_]]).
勝ちパターン([[_,_,○],[_,_,○],[_,_,○]]).
勝ちパターン([[○,_,_],[_,○,_],[_,_,○]]).
勝ちパターン([[_,_,○],[_,○,_],[○,_,_]]).
勝ちパターン([[×,×,×],_,_]).
勝ちパターン([_,[×,×,×],_]).
勝ちパターン([_,_,[×,×,×]).
勝ちパターン([[×,_,_],[×,_,_],[×,_,_]]).
勝ちパターン([[_,×,_],[_,×,_],[_,×,_]]).
勝ちパターン([[_,_,×],[_,_,×],[_,_,×]]).
勝ちパターン([[×,_,_],[_,×,_],[_,_,×]]).
勝ちパターン([[_,_,×],[_,×,_],[×,_,_]]).
ならびの位置指定置換(1,A,[_|R],[A|R]) :- !.
ならびの位置指定置換(N,A,[B|R1],[B|R2]) :-
integer(N),N1 is N - 1,
ならびの位置指定置換(N1,A,R1,R2).
ならびの位置指定置換([],A,L,L).
ならびの位置指定置換([Nth|R],A,L1,L) :-
ならびの位置指定置換(Nth,A,L1,L2),
ならびの位置指定置換(R,A,L2,L).
>>460 % Prolog (その一)
木(0,1,7).
木(1,2,5).
木(2,3,4).
木(3,-1,6).
木(4,-1,-1).
木(5,-1,6).
木(6,-1,-1).
木(7,8,10).
木(8,-1,9).
木(9,-1,-1).
木(10,-1,-1).
値(0,_).
値(1,_).
値(2,_).
値(3,_).
値(4,_).
値(5,_).
値(6,_).
値(7,_).
値(8,_).
値(9,_).
値(10,_).
>>462 % Prolog (その二)
キューを用いる幅優先探索(_キュー) :- キューは空である(_キュー),!.
キューを用いる幅優先探索(_キュー,_値) :-
キューから要素を取り出す(_木,_キュー1,_キュー2),
値を取り出す(_キュー2,_木,_値).
値を取り出す(_キュー,-1,_値) :-
キューを用いる幅優先探索(_キュー,_値).
値を取り出す(_キュー,_木,_値) :-
\+(_木 = -1),
値(_木,_値).
値を取り出す(_キュー,_木,_値) :-
キューを用いる幅優先探索(_キュー,_値).
木に値をセットする([],_キュー,_キュー).
木に値をセットする([A|R],_キュー1,_終了時のキュー) :-
キューから要素を取り出す(_要素,_キュー1,_キュー2),
retract(値(_要素,_)),
assertz(値(_要素,A)),
木に値をセットする(R,_キュー2,_終了時のキュー).
ならび要素をキューに追加する([],_キュー,_キュー).
ならび要素をキューに追加する([A|R],_キュー1,_キュー) :-
キューに要素を追加する(A,_キュー1,_キュー2),
ならび要素をキューに追加する(R,_キュー2,_キュー).
新しいキューを作る(X-X).
キューは空である(X-Y) :- X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).
キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y).
>>462 書き直し
% Prolog (その二)
キューを用いる幅優先探索(_キュー) :- キューは空である(_キュー),!.
キューを用いる幅優先探索(_キュー,_値) :-
キューから要素を取り出す(_木,_キュー1,_キュー2),
値を取り出す(_キュー2,_木,_値).
値を取り出す(_キュー,-1,_値) :-
キューを用いる幅優先探索(_キュー,_値).
値を取り出す(_キュー,_木,_値) :-
\+(_木 = -1),
値(_木,_値).
値を取り出す(_キュー,_木,_値) :-
キューを用いる幅優先探索(_キュー,_値).
木に値をセットする([],_キュー,_キュー).
木に値をセットする([A|R],_キュー1,_終了時のキュー) :-
キューから要素を取り出す(_要素,_キュー1,_キュー2),
retract(値(_要素,_)),
assertz(値(_要素,A)),
木に値をセットする(R,_キュー2,_終了時のキュー).
ならび要素をキューに追加する([],_キュー,_キュー).
ならび要素をキューに追加する([A|R],_キュー1,_キュー) :-
キューに要素を追加する(A,_キュー1,_キュー2),
ならび要素をキューに追加する(R,_キュー2,_キュー).
新しいキューを作る(X-X).
キューは空である(X-Y) :- X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).
キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y).
>>471 (
>>464 )
% Prolog 間違ったw これだと負けパターンでなくてはいけない。それではみっともないから。
% Prolog (その一)
三目ならべ :- 三目ならべ(×,[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]).
三目ならべ(_手番,LL) :-
勝ちパターン(LL),
write_formatted('%tの勝ちです\n',[_手番]),!.
三目ならべ(_手番,LL) :-
flat(LL,L),
\+(member(' ',L)),
write('引き分けです\n'),!.
三目ならべ(○,LL) :-
次の着手(×,_行,_列),
list_nth(_行,LL,L2),
list_nth(_列,L1,' '),
ならびの位置指定置換(_列,×,L1,L2).
ならびの位置指定置換(_行,L2,LL,LL2),
三目ならべ(×,LL2).
三目ならべ(×,LL) :-
次の着手(○,_行,_列),
list_nth(_行,LL,L1),
list_nth(_列,L1,' '),
ならびの位置指定置換(_列,○,L1,L2),
ならびの位置指定置換(_行,L2,LL,LL2),
三目ならべ(○,LL2).
次の着手(_手番,_行,_列) :-
repeat,write_formatted('%tの手番です。行,列を入力してください : ',[_手番]),
get_line(Line),split(Line,[' ',','],[_行,_列]),!.
>>477 % Prolog
入力された文字列の中にある文字が何個含まれるか :-
文字列を入力してください(_文字列),
確認したい文字を入力してください(_文字),
count(sub_atom(_文字列,_,1,_,_文字),_何個),
整数を全角文字表現に変換する(_何個,_何個の全角文字表現),
write_formatted('文字(%t)の数は%t文字です\n',[_文字,_何個の全角文字表現]).
文字列を入力してください(_文字列) :-
write('文字列を入力してください\n'),
get_line(_文字列).
確認したい文字を入力してください(_文字) :-
write('確認したい文字を入力してください\n'),
get_line(_文字列),
sub_atom(_文字列,0,1,_,_文字),!.
整数を全角文字表現に変換する(_整数,_整数の全角文字表現) :-
number_chars(_整数,Chars),
findall(_全角文字,(
member(A,Chars),
list_nth(N,['1','2','3','4','5','6','7','8','9','0'],A),
list_nth(N,['1','2','3','4','5','6','7','8','9','0'],_全角文字)),
L),
concat_atom(L,_整数の全角表現).
http://pc11.2ch.net/test/read.cgi/db/1274791771/10 # 質問です。
#
# ・DBMS名とバージョン
# MySQL5.1.42
#
# ・テーブルデータ(アクセスログのようなもの)
#
# ID CREATED
# --+---------------------
# 1 2010/5/10 12:00:00
# 2 2010/5/10 15:00:00
# 3 2010/5/11 13:15:00
# 4 2010/5/14 10:00:00
# 5 2010/5/15 16:30:00
#
# ・欲しい結果
# 対象テーブルの日毎のレコード数
# ただしグラフ化したいのでゼロの日はゼロと出力したい
#
# ・説明
# SELECT date_format(created,'%Y/%m/%d') d, count(*) from test_table group by d;
# とすると、日毎のレコード数が出力できるのは確認済です。
# スキマ(5/12&5/13分)をゼロで出力する簡単な方法はないでしょうか。
#
>>479 % Prolog
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日毎のレコード数) :-
min((テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_])),_起点日付),
max((テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_])),_終点日付),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_起点日付,_終点日付
,_日毎のレコード数).
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付,_終点日付,_日付,_日毎
のレコード数) :-
_日付 @=< _終点日付,
count(テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_]),_日毎のレコード数),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付1,_終点日付,_日付,_日
毎のレコード数) :-
_日付1 @=< _終点日付,
前日・今日(_日付1,_日付2),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付2,_終点日付,_
日付,_日毎のレコード数).
翌日は(_当日,_翌日) :-
atom_to_term(_当日,_当日項),
前日・今日(_当日項,_年/_月/_日),
concat_atom([_年,'/',_月,'/',_日],_翌日).
% 前日・翌日/2は
http://nojiriko.asia/prolog/nan_nichi_mae_go.html を参照してください。
>>482 (
>>479 ) 改行の手当てができてなかった。
% Prolog
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日毎のレコード数) :-
min((テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_])),_起点日付),
max((テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_])),_終点日付),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_起点日付,_終点日付,_日毎のレコード数).
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付,_終点日付,_日付,_日毎のレコード数) :-
_日付 @=< _終点日付,
count(テーブルデータ(_CREATED),split(_CREATED,[' '],[_日付,_]),_日毎のレコード数),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付1,_終点日付,_日付,_日毎のレコード数) :-
_日付1 @=< _終点日付,
前日・今日(_日付1,_日付2),
対象テーブルの日毎のレコード数ただしグラフ化したいのでゼロの日はゼロと出力したい(_日付2,_終点日付,_日付,_日毎のレコード数).
翌日は(_当日,_翌日) :-
atom_to_term(_当日,_当日項),
前日・今日(_当日項,_年/_月/_日),
concat_atom([_年,'/',_月,'/',_日],_翌日).
% 前日・翌日/2は
http://nojiriko.asia/prolog/nan_nichi_mae_go.html を参照してください。
>>480 % Prolog
'テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ' :-
get_lines('file.txt',Lines),
findall(Line2,(member(Line,Lines),replace_all(Line,good,bad,Line2)),Lines2),
put_lines('filea.txt',Lines2).
'テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ' :-
get_lines('file.txt',Lines),
findall([_文字数,_行],(member(_行,Lines),sub_atom(_行,_,_文字数,_,_行)),L1),
sort(L1,L2),
第二要素だけ選択してならびを反転する(L2,[],L3),
put_lines('fileb.txt',L3).
第二要素だけ選択してならびを反転する([],L,L) :- !.
第二要素だけ選択してならびを反転する([[_,A|_]|R1],L1,L) :-
第二要素だけ選択してならびを反転する(R1,[A|L1],L).
replace_all('',_,_,[]) :- !.
replace_all(Atom,Subatom,R_atom,[R_atom|R]) :-
sub_atom(Atom,0,Len,Len3,Subatom),
sub_atom(Atom(Len,Len3,_,Atom2),
replace_all(Atom2,Subatom,R_atom,R),!.
replace_all(Atom,Subatom,R_atom,[Atom1,R_atom|R]) :-
sub_atom(Atom,_,_,_,Atom1,Subatom,Atom2,_,_,_),
replace_all(Atom2,Subatom,R_atom,R),!.
replace_all(Atom,_,_,[Atom]).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/84 # 【 課題 】
http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/966.txt #
# 【sports.csv】
# 10,サッカー,中村俊輔
# 18,野球,松坂大輔
#
# 背番号,種目,名前がカンマで区切られたCSVファイルを読み込み、ファイルに出力する。
# なお出力の際には背番号に種目ごとに決められた番号を加算する。
# 今は2行だが今後は行数を追加し、「1,テニス,松岡修造」などを追加することもある。
#
# サッカー → 10
# 野球 → 50
#
# 【出力例】
# 20,サッカー,中村俊輔
# 68,野球,松坂大輔
>>485 % Prolog
一般にCSVファイルの加工(_入力CSVファイル,_出力CSVファイル) :-
get_split_lines(_入力CSVファイル,[','],L1),
加工する(L1,L2),
put_csv_lines(_出力CSVファイル,L2,',').
加工する(L1,L2) :- 具体的な加工の例(L1,L2).
具体的な加工の例([],[]).
具体的な加工の例([[_背番号,_種目,_名前]|R1],[[_加算された背番号,_種目,_名前]|R2]) :-
種目ごとの背番号加算値(_種目,_加算値),
_加算された背番号 is _背番号 + _加算値,
具体的な加工の例(R1,R2).
種目ごとの背番号加算値(サッカー,10).
種目ごとの背番号加算値(野球,50).
put_csv_lines(_出力CSVファイル,L,_区切り文字) :-
open(_出力CSVファイル,write,Output),
put_csv_lines_2(Output,L,_区切り文字),
close(Output).
put_csv_lines_2(_,[],_) :- !.
put_csv_lines_2(Output,[L|R],_区切り文字) :-
concat_atom(L,_区切り文字,_表示文字列),
write_formatted(Output,'%t\n',[_表示文字列]),
put_csv_lines_2(Output,R,_区切り文字).
% ここでは一般化して書きましたが、
>>485 に沿ったものは
http://nojiriko.asia/prolog/j69_84.html
http://pc12.2ch.net/test/read.cgi/tech/1267796762/86 # 【 課題 】下記参照ください。
# 【 形態 】1. Javaアプリケーション(main()で開始
# 【 期限 】今晩中の完成です。
# 【 Ver 】jdk1.6.0_13
# 【 補足 】javaのプログラム作成についてです。
# 条件分けの<if else>や繰り返しの<for>を組み合わせれば出来るのでしょうが、それがわかりません。
# お知恵を貸してください。
#
# 内容:
# 数字を入力し、それが「偶数」なら
# □
# ○○
# □□□
#
# 奇数なら
# ○
# □□
# ○○○
#
# 上記の3段の階段を作るプログラムを作成するのが課題です。
# 宜しくお願いします。
#
>>487 % Prolog
'3段の階段を作る' :-
数字を入力し(_数字),
'3段の階段を作る'(_数字).
'3段の階段を作る'(_数字) :-
それが偶数なら(_数字),
階段の表示(1,□),!.
'3段の階段を作る'(_数字) :-
それが奇数なら(_数字),
階段の表示(1,○),!.
数字を入力し(_数字) :- get_integer(_数字).
それが偶数なら(_数字) :- 0 is _数字 mod 2.
それが奇数なら(_数字) :- \+(0 is _数字 mod 2).
階段の表示(N,_) :- N > 3,!.
階段の表示(N,□) :- for(1,M,N),write(□),M = N,nl.
階段の表示(N,○) :- for(1,M,N),write(○),M = N,nl.
階段の表示(N,□) :- N2 is N + 1,階段の表示(N2,○).
階段の表示(N,○) :- N2 is N + 1,階段の表示(N2,□).
>>488 (
>>487 )
% Prolog 間違い。
階段の表示(N,_) :- N > 3,!.
階段の表示(N,□) :- for(1,M,N),write(□),M = N,nl,N2 is N + 1,階段の表示(N2,○).
階段の表示(N,○) :- for(1,M,N),write(○),M = N,nl,N2 is N + 1,階段の表示(N2,□).
>>489 % Prolog もともと
>>488 の定義は非決定性述語で基礎を作ろうとしたものだ。
% この方針を貫くとなると、大分修正点がある。
'3段の階段を作る' :-
数字を入力し(_数字),
'3段の階段を作る'(_数字),
fail.
'3段の階段を作る'.
'3段の階段を作る'(_数字) :-
それが偶数なら(_数字),
階段の表示(1,□,_).
'3段の階段を作る'(_数字) :-
それが奇数なら(_数字),
階段の表示(1,○,_).
数字を入力し(_数字) :- get_integer(_数字).
それが偶数なら(_数字) :- 0 is _数字 mod 2.
それが奇数なら(_数字) :- \+(0 is _数字 mod 2).
階段の表示(N,_,N) :- N > 3,!,fail.
階段の表示(N,□,N) :- for(1,M,N),write(□),M = N,nl.
階段の表示(N,○,N) :- for(1,M,N),write(○),M = N,nl.
階段の表示(N,□,X) :- N2 is N + 1,階段の表示(N2,○,X).
階段の表示(N,○,X) :- N2 is N + 1,階段の表示(N2,□,X).
% 階段の表示が3引数になっているのはトップレベルからこの述語を使う時のため。この述語は失敗して終わるように変更した。
% 注目点は、'3段の階段を作る'/1 の本体最後のカットが削除されたこと。
>>491 % Prolog
たしてちょうど15になる7個の自然数の組合せをすべて列挙する([A,B,C,D,E,F,G]) :-
重複組合せ([1,2,3,4,5,6,7,8,9],7,[A,B,C,D,E,F,G]),
15 is A + B + C + D + E + F + G .
組合せが全部でいくつあるのか(_いくつ) :-
count(たしてちょうど15になる7個の自然数の組合せをすべて列挙する(L),_いくつ).
重複組合せ(X,1,[A]) :- member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
N > 1,
M is N - 1,
重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
N > 1,
重複組合せ(Y,N,A).
>>491 % Prolog
たしてちょうど15になる7個の自然数の組合せをすべて列挙する([A,B,C,D,E,F,G]) :-
自然数候補ならび(L1),
重複組合せ(L1,7,[A,B,C,D,E,F,G]),
15 is A + B + C + D + E + F + G.
組合せが全部でいくつあるのか(_いくつ) :-
いくつ(たしてちょうど15になる7個の自然数の組合せをすべて列挙する(L),_いくつ).
自然数候補ならび(L) :-
_最小値 = 1,
M is 15 - _最小値 * (7 - 1),
'1からMまでのならび'(M,L).
'1からMまでのならび'(M,L) :- findall(J,for(1,J,M),L).
重複組合せ(X,1,[A]) :- member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
N > 1,
M is N - 1,
重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
N > 1,
重複組合せ(Y,N,A).
いくつ(_目標,_いくつ) :- count(_目標,_いくつ).
>>494 % Prolog
三角形の三頂点の座標が与えられたとして重心を求める(X1,Y1,X2,Y2,X3,Y3,_重心のX座標,_重心のY座標) :-
_重心のX座標 is (((X2+X3)/2-X1)*2)/3+X1,
_重心のY座標 is (((Y2+Y3)/2-Y1)*2)/3+Y1.
>>496 % Prolog
猫以下 :- 猫以下([],[' ',' ',' ',' ']).
猫以下(L,L) :- concat_atom(L,S),write_formatted('%t@\n',[S]),!.
猫以下(L,L2) :- concat_atom(L,S),write_formatted('%t@\n',[S]),猫以下([' '|L],L2),write_formatted('%t\n',[S]).
# [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を # 枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力 # を促すようにする。 # [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数 # 名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5 # 個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで # いなければゲームを続ける。
500 :
デフォルトの名無しさん :2010/05/30(日) 03:43:09
>>494 % Prolog
三角形の三頂点の座標が与えられたとして重心を求める(X1,Y1,X2,Y2,X3,Y3,_重心のX座標,_重心のY座標) :-
'X1の対辺の中点の座標'(X2,Y2,X3,Y3,_対辺の中点のX座標,_対辺の中点のY座標),
'重心は(X1,Y1)からこの中点へ伸ばした直線の中点寄り3分の2の所にある'(X1,Y1,_対辺の中点のX座標,_対辺の中点のY座標,_重心のX座標,_重心のY座標).
'X1の対辺の中点の座標'(X2,Y2,X3,Y3,X,Y) :-
_対辺の中点のX座標 is (X2 + X3) / 2,
_対辺の中点のY座標 is (Y2 + Y3) / 2.
'重心は(X1,Y1)からこの中点へ伸ばした直線の中点寄り3分の2の所にある'(X1,Y1,_対辺の中点のX座標,_対辺の中点のY座標,_重心のX座標,_重心のY座標) :-
_重心のX座標 is (X1 - _対辺の中点のX座標) / 3 + _対辺の中点のX座標,
_重心のY座標 is (Y1 - _対辺の中点のY座標) / 3 + _対辺の中点のY座標.
>>498 % Prolog 盤面表示から
五目並べ盤面表示(_盤面) :-
五目並べ横罫,
五目並べ表示(1,_盤面),
五目並べ横罫,!.
五目並べ横罫 :- write(' +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n').
五目並べ表示(_,[]) :- !.
五目並べ表示(N,[_行|R]) :-
半角全角数字変換(N,NS),
write_formatted('%t',[NS]),
五目並べ行表示(_行),
N2 is N + 1,
五目並べ表示(N2,R).
五目並べ行表示([]) :- write('|\n'),!.
五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R).
半角全角数字変換(1,' 1').
半角全角数字変換(2,' 2').
半角全角数字変換(3,' 3').
半角全角数字変換(4,' 4').
半角全角数字変換(5,' 5').
半角全角数字変換(6,' 6').
半角全角数字変換(7,' 7').
半角全角数字変換(8,' 8').
半角全角数字変換(9,' 9').
半角全角数字変換(10,'10').
>>498 % Prolog
五目並べ :-
初期盤面(_盤面),
五目並べ(A,_盤面).
五目並べ(A,_盤面) :-
次の手を入力する(A,_盤面,_更新された盤面),
五目並べ盤面表示(_更新された盤面),
五目並べ(B,_更新された盤面).
五目並べ(B,_盤面) :-
次の手を入力する(B,_盤面,_更新された盤面),
五目並べ盤面表示(_更新された盤面),
五目並べ(A,_更新された盤面).
次の手を入力する(A,_盤面,_更新された盤面) :-
write('Aさん次の手を入力しなさい : '),
get_split_line([' '],[_行,_列]),
盤面更新(A,_行,_列,_盤面,_更新された盤面),!.
次の手を入力する(B,_盤面,_更新された盤面) :-
write('Bさん次の手を入力しなさい : '),
get_split_line([' '],[_行,_列]),
盤面更新(B,_行,_列,_盤面,_更新された盤面),!.
盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :-
list_nth(_行,_盤面,L),
要素番号によるならびの置換(_列,_棋士,L,L1),
要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!.
>>503 (
>>498 )
% Prolog 変更。 次の手を入力する/3 をA、Bと個別に書く必要はなかった。
次の手を入力する(_棋士,_盤面,_更新された盤面) :-
write_formatted('%tさん次の手を入力しなさい : ',[_棋士]),
get_split_line([' '],[_行,_列]),
盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!.
>>498 % Prolog
初期盤面([
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]).
506 :
デフォルトの名無しさん :2010/05/30(日) 22:29:41
>>506 % Prolog
'『あるフォルダ中の moc*.cpp に一致するファイルの先頭に、「#include "stdafx.h"」 を挿入する』 ' :-
tmpnam(TMPNAM1),
tmpnam(TMPNAM2),
open(TMPNAM1,write,Output),
write(Output,'#include "stdafx.h"\n'),
close(Output),
shs('ls -N moc*.cpp',L),
( member(F,L),
concat_atom(['cat ',TMPNAM1,' ',F,' >'TMPNAM2',';mv ',TMPNAM2,' ',F],S),
system(S),fail;
concat_atom(['rm -f ',TMPNAM1],RM),
system(RM)
).
>>508 % Prolog
鳴き声('1',わん).
鳴き声('2',にゃー).
鳴き声('3',ぶー).
program :-
user_parameters(_ユーザ引数ならび),
append(_,[_ユーザ引数|R],_ユーザ引数ならび),
鳴き声(_ユーザ引数,_鳴き声),
write_formatted('%t\n',[_鳴き声]),
R=[].
>>511 % Prolog
二進数(_10進数,L) :-
_10進数 >= 0,
length(L,32),
二進数(_10進数,[],X),
append(L1,X,L),
all(L1,0),!.
二進数(_10進数,[1|L]) :-
_10進数 < 0,
_10進数_11 is maxint + _10進数 + 1,
二進数(_10進数_1,[],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).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/75 # [1] 授業単元:C言語プログラミング
# [2] 問題文:コマンドライン引数に指定された文字列それぞれが
# 16進数表記で表された0以上100万以下の整数であ
# るをことをチェックした後、それを12進数に
# 変換したものを表示するプログラムをつくれ
# 16進数表記の先頭の0xはなくても良いがあってもエラーに
# してはならない。16進数表記になっていない、あるいは
# 指定された範囲に無い場合はその旨表示する。
>>509 (
>>508 )
% Prolog 間違っている。最後の引数が未定義(例えば'3'より大きい)の時、この述語は失敗してしまう。
% しかし仮に途中失敗があっても最後の引数が鳴き声/2にあれぱ、成功裡に終わる。課題にこのような論理は含まれていない。
鳴き声('1',わん).
鳴き声('2',にゃー).
鳴き声('3',ぶー).
program :-
user_parameters(_ユーザ引数ならび),
append(_,[_ユーザ引数|R],_ユーザ引数ならび),
鳴き声(_ユーザ引数,_鳴き声),
write_formatted('%t\n',[_鳴き声]),
fail.
program.
>>514 ?- ... , append(_,[A|R],L), <副目標群> ,R=[].
member/2ではなくappend/3を使ってR=[]で終了するスマートな表現だが、
これを使ってよいのは <副目標群> が必ず成功する場合に限られると、考えてよい。
>>517 % Prolog 単位データベースの引数に複合項を持つことは好ましいことではないが
% ここでは事例のひとつとして取り上げてみる。
:- op(200,xf,ヤード).
:- op(200,xf,フィート).
:- op(200,xf,ポンド).
:- op(200,xf,インチ).
:- op(200,xf,cm).
:- op(200,xf,kg).
'身長(cm)と体重(kg)を「ヤードポンド法」に換算する'(_身長cm,_体重kg) :-
身長のヤードポンド法換算(_身長cm,_フィート,_インチ),
体重のヤードポンド法換算(_体重kg,_ポンド),
write_formatted('身長は%tフィート%.1fインチ、体重は%.1fポンドです\n',[_身長フィート,_身長インチ,_体
重ポンド]),!.
身長のヤードポンド法換算(_身長cm,_フィート,_インチ) :-
変換するヤードポンド法の関係(M フィート = N cm),
_身長フィート is truncate(floor(_身長 * M / N)),
変換するヤードポンド法の関係(M2 フィート = N2 インチ),
_身長インチ is ((_身長 * M / N) - floor(_身長 * M / N)) * N2 / M2,!.
体重のヤードポンド法換算(体重kg,_ポンド) :-
変換するヤードポンド法の関係(M3 ポンド = N3 kg),
_体重ポンド is _体重kg * M3 / N3,!.
>>517 % Prolog (その二)
変換するヤードポンド法の関係(1 ヤード = 3 フィート).
変換するヤードポンド法の関係(1 ヤード = 91.44 cm).
変換するヤードポンド法の関係(3 フィート = 91.44 cm).
変換するヤードポンド法の関係(1 フィート = 12 インチ).
変換するヤードポンド法の関係(1 フィート = 30.48 cm).
変換するヤードポンド法の関係(12 インチ = 30.48 cm).
変換するヤードポンド法の関係(1 インチ = 2.54 cm).
変換するヤードポンド法の関係(1 ポンド = 0.45359237 kg).
>>520 訂正 節が抜けた。
単位データベース -> 単位節データベース
単位節とは
変換するヤードポンド法の関係(1 ヤード = 3 フィート).
のように :- <本体>. を見掛け上持たない節。
実は :- true. があるのだという見方もできる。
>>519 % Prolog これは過去問にほとんど同じものがあった。
http://nojiriko.asia/prolog/c132_907.html 整数を一つ入力してその数以下の素数をすべて出力する :-
write('整数を一つ入力してください : '),
get_integer(N),
素数生成(N,L),
concat_atom(L,',',S),
write_formatted('%t以下のすべての素数は %t です\n',[N,S]).
素数生成(N,X) :-
findall(M,for(2,M,N),L),
エラトステネスの篩(L,X).
エラトステネスの篩(_,[],[]) :- !.
エラトステネスの篩(N,[A|R1],R2) :-
0 is A mod N,
エラトステネスの篩(N,R1,R2),!.
エラトステネスの篩(N,[A|R1],[A|R2]) :-
エラトステネスの篩(N,R1,R2).
エラトステネスの篩([],[]) :- !.
エラトステネスの篩([A|R1],[A|R2]) :-
エラトステネスの篩(A,R1,L),
エラトステネスの篩(L,R2).
>>518 % Prolog
'n元連立1次方程式を解き,掃き出し法により求まる係数マトリクスの逆行列と解ベクトルを表示する'(_係数行列,_定数項ベクトル,_係数行列の逆行列,_解ベクトル) :-
逆行列(_係数行列,_係数行列の逆行列),
行列の掛け算(_係数行列の逆行列,_定数項ベクトル,_解ベクトル).
>>525 % Prolog
'整数nを読み込んだ後,n個の数の総和を計算する' :-
整数を読み込む(_ndata),
総和を計算する(_ndata,0,_xsum),
結果を表示する(_xsum),!.
総和を計算する(0,_xsum,_xsum) :- !.
総和を計算する(_ndata,_xsum1,_xsum) :-
数を読み込む(_xval),
読み込んだ数と足しこんだ値を渡すと和を計算する(_xval,_xsum1,_xsum2),
_ndata1 is _ndata - 1,
総和を計算する(_ndata1,_xsum2,_xsum).
整数を読み込む(_ndata) :- write('整数を入力してください : '),get_integer(_ndata).
数を読み込む(_xval) :-
write('数を入力してください : '),get_line(Line),
atom_to_term(Line,_xval,_),
number(_xval),!.
数を読み込む(_xval) :- write('数値が入力されませんでした。もう一度 '),数を読み込む(_xval).
読み込んだ数と足しこんだ値を渡すと和を計算する(_xval,_xsum1,_xsum) :- _xsum is _xval + _xsum1.
結果を表示する(_xsum) :- write_formatted('総和は%tです\n',[_xsum]).
平均を計算する(_xsum,_ndata,_ave) :- _ave is _xsum / _ndata.
>>518 % Prolog
逆行列(_行列,_逆行列) :-
length(_行列,N),
単位行列(N,L),
行列の結合(_行列,L,_行列の二),
既約ガウス行列に変形(_行列の二,_既約ガウス行列),
変数正方行列(1,N,_逆行列),
行列の結合(_,_逆行列,_既約ガウス行列),!.
単位行列(M,N1,N,[]) :- N1 > N,!.
単位行列(M,M,N,[1|R]) :- N2 is M + 1,単位行列(M,N2,N,R).
単位行列(M,N1,N,[0|R]) :- \+(N1 = M),N2 is N1 + 1,単位行列(M,N2,N,R).
単位行列(M,N,[]) :- M > N,!.
単位行列(M,N,[_行|R]) :- 単位行列(M,1,N,_行),M2 is M + 1,単位行列(M2,N,R).
単位行列(N,_単位行列) :- 単位行列(1,N,_単位行列).
行列の結合(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3),length(_行1,Len1),length(_行2,Len2).
行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3),行列の結合(Len1,Len2,R1,R2,R3),length(_行1,Len1),length(_行2,Len2).
行列の結合([_行1|R1],[_行2|R2],_結合された行列) :- 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列),Len1 > 0,Len2 > 0.
変数正方行列(M,N,[]) :- M > N.
変数正方行列(M,N,[L|R]) :- length(L,N),M2 is M + 1,変数正方行列(M2,N,R).
>>520 (
>>517 )
% Prolog 訂正。_ポンド -> _体重ポンド
体重のヤードポンド法換算(体重kg,_体重ポンド) :-
変換するヤードポンド法の関係(M3 ポンド = N3 kg),
_体重ポンド is _体重kg * M3 / N3,!.
>>528 (
>>517 ) もう一ヶ所
% Prolog 訂正。 _がひとつ落ちていた。
体重のヤードポンド法換算(_体重kg,_体重ポンド) :-
変換するヤードポンド法の関係(M3 ポンド = N3 kg),
_体重ポンド is _体重kg * M3 / N3,!.
>>517 % Prolog
'身長(cm)と体重(kg)を「ヤードポンド法」に換算する'(_身長cm,_体重kg) :-
身長のヤードポンド法換算(_身長cm,_フィート,_インチ),
体重のヤードポンド法換算(_体重kg,_ポンド),
write_formatted('身長は%tフィート%.1fインチ、体重は%.1fポンドです\n',[_身長フィート,_身長インチ,_体重ポンド]),!.
身長のヤードポンド法換算(_身長cm,_フィート,_インチ) :-
ヤードポンド法変換(フィート,cm,M,N),
_身長フィート is truncate(floor(_身長 * M / N)),
ヤードポンド法変換(フィート,インチ,M2,N2),
_身長インチ is ((_身長 * M / N) - floor(_身長 * M / N)) * N2 / M3,!.
体重のヤードポンド法換算(_体重kg,_体重ポンド) :-
ヤードポンド法変換(ポンド,kg,M3,N3),
_体重ポンド is _体重kg * M3 / N3,!.
ヤードポンド法変換(ヤード,フィート,1,3).
ヤードポンド法変換(ヤード,cm,1,91.44).
ヤードポンド法変換(フィート,cm,3,91.44).
ヤードポンド法変換(フィート,インチ,1,12).
ヤードポンド法変換(フィート,cm,1,30.48).
ヤードポンド法変換(インチ,cm,12,30.48).
ヤードポンド法変換(インチ,cm,1,2.54).
ヤードポンド法変換(ポンド,kg,1,0.45359237).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/120 # [1] 授業単元:プログラミング演習
# [2] 問題文:整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい。
# ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する様にしなさい。
# [実行例]
# 3 <-n入力
# n=3
# ***
# *
# ***
# 4 <-n入力
# n=4
# ****
# *
# *
# ****
# 8 <-n入力
# n=8
# ********
# *
# *
# *
# *
# *
# *
# ********
>>531 % Prolog
f(X,Y) :- Y is X^2 * cos(X).
'等間隔シンプソン法を使ってx^2*cosx の0〜π/2までの積分'(_標本点数,_面積) :-
_刻み is (pai / 2 - 0) / (_標本点数 - 1),
findall(Y,(for(1,M,_標本点数),X is 0 + (M - 1) * _刻み,f(X,Y)),_等間隔標本点データならび),
シンプソンの公式(_等間隔標本点データならび,_刻み,0,_面積).
シンプソンの公式([],H,S1,S) :- S is S1 * H / 3,!.
シンプソンの公式([A,B,C|R],H,S1,S) :-
S2 is S1 + A + 4 * B + C,
シンプソンの公式([C|R],H,S2,S).
>>531 % Prolog
f(X,Y) :- Y is X^2 * cos(X).
'等間隔シンプソン法を使ってx^2*cosx の0〜π/2までの積分'(_標本点数,_面積) :-
標本点数は3以上の奇数である(_標本点数),
_刻み is (pai / 2 - 0) / (_標本点数 - 1),
findall(Y,(for(1,M,_標本点数),X is 0 + (M - 1) * _刻み,f(X,Y)),_等間隔標本点データならび),
シンプソンの公式(_等間隔標本点データならび,_刻み,0,_面積).
シンプソンの公式([],H,S1,S) :- S is S1 * H / 3,!.
シンプソンの公式([A,B,C|R],H,S1,S) :-
S2 is S1 + A + 4 * B + C,
シンプソンの公式([C|R],H,S2,S).
標本点数は3以上の奇数である(_標本点数) :- _標本点数 >= 3,1 is _標本点数 mod 2.
>>532 % Prolog
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい' :-
get_integer(N),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい'(N).
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい'(N) :- N =< 2,!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい'(N) :-
N >= 3,
write_formatted('n=%t\n',[N]),
'N個の星ならび'(N,L1),
'N-2個の空白ならび'(N,L2),
横方向に星を表示(L1),
右上から左下方向に星を表示(L2),
横方向に星を表示(L1),
get_integer(N2),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい'(N2).
'N個の星ならび'(N,L) :- length(L,N),all(L,'*').
'N-2個の空白ならび'(N,L) :- length(L1,N),L1 = [_,_|L],all(L,' ').
横方向に星を表示(L1) :-
concat_atom(L1,S),
write_formatted('%t\n',[S]).
右上から左下方向に星を表示([]) :- !.
右上から左下方向に星を表示([A|R]) :-
concat_atom([A|R],S),
write_formatted('%t*\n',[S]),
右上から左下方向に星を表示(R).
http://pc11.2ch.net/test/read.cgi/db/1274791771/29 # まったくわからないのです教えてください・・
#
# 1、名前はわかっているが、コードが不明な商品の受注明細を照会するSELECT文を記述せよ。
# 副照会:商品名からコードを求めるSELECT文
# 主照会:商品コードから商品の受注明細を照会するSELECT文
#
# 2、平均受注個数を超える商品に仕入れ先を照会するSELECT文を記述せよ。
# 副照会:商品の平均受注個数を求めるSELECT文
# 主照会:商品コード別に受注個数合計を求め、受注個数合計 > 平均受注個数であれば、仕入れ先を表示
#
# 3、1月と2月に\50,000以上の注文があった顧客からの3月受注額を照会するSELECT文を記述せよ。
# 副照会:4月と5月に受注額合計が共に50000以上であるという条件をみたす顧客を照会
# 主照会:顧客別に6月の受注額合計を求めるSELECT文。
#
>>536 % Prolog (その一) 2、は問題文意味不明のため保留。
名前はわかっているが、コードが不明な商品の受注明細を照会する(_商品名,_受注明細) :-
商品名(_商品コード,_商品名),
受注明細(_顧客コード,_扱店コード,_受注日,_納品予定日,_商品コード,_荷姿,_数量,_単価,_金額,_入力時刻).
'1月と2月に50,000以上の注文があった顧客からの3月受注額を照会する'(_顧客コード,_受注額) :-
'1月と2月に50,000以上の注文があった顧客'(_顧客コード),
findsum(_金額,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,5,2,'03')),_受注額).
'1月と2月に50,000以上の注文があった顧客'(_顧客コード) :-
'1月に50000以上の注文があった顧客'(_1月に50000以上注文があった顧客コードならび),
'2月に50000以上の注文があった顧客'(_2月に50000以上注文があった顧客コードならび),
積集合(_1月に50000以上注文があった顧客コードならび,_2月に50000以上注文があった顧客コードならび,_1月と2月に50000以上の注文があった顧客コードならび),
member(_顧客コード,_1月と2月に50000以上の注文があった顧客コードならび).
>>536 % Prolog (その二)
'1月に50000以上の注文があった顧客'(_1月に50000以上注文があった顧客コードならび),
findsetof(_顧客番号,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,5,2,'01')),_1月に注文があった顧客コードならび),
findall(_顧客番号,( findsum(_金額,( member(_顧客番号,_1月に注文があった顧客コードならび),
受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),
sub_atom(_受注日,5,2,'01')),
_合計金額),
_合計金額 > 50000),
_1月に50000以上注文があった顧客コードならび),!.
'2月に50000以上の注文があった顧客'(_2月に50000以上注文があった顧客コードならび),
findsetof(_顧客番号,(受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),sub_atom(_受注日,5,2,'02')),
_2月に注文があった顧客コードならび),
findall(_顧客番号,( findsum(_金額,( member(_顧客番号,_2月に注文があった顧客コードならび),
受注明細(_顧客コード,_,_受注日,_,_,_,_,_,_金額,_),
sub_atom(_受注日,5,2,'02')),
_合計金額),
_合計金額 > 50000),
_2月に50000以上注文があった顧客コードならび),!.
>>537-
>>538 (
>>536 )
% Prolog 間違いがありました。以下それぞれ訂正です。
sub_atom(_受注日,5,2,'01') -> sub_atom(_受注日,4,2,_,'01')
sub_atom(_受注日,5,2,'02') -> sub_atom(_受注日,4,2,_,'02')
sub_atom(_受注日,5,2,'03') -> sub_atom(_受注日,4,2,_,'03')
>>537-538 これではSQL以下。Prologの組込述語に多数の集約述語の追加が必要。
>>531 % Prolog (2)
シンプソンの公式([],H,S1,S) :- S is S1 * H / 3,!.
シンプソンの公式([A,B,C|R],H,S1,S) :-
S2 is S1 + A + 4 * B + C,
シンプソンの公式([C|R],H,S2,S).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f(X,Y) :- Y is log(X) ^ 2.
'等間隔シンプソン法を使って(logx)^2の1〜eまでの積分'(_標本点数,_面積) :-
標本点数は3以上の奇数である(_標本点数),
刻みは(_標本点数,_刻み),
標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび),
シンプソンの公式(_等間隔標本点データならび,_刻み,0,_面積).
標本点数は3以上の奇数である(_標本点数) :- _標本点数 >= 3,1 is _標本点数 mod 2.
刻みは(_標本点数,_刻み) :- _刻み is (exp(1) - 1) / (_標本点数 - 1).
標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび) :-
findall(Y,(for(1,M,_標本点数),X is 1 + (M - 1) * _刻み,f(X,Y)),_等間隔標本点データならび),!.
>>536 % Prolog 2、 宝石店以外ではありえない参照。
'商品コード別に受注個数合計を求め、受注個数合計 > 平均受注個数であれば、仕入れ先を表示'(_商品コード,_顧客コード) :-
平均受注個数を得る(_商品コード,_平均受注個数),
受注個数が平均受注個数を超えている(_商品コード,_平均受注個数,_顧客コード).
平均受注個数を得る(_商品コード,_平均受注個数) :-
findsetof(_商品コード,受注明細(_,_,_,_,_商品コード,_,_,_,_,_),_受注があった商品コードならび),
findavg(_数量合計,findsum(_数量,( member(_商品コード,_受注があった商品コードならび),
受注明細(_顧客コード,_,_,_,_,_,_数量,_,_,_)),
_数量合計),
_平均受注個数),!.
受注個数が平均受注個数を超えている(_商品コード,_平均受注個数,_顧客コード) :-
findsetof(_顧客コード,受注明細(_顧客コード,_,_,_,_商品コード,_,_,_,_,_),
_顧客コードならび),
member(_顧客コード,_顧客コードならび),
findsum(_数量,受注明細(_顧客コード,_,_,_,_商品コード,_,_数量,_,_,_),_数量合計),
_平均受注個数 > _数量合計.
http://pc11.2ch.net/test/read.cgi/php/1147830986/9 # 1.1行ずつURLが記述されたテキストファイルを読み込み、
# 2.そのURLのコンテンツを取得して
# 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可)
# するプログラムを作ってください。
#
# 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。
# (リンク先が存在し、そこには必ず<title></title>で囲まれた箇所があるhtml)
# また正常系のみで、エラー(テキストファイルが読み込めない、ネットワークが
# 繋がらなくてコンテンツが取得できない)の場合の処理は無くて構わない。
#
http://pc11.2ch.net/test/read.cgi/php/1251989472/378 # ----------input.txt-
# 1 2 3
# 4 5 6
# 7 8 9
# -------------------
# ---------------output.txt-
# 左上の数字は1です
# 中上の数字は2です
# ・
# ・
# ・
# ---------------
# input.txt->output.txtのようなprogramの書き方を教えてください
# できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが
>>544 % Prolog
位置と値を組み合わせて表示する :-
get_split_lines('input.txt',[' '],LL),
tell('output.txt'),
位置と値を組み合わせて行表示する([上,中,下],[左,中,右],LL),
told.
位置と値を組み合わせて行表示する(_,_,[]) :- !.
位置と値を組み合わせて行表示する([_行表現|R1],L1,[L2|R2]) :-
位置と値を組み合わせて列表示する(_行表現,L1,L2),
位置と値を組み合わせて行表示する(R1,L1,R2).
位置と値を組み合わせて列表示する(_,[],[]) :- !.
位置と値を組み合わせて列表示する(_行表現,[_列表現|R1],[N|R2]) :-
位置表現を構成する(_行表現,_列表現,_表示文字列),
write_formatted('%tの数字は%tです\n',[_表示文字列,N]),
位置と値を組み合わせて列表示する(_行表現,R1,R2).
位置表現を構成する(中,中,まん中) :- !.
位置表現を構成する(_行表現,_列表現,_表示文字列) :- concat_atom([_列表現,_行表現],_表示文字列).
>>543 % Prolog (その一)
'1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_テキストファイル) :-
get_lines(_テキストファイル,Lines),
member(URL,Lines),
'URLをHost,Port,Fileに分解する'(URL,Host,Port,File),
www_lines(Host,Port,File,_行ならび),
タイトルを得る(_行ならび,_タイトル),
write_formatted('URL=%t タイトル=%t\n',[URL,_タイトル]),
fail.
'1行ずつURLが記述されたテキストファイルを読み込み、そのURLのコンテンツを取得してタイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可) する'(_).
'URLをHost,Port,Fileに分解する'(URL,Host,Port,File) :-
'sPLIT'(URL,['/',':'],[http,':','/','/',Host,':',Port,'/'|File]),!.
'URLをHost,Port,Fileに分解する'(URL,Host,80,File) :-
'sPLIT'(URL,['/',':'],[http,':','/','/',Host,'/'|File]),!.
タイトルを得る(_行ならび,_タイトル) :-
append(_,[_行|R],_行ならび),
sub_atom(_行,_,7,_,_,'<TITLE>',_残り文字列,_,_,_),
sub_atom(_残り文字列,_,8,_,_タイトル,'</TITLE>',_,_,_,_),!.
>>543 % Prolog (その二)
www_lines(Host, Port, File, DataList) :-
hp_open_client(Host, Port, Socket),
make_request_header(Host,Header),
hp_work_client(Socket,Header,DataList).
hp_open_client(Host, Service, Socket) :-
atom(Service), !,
net_service(Service, tcp, Port),
socket(internet, stream, Socket),
host_addr(Host, Addr),
socket_connect(Socket, Addr : Port).
hp_open_client(Host, Port, Socket) :-
integer(Port), !,
socket(internet, stream, Socket),
socket_connect(Socket, Host : Port).
>>543 % Prolog (その三)
make_request_header(_ファイル,Header) :-
myhostname(Myhostname),
request_header_file(_ファイル,_整形されたファイル),
concat_atom(['GET ',_ファイル,' HTTP/1.1\nHost: ',Myhostname,
'\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.8) Gecko/20050511\n',
'Accept: text/xml,application/xml,application/xhtml+xml,',
'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: ja,',
'en-us;q=0.7,en;q=0.3\nAccept-Encoding: gzip,deflate\n',
'Accept-Charset: EUC-JP,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 300\n',
'Connection: keep-alive\n\n'],Header).
request_header_file(_ファイル,_ファイル) :-
sub_atom(_ファイル,0,1,_,'/'),!.
request_header_file(_ファイル,_整形されたファイル) :-
\+(sub_atom(_ファイル,0,1,_,'/')),
concat_atom(['/',_ファイル],_整形されたファイル),!.
hp_work_client(Socket,Header,DataList) :-
open(Socket, read, Input),
open(Socket, write, Output),
write_formatted(Output,'%t',[Header]),
flush_output,
findall(X,(repeat,get_line(Input,_診断,Data),(_診断=終了,!,fail;true)),DataList),
close(Input),
close(Output),
socket_shutdown(Socket).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/173 # [1] 授業単元:Cプログラミング
# [2] 問題文(含コード&リンク):
# 1、x[6]を宣言して、x[0]に5、x[1]に8、x[2]に6、x[3]に4、x[4]に1、x[5]に3を代入した後、ポインタを使って、
# x[0], x[2], x[4]の和と、x[1], x[3], x[5]の積を求めるプログラムを作成せよ。
# 2、与えられた文字数分だけ文字を一文字ずつ順に表示するprint関数を作成せよ。
# 引数として文字列配列stringと整数nを用いること。ここで、stringは文字型配列の先頭アドレスを、
# nは表示する文字を意味する。
# 3、以下のmain分に従い、2つの文字列配列の中身を交換する関数exchangeを完成させよ。
#
# int main(void){
# char string1[] = "abcdefg";
# char string2[] = "hijklmn";
#
# printf("string1 = %s string2 = %s\n", string1, string2);
# printf("exchange(string1, string2)");
# exchange(string1, string2);
# printf("string1 = %s string2 = %s\n", string1, string2);
#
# return 0;
# }
#
http://pc12.2ch.net/test/read.cgi/tech/1267796762/106 # 【 課題 】プログラムを改良して、100個のボールの衝突を避けるようにする。
#
# 問題1:BallAnimationを参考に、Class MyCanvaメソッドとしてaccerateを作成し、その中に個体間の距離を記憶するプログラムを作成しなさい。
# また、デバッグのために距離を出力できるようにしなさい。
#
# 問題1の注意:決まりとして、Class MyCanvas内に整数の行列distance(NB*NB)を用意して、個体間の距離を記入する。
# なお、個体a,bの距離は、個体b,aのそれと同じであるので、同じ計算は2度する必要はないとする。
#
# 問題2:「問題2で追加するプログラムの概要」を改良して、メソッドaccerateの中に、衝突を避けるプログラムを加えなさい。
#
# 問題3:「問題3で追加するプログラムの概要」を改良して、衝突が繰り返されるときに発生する加速度の限界を、5以下にせよ。
>>555 % Prolog
'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_25セント枚数,_10セント枚数,_5セント枚数,_1セント枚数,_お釣り,_最少枚数) :-
findmin(_枚数,(
for(0,A,_25セント枚数),
for(0,B,_10セント枚数),
for(0,C,_5セント枚数),
for(0,D,_1セント枚数),
_お釣り is 25 * A + 10 * B + 5 * C + 1 * D,
_枚数 is A + B + C + D),
_最少枚数),!.
'レジに入ってる小銭の枚数(25セント、10セント、5セント、1セント)と、お釣りの額を入力して、釣り銭の枚数が最少となる枚数を表示する。'(_,_,_,_,_,0) :- '釣り銭切れも考慮する。支払い不能な時は0を返す'.
'釣り銭切れも考慮する。支払い不能な時は0を返す'.
http://pc11.2ch.net/test/read.cgi/db/1274791771/39 #
# maindata
# -----------------------------
# main_id | main_name | junle
# -----------------------------
# 1000001 | aaaaaaaaa | 1
# 1000002 | bbbbbbbbb | 2
# 1000003 | ccccccccc | 1
# 1000004 | ddddddddd | 3
# 1000005 | eeeeeeeee | 1
#
# itemdata
# --------------------
# item_id | item_name
# --------------------
# 9000001 | AAAAAAAAA
# 9000002 | BBBBBBBBB
# 9000003 | CCCCCCCCC
# 9000004 | DDDDDDDDD
# 9000005 | EEEEEEEEE
# # itemlist # ------------------ # main_id | item_id # ------------------ # 1000001 | 9000001 # 1000001 | 9000004 # 1000002 | 9000002 # 1000002 | 9000005 # 1000004 | 9000002 # 1000004 | 9000004 # 1000004 | 9000005 # # という3つのテーブルがある場合に、maindata.junle='1'を条件に # main_id | main_name | itemlists # ---------------------------------------------------- # 1000001 | aaaaaaaaa | AAAAAAAAA DDDDDDDDD # 1000003 | ccccccccc | # 1000004 | eeeeeeeee | BBBBBBBBB DDDDDDDDD EEEEEEEEE # ---------------------------------------------------- # ※itemlistsは空白で連結 # # という結果を求めたいと思います。 # サブクエリを利用して一度に求めることは可能でしょうか? # それとも、アプリケーション側でループの際に都度itemlistsを生成する必要がありますでしょうか? #
>>557 % Prolog
'main_id | main_name | itemlists'(_main_id,_main_name,_itemlists) :-
findsetof([_main_id,_main_name],(
_junle='1',
maindata(_main_id,_main_name,_junle)),
L),
member([_main_id,_main_name],L),
findall(_item_name,(
itemlist(_main_id,_item_id),
itemdata(_item_id,_item_name)),
_itemlists_1),
concat_atom(_itemlists_1,' ',_itemlist).
>>559 (
>>557 )
% Prolog 訂正。一番最後の最後、_itemlists が _itemlist になっていた。
'main_id | main_name | itemlists'(_main_id,_main_name,_itemlists) :-
findsetof([_main_id,_main_name],(
_junle='1',
maindata(_main_id,_main_name,_junle)),
L),
member([_main_id,_main_name],L),
findall(_item_name,(
itemlist(_main_id,_item_id),
itemdata(_item_id,_item_name)),
_itemlists_1),
concat_atom(_itemlists_1,' ',_itemlists).
>>561 % Prolog
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
write('整数を入力してください : '),
get_line(_行),
atom_to_term(_行,_入力データ,_),
範囲検査(_入力データ),!.
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
write('値が範囲を外れています\n'),
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ).
範囲検査(_入力データ) :- integer(_入力データ),_入力データ > 0,_入力データ < 9,!.
% 上の定義ではエラーメッセージに入力した値を含ませることができない。バックトラックして第二節が
% 選択される時には論理変数 _行 や _入力データ は束縛が解かれてしまっている。一般的には以下のような定義となる。
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
write('整数を入力してください : '),
get_line(_行),
atom_to_term(_行,_入力データ,_),
範囲検査(_入力データ),!.
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ).
範囲検査(_入力データ) :- integer(_入力データ),_入力データ > 0,_入力データ < 9,!.
範囲検査(_入力データ) :- integer(_入力データ),write_formatted('値%tは範囲を外れています\n',[_入力データ]),!,fail.
範囲検査(_入力データ) :- \+(integer(_入力データ)),write('整数が入力されませんでした\n'),!,fail.
>>563 % Prolog
'4行3列の配列をキーボードから読み込み、各行、各列の和、及び配列全体の総和を求め、表示する' :-
'4行3列の配列をキーボードから読み込み、'(_4行3列の配列),
各行、各列の和、及び配列全体の総和を求め、(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和),
'_4行3列の配列,_各行の和,_各列の和,_配列全体の総和を表示する'(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和).
'4行3列の配列をキーボードから読み込み、'(_4行3列の配列) :-
write('列を3要素の整数リストとして4行入力しなさい(ただしread/1で読み込めるよう入力は.で終わること) : '),
findall(_3要素の整数ならび,(for(1,N,3),read(_3要素の整数ならび)),_4行3列の配列).
各行、各列の和、及び配列全体の総和を求め、(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和) :-
各行の和(_4行3列の配列,_各行の和),
各列の和(_4行3列の配列,_各列の和),
配列全体の総和(_各行の和,_配列全体の総和).
各行の和(_4行3列の配列,_各行の和) :-
findall(_行の和,(append(_,[_行|_],_4行3列の配列),
sum(_行,_行の和)),_各行の和).
各列の和(_4行3列の配列,_各列の和) :-
転置(_4行3列の配列,_転置された配列),
各行の和(_転置された配列,_各列の和).
配列全体の総和(_各行の和,_配列全体の総和) :-
sum(_各行の和,_配列全体の総和).
>>563 % Prolog (その二)
'_4行3列の配列,_各行の和,_各列の和,_配列全体の総和を表示する'(_4行3列の配列,_各行の和,_各列の和,_配列全体の総和) :-
行の表示(_4行3列の配列,_各行の和),
各列の和の表示(_各列の和),
配列全体の総和の表示(_配列全体の総和).
行の表示([],[]) :- !.
行の表示([_行|R1],[_和|R2]) :-
append(_行,[_和],L),
write_formatted('%d,%d,%d,%d\n',L),
行の表示(R1,R2).
各列の和の表示(_各列の和) :-
write_formatted('%d,%d,%d,',_各列の和).
配列全体の総和の表示(_配列全体の総和) :-
write_formatted('%d\n',[_配列全体の総和]).
sum([],0) :- !.
sum([N|R],S) :- sum(R,S1),S is N + S1.
>>566 % Prolog
'下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_並べ替え方法) :-
get_lines('input.txt',Lines),
整列(_並べ替え方法,Lines,Lines2),
put_lines('out.txt',Lines2).
整列(_並べ替え方法,_対象ならび,_整列されたならび) :-
分割閾値の選択(_対象ならび,_分割閾値,_それ以外のならび),
分割(_並べ替え方法,_それ以外のならび,_分割閾値,_左側ならび,_右側ならび),
整列(_並べ替え方法,_左側ならび,_整列された左側ならび),
整列(_並べ替え方法,_右側ならび,_整列された右側ならび),
append(_整列された左側ならび,[_分割閾値|_整列された右側ならび],_整列されたならび).
整列(_,[],[]).
分割閾値の選択([_分割閾値|_残りならび],_分割閾値,_残りならび) :- ここでは先頭要素を分割閾値とする.
ここでは先頭要素を分割閾値とする.
分割(昇順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @=< _分割閾値,
分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび).
分割(降順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @>= _分割閾値,
分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび).
分割(昇順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @> _分割閾値,
分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび).
分割(降順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @< _分割閾値,
分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび).
分割(_,[],_,[],[]).
>>568 % Prolog
サンプルデータから情報を取りだしその情報をstudents.txtとして出力する :-
サンプルデータから情報を取りだし(_サンプル情報ならび),
その情報をstudents.txtとして出力する(_サンプル情報ならび).
サンプルデータから情報を取りだし(_サンプル情報ならび) :-
count(サンプルデータ(_,_,_),_総情報数),
_標本数 is _総情報数 // 20,
findall([ID,_名前,_生徒情報],( for(1,N,_標本数),
ID is (random mod _情報数) + 1,
サンプルデータ(ID,_名前,_生徒情報)),
_サンプル情報ならび).
その情報をstudents.txtとして出力する(_サンプル情報ならび) :-
tell('students.txt'),
append(_,[_サンプル情報|_残りならび],_サンプル情報ならび),
行表示文字列を構成して(_サンプル情報,_行表示文字列),
出力する(_行表示文字列),
_残りならび = [],
told.
行表示文字列を構成して(_値ならび,_行表示文字列) :- concat_atom(_値ならび,' ',_行表示文字列).
出力する(_行表示文字列) :- write_formatted('%t\n',[_行表示文字列]).
>>569 (
>>568 )
% Prolog 一ヶ所訂正。 _情報数 -> _総情報数
サンプルデータから情報を取りだしその情報をstudents.txtとして出力する :-
サンプルデータから情報を取りだし(_サンプル情報ならび),
その情報をstudents.txtとして出力する(_サンプル情報ならび).
サンプルデータから情報を取りだし(_サンプル情報ならび) :-
count(サンプルデータ(_,_,_),_総情報数),
_標本数 is _総情報数 // 20,
findall([ID,_名前,_生徒情報],( for(1,N,_標本数),
ID is (random mod _総情報数) + 1,
サンプルデータ(ID,_名前,_生徒情報)),
_サンプル情報ならび).
その情報をstudents.txtとして出力する(_サンプル情報ならび) :-
tell('students.txt'),
append(_,[_サンプル情報|_残りならび],_サンプル情報ならび),
行表示文字列を構成して(_サンプル情報,_行表示文字列),
出力する(_行表示文字列),
_残りならび = [],
told.
行表示文字列を構成して(_値ならび,_行表示文字列) :- concat_atom(_値ならび,' ',_行表示文字列).
出力する(_行表示文字列) :- write_formatted('%t\n',[_行表示文字列]).
Javaです いくつかの数の合計を取るプログラムを作ることにする。 個数を まず読み込んで、続いてその個数分の数を読み込んで合計を書き出すようにしよう。 たとえば、合計を求めたい個数が5であるとすると、まず 5を入力し、続いて 5つの数が続く。 その5つの数の合計を書き出すことになる。以下は例。 5 1 3 8 9 2 合計は 23 コマンドプロンプトから実行します?、ガチ初心者なのでver、GUIについてはわかりませんでした、すいません Java宿題スレにもマルチしててすいません、どちらが適切かわからなかったもので
>>571 % Prolog
program :-
get_integer(_回),
findsum(_整数,(for(1,_,_回),get_integer(_整数)),_合計_1),
_合計 is truncate(_合計_1),
write_formatted('合計は%t\n',[_合計]).
http://pc11.2ch.net/test/read.cgi/db/1274791771/48 #
# ・テーブルの構造
# CREATE TABLE IF NOT EXISTS table (
# id integer NOT NULL auto_increment,
# value integer NOT NULL,
# PRIMARY KEY (id),
# );
#
# ・テーブルデータ
# ID VALUE
# --+--------
# 1 相沢
# 2 飯田
# 3 上井
#
# ・操作
# INSERT INTO table(id, value) values
# (NULL, '遠藤'), (NULL, '岡田');
#
# ・欲しい結果
# 4
# 5
#
# ・説明
# ID列をauto_incrementにしているのですが、要素を追加したときに
# そのIDを取得したいと考えています。どのようにしたらいいでしょうか?
http://pc12.2ch.net/test/read.cgi/tech/1274827528/284 # [1] 授業単元:プログラム演習A
# [2] 問題文:全30件の成績(0〜100点)をキーボードから
# 読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点 の
# 11通りの区間にそれぞれ何人が入るかを調べなさい。
# ただし、各区間に入る人数を溜めておく入れ物として
# 配列を利用すること。更に調べた人数に従って、各区間を
# ヒストグラムで表しなさい。
#
# 0点:***
# 10点:*****
# 20点:****
# ・
# ・
# 100点:*
#
#
>>575 % Prolog
任意の文字列を二つ入力し、一つ目の文字列から二つ目の文字列を「全て」検索する :-
任意の文字列を二つ入力し、(_一つ目の文字列,_二つ目の文字列),
一つ目の文字列から二つ目の文字列を「全て」検索する(_一つ目の文字列,_二つ目の文字列).
任意の文字列を二つ入力し、(_一つ目の文字列,_二つ目の文字列) :-
write('文字列を入力してください。 \n'),
get_line(_一つ目の文字列),
write('検索文字列を入力してください。\n'),
get_line(_二つ目の文字列).
一つ目の文字列から二つ目の文字列を「全て」検索する(_一つ目の文字列,_二つ目の文字列) :-
少なくとも一つは存在する(_一つ目の文字列,_二つ目の文字列),
「全て」検索する(_残り文字列,_二つ目の文字列,_開始位置,_長さ,_残り長さ),!.
一つ目の文字列から二つ目の文字列を「全て」検索する(_,_二つ目の文字列) :-
write_formatted('文字列「%t」は存在しません。\n',[_二つ目の文字列]).
少なくとも一つは存在する(_一つ目の文字列,_二つ目の文字列) :- sub_atom(_一つ目の文字列,_,_,_,_二つ目の文字列).
「全て」検索する(_一つ目の文字列,_二つ目の文字列,_開始位置,_長さ) :-
sub_atom(_一つ目の文字列,_開始位置,_長さ,_,_二つ目の文字列),
_終了位置 is _開始位置 + _長さ - 1,
write_formatted('文字列「%t」は%t文字から%t文字目に存在します。\n',[_二つ目の文字列,_開始位置,_終了位置]),
fail.
「全て」検索する(_,_,_,_) :- !.
>>576 % Prolog
'全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか調べヒストグラムで表わす' :-
'全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X),
ヒストグラムで表わす(X).
'全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X) :-
'全30件の成績(0〜100点)をキーボードから読み込み、'(L),
'0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(L,[[],[],[],[],[],[],[],[],[],[],[]],X).
'全30件の成績(0〜100点)をキーボードから読み込み、'(L) :-
findall(_点数,(for(1,N,30),write_formatted('第%t件目を入力してください : ',[N]),get_integer(_点数)),L).
'0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([],L,L) :- !.
'0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([_点数|R],L1,L) :-
_要素位置 is _点数 // 10 + 1,
'区間のならびに*を追加'(_要素位置,L1,L2),
'0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(R,L2,L).
'区間のならびに*を追加'(_要素位置,L1,L2) :-
list_nth(_要素位置,L1,L),
要素番号によるならびの置換(_要素位置,[*|L],L1,L2).
ヒストグラムで表わす(X) :-
append(L0,[L|R],X),
length(L0,N),
N2 is N * 10,
concat_atom(L,S),
write_formatted('%t点 : %t\n',[N2,S]),
R = [],!.
>>574 % Prolog
表に合計を付加して、表示する。ただし、行和、列和の前は少し空ける(_表) :-
表に合計を付加して、(_表,_合計が付加された表),
表示する。ただし、行和、列和の前は少し空ける(_合計が付加された表).
表に合計を付加する、(_表,_合計が付加された表) :-
転置(_表,_転置表),
算術和(_転置表,_横合計ならび),
ならびの連結(_転置表,[_横合計ならび],_横合計が付加された転置表),
転置(_横合計が付加された転置表,_横合計付加表),
算術和(_横合計付加表,_縦合計ならび),
ならびの連結(_横合計付加表,[_縦合計ならび],_合計が付加された表),!.
表示する。ただし、行和、列和の前は少し空ける(_合計が付加された表) :-
append(_,[L|R],_合計が付加された表),
append(L1,[E],L),
concat_atom(L1,' ',S1),
write_formtted('%t %t\n',[S1,E]),
R = [L2],
append(L3,[E2],L2),
concat_atom(L3,' ',S2),
write('\n'),
write_formatted('%t %t\n',[S2,E2]).
>>573 % Prolog
auto_increment(_表,_値ならび,_付加されるID) :-
length(_値ならび,Len),
length(L,Len),
P =.. [_表,ID0|L],
findmax(ID0,P,Max),
_付加されるID is Max + 1,
Q =.. [_表,_付加されるID|_値ならび],
assertz(Q),!.
auto_increment(_表,_値ならび,1) :-
Q =.. [_表,1|_値ならび],
assertz(Q),!.
>>582 % Prolog
文字と演算子を入力して四則計算する :-
get_line(Line),
文字と演算子を入力して四則計算する(Line,0,_答え),
write_formatted('%t\n',[_答え]).
文字と演算子を入力して四則計算する(=,_答え,_答え) :- !.
文字と演算子を入力して四則計算する(Line,S1,_答え) :-
member(Line,[+,-,*,/]),
数値項を得る(V),
F =.. [Line,S1,V],
S2 is F,
get_line(Line2),
文字と演算子を入力して四則計算する(Line2,S2,_答え),!.
文字と演算子を入力して四則計算する(A,_,_答え) :-
atom_to_term(A,V,_),
get_line(Line),
文字と演算子を入力して四則計算する(Line,V,_答え).
数値項を得る(V) :- get_line(Line),atom_to_term(Line,V,_),number(V),!.
数値項を得る(V) :- write('数値を入力してください\n'),数値項を得る(V).
http://pc12.2ch.net/test/read.cgi/tech/1255277760/337 # 問題:
# ジョンにとって縁起のいい数字は4と7で,
# 他はどうでもいい.ラッキーナンバーとは,
# 縁起のいい数字を含んだ10進数である.
# 整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数を挙げよ.
#
# 注:
# aの値は1から1,000,000,000まで
# bの値は1から1,000,000,000まで
#
# TopCoderでグーグル先生に聞いたら出てきた問題を適当に張ってみる
http://pc12.2ch.net/test/read.cgi/tech/1136788500/442 # 輝け甲子園の星(2010早春号)より 選抜高校野球選手権大会出場選手「好きなタレント」アンケート
#
# "好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義しなさい。
#
# 1位 北川景子 49票
# 2位 上戸 彩 24票
# 3位 香里奈 23票
# 4位 佐々木希 22票
# 5位 松本人志 18票
# 6位 新垣結衣 17票
# 7位 南 明奈 黒木メイサ 15票
# 9位 木下優樹奈 12票
# 10位 市川由衣 11票
# 11位 EXILE 10票
# 12位 ダウンタウン 相武紗季 9票
# 14位 宮崎あおい 8票
# 15位 柴咲コウ 戸田恵梨香 井上真央 コトリッチ 7票
#
>>586 % Prolog
'"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'
get_lines('好きなタレント.txt',Lines),
member(_行,Lines),
行解析(_行,_順位,_票,_姓名ならび),
member(_姓名,_姓名ならび),
assertz(好きなタレント(_順位,_姓名,_票)),
fail.
'"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'.
行解析([_順位1|R1],_順位,_姓名ならび,_票) :-
sub_atom(_順位1,_,1,0,位),
sub_atom(_順位1,0,_,1,_順位文字列から位を除いた文字列),
全角文字数値整数変換(_順位文字列から位を除いた文字列,_順位),
行解析_1(R1,_姓名ならび,_票).
行解析_1([A],[],_票) :- sub_atom(A,_,1,0,票),sub_atom(A,0,_,1,B),全角文字数値整数変換(B,_票),!.
行解析_1(L1,[B|R2],_票) :- 姓名変換(L1,B,R1),行解析_1(R1,R2,_票).
姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,2,0,_姓),sub_atom(_名,0,1,0,_名),concat_atom([_姓,_名],_姓名),!.
姓名変換([_姓,_名|R],_姓名,R) :- sub_atom(_姓,0,1,0,_姓),sub_atom(_名,0,2,0,_名),concat_atom([_姓,_名],_姓名),!.
姓名変換([_姓名|R],_姓名,R).
>>588 % Prolog 訂正。get_lines/2 get_split_lines/3 に訂正。
'"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'
get_split_lines('好きなタレント.txt',[' '],_順位ならび),
member(_行情報,_順位ならび),
行解析(_行情報,_順位,_票,_姓名ならび),
member(_姓名,_姓名ならび),
assertz(好きなタレント(_順位,_姓名,_票)),
fail.
'"好きなタレント.txt" ファイルから次のデータを呼び出し、述語 好きなタレント順位/3 を定義する'.
>>587 % Prolog (その一)
'人数nを読み込んだ後,配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する' :-
整数を読み込み変数のならびでそれを表現する(L0),
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'(L0,[[],[],[],[],[],[]],L),
findmax(Len,(member(LX,L),length(LX,Len)),Max),
ヒストグラム表示(Max,[' x < 150cm: ','150cm <= x < 160cm: ','160cm <= x < 170cm: ','170cm <=
x < 180cm: ','180cm <= x < 190cm: ','190cm <= x : '],[L1,L2,L3,L4,L5,L6]),!.
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'([],L,L) :- !.
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'([_|R],L1,L) :-
get_integer(_身長),
ヒストグラムの生成(_身長,L1,L2),
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'(R,L2,L).
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[[*|L1],L2,L3,L4,L5,L6]) :- _身長 < 150,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,[*|L2],L3,L4,L5,L6]) :- _身長 >= 150,_身長 < 160,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,[*|L3],L4,L5,L6]) :- _身長 >= 160,_身長 < 170,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,[*|L4],L5,L6]) :- _身長 >= 170,_身長 < 180,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,L4,[*|L5],L6]) :- _身長 >= 180,_身長 < 190,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,L4,L5,[*|L6]]) :- _身長 >= 190,!.
>>587 % Prolog (その一) 改行位置に適切でない部分があった。
'人数nを読み込んだ後,配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する' :-
整数を読み込み変数のならびでそれを表現する(L0),
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'(L0,[[],[],[],[],[],[]],L),
findmax(Len,(member(LX,L),length(LX,Len)),Max),
ヒストグラム表示(Max,[' x < 150cm: ','150cm <= x < 160cm: ','160cm <= x < 170cm: ','170cm <=x < 180cm: ','180cm <= x < 190cm: ','190cm <= x : '],[L1,L2,L3,L4,L5,L6]),!.
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'([],L,L) :- !.
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'([_|R],L1,L) :-
get_integer(_身長),
ヒストグラムの生成(_身長,L1,L2),
'配列に身長のデータを読み込んでいき,入力された身長を10cmごとにわけたヒストグラムを生成する'(R,L2,L).
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[[*|L1],L2,L3,L4,L5,L6]) :- _身長 < 150,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,[*|L2],L3,L4,L5,L6]) :- _身長 >= 150,_身長 < 160,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,[*|L3],L4,L5,L6]) :- _身長 >= 160,_身長 < 170,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,[*|L4],L5,L6]) :- _身長 >= 170,_身長 < 180,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,L4,[*|L5],L6]) :- _身長 >= 180,_身長 < 190,!.
ヒストグラムの生成(_身長,[L1,L2,L3,L4,L5,L6],[L1,L2,L3,L4,L5,[*|L6]]) :- _身長 >= 190,!.
>>587 % Prolog うまく改行しない。
整数を読み込み変数のならびでそれを表現する(L) :- get_integer(N),length(L,N).
ヒストグラム表示(Max,[A|R1],[L|R2]) :-
length(L1,Max),
length(L,_人数),
append(L,L0,L1),
all(L0,' '),
concat_atom(L1,H),
concat_atom([A,H,' ',_人数,名],S),
write_formatted('%t\n',[S]),
ヒストグラム表示(Max,R1,R2).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/120 # 【 課題 】コマンドプロンプト上で"1"と入力すると円を、"2"と入力すると長方形を、"3"と入力すると楕円を描画し、"end"と入力すると終了するプログラムを作れ。ただし、図形同士が重ならないように工夫すること。
# 【 形態 】2. Applet
# 【 GUI 】1. AWTのみ
# 【 期限 】06/07 22:00
# 【 Ver 】1.6.0_19
# 【 用語 】-
# 【 補足 】たとえば1,2,1,3,endと入力したらApplet上には図形が4つ並ぶことになります。また、図形のサイズ,色は問わないようです(ただ、"回"のようにはならず、"品"のようにずらして描くものと思われます)。
# よろしくお願いします。
http://pc11.2ch.net/test/read.cgi/db/1274791771/71 #
# TableA
# IDa C1
# -------------
# A1 X
# A2 Y
# A3 Z
#
# TableB
# IDb C2
# -------------
# B1 S
# B2 T
# B3 U
#
# TableC(TableAとTableBを紐付けているテーブル)
# IDa IDb
# -------------
# A1 B1
# A3 B3
#
# 欲しい結果
# IDa IDb C1 C2
# -----------------
# A1 B1 X S
# A2 Y
# A3 B3 Z U
# B2 T
>>594 (続き)
# 説明
# TableA,B,Cの3つのテーブルからTableCに存在しないIDのTableAとTableBのデータも出力したい
# ../test/read.cgi/db/1274791771/39と似てる気もしますが、よろしくお願いします。
>>594 % Prolog
'TableA,B,Cの3つのテーブルからTableCに存在しないIDのTableAとTableBのデータも出力する' :-
'TableAにのみ存在するID'(IDa,C1),
write_formatted('%2s %2s %2s %2s\n',[IDa,' ',C1,' ']),
fail;
'TableBにのみ存在するID'(IDb,C2),
write_formatted('%2s %2s %2s %2s\n',[' ',IDb,' ',C2]),
fail;
'TableBまでリンクがあるID'(IDa,IDb,C1,C2),
write_formatted('%2s %2s %2s %2s\n',[IDa,IDb,C1,C2]),
fail;
true.
'TableAにのみ存在するID'(IDa,C1) :- 'TableA'(IDa,C1),'TableC'(IDa,IDb),\+('TableB'(IDb,_)).
'TableAにのみ存在するID'(IDa,C1) :- 'TableA'(IDa,C1),\+('TableC'(IDa,IDb)).
'TableBにのみ存在するID'(IDb,C2) :- 'TableB'(IDb,C2),'TableC'(IDa,IDb),\+('TableA'(Ida,Idb)).
'TableBにのみ存在するID'(IDb,C2) :- 'TableB'(IDb,C2),\+('TableC'(_,IDb)).
'TableBまでリンクがあるID'(IDa,IDb,C1,C2) :- 'TableA'(IDa,C1),'TableC'(IDa,IDb),'TableB'(IDb,C2).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/424 # 【質問テンプレ】
# [1] 授業単元:C言語課題
# [2] 問題文(含コード&リンク):2つの正の整数(aとb)の最大公約数をユークリッドの互除法を用いて表示するプログラムを作成せよ。ただし、0<b≦a≦32767とする。
# ≪ユークリッドの互除法≫
# ユークリッドの互除法による最大公約数(GREATEST COMMON DIVISOR:GCD)は、次のように求める。
# �2数(aとb)の中で大きい値をl、小さい値をmとする。
# �lをmで割り、あまりをrとする。
# r=0ならば、mが最大公約数となる。
# r≠0(0<r<m)ならばl←m、m←r として再び�の処理を行う。
#
>>597 % Prolog ちょっと遊んでみる。
ユークリッドの互除法による最大公約数(N1,N2,X) :-
length(L1,N1),
length(L2,N2),
ユークリッドの互除法とならび演算による最大公約数(L1,L2,L),
length(L,X).
ユークリッドの互除法とならび演算による最大公約数(L1,L2,L) :-
append(_,L2,L1),
ならび剰余算(L1,L2,R),
ユークリッドの互除法とならび演算による最大公約数(L1,L2,R,L),!.
ユークリッドの互除法とならび演算による最大公約数(L1,L2,L) :-
append(_,L1,L2),
ユークリッドの互除法とならび演算による最大公約数(L2,L1,L).
ユークリッドの互除法とならび演算による最大公約数(_,L2,[],L2) :- !.
ユークリッドの互除法とならび演算による最大公約数(L1,L2,R,L) :- ユークリッドの互除法とならび演算による最大公約数(L2,R,L).
ならび割り算(L1,L2,X) :- ならび割り算(L1,L2,[],X).
ならび割り算(L1,L2,L,L) :- append([_|_],L1,L2).
ならび割り算(L1,L2,L4,L) :- append(L2,L3,L1),ならび割り算(L3,L2,[_|L4],L).
ならび剰余算(L1,L2,L1) :- append([_|_],L1,L2).
ならび剰余算(L1,L2,L) :- append(L2,L3,L1),ならび剰余算(L3,L2,L).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/448 # [1] 授業単元:プログラミング演習2
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10651.txt #
# 未完のプログラムを完成させよ。未完のプログラムの内容を削ってはならない。
# 駅情報を格納する自己参照的構造体struct stationを定義せよ。駅情報は、駅の名前(大きさ20のchar型配列とする)、次の駅(上り線までの距離(km))を保持するものとする。
# 駅情報を格納する自己参照的構造体を動的に確保する関数struct station *new_station(char *n,double d)を作成せよ(malloc()を呼び出し、確保された領域に名前と距離を格納して、struct station型へのポインタを返す)。
# struct station *head=NULL;で宣言されるポインタheadに、動的に以下の駅を確保せよ(new_stationの返り値をheadに代入する。さらに、必要であれば、駅を次の駅へ、ポインタの代入によって接続する)。
# ・駅名ebina、次の駅までの距離3.3km
# ・駅名atsugi、次の駅までの距離1.6km
# ・駅名honatsugi、次の駅までの距離1.3km
# headから辿った時に、honatsugi、atsugi、ebinaの順となるような線形リストを構築せよ。
# scrap_odawarasen()は、線形リストの先頭から辿れる要素をすべてfree()で解放する。そのため、自分でfree()を記述する必要はない。
http://pc12.2ch.net/test/read.cgi/tech/1274827528/453 #
# [1] 授業単元: 上級プログラミング
# [2] 問題文(含コード&リンク):
#
# 1、VisualC++2008のWindowsフォームアプリケーションのプロジェクトを作成し、DataGridViewを作成なさい。列は
# A,B,C の3列とする。
# 2、列Aに入力された4桁の数値を日付形式に変換し表示する様にしなさい(○月○日)。
# 3、sample.txtの内容を読み取り、その内容を使って列Bにオートコンプリートを実装しなさい。
#
# sample.txtの内容は
# あいうえお
# abcde
# 12345
# と言う様に、1行に1単語とする。
//
>>585 F#
let countLuckyNumber a b =
let count (x : int) =
let charToInt c = int c - int '0'
let oct =
((false, []), string x) ||> Seq.fold (fun (s, r) c ->
match s, c with
| true, _ -> (true, 9::r)
| _, '4' | _, '7' -> (true, (charToInt c - 1)::r)
| _ -> (false, charToInt c::r))
|> snd |> List.rev
|> List.map ((function n when n > 7 -> n - 2 | n when n > 4 -> n - 1 | n -> n) >> string)
|> String.concat ""
x - System.Convert.ToInt32(oct, 8)
count (max a b) - count (min a b)
>>604 に間違いがあったので訂正
誤:count (max a b) - count (min a b)
正:count (max a b) - count (min a b - 1)
http://pc12.2ch.net/test/read.cgi/tech/1274827528/501 # [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# int plot(int x,int y,int c);は座標(x,y)に色cを設定する関数である。
# これが与えられているものとして
# コマンドラインから(x,y)の形で座標値が何個か与えられた時
# (0<=x,y<=10000)これらに異なる色(選択は自由)を与える。
# 0<=x,y<=10000を満たす座標の各点についてその点から
# 最も近い点の色をその点に設定する(2つ以上の点から等距離
# にある場合は、これらの点の中でコマンドラインで最初に指定
# された点の色を設定)
# この処理を行うプログラムを記述する
http://pc12.2ch.net/test/read.cgi/tech/1274827528/517 # 上の「簡易シェルプログラム」はコマンドに引数があるとexec()でエラー
# になってしまう。また、パス検索機能も指定されていないのでコマンドはフルパス入していた
# 今回はパス検索機能も追加しコマンドに引数があってもexec()でプログラムが正常に実行
# 出来るように改造せよ
#
# 実行するコマンド
# >ls
# >ls -r
# >data -I
# >gcc -o xxx xxx.c xxx.cは各自で適当に作る
# >./xxx
# >./xxx 1
# >enterのみ入力
>>601 % Prolog main関数のみというのは考えられない。
'int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と偏差値を計算し、結果を画面に出力する' :-
キーボードから人数Nを入力(N),
キーボードからN人分の点数を入力(N,L),
相加平均(L,_相加平均),
標準偏差(L,_標準偏差),
偏差値(L,_相加平均,_標準偏差,_偏差値),
write_formatted('平均点は%4.1f点です。\n',[_相加平均]),
write_formatted('偏差値は%4.1fです。\n',[_偏差値]).
キーボードから人数Nを入力(N) :-
repeat,get_integer(N),N>=0,N=<100,!.
キーボードからN人分の点数を入力(0,[]) :- !.
キーボードからN人分の点数を入力(N,[I|R]) :-
get_integer(I),
I >= 0,I =< 100,
N1 is N - 1,
キーボードからN人分の点数を入力(N1,R),!.
キーボードからN人分の点数を入力(N,L) :- キーボードからN人分の点数を入力(N,L).
% 相加平均/3,標準偏差/2,偏差値/4の定義は
http://nojiriko.asia/prolog/suchikeisan.html を参照してください。
>>606 % Prolog
'コマンドラインから(x,y)の形で座標値が何個か与えられた時、キーボードから与えられる新たな点に最も近い既知の点の色を設定する' :-
'10000×10000の座標情報ならび'(_座標情報ならび),
user_parameters(L),
findall([X,Y,_色],(member(A,L),split(A,[','],[X,Y,_色])),_初期設定色情報),
初期設定色情報を座標情報ならびに設定する(_初期設定色情報),
write('追加点の座標をx,yの形式で入力してください'),
get_split_line([','],[X0,Y0]),
'与えられた座標X0,Y0に最も近い点X,Yの色'(_座標情報ならび,X0,Y0,X,Y,_色),
plot(X0,Y0,_色).
初期設定色情報を座標情報ならびに設定する([]) :- !.
初期設定色情報を座標情報ならびに設定する([[X,Y,_色]|R]) :-
plot(X,Y,_色),
初期設定色情報を座標情報ならびに設定する(R).
'与えられた座標X0,Y0に最も近い点X,Yの色'(_座標情報ならび,X0,Y0,X,Y,_色) :-
findmin([_距離,X,Y,_色],(
座標情報ならびから色情報を読み出す(0,_座標情報ならび,X,Y,_色),
\+(_色 = 0),
\+(_色 = (-1)),
_距離 is sqrt(((X-X0) ^ 2 + (Y-Y0) ^2)))),
[_最短距離,X,Y,_色]),!.
>>606 % Prolog (その二)
座標情報ならびから色情報を読み出す(_,[],_,_,_) :- !,fail.
座標情報ならびから色情報を読み出す(Y,[L|R],X,Y,_色) :-
'X座標を読み出す'(1,L,X,_色).
座標情報ならびから色情報を読み出す(M,[_|R],X,Y,_色) :-
M2 is M + 1,
座標情報ならびから色情報を読み出す(M2,R,X,Y,_色).
'X座標を読み出す'(_,[],_,_) :- !,fail.
'X座標を読み出す'(X,[_色|R],X,_色).
'X座標を読み出す'(M,[_|R],X,_色) :-
M2 is M + 1,
'X座標を読み出す'(M2,R,X,_色).
'10000×10000の座標情報ならび'(_座標情報ならび) :-
findall(L,(for(0,_,10000),length(L,10001),all(L,0)),_座標情報ならび).
>>588 (
>>586 )
% Prolog この定義が抜けていた。
全角文字数値整数変換(_全角文字数値,_整数) :-
atom_chars(_全角文字数値,Chars),
全角文字数値ならび整数変換(Chars,_整数).
全角数値ならび整数変換(Chars,_整数) :-
全角数値ならび整数変換(Chars,0,_整数).
全角文字数値ならび整数変換([],N,N) :- !.
全角文字数値ならび整数変換([A|R],N1,N) :-
全角文字整数変換(A,M),
N2 is 10 * N + M,
全角文字数値ならび整数変換(R,N2,N).
全角文字整数変換('0',0).
全角文字整数変換('1',1).
全角文字整数変換('2',2).
全角文字整数変換('3',3).
全角文字整数変換('4',4).
全角文字整数変換('5',5).
全角文字整数変換('6',6).
全角文字整数変換('7',7).
全角文字整数変換('8',8).
全角文字整数変換('9',9).
http://pc11.2ch.net/test/read.cgi/db/1274791771/78 # SQLを仕事で書いてますが、困ってます。
#
# ○テーブルA
# number
# nendo
# gaku
# riyu
#
# ○テーブルB
# number
# code
#
# テーブルAのgakuの値を更新するSQLを作りたいです。条件は
#
# ・テーブルAのriyu <> -1の全てのレコードのgakuに値をセットする。
# セットする値は、レコードそれぞれのnumberでテーブルAとテーブルB
# を結合して、テーブルBのcode=1なら1000,code=2なら2000、code=3なら3000
#
>>613 % Prolog
'テーブルAのriyuが-1でないの全てのレコードのgakuに値をセットする。セットする値は、レコードそれぞれのnumberでテーブルAとテーブルBを結合して、テーブルBのcode=1なら1000,code=2なら2000、code=3なら3000' :-
findall([_number,_nendo,_gaku,_riyu,X],(
テーブルA(_number,_nendo,_gaku,_riyu),
\+(_riyu = (-1)),
テーブルB(_number,_code),
値選択(_code,X)),
L),
update_テーブルA(L).
update_テーブルA([]) :- !.
update_テーブルA([[_number,_nendo,_gaku,_riyu,X]|R]) :-
retract(テーブルA(_number,_nendo,_gaku,_riyu)),
assertz(テーブルA(_number,_nendo,X,_riyu)),
update_テーブルA(R).
値選択(1,1000).
値選択(2,2000).
値選択(3,3000).
>>613 「値選択」なんて述語が閃くところがおもしろくない。
できるかぎり神様は出てこないように。
テーブルBのcode=1なら1000,code=2なら2000、code=3なら3000
の部分の表現を生かすには?
http://pc12.2ch.net/test/read.cgi/tech/1274827528/536 # [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# 次の仕様を満たすプログラムを作成せよ
# 「xy 平面内に任意の電荷量の点電荷を複数個配置する.xy 平面内の原点Oを中心とする4 m 四方(±2 m)の領域内において,位置r(x, y)に形成される電界Erや電位Φrを計
# 算する.」複数個の点電荷で形成される電界Erや電位Φrを,任意の位置r で計算する際は,重ね合わせの原理を用います
# 電界ベクトルの計算は, x 成分とy 成分に分けて行います
#
>>607 % Prolog (その一)
'整数nを入力し、以下のようにサイズnの"N型の図形"を、奇数目入力は"*"、偶数目入力では"+"で表示する' :-
整数nを入力し(_n),
length(L1,_n),
変数正方行列(1,_n,L2),
対角要素(L2,L1),
list_nth(L2,L1),
list_nth(_n,L1),
図形要素の刻印(_n,L1),
変数要素を値に単一化(' ',L2,L),
行列要素を隙間なく表示(L).
整数nを入力し(_n) :- get_integer(_n).
変数正方行列(M,N,[]) :- M > N.
変数正方行列(M,N,[L|R]) :- length(L,N),M2 is M + 1,変数正方行列(M2,N,R).
図形要素の刻印(_n,L1) :- 1 is _n mod 2,all(L1,'*'),!.
図形要素の刻印(_n,L1) :- 0 is _n mod 2,all(L1,'+'),!.
変数要素を値に単一化(_値,[],[]) :- !.
変数要素を値に単一化(_値,[L|R1],[L1|R2]) :- list(L),変数要素を値に単一化(_値,L,L1),変数要素を値に単一化(_値,R1,R2),!.
変数要素を値に単一化(_値,[V|R1],[_値|R2]) :- var(V),変数要素を値に単一化(_値,R1,R2),!.
変数要素を値に単一化(_値,[V|R1],[V|R2]) :- \+(var(V)),変数要素を値に単一化(_値,R1,R2),!.
>>607 % Prolog (その二)
行列要素を隙間なく表示([]) :- !.
行列要素を隙間なく表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),
行列要素を隙間なく表示(R).
対角要素(M,N,_,[]) :- M > N,!.
対角要素(M,N,_行列,[_要素|R]) :-
list_nth(M,_行列,_行),
list_length(_行,N),
list_nth(M,_行,_要素),
M2 is M + 1,
対角要素(M2,N,_行列,R).
対角要素(_行列,_対角要素) :- list_length(_行列,N),対角要素(1,N,_行列,_対角要素).
>>619 (
>>607 )
% Prolog 間違えました。一番肝心な所を。
'整数nを入力し、以下のようにサイズnの"N型の図形"を、奇数目入力は"*"、偶数目入力では"+"で表示する' :-
整数nを入力し(_n),
length(L1,_n),
変数正方行列(1,_n,L2),
対角要素(L2,L1),
list_nth(L2,L1),
list_nth(_n,L1),
図形要素の刻印(_n,L1),
変数要素を値に単一化(' ',L2,L3),
転置(L3,L),
行列要素を隙間なく表示(L).
>>616 % Prolog (その一)
バケツソート(_整列されたならび) :-
abolish('$temp'/2),
findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L),
バケツソート(L,_整列されたならび),!.
バケツソート(L,_整列されたならび) :-
バケツに吐き出す(L),
findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび).
数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']).
鍵候補値を昇順に発生させる(S) :-
数値文字候補ならび(L),
member(A,L),member(B,L),member(C,L),member(D,L),member(E,L),
concat_atom([A,B,C,D,E],S).
ランダムな文字列の発生(S) :-
数値文字候補ならび(L),
findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2),
concat_atom(L2,S),!.
>>616 % Prolog (その一)
バケツソート(_整列されたならび) :-
abolish('$temp'/2),
findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L),
バケツソート(L,_整列されたならび),!.
バケツソート(L,_整列されたならび) :-
バケツに吐き出す(L),
findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび).
;数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']).
鍵候補値を昇順に発生させる(S) :-
数値文字候補ならび(L),
member(A,L),member(B,L),member(C,L),member(D,L),member(E,L),
concat_atom([A,B,C,D,E],S).
ランダムな文字列の発生(S) :-
数値文字候補ならび(L),
findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2),
concat_atom(L2,S),!.
>>616 % Prolog (その二)
バケツに吐き出す([]) :- !.
バケツに吐き出す([S|R]) :-
retract('$temp'(S,L)),
assertz('$temp'(S,[_|L])),
バケツに吐き出す(R),!.
バケツに吐き出す([N|R]) :-
assertz('$temp'(S,[_])),
バケツに吐き出す(R),!.
バケツから拾い上げる(S,X) :-
'$temp'(S,L1),
all(L1,S),
member(X,L1).
>>618 % Prolog
>>621 (
>>607 ) 述語との相違点だけ
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 ' :-
整数nを入力し(_n),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n),!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :- _n =< 2,!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :-
length(L1,_n),
変数正方行列(1,_n,L2),
対角成分(L2,L1),
list_nth(L2,L1),
list_nth(_n,L1),
図形要素の刻印(_n,L1),
変数要素を値に単一化(' ',L2,L3),
すべての要素を左右反転する(L3,L),
write_formatted('n=%t\n',[_n]),
行列要素を隙間なく表示(L),
整数nを入力し(_n2),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n2).
図形要素の刻印(_,L1) :- all(L1,'*'),!.
すべての要素を左右反転する([],[]) :-!.
すべての要素を左右反転する([L1|R1],[L2|R2]) :- reverse(L1,L2),すべての要素を左右反転する(R1,R2).
>>626 % Prolog
身長と標準体重を表示する :-
催促付き整数入力('身長(cm)の開始値(整数)を入力してください : ',_開始値),
催促付き整数入力('身長(cm)の終了値(整数)を入力してください : ',_終了値), 催促付き整数入力('増分(整数)を入力してください : ',_開始値),
N is _終了値 - _開始値,
for(0,M,N),
_身長 is _開始値 + _増分 * M,
身長と標準体重を表示する(_身長,_終了値),
M = N.
身長と標準体重を表示する(_身長,_終了値) :- _身長 > _終了値,!.
身長と標準体重を表示する(_身長,_終了値) :-
_標準体重 is (_身長 / 100) ^ 2 * 22,
write_formatted('身長 = %tcm, 標準体重 = %5.2f\n',[_身長,_標準体重]),!.
>>618 % Prolog こちらの方がPrologとしては自然かな。
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 ' :-
get_integer(_n),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n),!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :- _n =< 2,!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :-
write_formatted('n = %t\n',[_n]),
length(L,_n),
append(L1,['*'|L2],L),
行表示要素(L1,V,L2,L),
reverse(L,RL),
concat_atom(RL,S),
write_formatted('%t\n',[S]),
L2 = [],
get_integer(_n2),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るす
るプログラムを作成しなさい。 '(_n2),!.
行表示要素([],V,L2,L) :- all(L2,*),!.
行表示要素(L1,V,[],L) :- all(L1,*),!.
行表示要素(L1,V,L2,L) :- all(L1,' '),all(L2,' ').
>>628 (
>>618 )
% Prolog 改行にミスがあったので書き直し。こちらの方がPrologとしては自然かな。
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 ' :-
get_integer(_n),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n),!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :- _n =< 2,!.
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n) :-
write_formatted('n = %t\n',[_n]),
length(L,_n),
append(L1,['*'|L2],L),
行表示要素(L1,V,L2,L),
reverse(L,RL),
concat_atom(RL,S),
write_formatted('%t\n',[S]),
L2 = [],
get_integer(_n2),
'整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表るするプログラムを作成しなさい。 '(_n2),!.
行表示要素([],V,L2,L) :- all(L2,*),!.
行表示要素(L1,V,[],L) :- all(L1,*),!.
行表示要素(L1,V,L2,L) :- all(L1,' '),all(L2,' ').
>>603 % Prolog
互いに素なnとaについてオイラーの定理が成り立つか確かめる :-
findall(_n,(
for(1,_n,5),
互いに素なnとaについてオイラーの定理が成り立つか確かめる(_n)),
L),
length(L,5).
互いに素なnとaについてオイラーの定理が成り立つか確かめる(_n) :-
findall(Mod,(
互いに素なnとa(_n,_a),
オイラー関数(_n,Z),
Mod is (_a ^ Z) mod _n),
L),
all(L,1),!.
互いに素なnとa(_n,_a) :-
findall(M,for(1,M,_n-1),L),
組み合わせ(L,2,[_n,_a]),
最大公約数(_n,_a,1).
オイラー関数(_n,Z) :-
count((for(1,M,_n-1),\+(0 is _n mod M)),Z).
http://pc11.2ch.net/test/read.cgi/db/1274791771/96 # 教えてください
# table aから(dept,place)でのくくりでcount の次のレスに示すようにtop3を抽出したいです
#
# table a
# dept|place|ext|count
# aaaa|aaaaa|jar|10
# aaaa|aaaaa|com|4
# aaaa|aaaaa|scr|20
# aaaa|aaaaa|exe|80
# aaaa|aaaaa|bat|2
# aaaa|bbbbb|ace|10
# aaaa|bbbbb|arj|4
# aaaa|bbbbb|zip|20
# aaaa|bbbbb|rar|80
# aaaa|bbbbb|lzh|2
# bbbb|aaaaa|mdb|10
# bbbb|aaaaa|xls|4
# bbbb|aaaaa|ppt|20
# bbbb|aaaaa|doc|80
# bbbb|aaaaa|txt|2
# bbbb|bbbbb|gif|10
# bbbb|bbbbb|png|4
# bbbb|bbbbb|png|4
# bbbb|bbbbb|jpg|20
# bbbb|bbbbb|bmp|80
# bbbb|bbbbb|tif|2
# ↓ # aaaa|aaaaa|exe|80 # aaaa|aaaaa|scr|20 # aaaa|aaaaa|jar|10 # aaaa|bbbbb|rar|80 # aaaa|bbbbb|zip|20 # aaaa|bbbbb|ace|10 # bbbb|aaaaa|doc|80 # bbbb|aaaaa|ppt|20 # bbbb|aaaaa|mdb|10 # bbbb|bbbbb|bmp|80 # bbbb|bbbbb|jpg|20 # bbbb|bbbbb|gif|10 #
>>631 % Prolog
'table aからdept,placeのくくりでcountのtop3を抽出' :-
findsetof([_dept,_place],a(_dept,_place,_exit,_count)),
findall(X,findrsort([_count],a(_dept,_place,_ext,_count),X),L),
for(1,N,3),
list_nth(N,L,X),
write_formatted('%t|%t|%t|%t\n',X),
N = 3,
fail.
'table aからdept,placeのくくりでcountのtop3を抽出'.
% findrsort/3,findsetof/2 は
http://nojiriko.asia/prolog/findsort.html 参照
>>600 % Prolog
駅([]).
駅を登録する(ID) :-
retract(駅(_)),
asserta(駅([ID|L])),!.
新しい駅を確保(_駅,_上りの次の駅までの距離,ID) :-
ID is random,
\+((駅(L),member(ID,L))),
asserta(駅情報(ID,_駅,_上りの次の駅までの距離)),!.
新しい駅を確保(_駅,_上りの次の駅までの距離,ID) :-
新しい駅を確保(_駅,_上りの次の駅までの距離,ID).
駅の解放 :-
retract(駅(_)),
asserta(駅([])).
駅情報の解放 :-
retract(駅情報(_,_,_)),
fail.
駅情報の解放.
>>602 % Prolog
列Bの入力(_行,2,X,LL1,LL2) :-
rawmode,
get_char(Char),
検査(Char,[],L),
atom_chars(X,L)
要素位置による行列の置換(_行,2,X,LL1,LL2),
検査('\n',L,L) :- assertz(入力補助情報('B',L)),!.
検査(Char,L1,L) :-
append(L1,[Char],L2),
findall(L,(append(L1,[Char|R],LX),入力補助情報('B',LX)),_入力補助),
入力補助選択(L,_入力補助),!.
検査(Char,L1,L) :-
append(L1,[Char],L2),
get_char(Char2),
検査(Char2,L2,L).
列Bに入力補助初期情報を与える :-
get_lines('sample.txt',Lines),
member(Line,Lines),
atom_chars(Line,Chars),
assertz(入力補助情報('B',Chars)),
fail.
列Bに入力補助初期情報を与える.
>>637 % Prolog
ファイルの各行に追番のタグをつけて書込む(Infile,Outfile) :-
get_lines(Infile,L1),
追番のタグを付加する(1,L1,L2),
put_lines(Outfile,L2).
追番のタグを付加する(_,[],[]) :- !.
追番のタグを付加する(N,[A|R1],[B|R2]) :-
write_formatted_atom('<Vol%00d>%t\n',[N,A],B),
N2 is N + 1,
追番のタグを付加する(N2,R1,R2).
>>636 % Prolog
sum(Sum) :-
user_parameters(L),
findall(N,(member(A,L),atom_to_term(A,N,_)),L2),
sum_2(L2,Sum).
sum_2([],0) :- !.
sum_2([N|R],X) :- sum_2(R,Y),X is N + Y.
http://pc12.2ch.net/test/read.cgi/tech/1274827528/599 # 2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力するプログラムを作成せよ。
# なお、m = a % b としたとき、gcd(a, b) は m≠0 の場合 gcd(b, m) に等しく、 m=0 の場合 b に等しい。
#
# 2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力するプログラムを作成せよ。
# なお、comb(a, b) = comb( a-1, b) + comb( a-1, b-1) であり、 b==0 もしくは b==a のとき comb(a, b) = 1 である。
>>640 % Prolog
'2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力する' :-
催促付き整数入力('自然数aを入力してください : ',_a),
催促付き整数入力('自然数bを入力してください : ',_b),
gcd(_a,_b,X),
write_formatted('%tと%tの最大公約数は%tです\n',[_a,_b,X]).
'2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、そ
れを出力する' :-
催促付き整数入力('自然数aを入力してください : ',_a),
催促付き整数入力('自然数bを入力してください : ',_b),
comb(_a,_b,X),
write_formatted('%t人から%t人を選ぶ組み合わせは%t通りです\n',[_a,_b,X]).
gcd(_a,_b,X) :-
M is _a mod _b,
\+(M = 0),
gcd(_b,M,X),!.
gcd(_a,_b,_b).
comb(N,N,1) :- !.
comb(_,0,1) :- !.
comb(_a,_b,X) :-
_a_1 is _a - 1,
_b_1 is _b - 1,
comb(_a_1,_b,Y),
comb(_a_1,_b_1,Z),
X is Y + Z.
>>642 (
>>640 )
% Prolog 改行ミスがあった。
'2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力する' :-
催促付き整数入力('自然数aを入力してください : ',_a),
催促付き整数入力('自然数bを入力してください : ',_b),
gcd(_a,_b,X),
write_formatted('%tと%tの最大公約数は%tです\n',[_a,_b,X]).
'2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力する' :-
催促付き整数入力('自然数aを入力してください : ',_a),
催促付き整数入力('自然数bを入力してください : ',_b),
comb(_a,_b,X),
write_formatted('%t人から%t人を選ぶ組み合わせは%t通りです\n',[_a,_b,X]).
gcd(_a,_b,X) :-
M is _a mod _b,
\+(M = 0),
gcd(_b,M,X),!.
gcd(_a,_b,_b).
comb(N,N,1) :- !.
comb(_,0,1) :- !.
comb(_a,_b,X) :-
_a_1 is _a - 1,
_b_1 is _b - 1,
comb(_a_1,_b,Y),
comb(_a_1,_b_1,Z),
X is Y + Z.
>>585 % Prolog とても1億以上で動くとは思えないけれど・・
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :-
_a < _b,
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_b,_a,_ラッキーナンバーの個数).
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :-
_b >= _a,
ラッキーナンバーの個数(_a,_b,0,_ラッキーナンバーの個数),!.
ラッキーナンバーの個数(M,N,X,X) :- M > N,!.
ラッキーナンバーの個数(M,N,Y,X) :-
number_codes(M,L),
(member(52,L);member(55,L)),!,
Y2 is Y + 1,
M2 is M + 1,
ラッキーナンバーの個数(M2,N,Y2,X),!.
ラッキーナンバーの個数(M,N,Y,X) :-
M2 is M + 1,
ラッキーナンバーの個数(M2,N,Y,X),!.
>>645 (
>>585 )
% Prolog 最初の節間違い。
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :-
_a > _b,
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_b,_a,_ラッキーナンバーの個数).
'整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :-
_a =< _b,
ラッキーナンバーの個数(_a,_b,0,_ラッキーナンバーの個数),!.
ラッキーナンバーの個数(M,N,X,X) :- M > N,!.
ラッキーナンバーの個数(M,N,Y,X) :-
number_codes(M,L),
(member(52,L);member(55,L)),!,
Y2 is Y + 1,
M2 is M + 1,
ラッキーナンバーの個数(M2,N,Y2,X),!.
ラッキーナンバーの個数(M,N,Y,X) :-
M2 is M + 1,
ラッキーナンバーの個数(M2,N,Y,X),!.
>>647 % Prolog
キーボードから3つの整数を入力し、1つめに入力された数から2つ目に入力された数ま
での範囲において、3つめに入力した数の倍数のみを表示する' :-
get_integer(N1),
get_integer(N2),
get_integer(N3),
for(N1,N,N2),
'3つめに入力した数の倍数のみを表示する'(N,N3),
N = N2.
'3つめに入力した数の倍数のみを表示する'(N,N3) :-
0 is N mod N3,
write_formatted('%t\n',[N]),!.
'3つめに入力した数の倍数のみを表示する'(_,_).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'2つの数A,Bを入力し、AのB乗を求める'(A,B,_AのB乗) :-
_AのB乗 is A ^ B.
>>648 (
>>647 )
% Prolog 訂正。一番頭の ' が落ちていた。
'キーボードから3つの整数を入力し、1つめに入力された数から2つ目に入力された数までの範囲において、3つめに入力した数の倍数のみを表示する' :-
get_integer(N1),
get_integer(N2),
get_integer(N3),
for(N1,N,N2),
'3つめに入力した数の倍数のみを表示する'(N,N3),
N = N2.
'3つめに入力した数の倍数のみを表示する'(N,N3) :-
0 is N mod N3,
write_formatted('%t\n',[N]),!.
'3つめに入力した数の倍数のみを表示する'(_,_).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'2つの数A,Bを入力し、AのB乗を求める'(A,B,_AのB乗) :-
_AのB乗 is A ^ B.
651 :
デフォルトの名無しさん :2010/06/11(金) 20:38:17
>>241 使用言語:J
配列を指定位置で分割して入れ替える部分だけ。
f=:dyad define
g=.[<@:~:@#~@,.-~
'S00 S01 S10 S11'=.,(x g($y))<;.1 y
((>S11),.(>S10)),(>S01),.>S00
)
] A=:i.4 5
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
2 3 f A
13 14 10 11 12
18 19 15 16 17
3 4 0 1 2
8 9 5 6 7
>>647 問1
使用言語:J
f=:monad define
'a b c'=.y
(#~[:0&=c&|)a+i.>:(b-a)
)
f 10 30 3
12 15 18 21 24 27 30
>>245 使用言語:J
f=:monad define
dgit=:11 5 3$,(15#2)#:31727-128 27046 2056 2080 8230 544 512 422 0 32 30687
(ucp'○●'){~(,.0&,.)/(({.,10&,@{:)10 10#:3 4{6!:0''){dgit
)
f ''
●●●○●●●○○○○○●●●○●●●
●○●○●○○○○●○○○○●○●○●
●○●○●●●○○○○○●●●○●●●
●○●○●○●○○●○○●○○○○○●
●●●○●●●○○○○○●●●○●●●
>>656 % Prolog
'一次不定方程式、例えばAx+By=Cのxとyを求めるプログラムをユークリッドの互除法を
使って求める'(A,B,C,X,Y) :-
A1 is A // C,B1 is B // C,
あまりが1になるまでユークリッドの互除法を適用(A1,B1,L),
append(_,[D,E],L),
X is 1 + E,
Y is (-1) * (1 + D + D * E).
あまりが1になるまでユークリッドの互除法を適用(A,B,[D]) :-
1 is A mod B,
D is A // B.
あまりが1になるまでユークリッドの互除法を適用(A,B,[D|R]) :-
C is A mod B,
D is A // B,
あまりが1になるまでユークリッドの互除法を適用(B,C,R).
>>658 (
>>656 )
% Prolog 改行エラーがあった。
'一次不定方程式、例えばAx+By=Cのxとyを求めるプログラムをユークリッドの互除法を使って求める'(A,B,C,X,Y) :-
A1 is A // C,B1 is B // C,
あまりが1になるまでユークリッドの互除法を適用(A1,B1,L),
append(_,[D,E],L),
X is 1 + E,
Y is (-1) * (1 + D + D * E).
あまりが1になるまでユークリッドの互除法を適用(A,B,[D]) :-
1 is A mod B,
D is A // B.
あまりが1になるまでユークリッドの互除法を適用(A,B,[D|R]) :-
C is A mod B,
D is A // B,
あまりが1になるまでユークリッドの互除法を適用(B,C,R).
http://pc12.2ch.net/test/read.cgi/tech/1274827528/686 # [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10676.txt # 【問題1-02】 30点 配列要素の添字参照とポインタによるアドレス参照 [第1-1章 第09,10節]
#
# int型の配列 arr[] において、添字位置 n1 から n2 までの部分列を逆順にする関数arr_rev() を考える。
# 例えば、arr = {0,1,2,3,4,5} のとき、2 と 4 の間を逆順にすると、{0,1,4,3,2,5}となる。
# 配列と添字 n1,n2を引数とし、配列要素の添字参照として実装する arr_rev1() と、
# 配列要素のアドレスを与え、ポインタ走査で実装する arr_rev2() の効率性を比較する。
# 後者は、arr_rev2(&arr[n1], &arr[n2]) として呼び出す。
#
# void arr_rev1(int arr[], int n1, int n2)
# void arr_rev2(int *p1, int *p2)
# 逆順にする算法自体は、左端と右端の要素を交換を、両端を1つずつ狭めながら繰り返し、範囲が0または1になったら終了する。
# 左右の2つの反復変数を用いる。詳細は、情報数学の教科書や、オンラインのC言語ハンドブックを参照せよ。
#
# 配列の添字による要素参照 arr[k] は、arrの先頭番地 + 要素型サイズ × k の計算を行っている。
# ポインタ p の移動 p++ とポインタ先の参照 *p の方が直接的で速い。
# 関数の引数においても、arr_rev2() では、起点となる配列の先頭番地 arr が不要となる。
# 有効長の小さい配列で、プログラムの正当性を検証し、有効長を大きくして、計算時間の変化を調べよ。
http://pc12.2ch.net/test/read.cgi/tech/1274827528/686 # [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10676.txt # 【問題1-03】 40点 素朴累乗法と二分累乗法 [第1-1章 第09,10節]
# 整数 a, e, m ; 1≦a≦40000, e≧0, 2≦m≦40000 に対し、a の e乗を m で割った余りを求める関数 mpow(a, e, m) を考える。
# 素朴累乗法を用いた mpow1 () と二分累乗法を用いた mpow2() の効率性を比較する。
#
# 素朴累乗法は、a×a×‥×a のように、乗算を e-1 回 繰り返す素朴な方法である。
# 二分累乗法は、a^13=((a^2×a)^2)^2×a のように変形し、二乗と乗算を効率的に組み合わせる方法である。
# ただし、再帰法は用いず、反復法での実装とする。指数 e の奇偶で場合分けする。二乗値を格納する変数 p も用意する。
# オーバーフローが起きないよう、乗算したら、すぐ m による剰余に置き換える。
# 範囲が 40000 以下なのは、二乗の計算がint型(32ビット符号付整数)の値に収まるからである。
# 詳細は、情報数学の教科書や、オンラインのC言語ハンドブックを参照せよ。
#
# 効率性の比較は、理論面として計算回数(二乗を含む乗算回数)、実用面として実行時間の両方で行う。
# m の値が大きいと、大きな整数の乗算が必要になる。初期値となる a の値より、m の値の方が影響が大きい。
# m の値と eの値の変化を組み合わせ、多面的に論じること。
>>343 使用言語:J
f=:monad define
if. (y<1)+.y>9 do.
smoutput '入力する数は1から9までです'
else.
smoutput@>(,}.@|.)(<@#1&":)"0>:i.y
end.
''
)
f 4
1
22
333
4444
333
22
1
f 10
入力する数は1から9までです
>>332 使用言語:J
f=:dyad define
(y?#x){x
)
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' f 30
TKbnHBNvZRtprqyzQkmDJcSUEwajfM
>>618 使用言語:J
f=:monad define
smoutput@>y{.(,('*'<@{.~"0|.-2}.i.y)&,)<'*'#~y
)
f 5
*****
*
*
*
*****
>>668 % Prolog としては完全に反則ですが、ちょっと関数型風に遊んでみました。
:- op(750,fx,(::)).
:- op(350,fx,(``)).
:- op(340,fx,(`)).
:- op(300,fx,(#)).
%%%%%% 以上のオペレータ定義はシステムの初期化時に実行されている %%%%%%%%%%%%%%%%%
四則演算の記号の個数を入力すると、その個数に合わせた文字列を表示する :-
`` 記号の個数を入力,
findall(N :: `A,(member(A,[+,-,*,/]),` [A,(:)],# N),L),
call_all(L).
%%%%%% ただし、以下の定義があるものとする %%%%%%%%%%%%%%%%%%%%%%
N :: P :- for(1,M,N),call(P),M=N.
`` A :- write_formatted('%t\n',[A]).
` L :- list(L),(member(A,L),write(A),fail;true),!.
` A :- \+(list(A)),write(A).
# N :- get_integer(N).
>>697 % Prolog
'2次元配列を使って2点を結ぶ線分を引く'(M1,M2,X1,X2,Y1,Y2,LL) :-
'2次元配列を生成'(M1,M2,LL),
A is (X2-X1) / (Y2-Y1),
B is Y1 - A * X1,
for(X1,X,X2),
Y is truncate(A * X + B),
Xp is X + 1,Yp is Y + 1,
'2次元配列を要素位置指定により置換'(Yp,Xp,LL,'*'),
X = X2.
'2次元配列を生成'(M1,M2,LL) :-
findall(L,(for(1,M,M1),list_lenth(L,M2),all(L,' ')),LL),!.
'2次元配列を要素位置指定により置換'(M,N,A,LL1,LL2) :-
list_nth(M,LL,L),
要素番号によるならびの置換(N,A,L,L1),
要素番号によるならびの置換(M,L1,LL,LL2).
要素番号によるならびの置換(E,E,U,[A|R],[U|R]) :- !.
要素番号によるならびの置換(S1,E,U,[A|R],[A|R1]) :- S2 is S1 + 1,要素番号によるならびの置換(S2,E,U,R,R1).
要素番号によるならびの置換(Pos,U,L1,L2) :- 要素番号によるならびの置換(1,Pos,U,L1,L2).
>>321 使用言語:J
f=:dyad define
(-x){.y,~x#'0'
)
10 f 'abc'
0000000abc
>>662 % Prolog これもPrologには無縁の問題。ここではPrologの arr_rev を二通り示す。
arr_rev(L1,N1,N2,L2) :-
N11 is N1 - 1,
length(L11,N11),
length(L12,N2),
append(L12,R,L1),
append(L11,L13,L12),
reverse(L13,L14),
append(L11,L14,R,L2),!.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
arr_rev([A|R1],M,N1,N2,[A|R2]) :- M < N1,M2 is M + 1,arr_rev(R1,M2,N1,N2,R2).
arr_rev(L1,N1,N1,N2,L2) :-
arr_rev_p(L1,N1,N2,[],L2),!.
arr_rev_p(R,M,N2,L1,L2) :- M > N2,append(L1,R,L2),!.
arr_rev_p([A|R1],M,N2,L1,L2) :-
M2 is M + 1,
arr_rev_p(R1,M2,N2,[A|L1],L2).
>>585 Java
いろいろ適当なのは気にしない
public class TheLuckyNumbers {
public static int count(int a, int b) {
if (a < 1 || a > 1000000000 || b < 1 || b > 1000000000 || a > b) return 0;
return count(b) - count(a - 1);
}
private static int count(int a) {
int result = 0, digits = 0, add = 0;
if ((digits = search(a)) != 0) { result = a % digits; a -= result; result += 1; }
digits = 1;
while (a != 0) {
for (int i = 0, j = a % 10; i < j; i++) {
result += (i == 4 || i == 7) ? digits : add;
}
a /= 10; add = add * 8 + digits * 2; digits *= 10;
}
return result;
}
private static int search(int a) {
int result = 0;
for (int digits = 1; a != 0; digits *= 10, a /= 10) {
if (a % 10 == 4 || a % 10 == 7) { result = digits; }
}
return result;
}
}
http://pc12.2ch.net/test/read.cgi/tech/1274827528/774 # [1]Cプログラミング(中級者コース)
# [2]
# f(1)=1
# f(2)=12-34=-22
# f(3)=123-894+765=-6
# f(4)=1234-1213145+1116156-10987=-106742
# f(5)=12345-161718196+152425207-142322218+131211109
# ......
# 規則性を見いだしてf(n)を計算するプログラム(n<=1000迄は最小限対応)
# 全桁正確に計算すること
# [3] WIndows XP sp3/Visual C++2008/C言語
# [4] 6/30迄
# [5] stdio.hのみ#include。stdio.hで定義されている関数や定数
# を利用出来る。それ以外は自分で定義して使うこと
>>585 使用言語:J
f=:dyad define
+/([:+./'47'e.":)"0 x+i.>:y-x
)
1 f 100
36
50 f 100
18
1 f 10000000
7902848
なんにも工夫なしでは10000000ぐらいまでしかできないなあ。
//
>>676 F#
open System.Numerics
let f n =
let turn = function -1, 0 -> (0, -1) | 0, -1 -> (1, 0) | 1, 0 -> (0, 1) | _ -> (-1, 0)
let (nums, _, _) =
(([|for _ in 1 .. n -> [|for _ in 1 .. n -> 0|]|], (0, 0), (1, 0)), {1 .. n * n})
||> Seq.fold (fun (ns, (x, y), (dx, dy)) i ->
ns.[y].[x] <- i
let (dx', dy') =
let (x', y') = (x + dx, y + dy)
if 0 <= x' && x' < n && 0 <= y' && y' < n && ns.[y'].[x'] = 0 then (dx, dy)
else turn (dx, dy)
(ns, (x + dx', y + dy'), (dx', dy')))
let ops = [|(+); (-)|]
((0I, 0), nums) ||> Array.fold (fun (s, i) ns ->
let x = ns |> Array.map string |> String.concat "" |> BigInteger.Parse
(ops.[i] s x, (i + 1) % 2))
|> fst
>>675 % Prolog
四則演算の記号を連続し入力すると、各々の文字列を入れると、文字の個数を結果として表示する :-
get_line(Line),
findall([A,C],(member(A,[+,-,*,/]),count(sub_atom(Line,_,1,_,A),C)),L),
append(_,[[_四則演算記号,_頻度]|R],L),
write_formatted('%t:%t\n',[_四則演算記号,_頻度]),
R = [].
>>676 使用言語:J
spiral =: ,~ $ [: /: }.@(2 # >:@i.@-) +/\@# <:@+: $ (, -)@(1&,)
f=:monad define
if. y=1 do. 1 else. -/;".@,&'x'&.><@(,&":/)"1>:spiral y end.
)
f 1
1
f 2
_31
f 3
_6
f 4
_106742
f 5
_20391753
#": f 1000
5945 これは桁数
いろんなところからパクってつぎはぎ。
>>680 f(2)は出題側のミスなんですね。元スレ繁盛し過ぎていて読なかった
ばっかりにさっぱり分かりませんでした。
>>673 % Prolog
文字とその確率を入力しそれに対するハフマン符号を文字に割当て表示する :-
findall([_確率,_文字],(
repeat,
get_line(Line),(Line=end_of_file,!,fail;
split(Line,[' ',','],[_文字,B]),
atom_to_term(B,_確率,_))),L1),
ハフマン符号化(L1,L2),
ハフマン符号表(L2).
ハフマン符号化(L1,[[A,'0']|R]) :-
sort(L1,L2),
append(L3,[[_,A]],L2),
ハフマン符号の割り当て(L3,[[B,C]|L4]),
ハフマン符号に補正する(L4,[[B,C]],R).
ハフマン符号の割り当て([[_,A]],[[A,'1']]) :- !.
ハフマン符号の割り当て([[_,A]|R1],[[A,S1]|R2]) :- ハフマン符号の割り当て(R1,R2),R2 = [[B,S2]|_],concat_atom(['1',S2],S1).
ハフマン符号に補正する([],L,L) :- !.
ハフマン符号に補正する([[A,B]|R1],L1,L) :- concat_atom([B,'0'],C),ハフマン符号に補正する(R1,[[A,C]|L1],L).
ハフマン符号表([]) :- !.
ハフマン符号表([[A,B]|R]) :- write_formatted('%t %t\n',[A,B]),ハフマン符号表(R).
http://pc11.2ch.net/test/read.cgi/db/1274791771/139 # 期間の抽出について相談です。
# 元情報
# ID START END
# ----- ----- -----
# 10 2010/06/01 2010/06/12
# 10 2010/06/13 2010/06/14
# 10 2010/06/15 NULL
# 20 2010/06/01 2010/06/11
# 20 2010/06/13 2010/06/15
# ↓
# 欲しい情報
# ID START END
# ----- ----- -----
# 10 2010/06/01 NULL
# 20 2010/06/01 2010/06/11
# 20 2010/06/13 2010/06/15
#
# ・開始日、終了日の期間重複はなし
# ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日
# ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20)
SQLの宿題スレはないから、DB板の質問スレから採用する他ない。
http://pc12.2ch.net/test/read.cgi/tech/1274827528/844 # [1] 授業単元:プログラミング応用
# [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。
# ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。
# 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。
# 下記を参考にプログラムを作成しなさい。
# int gannen[]={1989, 1926, 1912, 1868};
# char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"};
#
>>689 #
# 図
#
# 0x30; 0 0x31; 1 0x32; 2 0x33; 3
#
# 0x34; 4 0x35; 5 0x36; 6 0x37; 7
#
# (省略)
#
# 0x78; x 0x79; y 0x7a; z 0x7b; {
#
採用って誰を?
>>683 % Prolog
'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :-
findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1),
findall([_ID,_最小開始日,_最大終了日],(
member(_ID,L1),
findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日),
findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)),
L).
write('ID START END \n----- ----- ----- \n'),
append(_,[[_ID,_Start,_End]|R],L),
write_formatted('%t %t %t\n',[_ID,_Start,_End]),
R = [].
開始日(_ID,_開始日) :- 期間(_ID,_開始日,_).
終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL').
%
>>691 問題として採用するの意味w
>>693 # <<実行例>> (seed=97の場合)
# 国語 数学 英語
# 1人目: 75 55 84
# 2人目: 3 58 90
# 3人目: 100 60 61
# 4人目: 19 39 67
# 5人目: 90 99 15
# 6人目: 5 58 59
# 7人目: 20 15 47
# 8人目: 46 12 94
# 9人目: 22 93 27
# 10人目: 90 90 35
#
# 合計点(ソート前): 214 151 221 125 204 122 82 152 142 215
# 合計点(ソート後): 221 215 214 204 152 151 142 125 122 82
>>693 % Prolog 前半部分(その一)
'10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する'
'10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列),
終えたのち,
'実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する'(_10人の三教科の点数を二次配列),!.
'10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列) :-
findall([_国語の点数,_数学の点数,_英語の点数],(
10人の,
'点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数)),
_10人の三教科の点数を二次配列).
10人の :- for(1,N,10).
10人の(N) :- for(1,N,10).
終えたのち.
>>693 % Prolog 前半部分(その二)
'点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数) :-
'n個の範囲(1~100)の正規分布ならびを得る'(3,[_国語の点数,_数学の点数,_英語の点数]).
'n個の範囲(1~100)の正規分布ならびを得る'(_n個,_正規分布ならび) :-
findall(Y2,(
for(1,_,_n個),
U is (random mod 100000) / 100000,
R is ( 2 * pi * (random mod 100000)) / 100000,
S is (-2) * log(1-U),
X is sqrt(S) * cos(R),
Y is sqrt(S) * sin(R),
Y2 is truncate(100 * (Y + pi) / (2 * pi)) + 1),
_正規分布ならび),!.
'実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する'(_n人目,_10人の三教科の点数を二次配列) :-
write(' 国語 数学 英語\n'),
10人の(_n人目),
list_nth(_n人目,_10人の三教科の点数を二次配列,[_国語の点数,_数学の点数,_英語の点数]),
write_formatted('%2d人目 %3d %3d %3d\n',[_n人目,_国語の点数,_数学の点数,_英語の点数]),
_n人目 = 10,!.
> SQLの宿題スレはないから、DB板の質問スレから(問題を)採用する他ない。 tech板の問題集が少ないから、DB板から問題を採用したわけですね。
>>698 Prologはオンメモリデータベースとして生き抜いていく言語ですから、
一般のDBMSで採用されている言語と等価の述語表現がどうなるのかは
興味の尽きない課題です。それで、敢えて宿題以外に題材を求めてこの
スレでは問題として掲載しています。
Prologの節はORの関係にあり、集約には不利です。ここの部分をどう
補えばよいのか。どこまで組込み述語として用意するべきなのか。
処理系の開発者と話し合うためのたたき台として準備しているのが
このスレのSQL関係の解答ということになります。
http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # [1] 授業単元:計算機とアルゴリズム
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt #
# 問題3
#
# 実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定するプログラムを作成しなさい。
# 例として a, b, c をそれぞれ 1.0, 5.0, 3.0 としたとき、および a, b, c をそれぞれ 4.0, 5.0, 3.0 としたときの実行結果例を示す。
#
# 実行結果(a=1.0, b=5.0, c=3.0 の場合)
#
# 辺の長さが 1.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します
# ありえません
#
#
# 実行結果(a=4.0, b=5.0, c=3.0 の場合)
#
# 辺の長さが 4.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します
# ありえます
>>700 % Prolog
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて表示する'(_a,_b,_c) :-
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([_a,_b,_c],X),
write_formatted('一番小さい数は %t です\n',[X]).
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([X],X) :- !.
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([A,B|R],X) :-
A =< B,
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([A|R],X).
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([A,B|R],X) :-
A > B,
'3つの整数 a,b,c を比較し、 その中で一番小さい数を見つけて'([B|R],X).
>>702 % Prolog
:- op(600,xfx,と).
:- op(650,fx,辺の長さが).
:- op(700,xf,となる三角形があり得るかどうか判定します).
辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :-
_a > _b + _c,
_b > _a + _c,
_c > _a + _b,
write('ありえます\n'),!.
辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :-
write('ありえません\n').