第二編も512Kbyte越えで終了しました。
前スレで未解決な課題は順次このスレにコピーします。
>>2 % Prolog
算術式解析(_文,_残りの文,_初期節番号,_終了節番号,_式) :-
atom_chars(_文,Chars),
算術式(_初期節番号,_終了節番号,Chars,R,_式),
atom_chars(_残りの文,R),!.
定数(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!.
変数(A) :- member(A,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]),!.
変数(A) :- member(A,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']),!.
算術式(N1,N2,[A|R],R,B) :-
定数(A),
atom_to_term(A,B,_),
assertz(算術式構文木(N1,[],[],B)),
N2 is N1 + 1,!.
算術式(N1,N2,[A|R],R,A) :-
変数(A),
assertz(算術式構文木(N1,[],[],A)),
N2 is N1 + 1,!.
算術式(N1,N2,L,R,'+'(S1,S2)) :-
append(['('|L1],[')'|R],L),append(L2,['+'|L3],L1),
N3 is N1 + 1,
算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2),
assertz(算術式構文木(N1,N3,N4,'+')),!.
算術式(N1,N2,L,R,'*'(S1,S2)) :-
append(['('|L1],[')'|R],L),append(L2,['*'|L3],L1),
N3 is N1 + 1,
算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2),
assertz(算術式構文木(N1,N3,N4,'*')),!.
http://pc12.2ch.net/test/read.cgi/tech/1260532772/112 # 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
# ポーカーゲーム(の一部)をC言語にて作成する。
#
# ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
# カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
# プレイヤは配られたカードの中から交換するものを選択できるようにする。
# ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
# プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
# 表示、カードの選択は標準入出力を利用してください。
#
>>6 % Prolog (その一) VT100のエスケープシーケンスの一部。前スレに書いたものだけど、これがないとエディタは作れないと思うので再掲。
カーソルをPl行上へ移動(Pl) :- put_code(27),write_formatted('[%tA',[Pl]).
カーソルをPl行下へ移動(Pl) :- put_code(27),write_formatted('[%tB',[Pl]).
カーソルをPc桁右へ移動(Pc) :- put_code(27),write_formatted('[%tC',[Pc]).
カーソルをPc桁左へ移動(Pc) :- put_code(27),write_formatted('[%tD',[Pc]).
カーソルを移動(Pl,Pc) :- put_code(27),write_formatted('[%t;%tH',[Pl,Pc]).
カーソルから画面の終わりまでを消去 :- put_code(27),write('[J').
画面の始めからカーソルまでを消去 :- put_code(27),write('[1J').
画面全体を消去 :- put_code(27),write('[2J').
カーソルから行の終わりまでを消去 :- put_code(27),write('[K').
行全体を消去 :- put_code(27),write('[2K').
行の始めからカーソルまでを消去 :- put_code(27),write('[1K').
>>4 % Prolog
算術式の値を計算して表示 :-
get_line(Line),
算術式解析(Line,_,1,_,_式),
write_formatted('show:%t\n',[_式]),
X is _式,
write_formatted('eval:%t\n',[X]).
% 算術式解析/5 他の定義は
http://pc12.2ch.net/test/read.cgi/tech/1261443439/3 参照
http://pc12.2ch.net/test/read.cgi/tech/1260532772/365 # [1] 授業単元:初級プログラミング
# [2] 問題文(含コード&リンク):マインスイーパーを作ってください。
# ・縦の列はABC...で、横の列は123...で表示し、座標を繰り返し入力する
# ・枡の大きさは自由である(難易度ごとに大きさを選べる等要工夫)
# ・地雷の位置は毎回ランダムであること
# ・指定(入力)した座標には周囲の地雷の数を表示させる
# ・地雷のある座標を入力するか、全ての安置を入力することでクリアとする
# ・その他、工夫等が見られると加点
>>12 % Prolog
'数値(n)を反転した値を表示' :-
get_integer(N),
'数値(n)を反転する'(N,N2),
write_formatted('%t\n',[M]).
'数値(n)を反転する'(N,N1) :-
number_chars(N,Chars1),
reverse(Chars1,Chars2),
number_chars(N1,Chars2).
>>9 % Prolog 一番基本的なもの。
有向グラフ(1,2,50).
有向グラフ(1,3,80).
有向グラフ(2,4,15).
有向グラフ(2,3,20).
有向グラフ(4,5,30).
有向グラフ(3,4,10).
有向グラフ(3,5,15).
有向グラフの最短経路(_頂点1,_頂点2,_最短距離,_最短経路) :-
findmin([_距離,_経路],有向グラフの距離と経路(_出発点,_終点,_距離,_経路),[_
最短距離,_最短経路]).
有向グラフの距離と経路(_頂点,_頂点,0,[_頂点]) :- !.
有向グラフの距離と経路(_頂点1,_頂点2,_距離,[_頂点1|R]) :-
有向グラフ(_頂点1,_頂点3,_距離1),
有向グラフの距離と経路(_頂点3,_頂点2,_距離2,R),
_距離 is _距離2 + _距離1.
>>15 % Prolog
入力したデータセットを一枚交換して合計が一致する組をすべて示す(AL,BL,A,B) :-
データセットの入力(N,M,AL,BL),
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B).
データセットの入力(N,M,AL,BL) :- get_split_line([' '],[N,M]),\+((N=0,M=0)),'Aの入力'(N,AL),'Bの入力'(M,BL),!.
'Aの入力'(N,AL) :- findall(A,(for(1,_,N),get_integer(A)),AL).
'Bの入力'(M,AL) :- findall(B,(for(1,_,M),get_integer(B)),BL).
一枚ずつ全てを交換してみる(0,M,AL,BL,_,_) :- !,fail.
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B) :-
ならびの回転(左方向,1,AL,[A|R1]),
交換して合計が一致する(M,BL,A,B).
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B) :-
ならびの回転(左方向,1,AL,AL2),
N1 is N - 1,
一枚ずつ全てを交換してみる(N1,M,AL2,BL,A,B).
交換して合計が一致する(0,[A|R1],[B|R2],A,B) :- !,fail.
交換して合計が一致する(M,[A|R1],[B|R2],A,B) :- sum([B|R1],Sum), sum([A|R2],Sum).
交換して合計が一致する(M,[A|R1],[B|R2],A,B) :-
ならびの回転(左方向,1,BL,BL2),
M1 is M - 1,
交換して合計が一致する(M1,[A|R1],BL2,A,B).
>>6 % Prolog (その二) Prolog-KABA風にやってみる。まだまだ続く。
e_do(11,P1,P2,B1,B2,K1,K2,no) :- e_kill(B1,B2,K1,K2),P2 is P1 - 1,e_disp(P2,B2),!.
e_do(1,P1,Tol,B1,B1,K1,K1,no) :- e_tol(P1,Tol),e_jump(Tol),e_disp(Tol,B1),!.
e_do(5,P1,Eol,B1,B1,K1,K1,no) :- e_eol(P1,Eol),e_jump(Eol),e_disp(Eol,B1),!.
e_do(4,P1,P2,B1,B2,K1,K1,no) :- e_delete(1,P1,B1,B2),e_disp(P2,B1),!.
e_do(8,P1,P2,B1,B2,K1,K1,no) :- P2 is P-1,e_jump(P2),e_delete(1,P2,B1,B2),e_disp(P2),!.
e_do(6,P1,P2,B1,B1,K1,K2,no) :- P2 is P+1,e_disp(P2,B1),!.
18 :
17:2009/12/23(水) 04:08:35
>>6 は行エディタを指定しているらしいけれど、どうせやるなら、Emacs風にいきたいw
>>19 % Prolog
program :-
user_parameters([A]),
atom_to_term(A,N,_),
N2 is N // 2,
findall([M,D],(for(1,M,N2),0 is N mod M,D is N // M),L),
因数の表示(N,L),
halt.
因数の表示(_,[]).
因数の表示(N,[[M,D]|R]) :-
write_formatted('%t = %t * %t\n',[N,M,D]),
因数の表示(N,R).
http://pc12.2ch.net/test/read.cgi/tech/1258320456/52 # 【 課題 】和歌について考察する問題。
# 歌 ... こぬ人を待つほの浦の夕凪にやくやもしほの身もこがれつつ (定家)
# これはかなり複雑なうたです。
# 人をまつとは「待つ」であり、「松」です。まつ帆だからです。松の姿に似た帆です。
# もちろん松は浦の背景でもあります。浦は夕凪ですから心は風を「待って」もいます。
# 風はありませんから、待ってもこぬ人なのです。風があの人なのかそれとも帆船なのか
# 微妙です。浦は「浦」であると同時に心の「裏」であり、あの人(風)の気持ちを「占」なふ、
# うらでもあります。
# 「焼くや」(やいているのだろうか)とは、恋に焦がれて身を焼いているのであり、
# やくやもしほとは藻塩(自分)が陽にあぶられ、渇き、焼かれ、煙でいぶされ、さらに
# 煮られ、再び乾かされというような、製塩法の愛の地獄絵であり、身もこがれという
# 言葉には「藻」がここでも含まれています。製塩の煙は夕凪の浦に実際に漂って
# いるのかもしれません。
# 以上のような、この歌に含まれる語とそれからくる連想をプログラムで表現しなさい。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/177 # [1] 授業単元: コンピュータプログラミング
# [2] 問題文(含コード&リンク)
# 1)f(x,y)=dy/dx=-4(x-1)y,y(0)=e^-2の一階微分方程式についてオイラーの方法で数値解を求めるプログラムを作成せよ。
# 2)dy/dx=f(x,y)=1-y,y(0)=0
# dy/dx=f(x,y)=y(1-y),y(0)=0.01
# dy/dx=f(x,y)=2yx,y(0)=1
# の数値解をオイラー法によって求めよ。
#
http://pc12.2ch.net/test/read.cgi/tech/1260532772/112 # 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
# ポーカーゲーム(の一部)をC言語にて作成する。
#
# ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
# カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
# プレイヤは配られたカードの中から交換するものを選択できるようにする。
# ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
# プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
# 表示、カードの選択は標準入出力を利用してください。
#
http://sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
# 3.以下のプログラムを作成
# 3x3マスのマルバツゲームのボードを作成
# ○側と×側が交互に2次元座標上の位置を入力
# 入力後、毎回ボードを表示する
# たて、よこ、斜めのいずれかに○か×が3つ並んだ
# 時点でプログラムを終了
#【 課題 】
#「0.2+0.4+0.6+・・・・・+10.0の計算を行うプログラムを作成せよ。」と
# いう課題文が与えられたとする。
# この文を、公差数列 0.2,0.4,0.6...10.0の和を計算する課題であると認識する
# ことができる最小限のプログラムを示せ。
http://pc12.2ch.net/test/read.cgi/tech/1245017721/12 # 実際の問題を簡単にした問題例です。
#
# 流れ:
# キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
# ということを目標金額まで繰り返し、到達したらその金がなくなるまで
# 家でごろ寝し、なくなったらまた働く
#
# キャラクタは
# ・バイトをする : 手持ちが1増える
# ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
# ・家で寝る : 貯金が1減る
# の状態を取ります。
# 財布の許容量は3、目標貯金額は5とします。
#
#【課題2】
#
# 順次生成・比較法により、閉路を順次生成し、これまでの最短経路長をもった閉路と閉路長を比較することによってTPSを解くプログラムを作成せよ。
# (※1 : 適当に出発点を定め、そこを出発点とする閉路をひとつ生成し、それをとりあえず最短閉路とする)
# (※2 : 新たに経色を生成し、その閉路長をその時点での最短閉路長と比較し、短い方を最短閉路とする)
# (※3 : 上記のことを全ての閉路について繰り返し、最短閉路を求める)
http://pc12.2ch.net/test/read.cgi/tech/1260532772/400 # [1]授業単元:プログラミング
# [2] 課題:いわゆる15パズル。
# 01 02 03 04
# 05 06 07 08
# 09 10 11 12
# 13 14 15
# のように配置された4x4のパネルを乱数を用いてシャフルする。シャフル時のパネルの動かし方は
# ゲーム進行中のパネルを動かすやり方と同じルールが適用される。
# パネル座標値(R,C) を入力させ (Rは行 Cは列 それぞれ1から4の値を取る)
# 対応するパネルが空白でないパネルで空白と隣接する場合はそこに移動させる方法で
# ゲームを進行させ、最初の状態に戻った場合(完成)は「暇人さんご苦労様」と出力して終了。
# 完成するまで入力と移動を繰り返す。無効なマスの指定は「そんなパネル動かせへん」と警告を表示すること。
# 盤面状況はコンソール出力とし、動かした回数と共に入力の直前に随時、及びゲーム
終了前に表示すること。
>>35 Haskellで
import Control.Monad.State
import qualified Data.Set as S
import qualified Data.Map as M
type Proc = StateT (M.Map Char Int, S.Set Int) []
solve :: [String]
solve = flip evalStateT (M.empty, S.fromList [0..9]) $ do
osaka <- int "osaka"
kyoto <- int "kyoto"
tokyo <- int "tokyo"
guard $ osaka + kyoto == tokyo
return $ show osaka ++ " + " ++ show kyoto ++ " = " ++ show tokyo
main = putStr $ unlines solve
int :: String -> Proc Int
int xs = do
(d:ds) <- mapM digit xs
guard $ d /= 0
return $ foldl (\n c -> n * 10 + c) 0 (d:ds)
digit :: Char -> Proc Int
digit c = do
(m, s) <- get
case M.lookup c m of
Just d -> return d
Nothing -> do
d <- lift $ S.toList s
put (M.insert c d m, S.delete d s)
return d
>>35 % Prolog 汎用性の全くない定義。
覆面算_35(O,S,A,K,Y,T) :-
加算表(A,O,K1,O),
(K1=0,加算表(K,T,K2,Y);K1=1,加算表の一(K,T,K2,Y)),
(K2=0,加算表(A,O,K3,K);K2=1,加算表の一(A,O,K3,K)),
(K3=0,加算表(S,Y,K4,O);K3=1,加算表の一(S,Y,K4,O)),
(K4=0,加算表(O,K,0,T);K4=1,加算表の一(O,K,0,T)),
\+(O=S),\+(O=A),\+(O=K),\+(O=Y),\+(O=T),
\+(S=A),\+(S=K),\+(S=Y),\+(S=T),
\+(A=K),\+(A=Y),\+(A=T),
\+(K=Y),\+(K=T),
\+(Y=T).
加算表の一(A,B,C,D) :- 加算表(1,A,K,E),加算表(E,B,C,D).
加算表定義 :-
for(0,M,9),
for(0,N,9),
D is (M+N) // 10,
Mod is (M+N) mod 10,
P=加算表(M,N,D,Mod),
assertz(P),
N=9,
M=9.
:- 加算表定義.
辺の和が3以上1000以下の直角三角形の個数を求める(_個数) :-
Max1 is truncate(sqrt(1000)),
findall(N2,(for(1,N,Max1),N2 is truncate(N*N)),L1),
count((組み合わせ(L1,3,[A,B,C]),C is A+B,C>=3,C=<1000),_個数).
辺の和が3以上1000以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さ(_短辺1,_短辺2,_長辺) :-
Max1 is truncate(sqrt(1000)),
findall(N2,(for(1,N,Max1),N2 is truncate(N*N)),L1),
findmax([C,A,B],(組み合わせ(L1,3,[A,B,C]),C is A+B,C>=3,C=<1000),[_短辺1,_短辺2,_長辺]).
41 :
40:2009/12/24(木) 07:17:15
>>40 間違い。これは辺の二乗だったね。
% Prolog
辺の和が3以上1000以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さを求める(_辺1,_辺2,_辺3) :-
Max1 is truncate(sqrt(1000)),
findall(N2,(for(1,N,Max1),N2 is truncate(N*N)),L1),
findmax([C,A,B],(組み合わせ(L1,3,[A,B,C]),C is A+B,C>=3,C=<1000),[A,B,C]),
_辺1 is truncate(sqrt(A)),
_辺2 is truncate(sqrt(B)),
_辺3 is truncate(sqrt(C)),!.
>>40 益々、間違えた。というより最初から問題を読み違えてる。
% Prolog
辺の和が3以上1000以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さを求める(_辺1,_辺2,_辺3) :-
Max1 is truncate(sqrt(1000)),
findall(N2,(for(1,N,Max1),N2 is truncate(N*N)),L1),
findmax([S,A1,B1,C1],(組み合わせ(L1,3,[A,B,C]),C is A+B,C>=3,C=<1000,A1 is truncate(sqrt(A)),B1 is truncate(sqrt(B)),C1 is trucate(sqrt(C)),S is A1 * B1 / 2)),[S1,_辺1,_辺2,_辺3]),!.
辺の和が3以上1000以下の直角三角形という最初の部分が正しく書けていなかったので
後で両方とも書き直します。
>>40 の方針でやると、半日経っても答えは返らないのでは。Prologではね
>>38 % Prolog これで動くか?
辺の和が3以上1000以下の直角三角形の個数を求める(Min,Max,_個数) :-
辺の和がMin以上Max以下の直角三角形の個数を求める(3,1000,_個数).
辺の和がMin以上Max以下の直角三角形の個数を求める(Min,Max,_個数) :-
findall(N2,(for(1,N,Max),N2 is truncate(N*N)),L1),
count((for(1,N1,Max),辺の和がM以下の直角三角形(N1,Min,Max,L1,Sum)),_個数).
辺の和がM以下の直角三角形(N,Min,Max,L1,Sum) :-
N2 is N * N,
member(A,L1),
U is truncate(A + N2),
member(U,L1),
Sum is truncate(sqrt(A) + sqrt(U) + N),
Sum >= Min,
Sum =< Max.
>>46 述語名とそれへの副目標を
辺の和がM以下の直角三角形 -> 辺の和がMin以上Max以下の直角三角形
に変更してください。
>>38 % Prolog
辺の和が3以上1000以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さを求める(Min,Max,_辺1,_辺2,_辺3) :-
辺の和がMin以上Max以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さを求める(3,1000,_辺1,_辺2,_辺3).
辺の和がMin以上Max以下の直角三角形のうち、最も面積の大きい直角三角形の3辺の長さを求める(Min,Max,_辺1,_辺2,_辺3) :-
findall(N2,(for(1,N,Max),N2 is truncate(N*N)),L1),
findmax([_面積,A,B,C],(for(1,N1,Max),辺の和がMin以上Max以下の直角三角形の面積(N1,Min,Max,L1,_面積,A,B,C)),[_,_辺1,_辺2,_辺3]).
辺の和がMin以上Max以下の直角三角形の面積(N,Min,Max,L1,_面積,A1,N,B1) :-
N2 is N * N,
member(A,L1),
U is truncate(A + N2),
member(U,L1),
A1 is sqrt(A),
C is sqrt(U),
Sum is truncate(A1 + N + C),
Sum >= Min,
Sum =< Max,
_面積 is A1 * N / 2.
# [1] 授業単元:Prolog初歩
# [2] 課題:以下の情報を述語として定義しなさい。
#
# 賞味期限
# 16…予約はじまる
# 22…予約最盛期
# 23…我慢できない
# 24…最盛期
# 25…ロスタイム
# 26…半額
# 27…更に半額
# 28…返品
# 29…廃棄処分
# 30…廃棄処分逃れてもカビ
#
>>49 % Prolog
:- op(500,xfx,…).
賞味期限(16…予約はじまる).
賞味期限(22…予約最盛期).
賞味期限(23…我慢できない).
賞味期限(24…最盛期).
賞味期限(25…ロスタイム).
賞味期限(26…半額).
賞味期限(27…更に半額).
賞味期限(28…返品).
賞味期限(29…廃棄処分).
賞味期限(30…廃棄処分逃れてもカビ).
>>49 % Prolog
賞味期限(16,予約はじまる).
賞味期限(22,予約最盛期).
賞味期限(23,我慢できない).
賞味期限(24,最盛期).
賞味期限(25,ロスタイム).
賞味期限(26,半額).
賞味期限(27,更に半額).
賞味期限(28,返品).
賞味期限(29,廃棄処分).
賞味期限(30,廃棄処分逃れてもカビ).
>>22 % Prolog こんなところから。
重層的な対象(待つ,人).
重層的な対象(待つ,風).
重層的な対象(焼く,身).
重層的な対象(焼く,藻).
形態的近似(松,帆).
形態的近似(帆,松).
音通(待つ,松).
音通(松,待つ).
音通(裏,占).
音通(占,裏).
音通(裏,浦).
音通(浦,裏).
音通(占,浦).
音通(浦,占).
連想(X,Y) :- 音通(X,Y).
連想(X,Y) :- 形態的近似(X,Y).
連想(X,Y) :- 連想(X,Z),連想(Z,Y).
>>30 % Prolog
'50人のクラス(男子35人)から5人の委員をランダムに選ぶ。このとき選ばれた委員の中に男3人、女2人が入る確率'(_確率) :-
A is 50 * 49 * 48 * 47 * 46,
B is 35 * 34 * 33 * 15 * 14,
階乗(5,C),
階乗(3,D),
階乗(2,E),
F is C / ( D * E),
_確率 is (B * F) / A.
>>54 % Prolog
'キーボードから文字入力し、":"で文字列分割をし、結果を表示する' :-
get_line(Line),
split(Line,[':'],L),
write_formatted('%t\n',[L]).
>>56 % Prolog
'20000〜40000までの自然数のうち、数字の9を2個含む素数の個数'(_個) :-
素数生成(40000,_素数ならび),
count((member(N1,_素数ならび),N1>=20000,数字の9を2個含む(N1)),_個).
数字の9を2個含む(N) :-
number_chars(N,L),
count(member('9',L),2),!.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
素数生成(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).
http://pc12.2ch.net/test/read.cgi/tech/1260532772/439 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
#
# 三角形の「底辺」「高さ」「面積」を表現するために,整数型の2つの変数teihenとtakasaと浮動小数点型(double型)の1つの変数mensekiの,計3つの変数をメンバとしてもつ構造体型sankakuを宣言しよう.
#
# main関数の中で,構造体変数triangle1とtriangle2が次のように定義されているとする.
#
# struct sankaku triangle1 = {2, 8, 0.0};
#
# struct sankaku triangle2 = {3, 6, 0.0};
#
# このとき,以下の式で三角形の面積を計算し,それぞれのメンバ変数mensekiに求めた値を格納しよう.(整数同士の計算結果は必ず整数型の値になってしまうため,「2.0」という小数点付の数で割る計算をすること.そうすると,小数点以下の値まで求められる)
#
# (面積) = (底辺) × (高さ) / 2.0
#
# さらに,格納されたそれぞれの面積の値(triangle1のmensekiとtriangle2のmenseki)を表示するプログラムを作成せよ.(表示の際にはdouble型の値を表示することになるので,printfの" "の中の書き方に注意すること)
>>12 使用言語: J
f=:|.&.":
f 56789
98765
1 + f 56789
98766
>>30 % Prolog 一般解を試みる。あまりすっきりしない。
'メンバーが男Mn人女Fn人で構成される時、男M人女N人をランダムに取り出す確率'(Mn,Fn,M,N,_確率) :-
メンバー全員は(Mn,Fn,Sn),
Sm is Sn - M - N + 1,
Mm is Mn - M + 1,
Nm is Nn - N + 1,
'男M人女N人の取り出し順序は何通りか'(M,N,_何通り),
'分母はSn*S(n-1)*..*S(m+1)*Smである'(Sn,Sm,_分母),
'分子はMm*M(m-1)*..M(n+1)*M(n)*Fm*F(m-1)..*F(n+1)*Fnに取り出し順序の何通りかを掛けたものである'(Mn,Mm,Fn,Fm,_何通り,_分子),
_確率 is _分子 / _分母.
'分母はSn*S(n-1)*..*S(m+1)*Smである'(Sn,Sm,_分母) :- 階乗(Sn,Sm,_分母),!.
'分子はMm*M(m-1)*..M(n+1)*M(n)*Fm*F(m-1)..*F(n+1)*Fnに取り出し順序の何通りかを掛けたものである'(Mn,Mm,Fn,Fm,_何通り,_分子) :-
階乗(Mn,Mm,A),
階乗(Fn,Fm,B),
_分子 is A * B * _何通り,!.
'男M人女N人の取り出し順序は何通りか'(M,N,_何通り) :-
S is M + N,
階乗(M,M1),
階乗(N,N1),
階乗(S,S1),
_何通り is S1 / ( M1 * N1 ).
>>30 つづき。
% Prolog
メンバー全員は(Mn,Fn,Sn) :- Sn is Mn + Fn.
階乗(0,_,1) :- !.
階乗(1,_,1) :- !.
階乗(M1,M,1) :- M1 < M,!.
階乗(N,M,X) :-
N1 is N - 1,
階乗(N1,M,Y),
X is N * Y,
asserta((階乗(N,M,X) :- (!))),!.
>>56 使用言語: J
+/2=+/"1'9'=":,.p:a+i.(_1&p:40000)-(a=._1&p:20000)
141
>>12 使用言語: maxima
(%i36) f(n):=(r:0,while(n>0)do (r:r*10+mod(n,10),n:fix(n/10)),r);
(%i37) f(987654321);
(%o37) 123456789
>>65 % Prolog
指定された文字列('"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"').
'"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の文字列の長さを求めて表示する' :-
指定された文字列(_指定された文字列),
atom_to_term(_指定された文字列,_文字コードならびのならび),
member(Codes,_文字コードならびのならび),
length(Codes,_長さ),
atom_codes(_表示文字列,Codes),
write_formatted('%t:%t\n',[_長さ,_表示文字列]),
fail.
'"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の文字列の長さを求めて表示する'.
>>65 % Prolog
指定された文字列('"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"').
'"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の文字列の長さを求めて表示する' :-
指定された文字列(_指定された文字列),
split(_指定された文字列,[',','"'],_文字ならびのならび),
member(Chars,_文字ならびのならび),
length(Chars,_長さ),
atom_chars(_表示文字列,Chars),
write_formatted('%t:%t\n',[_長さ,_表示文字列]),
fail.
'"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の文字列の長さを求めて表示する'.
>>65 % Prolog
指定された文字列('"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"').
'"izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の文字列の長さを求めて表示する' :-
指定された文字列(_指定された文字列),
split(_指定された文字列,[',','"'],_文字ならびのならび),
文字列を長さと共に表示する(_文字ならびのならび).
文字列を長さと共に表示する([]) :- !.
文字列を長さと共に表示する([Chars|R]) :-
length(Chars,_長さ),
atom_chars(_表示文字列,Chars),
write_formatted('%t:%t\n',[_長さ,_表示文字列]),
文字列を長さと共に表示する(R).
>>68 splitの下の行のインデントが狂いました。
そうそう。
インデントはPrologの実行にはまったく関係ありません。
これを習慣にしている人には見易いかなという程度の問題です。
冬休みに入って課題が出ない日がしばらくは続くでしょうね。
>>71 % Prolog
入力されたデーク数に応じた配列を確保し,入力されたデータをその配列に保存し,それらの和を求める :-
催促付き整数入力('データの数は?',N),
findsum(X,(for(1,M,N),催促付き整数入力('%t番目のデータを入力してください:',[M],X)),_和),
write_formatted('和=%t\n',[_和]).
>>71 % Prolog
>>72はズルしてるのでもうひとつ。配列はリストと読み替えてください。
入力されたデーク数に応じた配列を確保し,入力されたデータをその配列に保存し,それらの和を求める :-
催促付き整数入力('データの数は?',N),
入力されたデーク数に応じた配列を確保し(N,L),
入力されたデータをその配列に保存し、([_],L),
それらの和を求める(L,_和),
write_formatted('%\n',[_和]).
入力されたデーク数に応じた配列を確保し(N,L) :- length(L,N).
入力されたデータをその配列に保存し、(_,[]) :- !.
入力されたデータをその配列に保存し、(L,[N|R]) :-
length(L,M),
催促付き整数入力('%t番目のデータを入力してください:',[M],N),
入力されたデータをその配列に保存し、([_|L],R).
それらの和を求める([],0).
それらの和を求める([N|R],X) :- それらの和を求める(R,Y),X is N + Y.
>>65 使用言語: J
(,.~#&.>)'izumi';'Kanto';'Kudo';'Sato';'Sugawara';'Matuda';'Wada'
+-+--------+
|5|izumi |
+-+--------+
|5|Kanto |
+-+--------+
|4|Kudo |
+-+--------+
|4|Sato |
+-+--------+
|8|Sugawara|
+-+--------+
|6|Matuda |
+-+--------+
|4|Wada |
+-+--------+
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 巡回セールスマン問題をNearest Addition法で解くプログラムを作成せよ。
# Nearest Addition法とは
# (1)1つの都市からなる長さ0の部分閉路Tをひとつ作成する
# (2)現在の部分閉路Tが全ての都市を含むならば、それが解
# (3)そうでないならば、Tに含まれる都市jとTに含まれない都市kの組み合わせで、
# jとkの間の距離Cjk(jkはCの右下)を最小にするようなものを求める
# (4)(i,j)をTに含まれるパスとするとき、これを2つのパス(i,k)と(k,j)で置き換える
# (5)以上の(2)〜(4)を繰り返す
http://pc12.2ch.net/test/read.cgi/tech/1248012902/157 # 【 課題 】
ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/787.txt # 行列や固有値を扱う数値計算の課題です。
#
# 逆反復法(逆べき乗法)とLU分解を用いて、固有値問題を解く。
# 与える行列Aはn*n行列で、4*4や5*5でも、自由に数値を定めて良い。
# 1)一番小さい固有値に対応する固有ベクトルsVを求める。
# 2)二番目に小さい固有値に対応する固有ベクトルVを求める。
# double [] gauss(double[][] A , double[] b)
# のような形を作り、
# LU分解のメソッドを逆べき乗法のメソッドでコールするようにする。
# (あらかじめAをLU分解しておき、連立一次方程式を解いて反復するため)
# 解はdouble[]の形のベクトルで、for文の中でSystem.out.printを回して出力。
# ここまでが最低ライン。可能ならば
# ベクトル集合V=(v1,v2,....vn)において、
# Vi < 0 のときは-1のラベルを、
# Vi >=0 のときは 1のラベルをつける。
http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号194)
# [1] 授業単元: 情報処理
# [2] 問題文(含コード&リンク):ファイルからデータ(迷路空間)を読み込む処理と構造体・リストを用いた、
# 迷路空間を作成せよ。
# 読み込むデータは右図のような形式であり、 ******
# 各記号は次の意味を持つものとする。 *8000*
# * : 壁 ****0*
# 0 : 通路 **000*
# 8 : 通路 & スタート *90*0*
# 9 : 通路 & ゴール ******
# 迷路空間は、必ず長方形であることを前提とする。
# そして、再帰を用いた迷路空間の探索プログラムも作成せよ。
# 最短経路と後戻りした記録付き経路のどちらを表示しても構わないが両方表示した方がポイント高し
http://pc12.2ch.net/test/read.cgi/tech/1258158172/384 # [1] 授業単元:ヒューマンインターフェイス
# [2] 問題文(含コード&リンク):少なくとも以下の英文を日本語分に翻訳できるプログラムを作成せよ
# 1.The boy beats a dog with a stick.
# 2.Every boy loves a dog .
# 3.The dog is loved by every boy.
# 4.The boy saw a girl with a telescope.
# 5.The boy saw a girl with a dog.
# 6.The boy cut a stick with a saw.
宿題スレ難問集の様相を呈してきました。
HaskellやOCamlそして、Scalaなどの使い手がバッサバッサとプログラミングして
くれるといいんだがな。
>>38 問1
使用言語: 十進BASIC
LET st= TIME
LET r=0
FOR a=1 TO 1000
LET aa=a*a
FOR b=a TO 1000
LET bb=b*b
FOR c=1 TO 1000-a-b
IF aa+bb=c*c THEN LET r=r+1
NEXT C
NEXT B
NEXT A
PRINT r
PRINT TIME-st;" sec (CeleronM 1.46GHz)"
END
実行結果
325
10.5 sec (CeleronM 1.46GHz)
>>38 問2
使用言語: 十進BASIC
LET st= TIME
LET maxs=0
LET maxa=0
LET maxb=0
LET maxc=0
FOR a=1 TO 1000
LET aa=a*a
FOR b=a TO 1000
LET ab=aa+b*b
FOR c=1 TO 1000-a-b
IF ab=c*c THEN
LET ab2=a*b/2
IF ab2>maxs THEN
LET maxs=ab2
LET maxa=a
LET maxb=b
LET maxc=c
END IF
END IF
NEXT C
NEXT B
NEXT A
PRINT maxa;maxb;maxc
PRINT TIME-st;" sec (CeleronM 1.46GHz)"
END
実行結果
264 315 411
8.89999999999418 sec (CeleronM 1.46GHz)
>>85 % Prolog ここでも配列はリストと読み替えてください
'人力されたクラスの人数と科目の数に応じた配列を確保し,入力されたデータをその配列に保存し,科目ごとの和を求めよ' :-
人力されたクラスの人数と科目の数に(_クラスの人数,_科目の数),
応じた配列を確保し(_クラスの人数,_科目の数,L),
データを入力する([_],L),
科目ごとの和を求める(_和ならび),
和ならびを表示する(_和ならび).
人力されたクラスの人数と科目の数に(_クラスの人数,_科目の数) :- 催促付き整数入力('クラスの人数は ?',_クラスの人数),催促付き整数入力('科目の数は ?',_科目の数),!.
応じた配列を確保し(_クラスの人数,_科目の数,L) :- length(L,_クラスの人数),findall(L1,(member(L1,L),length(L1,_科目の数)),L).
データを入力する(_,[]) :- !.
データを入力する(NL,[L|R]) :-
length(NL,N),write_formatted('%t番目の学生は ?',[N]),
findall(A,(member(A,L),get_integer(A)),L),
データを入力する([_|NL],R).
科目ごとの合計を求める(L,_和ならび) :- 行列の転置(L,L1),findall(S,(member(L2,L1),sum(L2,S)),_和ならび).
和ならびを表示する([]) :- !.
和ならびを表示する([_和|R]) :- write_formatted('%t\n',[_和]),和ならびを表示する(R).
>>12 使用言語: 十進BASIC 計算だけで反転するのと文字列に変換して反転するのを比べてみた。
FUNCTION f1(n)
LET r=0
DO WHILE n>0
LET r=r*10+MOD(n,10)
LET n=INT(n/10)
LOOP
LET f1=r
END FUNCTION
FUNCTION f2(n)
LET s1$=STR$(n)
LET s2$=s1$
LET b=LEN(s1$)
FOR i=1 TO b
LET s2$(b-i+1:b-i+1)=s1$(i:i)
NEXT I
LET f2=VAL(s2$)
END FUNCTION
LET st=TIME
FOR i=1 TO 1000000
LET a=f1(123456789)
NEXT I
PRINT "f1";TIME -st;"sec"
LET st=TIME
FOR j=1 TO 1000000
LET a=f2(123456789)
NEXT J
PRINT "f2";TIME -st;"sec"
END
f1 3.63000000000466 sec
f2 24.5599999999977 sec
>>56 使用言語: 十進BASIC
FUNCTION isprime(n)
LET isprime=0
IF MOD(n,2)=0 THEN
IF n=2 THEN LET isprime=1
ELSE
FOR i=3 TO SQR(n) STEP 2
IF MOD(n,i)=0 THEN EXIT FOR
NEXT i
IF i>SQR(n) THEN LET isprime=1
END IF
END FUNCTION
FUNCTION is99(n)
LET is99=0
LET r=0
DO WHILE n>0
IF MOD(n,10)=9 THEN
LET r=r+1
IF r>2 THEN EXIT DO
END IF
LET n=INT(n/10)
LOOP
IF r=2 THEN LET is99=1
END FUNCTION
LET s=0
FOR j=20000 TO 40000
IF isprime(j)=1 AND is99(j)=1 THEN LET s=s+1
NEXT J
PRINT s
END ! 実行結果 141
'30年後の残高'(_単利か福利か,_元金,_利息,_30年後の残高) :-
findall(_残高1,残高(_単利か複利か,30,_元金,_利率,_,_,_残高1),_残高ならび),
last(_残高ならび,_30年後の残高).
残高(_単利か複利か,_期間,_元金,_利率,_年目,_利息,_残高) :-
length(L,_期間),
残高(_単利か複利か,L,[_],_元金,_元金,_利率,_年目,_利息,_残高).
残高(単利,[_|R1],L1,_元金,_残高1,_利率,_年目,_利息,_残高) :-
_利息 は 切り捨て(_元金 * _利率),
_残高 is _残高1 + _利息,
length(L1,_年目),
write_formatted('%t年目 利息=%t 残高=%t\n',[_年目,_利息,_残高]).
残高(複利,[_|R1],L1,_元金,_残高1,_利率,_年目,_利息,_残高) :-
_利息 は 切り捨て(_残高1 * _利率),
_残高 is _残高1 + _利息,
length(L1,_年目),
write_formatted('%t年目 利息=%t 残高=%t\n',[_年目,_利息,_残高]).
残高(単利,[_|R1],L1,_元金,_残高1,_利率,_年目,_利息,_残高) :-
_利息1 は 切り捨て(_元金 * _利率),
_残高2 is _残高1 + _利息1,
残高(単利,R1,[_|L1],_元金,_残高2,_利率,_年目,_利息,_残高).
残高(複利,[_|R1],L1,_元金,_残高1,_利率,_年目,_利息,_残高) :-
_利息1 は 切り捨て(_残高1 * _利率),
_残高2 is _残高1 + _利息1,
残高(複利,R1,[_|L1],_元金,_残高2,_利率,_年目,_利息,_残高).
>>90 訂正
% Prolog www
福利 -> 複利
>>90 % Prolog
'30年以内に複利の残高は単利の残高を上回るか。'(_元金,_複利の利率,_単利の利率) :
findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
行列の転置([L1,L2],L3),
member([A,B],L3),
A > B.
>>93 一ヶ所書き直し。さてどこでしょう?
>>90 % Prolog
'30年以内に複利の残高は単利の残高を上回るか。'(_元金,_複利の利率,_単利の利率) :-
findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
行列の転置([L1,L2],L3),
member([A,B],L3),
A > B.
>>93 >>94 リンクを
>>90 としてあるけどこれは
>>88です。
さて、
>>90の残高の中で表示をしているので、
>>94の課題でも、
客年の何年目、利息、残高が煩く表示されてしまう。
?- tell('/dev/null'),'30年以内に複利の残高は単利の残高を上回るか。'(1000,0.045,0.031),told.
とでもやればよいか。
これでも、上回らないと中の副目標がfailになって、toldが実行されないままとなる。
それもそうだけど、
複利の利率の方が大きいのでは1年目で片がついてしまうw
>>88 % Prolog
'30年以内に複利の残高は単利の残高を上回るか。上回るならば何年後か。'(_元金,_複
利の利率,_単利の利率,_何年後) :-
findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
行列の転置([L1,L2],L3),
append(L0,[[A,B]|_],L3),
A > B,
length([_|L0],_何年後).
>>97 (
>>88) 再表示。
% Prolog
'30年以内に複利の残高は単利の残高を上回るか。上回るならば何年後か。'(_元金,_複利の利率,_単利の利率,_何年後) :-
findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
行列の転置([L1,L2],L3),
append(L0,[[A,B]|_],L3),
A > B,
length([_|L0],_何年後).
>>98 すみません。間違い発見。またまた書き直し。
% Prolog
'30年以内に複利の残高は単利の残高を上回るか。上回るならば何年後か。'(_元金,_複利の利率,_単利の利率,_何年後) :-
findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
findall(_残高2,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
行列の転置([L1,L2],L3),
append(L0,[[A,B]|_],L3),
A > B,
length([_|L0],_何年後).
どこが間違ってるのか、コメントしてよ。
間違いの部分を読むのは勉強になるから。
>>100 焦ってしまって、精神的にコメントを入れてる余裕がなくなるw
人に見られないうちに書き換えようって。
ところで、findall/3は奇妙な仕様になっていて、
findall(_残高,残高(複利,30,_元金,_複利の利率,_,_残高),L1),
findall(_残高,残高(単利,30,_元金,_単利の利率,_,_残高),L2),
でも通ってしまう。
この目標が終了する時にこの中で使われている変数の束縛を解いてしまう。
好ましい表現ではないと思うから、避けるようにしているけど。
# [1] 授業単元:Prolog基礎
# [2] 問題文(含コード&リンク):カラムとして、電話番号と氏名を持つ
# 電話帳テーブルがある。この中で同姓同名が最も多い氏名を探せ。
>>102 % Prolog
'カラムとして、電話番号と氏名を持つ電話帳テーブルがある。この中で同姓同名が最も多い氏名'(_氏名ならび) :-
findall(_氏名,clause(電話帳(_,_氏名),_),_氏名ならび),
quicksort(_氏名ならび,_整列された氏名ならび),
同姓同名が最も多いもの(_整列された氏名ならび,0,[],_氏名ならび).
同姓同名が最も多いもの(_整列された氏名ならび,_これまでの最大数,_氏名ならび1,_氏名ならび).
整列された氏名ならび=[A|R1],
要素の連続数(1,A,R1,X,R2),
最大値は(A,X,_これまでの最大値,_更新された最大値,_氏名ならび1,_氏名ならび2),
同姓同名が最も多いもの(R2,_更新された最大値,_氏名ならび2,_氏名ならび),!.
同姓同名が最も多いもの(_,_,_氏名ならび,_氏名ならび).
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名]) :- X @> _これまでの最大値,!.
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名|_氏名ならび]) :- X = _これまでの最大値,!.
最大値は(_,_,_これまでの最大値,_これまでの最大値,_氏名ならび,_氏名ならび).
要素の連続数(X,A,[],X,[]) :- !.
要素の連続数(X,A,[B|R],X,[B|R]) :- \+(A==B),!.
要素の連続数(M,A,[A|R1],X,R) :- M2 is M + 1,要素の連続数(M2,A,R1,X,R).
>>102 書き直し。
% Prolog
'カラムとして、電話番号と氏名を持つ電話帳テーブルがある。この中で同姓同名が最も多い氏名'(_氏名ならび) :-
findall(_氏名,clause(電話帳(_,_氏名),_),_氏名ならび),
quicksort(_氏名ならび,_整列された氏名ならび),
同姓同名が最も多いもの(_整列された氏名ならび,0,[],_氏名ならび).
同姓同名が最も多いもの(_整列された氏名ならび,_これまでの最大数,_氏名ならび1,_氏名ならび).
整列された氏名ならび=[A|R1],
要素の連続数(1,A,R1,X,R2),
最大値は(A,X,_これまでの最大値,_更新された最大値,_氏名ならび1,_氏名ならび2),
同姓同名が最も多いもの(R2,_更新された最大値,_氏名ならび2,_氏名ならび),!.
同姓同名が最も多いもの(_,_,_氏名ならび,_氏名ならび).
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名]) :- X @> _これまでの最大値,!.
最大値は(_氏名,X,_これまでの最大値,X,_氏名ならび,[_氏名|_氏名ならび]) :- X = _これまでの最大値,!.
最大値は(_,_,_これまでの最大値,_これまでの最大値,_氏名ならび,_氏名ならび).
要素の連続数(X,A,[],X,[]) :- !.
要素の連続数(X,A,[B|R],X,[B|R]) :- \+(A==B),!.
要素の連続数(M,A,[A|R1],X,R) :- M2 is M + 1,要素の連続数(M2,A,R1,X,R).
>>104 ふたつ気になることがあります。
一つは、テーブルからの取得をclause/2で行っていること。本体(条件)を
殺しているのですが、電話番号による種別の判定など意味のあるケースも
想定できると思います。
二つめは、同一人が複数の回線を持つのは普通のことだから、カラムに
住所まで加えて、それも氏名+住所をキーにしなくてはいけないのではないか。
これは問題の不備ということになります。
>>105 問題がテーブルとありますから、やはり単位節のみと考えるべきなんでしょうね。
いきなり、条件部の記述によって自動発信してしまうケースなどを懼れました。
それから時刻を調べて週末だけはこの電話とか。
>>35 使用言語: 十進BASIC
FOR o=1 TO 9
FOR s=0 TO 9
IF o<>s THEN
FOR a=0 TO 9
IF o<>a AND s<>a THEN
FOR k=0 TO 9
IF o<>k AND s<>k AND a<>k THEN
FOR y=0 TO 9
IF o<>y AND s<>y AND a<>y AND k<>y THEN
FOR t=0 TO 9
IF o<>t AND s<>t AND a<>t AND k<>t AND y<>t THEN
IF (o+k)*10000+(s+y)*1000+(a+o)*100+(k+t)*10+a+o=t*10000+o*1000+k*100+y*10+o THEN
PRINT USING "# # # # # + # # # # # = # # # # #":o,s,a,k,a,k,y,o,t,o,t,o,k,y,o
END IF
END IF
NEXT T
END IF
NEXT Y
END IF
NEXT K
END IF
NEXT A
END IF
NEXT S
NEXT O
END
実行結果
3 2 0 4 0 + 4 1 3 7 3 = 7 3 4 1 3
>>37 (
>>35) 訂正追加。
% Prolog 定義を一節増やします。
加算表の一(A,B,1,D) :- 加算表(1,A,1,E),加算表(E,B,_,D).
加算表の一(A,B,C,D) :- 加算表(1,A,0,E),加算表(E,B,C,D).
# [1] 授業単元:Prolog基礎
# A社の組織として営業部、総務部があります。営業部は営業一課、営業二課にわかれています。
# 総務部も人事課と経理課にわかれています。管理情報として所属テーブル、給与テーブルがあります。
# [所属テーブル]
# 部, 課, ,社員名
# 営業部,営業一課,岡部
# 営業部,営業二課,小野
# 営業部,営業二課,鹿戸
# 営業部,営業二課,小泉
# 総務部,人事課,大崎
# 総務部,経理課,嶋田
# 総務部,経理課,宮田
# [給与テーブル]
# 社員名,給与
# 岡部,300000
# 小野,250000
# 鹿戸,280000
# 小泉,350000
# 大崎,200000
# 嶋田,400000
# 宮田,200000
# [問題] 部・課、部をそれぞれキーとして給与額を集約して合計した
# 部・課集約テーブル、部集約テーブルを作り出す述語を定義しなさい。
>>109 % Prolog (その一) 一般化できる部分のみ。集約データの収集/3,_述語/_アリティに対応する述語定義
% データベースの項目に関する情報述語と集約項目に関する述語が別に必要。
集約述語の生成(_述語/_アリティ,_集約述語ならび) :-
findall(_集約キー,集約キーの生成(_述語/_アリティ,_集約キー),_集約キーならび),
集約述語の生成(_述語/_アリティ,_集約キーならび,_集約述語ならび).
集約述語の生成(_述語/_アリティ,[],[]) :- !.
集約述語の生成(_述語/_アリティ,[_集約キー|R1],[_集約述語名/_アリティ2|R2]) :-
concat_atom(_集約キー,'・',_集約述語名),
length([_|_集約キー],_アリティ2),
集約データの収集(_述語/_アリティ,_集約キー,_集約データならび),
集約データの定義(_集約述語名,_集約データならび),
集約述語の生成(_述語/_アリティ,R1,R2).
集約データの定義(_,[]) :- !.
集約データの定義(_集約述語名,[_集約データ|R]) :-
P =.. [_集約述語名|_集約データ],
assertz(P),
集約データの定義(_集約述語名,R).
集約キーの生成(_述語/_アリティ,_集約キー) :-
集約項目(_述語/_アリティ,L),
append(L1,_,L),
\+(L1=[]).
>>102 使用言語: J
data=:noun define
0123456789 山田一郎
1234567890 鈴木二郎
2345678901 伊藤三郎
3456789012 山田一郎
4567890123 伊藤一郎
5678901234 山田一郎
)
]a=:cutopen<;._2 data
+----------+------------+
|0123456789|山田一郎|
+----------+------------+
|1234567890|鈴木二郎|
+----------+------------+
|2345678901|伊藤三郎|
+----------+------------+
|3456789012|山田一郎|
+----------+------------+
|4567890123|伊藤一郎|
+----------+------------+
|5678901234|山田一郎|
+----------+------------+
f=:0{(~.\:#/.~)
f 1{"1 a
+------------+
|山田一郎|
+------------+
f >1{"1 a
山田一郎
>>110 (
>>109)
% Prolog (その二) 具体的なテーブルを。あと、集約データの収集述語定義をすればよい。
所属(営業部,営業一課,岡部).
所属(営業部,営業二課,小野).
所属(営業部,営業二課,鹿戸).
所属(営業部,営業二課,小泉).
所属(総務部,人事課,大崎).
所属(総務部,経理課,嶋田).
所属(総務部,経理課,宮田).
給与(岡部,300000).
給与(小野,250000).
給与(鹿戸,280000).
給与(小泉,350000).
給与(大崎,200000).
給与(嶋田,400000).
給与(宮田,200000).
集約項目(所属/3,[部,課]).
述語構造(所属/3,1,部).
述語構造(所属/3,2,課).
述語構造(所属/3,3,社員名).
述語構造(給与/2,1,社員名).
述語構造(給与/2,2,給与).
>>19 使用言語: J
f=:monad def'((":y),'' = '',":@{.,'' * '',":@}.)"1~./:~"1|:(,:y&%)>:I.0=y|~>:i.y'
f 120
120 = 1 * 120
120 = 2 * 60
120 = 3 * 40
120 = 4 * 30
120 = 5 * 24
120 = 6 * 20
120 = 8 * 15
120 = 10 * 12
パズルでもやってみる?
2,0,1,0 の4個の数字をこの順番で1回だけ使い、0から99の数字を作れ。
演算子、関数の使用は自由。
例
201^0 -> 1
http://pc12.2ch.net/test/read.cgi/tech/1260532772/487 # [1] 授業単元:計算機入門及び演習
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10311.txt #
以下の問題を解くプログラムをC言語を用いて作成しなさい.
AさんとBさんは点数が書かれたカードを何枚か持っている. AさんのカードとBさんのカ
ードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つカード合計点数が
等しくなるようにしたい.
このときどのカードとどのカードを交換したらよいか.ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする.
入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられる.
n m
s1
s2
...
sn
sn+1
sn+2
...
sn+m
各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, n はAさんのカードの枚数,m はBさんのカードの枚数を表す.続く n+m 行には,各カードの
点数が 1 行にひとつずつ並ぶ.最初の n 個の点数 (s1 から sn まで) はAさんのカードの点数,残りの m 個の点数 (sn+1 から sn+m まで) はBさんのカードの点数を表す.
n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする.入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される.
各データセットに対し,Aさん,Bさんの交換前のすべてのカードと交換すべき2つのカードを出力すること.形式は特に問わない(実行例を参考にすること).
なお,合計を等しくするようなカードの交換の方法が複数ある場合は,交換するカードの点数の和が最小となるもののみを出力すること.
また,カードの点数の合計を等しくするような交換が存在しない場合はその旨を出力すること.
>>114 使用言語: maxima
15までできたけど、結構、大変。
0 201*0;
1 2-0-1-0;
2 20/10;
3 2+0+1+0;
4 fix(sqrt(20.10));
5 ceiling(sqrt(20.10));
6 fix(sqrt(20.10));
7 fix(exp(2.010));
8 ceiling(exp(2.010));
9 ceiling(exp(2.0)+1.0);
10 fix(exp(2.0)+exp(1.0));
11 ceiling(exp(2.0)+exp(1.0));
12 2+0+10;
13 ceiling(exp(sin(2.0))+10);
14 fix(sqrt(201.0));
15 ceiling(sqrt(201.0));
>>30 使用言語: 十進BASIC
FUNCTION 組合せの数(n,r)
LET a=1
LET b=n
FOR i=2 TO r
LET a=a*i
LET b=b*(n-i+1)
NEXT I
LET 組合せの数=b/a
END FUNCTION
PRINT 組合せの数(35,3)*組合せの数(15,2)/組合せの数(50,5)
PRINT 組合せの数(35,4)*組合せの数(15,1)/組合せの数(50,5)
PRINT 組合せの数(35,2)*組合せの数(15,3)/組合せの数(50,5)
PRINT "組み込み関数combを使った場合"
PRINT comb(35,3)*comb(15,2)/comb(50,5)
PRINT comb(35,4)*comb(15,1)/comb(50,5)
PRINT comb(35,2)*comb(15,3)/comb(50,5)
END
実行結果
.324352451433858
.370688515924409
.127775208140611
組み込み関数combを使った場合
.324352451433858
.370688515924409
.127775208140611
>>114 使用言語: maxima
(%i182) makelist(i,i,fix(sin(%pi)),fix(apply("^",reverse([2.0,10]))+cos(%pi)));
(%o182) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99]
>>114 使用言語: 十進BASIC
DEF f(n)=n*n-n/n
FOR i=z TO f(20-10)
PRINT i
NEXT I
END
>>114 使用言語: Arc
arc> (apply range (map [-(* _ _)(/ _ _)] (list(expt 2 0) 10)))
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99)
>>114 使用言語: J
i. ,~ 20 - 10
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
>>114 使用言語: Haskell
Prelude> init $ (\[a,b]->[a..b]) $ map(^2)[0,10]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,
29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,
55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
http://pc12.2ch.net/test/read.cgi/tech/1258320456/79 # Windows XP上で、
# まず 同じディレクトリにあるsetting.iniを読み込んで
# その1行目, 2行目, 3行目を
# 文字列p, regex, aftに格納する。
# pをパスとして調べ、
# 1.実在するディレクトリだったらそのディレクトリの名前とサブディレクトリの名前と、
# それらの中にあるファイルの名前、およびファイルの中身に以下の置換作業を実行する。
# > 前からみて順に正規表現regexにマッチする文字列を全てaftに置換する。
# 2.実在しないディレクトリでなかったらエラーメッセージを標準出力に出力する。
>>114 使用言語: Scilab
-->a=2;[0:(10^a-a/a)]
>>125 % Prolog では正規表現は使わないので、その代わり以下のような述語を作っておく。
探索目標を真とする副文字列を置換文字列に置換(_文字列,_対象文字ならび,_探索目標,_置換文字列,X) :-
findall(S,探索目標を真とする副文字列を置換文字列に置換の一(_文字列,_対象文字ならび,_探索目標,_置換文字列,S),X).
探索目標を真とする副文字列を置換文字列に置換の一(_文字列,_対象文字ならび,_探索目標,_置換文字列,S) :-
atom_chars(_文字列,Chars),
探索目標を真とする文字ならびを得る(Chars,L1,_対象文字ならび,_探索目標,L3),
atom_chars(A1,L1),
atom_chars(A3,L3),
concat_atom([A1,_置換文字列,A3],S).
探索目標を真とする文字ならびを得る([],L1,L2,_探索目標,L3) :- !,fail.
探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,L3) :-
append(L1,L2,L3,L),
_探索目標.
探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,X) :-
変数指定項複写(_探索目標,_探索目標2,[L2],[L4]),
append(L11,L2,31,L),
_探索目標,
探索目標を真とする文字ならびを得る(L31,L1,L4,_探索目標2,X).
>>114 使用言語: Io
Io> list(2-0,10)reduce(a,b,b**a)repeat(v, v println)
>>114 使用言語: Io
Io> (20-10)squared repeat(v, v println)
>>127 (
>>125) かなりの大間違い。訂正。
% Prolog では正規表現は使わないので、その代わり以下のような述語を作っておく。L1,L3が加わり、益々意味不明になってきた。
探索目標を真とする副文字列を置換文字列に置換(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,X) :-
findall(S,探索目標を真とする副文字列を置換文字列に置換の一(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,S),X).
探索目標を真とする副文字列を置換文字列に置換の一(_文字列,L1,_対象文字ならび,L3,_探索目標,_置換文字列,S) :-
atom_chars(_文字列,Chars),
探索目標を真とする文字ならびを得る(Chars,L1,_対象文字ならび,_探索目標,L3),
atom_chars(A1,L1),
atom_chars(A3,L3),
concat_atom([A1,_置換文字列,A3],S).
探索目標を真とする文字ならびを得る(L,L1,L2,_探索目標,L3) :-
append(L1,L2,L3,L),
_探索目標.
>>130 使い方の例。
% 行頭に「私は」を挿入。
?- 探索目標を真とする副文字列を置換文字列に置換(嘘を申しません,[],[],L3,true,私は,X).
L3 = _141192,
X = ['私は嘘を申しません']
% "d.f" を"aaa"に置換
?- 探索目標を真とする副文字列を置換文字列に置換(abcdefgdufz,_,[d,_,f],_,true,aaa,X).
_ = _141192,
_ = _141193,
_ = _141200,
X = [abcaaagdufz,abcdefgaaaz]
% "b"と"f"の間にありその中に"d"を2つ含む文字列をaaaに置換
?- 探索目標を真とする副文字列を置換文字列に置換(abcdefgdufz,_,L2,_,(append([b],LY,[f],L2),count(member(d,LY),2)),baaaf,X).
_ = _141192,
L2 = _141193,
_ = _141194,
LY = _141197,
X = [abaaafz]
>>131 Prologでは実際にこんな述語を呼び出して検索や置換を行うものですか?
>>132 一般にどうかはわからない。私の場合はcall/1を使って汎用述語を作ることは
絶対と言っていいほどしない。したがってここでは課題として書いてみたが、
>>130のような定義述語を利用することはない。少々煩わしくても、検索が必要に
なった時に一つ述語を定義する。
このスレでは、一度に書き込める行数に制限があるので、何度も使用された
述語を「汎用」のものとみなして定義なしに、呼び出している場合も多い。
これはやむを得ずそうしているのであって、それが模倣すべきプログラムスタイルだ
などと考えないでほしい。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/496 # [1] 授業単元: C++実習
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10313.txt # 問題2
# 個々のオブジェクトにint型の識別番号を与える(全オブジェクトに異なる整数値を与える)ように以下のクラスを書き換えよ。
# また書き換えたクラスがテストできる適切なmain関数も作成せよ。
# class Account {
# string name; //口座名義
# string no; //口座番号
# long balance; //預金額
# Date open; //口座開設日
#
# public:
# Account(string n, string num, long z, Date op);
#
# void Deposit(long k); //預ける
# void Withdraw(long k); //おろす
# string GetName() const { return name; } //口座名義を調べる
# string GetNo() const { return no; } //口座番号を調べる
# long CheckBalance() const { return balance; } //預金額を調べる
# Date OpeningDate() const { return open; } //口座開設日を調べる
# }
http://pc12.2ch.net/test/read.cgi/tech/1235561034/679 # [授業単元] : Prolog
# 知恵を貸してください。
# 今宿題で嫉妬深い恋人たちの問題をやっていて
# 初期状態とゴール状態をそれぞれ
# initial_state(jealousy, jealousy(left,[1,2,3],[1,2,3],[ ],[ ])).
# final_state(jealousy(right,[ ],[ ],[1,2,3],[1,2,3])).
# と作って指し手の移動と状態変化についてはかけたのですが
# 状態変化したときの合法性のチェックでつまっています。
# legal(jealousy(right,[[1],[1,2]], [[2,3],[3]]) ×
# legal(jealousy(left,[[2,3],[2,3]], [[1],[1]]) ○
# としたいのですがどうしたらいいのでしょうか?
>>136 % Prolog
'京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'('
http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10318.txt').
区の名前,人口,面積のデータを格納する :-
'京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'(_ウェブサイト),
get_split_lines(_ウェブサイト,[' '],Lines),
member([_区の名前,_人口,_面積],Lines),
assertz('京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積)),
fail.
区の名前,人口,面積のデータを格納する.
人口についてソートする(_整列されたデータならび) :-
findall([_人口,_区の名前,_人口,_面積],'京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),L),
sort(L,L1),
降順に並べ直しながら鍵項目の削除する(L1,[],_整列されたデータならび).
面積についてソートする(_整列されたデータならび) :-
findall([_面積,_区の名前,_人口,_面積],'京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),L),
sort(L,L1),
降順に並べ直しながら鍵項目の削除する(L1,[],_整列されたデータならび).
降順に並べ直しながら鍵項目を削除する([],X,X) :- !.
降順に並べ直しながら鍵項目を削除する([[_|L]|R],Y,X) :-
降順に並べ直しながら鍵項目を削除する(R,[L|Y],X).
>>138 どうしても、ダメだね。勝手に改行が入ってしまう。"ある"の後の改行は
ないことにして下さい。
>>137 訂正
% Prolog Lines -> _区の名前・人口・面積ならび
区の名前,人口,面積のデータを格納する :-
'京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されているデータがある'(_ウェブサイト),
get_split_lines(_ウェブサイト,[' '],_区の名前・人口・面積ならび),
member([_区の名前,_人口,_面積],_区の名前・人口・面積ならび),
assertz('京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積)),
fail.
区の名前,人口,面積のデータを格納する.
>>136 % Prolog
人口が最大の区と最小の区の、名前と人口(_人口が最大の区の名前,_人口が最大の区の人口,_人口が最小の区の名前,_人口が最小の区の人口) :-
findmax([_人口,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_人口,_),[_人口が最大の区の人口,_人口が最大の区の名前),
findmin([_人口,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_人口,_),[_人口が最小の区の人口,_人口が最小の区の名前).
面積が最大の区と最小の区の、名前と面積(_面積が最大の区の名前,_面積が最大の区の面積,_面積が最小の区の名前,_面積が最小の区の面積) :-
findmax([_面積,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_,_面積),[_面積が最大の区の面積,_面積が最大の区の名前),
findmin([_面積,_区の名前],京都市の区ごとの人口と面積のデータ(_区の名前,_,_面積),[_面積が最小の区の面積,_面積が最小の区の名前).
人口密度が最大の区と最小の区の、名前と人口密度(_人口密度が最大の区の名前,_人口密度が最大の区の人口密度,_人口密度が最小の区の名前,_人口密度が最小の区の人口密度) :-
findmax([_人口密度,_区の名前],(京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),_人口密度 is _人口 / _面積),[_人口密度が最大の区の人口密度,_人口密度が最大の区の名前),
findmin([_人口密度,_区の名前],(京都市の区ごとの人口と面積のデータ'(_区の名前,_人口,_面積),_人口密度 is _人口 / _面積),[_人口密度が最小の区の人口密度,_人口密度が最小の区の名前).
>>141 ほとんどの場合これで済ませてしまいますが、本当は正しくない。
これだと、同一の人口、面積、人口密度が生じた時、名前の小さいまたは大きいもの
が採られてしまいます。正しい処理は、
人口が最大の区と最小の区の、名前と人口(_人口が最大の区の名前,_人口が最大の区の人口,_人口が最小の区の名前,_人口が最小の区の人口) :-
findmax(_人口,京都市の区ごとの人口と面積のデータ(_,_人口,_),_最大の人口),
findall([_区の名前,_最大の人口],京都市の区ごとの人口と面積のデータ(_区の名前,_最大の人口,_),L1),
findmin(_人口,京都市の区ごとの人口と面積のデータ(_,_人口,_),_最小の人口),
findall([_区の名前,_最小の人口],京都市の区ごとの人口と面積のデータ(_区の名前,_最小の人口,_),L2),
member([_人口が最大の区の名前,_人口が最大の区の人口],L1),
member([_人口が最小の区の名前,_人口が最小の区の人口],L2).
% なら、人口が同一の区があっても正しく解が得られます。
>>151 % Prolog は集約は得意としない。その場でこの述語を考えるのは負担が大きいので、
% 以下のような準備が必要だろう。SQLのcount(*)を解決する処理だが。
集約_数_逆順ならび([],L,L) :- !.
集約_数_逆順ならび([A|R1],L1,L) :-
\+(member([_,A],L1)),
集約_数_計測(A,R1,L2,1,Count),
逆順整列([Count,A],L1,L3),
集約_数_逆順ならび(L2,L3,L),!.
集約_数_計測(_,[],[],Count,Count) :- !.
集約_数_計測(A,[A|R1],L2,Count1,Count) :-
Count2 is Count1 + 1,
集約_数_計測(A,R1,L2,Count2,Count),!.
集約_数_計測(A,[B|R1],[B|R2],Count1,Count) :-
\+(A = B),
集約_数_計測(A,R1,R2,Count1,Count),!.
逆順整列(L,[],[L]) :- !.
逆順整列(L,[L1|R1],[L,L1|R1]) :-
L @>= L1,!.
逆順整列(L,[L1|R1],[L1|R2]) :-
逆順整列(L,R1,R2).
>>151 使用言語:J
ofic=:;:'b a b b a a c d g h c x r t a d c g j u y w q'
]ofic=:ofic,;:'g v c f g v a d e x n u y t y r t a s w'
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|b|a|b|b|a|a|c|d|g|h|c|x|r|t|a|d|c|g|j|u|y|w|q|g|v|c|f|g|v|a|d|e|x|n|u|y|t|y|r|t|a|s|w|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10{.\:~(~.,.~<@#/.~)ofic
+-+-+
|6|a|
+-+-+
|4|g|
+-+-+
|4|c|
+-+-+
|3|y|
+-+-+
|3|t|
+-+-+
|3|d|
+-+-+
|3|b|
+-+-+
|2|x|
+-+-+
|2|w|
+-+-+
|2|v|
+-+-+
>>152 (
>>151)
% Prolog 逆順ではなかった。降順だね。
集約_数_降順ならび([],L,L) :- !.
集約_数_降順ならび([A|R1],L1,L) :-
\+(member([_,A],L1)),
集約_数_計測(A,R1,L2,1,Count),
降順整列([Count,A],L1,L3),
集約_数_降順ならび(L2,L3,L),!.
集約_数_計測(_,[],[],Count,Count) :- !.
集約_数_計測(A,[A|R1],L2,Count1,Count) :-
Count2 is Count1 + 1,
集約_数_計測(A,R1,L2,Count2,Count),!.
集約_数_計測(A,[B|R1],[B|R2],Count1,Count) :-
\+(A = B),
集約_数_計測(A,R1,R2,Count1,Count),!.
降順整列(L,[],[L]) :- !.
降順整列(L,[L1|R1],[L,L1|R1]) :-
L @>= L1,!.
降順整列(L,[L1|R1],[L1|R2]) :-
降順整列(L,R1,R2).
>>151 % Prolog
所属する弁護士の数が多い事務所トップ10(L) :-
findall(_所属法律事務所,弁護士所属(_弁護士の名前,_所属法律事務所),L1),
集約_数_降順ならび(L1,[],L2),
length(L,10),
append(L,_,L2).
>>147 同時整数関係 -> 同次整数関係
であるとの訂正が出題スレに載っていました。
>>151 使用言語:Io
Io> ofic:="b a b b a a c d g h c x r t a d c g j u y w q"
Io> ofic=ofic .. "g v c f g v a d e x n u y t y r t a s w"
Io> ofic=ofic split
Io> ofic uniqueCount sortBy(block(x,y,x at(1)>y at(1)))slice(0,10)
==> list(list("a", 6), list("c", 4), list("b", 3), list("d", 3), list("g", 3),
list("y", 3), list("t", 3), list("v", 2), list("r", 2), list("w", 2))
>>109 % Prolog 出題から離れますが、2次元のリストの指定された列を取り出すユーティリティは
全ての行に対して位置指定により列を選択する(_,[],[]) :- !.
全ての行に対して位置指定により列を選択する(_選択する列位置ならび,[_行|R1],[L|R2
]) :-
列の選択(_選択する列位置ならび,_行,L),
全ての行に対して位置指定により列を選択する(_選択する列位置ならび,R1,R2).
列の選択([],_,[]) :- !.
列の選択([_列位置|R1],_行,[A|R2]) :-
integer(_列位置),
list_nth(_列位置,_行,A),
列の選択(R1,_行,R2),!.
列の選択([A|R1],_行,R2) :-
\+(integer(A)),
B は A,
integer(B),
列の選択([B|R1],_行,R2),!.
列の選択([A|R1],_行,[B|R2]) :-
\+(integer(A)),
B は A,
\+(integer(B)),
列の選択(R1,_行,R2),!.
>>158 list_nthは使わないで、第一引数を先にソートしてからやった方がいいと思う。
>>159 列の選択の第二・三節で変な事をやっているので、ソートできないw
そういうことか。それにしても危なっかしい仕様だな。
>>12 使用言語:Scala
scala> def f1(n:Int):Int={var r=0;var a=n;while(a>0){r=10*r+a%10;a/=10};r}
f1: (Int)Int
scala> f1(987654321)
res72: Int = 123456789
scala> def f2(n:Int):Int={n.toString.reverse.toInt}
f2: (Int)Int
scala> f2(987654321)
res73: Int = 123456789
>>144 使用言語:J
%:6*+/%2^~>:i.1000000
3.14159
>>144 使用言語:Io
Io> r:=0;for(i,1,1000000,r=r+1/(i*i));(r*6)sqrt
==> 3.1415916986605086
>>159 >>160 のような呑気なレスをつけてしまったが、取り出す順序が勝手に変わって
しまっては、後でmember/2などで取り出す時どうすればいいのかな?
http://pc11.2ch.net/test/read.cgi/db/1252492296/377 #
# Aテーブル
# aaa|ddd
#
# Bテーブル
# aaa|bbb
#
# Cテーブル
# bbb|ccc
#
# Aテーブルに対して、カラムaaaでBテーブルが紐づき、
# Bテーブルに対して、カラムbbbでCテーブルが紐づくとします。
# (つまり、Aテーブルのレコード1件は、Bテーブルを経由してCテーブルのレコード1件と紐づく)
# ここで、A.ddd = 'X'のとき、C.ccc = 'Y'に更新したいのですが
# 下記の文であってますでしょうか?
# また、もっと効率のいい方法はありますでしょうか?
#
# update C set C.ccc = 'Y' where C.bbb in
# ( select B.bbb from B where B.aaa in
# ( select A.aaa from A where A.ddd = 'X')
# ( select A.aaa from A where A.ddd = 'X')
# )
>>166 % Prolog
?- 'A'(A,'X'),'B'(A,B),(retract('C'(B,_)),fail;assertz('C'(B,'Y'))).
>>167 (
>>166)
% prolog (retract('C'(B,_)),fail;assertz('C'(B,'Y'))) の部分を
update(P,Q) :-
functor(P,F,A),
functor(Q,F,A),
( retract(P),fail;assertz(Q)).
が定義されているとして、
?- 'A'(A,'X'),'B'(A,B),update('C'(B,_),'C'(B,'Y')).
>>144 使用言語:Scilab
-->sqrt(6*sum(1.0 ./((1:1000000)^2)))
ans =
3.1415917
>>144 使用言語:Haskell
Prelude> sqrt $ 6*(sum[1/(x*x)|x<-[1..1000000]])
*** Exception: stack overflow
Prelude> sqrt $ 6*(sum[1/(x*x)|x<-[1..500000]])
3.141590743731832
>>151 使用言語:R
> ofic <- "b a b b a a c d g h c x r t a d c g j u y w q"
> ofic <- paste(ofic,"g v c f g v a d e x n u y t y r t a s w")
> ofic <- unlist(strsplit(ofic," "))
> head(sort(table(ofic),T),10)
ofic
a c g b d t y r u v
6 4 4 3 3 3 3 2 2 2
>>116 % Prolog データ入力部分は省略
カードの合計が一致するまででたらめにN回以内交換する(0,_,_,_,_,[]) :- !,fail.
カードの合計が一致するまででたらめにN回以内交換する(N,AL,BL,AL,BL,[]) :-
加算(AL,Sum1),
加算(BL,Sum2),
Sum1 = Sum2.
カードの合計が一致するまででたらめにN回以内交換する(N,AL,BL,X,Y,[[A,B,AL,BL]|Z]) :-
RA is (random mod 3) + 1,
RB is (random mod 3) + 1,
ならびの回転(左方向,RA,AL,[A|R1]),
ならびの回転(左方向,RB,BL,[B|R2]),
N1 is N - 1,
カードの合計が一致するまででたらめにN回以内交換する(N1,[B|R1],[A|R2],X,Y,Z).
>>174 使用言語:なでしこ
「#{HEX(色選択)}」をコピー
>>174 使用言語:J
wd 'clipcopy "',(":3{.". wd 'mbcolor'),'"'
http://pc11.2ch.net/test/read.cgi/db/1252492296/393 # SELECT文について質問です。
# テストデータ
# 名前 |1回目点数|2回目点数|
# ----+--------+--------|
# 田中 | 100 | 90 |
# 鈴木 | 80 | 80 |
#
# 成績マスタ
# 成績 | 点数 |
# ----+-------|
# A | 100 |
# B | 90 |
# C | 80 |
# ・欲しい結果
# 名前 |成績(1回目)|成績(2回目)|
# ----+---------+---------|
# 田中 | A | B |
# 鈴木 | C | C |
# ・説明 2TABLEを連結してSELECTしたいのですが、テストデータの点数を
# 下に、成績マスタから(1回目)と(2回目)の値をひっぱってくるには
# どう書けばよいでしょうか。
>>178 % Prolog 引数を順に処理する場合、それぞれ副目標を明示的に立てる。
テストデータ(田中,100,90).
テストデータ(鈴木,80,80).
成績マスタ('A',100).
成績マスタ('B',90).
成績マスタ('C',80).
欲しい結果(_欲しい結果) :-
findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回目成績),_欲しい結果).
欲しい結果(_氏名,_一回目成績,_二回目成績) :-
テストデータ(_氏名,_一回目点数,_二回目点数),
成績マスタ(_一回目成績,_一回目点数),
成績マスタ(_二回目成績,_二回目点数).
>>178 % Prolog 元スレで
http://pc11.2ch.net/test/read.cgi/db/1252492296/393の % 成績マスタは以下のような範囲型にしたかったのではないか、との指摘があった。
テストデータ(田中,100,90).
テストデータ(鈴木,80,80).
成績マスタ('A',91,100).
成績マスタ('B',81,90).
成績マスタ('C',71,80).
欲しい結果(_欲しい結果) :-
findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回
目成績),_欲しい結果).
欲しい結果(_氏名,_一回目成績,_二回目成績) :-
テストデータ(_氏名,_一回目点数,_二回目点数),
成績マスタ(_一回目成績,_点数下限1,_点数上限1),
_一回目成績 >= _点数下限1,
_一回目成績 =< _点数上限1,
成績マスタ(_二回目成績,_点数下限2,_点数上限2),
_二回目成績 >= _点数下限2,
_二回目成績 =< _点数上限2.
>>180 (
>>178)
% Prolog このような場合、RDBからは遠くなるが、
テストデータ(田中,100,90).
テストデータ(鈴木,80,80).
成績マスタ('A',_点数) :- _点数 >= 91,_点数 =< 100.
成績マスタ('B',_点数) :- _点数 >= 81,_点数 =< 90.
成績マスタ('C',_点数) :- _点数 >= 71,_点数 =< 80.
欲しい結果(_欲しい結果) :-
findall([_氏名,_一回目成績,_二回目成績],欲しい結果(_氏名,_一回目成績,_二回目成績),_欲しい結果).
欲しい結果(_氏名,_一回目成績,_二回目成績) :-
テストデータ(_氏名,_一回目点数,_二回目点数),
成績マスタ(_一回目成績,_一回目点数),
成績マスタ(_二回目成績,_二回目点数).
% の方がPrologの特性を生かしたコードといえるだろう。
>>177 使用言語:J
add=:dyad def 'x+y'
mul=:dyad def '(-/x*y),+/y*|.x'
print=:monad def 'smoutput (":y),''i'' '
a=: 1 2
b=: 3 4
print a add b
4 6i
print a mul b
_5 10i
NB.標準サポートの複素数の場合
datatype 1j2
complex
1j2 + 3j4
4j6
1j2 * 3j4
_5j10
>>183 使用言語:maxima
(%i1) integrate(integrate(integrate(4*x^3+x*y^2+5*y+y*z+6*z,z,0,2),y,0,3),x,0,4);
(%o1) 2040
x= が2回出てきますが、2回目のx= は勝手にz= と解釈しました。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/604 # [1] 授業単元: 演習チャレンジ問題
# [2] 問題文(含コード&リンク):
# あるint型配列array[256]の中身をランダムシャッフルしたい。
# 0〜127の範囲の値を被らずに出す乱数関数randEx(Seed, i)を作成せよ。(iは0〜127)
# ※Seedを変えることにより、異なるパターンのランダム列が出るようにする。
# ※array[i]とarray[128+randEx(Seed, i)]をスワップすることで並列計算において一気にシャッフルするのが目的です。
# ※「スワップするかしないか」の部分は別なので考えなくて良いです。
>>187 % Prolog (!)に意味があります。
あるテーブルから特定のデータが1件でも存在するかどうかの判断する(Q) :- call(Q),!.
>>187 % Prolog テーブル名,引数ならびとして与えられたら、
あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび) :-
Q =.. [_テーブル名|_引数ならび],
call(Q),!.
>>187 % Prolog
>>189は単位節データベースの自然なコードだが、条件が付加されていて、
% そこに副作用を生じる目標が記述されている懸念がある場合は、clause/2を使う。
あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび) :-
Q =.. [_テーブル名|_引数ならび],
clause(Q,_),!.
>>187 % Prolog
>>190にさらに条件を付加したい場合は、_条件として引数の条件、あるいは
% 引数と引数の関係を記述します。
あるテーブルから特定のデータが1件でも存在するかどうかの判断する(_テーブル名,_引数ならび,_条件) :-
Q =.. [_テーブル名|_引数ならび],
clause(Q,_),
call(_条件),!.
http://pc12.2ch.net/test/read.cgi/tech/1260532772/606 # プログラミングの問題なんですが、if文と繰り返し(for,whileのいずれか)を利用して次の問題を作成します。
#
# 米ドル紙幣としては次のような紙幣とコインがある。
# 100ドル、50ドル、20ドル、10ドル、5ドル、2ドル、1ドル
# 50セント、25セント、10セント、5セント、1セント
#
# 問題は、キーボードから日本円を入力し、まずドルに変換した後ドルを最適な紙幣とコインに振り分けるプログラムを作成しなさい。但し1ドルを92.69円として換算しなさい。そして、日本円が0円の時にプログラムを終了する。
>>186 使用言語:J
randEx=:dyad def 'y{?~128[(9!:1)x'
123 randEx 0
126
123 randEx 1
57
8 16 $ 123 randEx i.128
126 57 86 113 124 79 46 115 67 27 101 54 70 4 30 5
62 98 31 121 11 9 119 50 75 89 71 117 68 74 108 81
22 47 34 102 55 3 48 105 96 122 52 110 85 88 14 58
116 84 1 82 118 20 39 44 19 41 28 93 16 78 92 87
17 104 6 123 109 23 40 100 91 73 24 111 106 38 80 94
83 56 60 33 42 15 66 13 72 64 32 8 103 77 29 112
18 76 25 10 125 127 65 51 37 43 97 0 35 36 120 45
2 90 26 12 99 114 21 63 7 95 59 69 61 107 49 53
321 randEx 0
116
321 randEx 1
46
8 16 $ 321 randEx i.128
116 46 112 67 45 53 9 7 106 114 82 3 20 86 77 110
113 42 1 29 117 18 93 58 38 52 90 15 79 97 25 50
99 49 27 51 126 89 111 16 115 119 4 39 19 76 54 118
0 108 65 125 47 55 63 14 88 103 73 48 30 23 59 87
5 33 101 36 91 12 22 95 24 43 74 37 69 26 28 57
68 94 11 32 122 92 100 66 104 34 123 17 75 13 40 2
60 56 70 98 64 62 84 80 109 35 85 121 105 61 102 44
8 71 96 124 107 41 83 21 127 10 120 78 6 31 72 81
>>183 使用言語:Yacas
In> Integrate(x,0,4)Integrate(y,0,3)Integrate(z,0,2)4*x^3+x*y^2+5*y+y*z+6*z
Out> 2040
>>183 使用言語:Axiom
(8) -> integrate(integrate(integrate(4*x^3+x*y^2+5*y+y*z+6*z,z=0..2),y=0..3),x=0..4)
(8) 2040
>>192 使用言語:J
a=:10000 50000 20000 1000 500 200 100 50 25 10 5 1
b=:<;._1' 100$ 50$ 20$ 10$ 5$ 2$ 1$ 50C 25C 10C 5C 1C'
f=:}:@;@(((}:@>@{.,(0,{.@>@}.)#:{:@>@{.);}.@>@{:)^:(#@>@}.))
g=:3 :'((b#~*),.;/@-.&0)f a;~<.y%0.9269'
g 1980
+---+-+
|10$|2|
+---+-+
|1$ |1|
+---+-+
|25C|1|
+---+-+
|10C|1|
+---+-+
|1C |1|
+---+-+
>>197 テーブルのデータ間違えました。訂正します。
> a=:10000 50000 20000 1000 500 200 100 50 25 10 5 1
a=:10000 5000 2000 1000 500 200 100 50 25 10 5 1
>>171 foldl' 使えば
Prelude> :m +Data.List
Prelude Data.List> sqrt $ 6*(foldl' (+) 0 [1/(x*x)|x<-[1..1000000]])
3.14159169866051
201 :
デフォルトの名無しさん:2010/01/09(土) 21:09:52
http://pc12.2ch.net/test/read.cgi/tech/1260532772/639 # [1] アルゴリズム
#
# [2] 自然数の数列を入力し
# 数列内にあるnよりも大きい数と小さい数が
# nの前後にそれぞれ一つ以上ある場合、そのnを出力する。
#
# フローチャートは以下です。
#
# 順数列の入力
# ↓ ↓
# 数列数が5以上 4以下→終了(4以下のときどれも除外できないので)
# ↓
# 数列の中で最大最小の値と
# 最初と最後に入力した値は除外できる。
# ↓
# 残りの数値に前後に大小の値が一つ以上あれば除外
# ↓
# 残った値を表示して終了
http://pc12.2ch.net/test/read.cgi/tech/1260532772/644 # [1]授業単元:プログラミング2
# [2]問題文:次のような10×10の半角文字+を碁盤の目として、一対コンピュータで五目並べ
# をするプログラムを作成せよ。碁石を表す文字は、半角の@,0を用いよ。
#
# abcdefghij
# a++++++++++
# b++++++++++
# c+++++@++++
# d++++++0+++
# e++++++++++
# f++++++++++
# g++++++++++
# h++++++++++
# i++++++++++
# j++++++++++
# @の場所は、cf , 0の場所は、dg とあらわす
#
# ・人とコンピュータのどちらかが先手になるか選択できる
# ・先手の33を禁止する
# ・勝敗の判定ができる。(置く場所がなくなったら引き分けとする)
# ・コンピュータは人が3と4を作った場合、それを止める場所におく
# ・すでに石がおいてある場所に人が石を置こうとした場合、再入力を促す。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/642 # [1] 初級C言語実習
# [2] 次の関数copyStringを同じ動作をするように書き換えよ。ただし変数の追加、削除(未使用を含む)
# if文(三項演算子を含む)while,do while,for文 goto文を使用してはならない。
# char *copyString(char *s){
# char *p=s,*t=s,tmp;
# if(s==NULL)return NULL;
# while(*p++); p--;while(!*p)p--;
# while(p>s){tmp=*p;*p--=*s;*s++=tmp;}
# return t;
# }
http://pc12.2ch.net/test/read.cgi/tech/1260532772/659 # [1] 授業単元: オペレーティングシステム
# [2] 問題文(含コード&リンク):
# fork,exec*システムコールを用いて簡単なコマンドインタープリタ
# (mysh)を作成せよ。但し、作成するコマンドインタープリタは以下の
# 機能をサポートすること。
# ・設定ファイル(.path)にコマンドサーチパスを指定することが出来る。
# なお、ファイル内のパスの指定方法は、各自が考え定義すること。
# (パスにないコマンドを入力した場合には、見つからない旨のエラー
# メッセージを出力すること。)
# ・パイプを利用して複数(可変個)のコマンドの入出力を結合する
# ことができる。
# ・リダイレクションを使用してコマンドへの入力をファイルから得たり、
# ファイルへ出力したりすることができる
# ・コマンド実行中にCtrl-Cを入力すると、現在のコマンドの実行を
# 中断する
# ・exitを入力すると、myshを終了する。
#
http://pc12.2ch.net/test/read.cgi/tech/1260532772/678 # [1] 授業単元: 基礎プログラミングおよび演習
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10352.txt #
# あるWebページに対する24時間分の閲覧者の名前、閲覧開始時刻および閲覧継続時間を表す「閲覧データ」があるとしよう。
# 1名以上の閲覧データから、閲覧している人数がもっとも多い30分刻みでの時間帯を求め、そのときの閲覧者名を印字する
# プログラムを作成せよ。状況によっては日をまたぐこともあるが、ここではどの時間帯に閲覧が多いのかを知りたいので
# 日の違いは考えなくてよい。各閲覧データは標準入力から、
#
# 閲覧者名
# 閲覧開始時刻 閲覧継続時間
#
# の2行で与えられる。ここで閲覧者名は英小文字2文字の後に4桁の数字が続く。閲覧開始時刻は24時間制での時を100倍し、
# 分を加えた数を表す4桁の数字、閲覧継続時間は分を表す高々3桁の数字である。時刻および時間は30分刻み(つまり0分か30分)
# である。たとえば、
#
# ku7535
# 0130 60
#
# は、名前がku7535、開始時刻が1時30分、継続時間が60分、つまり1時30分から2時30分直前まで閲覧していたことを表す。
# まず閲覧データに対する構造体 user を定義し、それを要素とする大きさNの大域的な配列 users を用意せよ(Nはマクロ
# である)。次に、N人分のデータを読み込むか、閲覧者名としてアスタリスク(*)が与えられるまで、標準入力から閲覧データを
# 読み込み、配列 users にセットするとともに閲覧データを返す関数 int read_users(void) を作成せよ。最後に配列 users の
# 先頭からn個の閲覧データを対象に、24時間中で最大人数が閲覧している30分刻みでの時間帯と、そのときの閲覧者名を印字
# する関数 void print_prime_time(int n) を定義せよ。ただし最大閲覧者数となる時間帯は一般に複数あることに注意すること。
# さらに以下のmain関数と組み合わせてプログラムを作成せよ。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/710 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): 数値には初期値が与えられている。
# この配列を昇順に並べ替えるプログラムを作成しなさい。
#
# 表示結果: 数値[00]=80
# 数値[01]=40
# 数値[02]=23
# 数値[03]=69
# 数値[04]=10
#
# ソート後
# 数値[01]=10
# 数値[02]=23
# 数値[03]=40
# 数値[04]=69
# 数値[03]=80
http://pc12.2ch.net/test/read.cgi/tech/1260532772/715 # [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):
# 文字列text[]と文字列pat[]が与えられたとき、文字列text中に文字列patが含まれるときは最初に現れるその文字列の先頭の位置(0〜)を返し、含まれないときは-1を返す関数searchを作成せよ。
# また、その関数を用いて、2つの文字列text[]とpat[](空白は含まない)を入力すると関数searchの値を返すプログラムを作成せよ。ここでtextとpatには長さ1以上の文字列が入っているものとする。
# (例:text[]="thisisatesttextdata"の中に、pat[]="this"は0の位置に、pat[]="test"は7の位置に現れる。)
#
http://pc12.2ch.net/test/read.cgi/tech/1260532772/718 # [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): 再帰を使って自然対数の底eを求めるプログラムを作成しなさい
# 下記のようにnを0から30まで増加させながら
# n=0のときe=1/0! n=30のときe=1/0!+1/1!+1/2!+1/3!+……1/30! の計算を行い下 のように表示しなさい
#
# n=0:e=1.000000000000000
# n=1:e=2.000000000000000
# ・
# ・
# n=30:e=2.718281828459046
#
http://pc12.2ch.net/test/read.cgi/tech/1260532772/722 # [1]授業単元:プログラミング2
# [2]問題文:以下の機能を備えた対コンピュータの五目並べを作成せよ
# ・置く場所を縦と横の数字で指定する
# ・人とコンピュータのどちらかが先手になるか選択できる
# ・先手の33を禁じる
# ・勝敗の判定ができる(置く場所がなくなったら引き分け)
# ・コンピュータは人が3と4を作った場合、それを止める場所に石を置く
# ・すでに石がおいてある場所に人が石を置こうとした場合、再入力を促す
http://pc12.2ch.net/test/read.cgi/tech/1260532772/741 # [1] 授業単元: プログラミング2
# [2]問題文:
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyfmg/10356.txt # 下図(A)のテキストファイルは、ある実験を行ったときのメモであり、
# 実験の年月日と使用した材料及びその使用量が記載されている(スペースは全て半角スペース)。
# そこでこのファイルを読み込んで、最も多くの量を使用した材料の記号とその合計量、及び1回当たりの平均使用量を、
# 図(B)に示すような別のテキストファイルに書き出すプログラムを作成せよ。なおこの実験で使用する材料はA、B、Cの3種類のみである。
#
# プログラム作成に際しては、次の条件を満たすものとする。
# ・入力用のファイル名はJikkenMemo.txtで固定とし、一々キーボードからは指定しない。
# ・出力用のファイル名はキーボードから任意の名前で指定する。
# ・JikkenMemo.txtでは今回は13回分の実験が書き込まれているが、今後の実験の追加にも対応できるようにすること(即ち13行に限定しないこと)。
# ・出力ファイルにおける使用量の単位gは数値の後につける。
# ・出力ファイルにおける数値の表示はいずれも小数点以下1桁までとする。
#
# (補足)
# キーボードから入力した1文字がAという文字であるとき「Aです」と表示させるには、
# char cc;
# scanf("%c",&cc);
# if(cc=='A') printf("Aです\n");
# とすればよい。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/744 # [1] プログラミング
# [2] 0から10の中からランダムに整数の2組を決める。それを平面上の座標と、座標を10個つくる。
# ユーザに座標を入力させ、その点から最も遠い点と近い点を求める。
# 最も近い点がユーザが入力した点と重なったら◎を出力する。
# 結果は下記のように出力。
# △
# △
# △
# × ○
#
#
#
# ●
#
# ×:ユーザが入力した点
# ○:最も近い点
# ●:最も遠い点
# △:それ以外の点
#
>>224 (補足)
# キーボードから入力した1文字がAという文字であるとき「Aです」と表示させるには、
# char cc;
# scanf("%c",&cc);
# if(cc=='A') printf("Aです\n");
# とすればよい。
# 図(A) 読み込み用ファイルの内容
# 実験メモ
# 年 月 日 材料 使用量[g]
# 2007 9 28 C 289.1
# 2007 10 4 A 254.3
# 2007 10 8 B 187.4
# 2007 10 15 A 211.3
# 2007 10 16 C 400.8
# 2007 10 18 B 34.2
# 2007 10 25 C 343.6
# 2007 10 31 A 102.6
# 2007 11 6 A 155.2
# 2007 11 12 B 87.5
# 2007 11 20 C 98.7
# 2007 11 27 A 177.8
# 2007 11 28 C 44.7
# 図(B) 出力ファイルの内容例
# (仮に、最も多く使用した材用がAで、合計使用量が100.0g、1回の平均使用量が10.0gであった場合)
# 最多使用材料A
# 合計使用量 100.0g
# 平均使用量 100.g
rubyで
>>231 f=File.open("out.txt","w")
for i in 1..9 do
for j in 1..9 do
f.printf("%3d"%[i*j])
end
f.puts()
end
f.close
>>232 N=10000
num=0
for i in 1..N
if rand()**2+rand()**2<=1 then num+=1 end
end
puts(4.0*num/N)
#print("PI=",4.0*num/N)
http://pc12.2ch.net/test/read.cgi/tech/1260532772/770 #
# [1] 授業単元:C言語
# [2]問題文:
# 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベシステムの構築を考える。
# 新しい科目を登録する機能
# すでに登録されている科目を修正(更新)する機能
# 登録科目のソート(並び替え)を行う機能
# 登録科目の一部分のみを検索して取り出し、表示する機能
# 登録科目から、卒業までに必要な単位を計算し、表示する機能
# 卒業要件を簡略化しても良い.
>>760 の訂正
http://pc12.2ch.net/test/read.cgi/tech/1260532772/771 # 問題分が足りてなかったので再投稿させてもらいます。
#
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
#
# 非線形方程式の解を求めるアルゴリズムのひとつに、ニュートン法と呼ばれる方ある。
# この方法ではf(x)=0の解の近似値を次の漸化式から求める。
# ただしf'(x)はxによる微分を表す。
# x_(i+1) =x_i - f(x_i)/f'(x_i)
#
# f(x)=2^2-e^x-2=0
#
# x_i の初期値を x_0 としたとき i=1から i=5すなわちx_1からx_5までをC言語で計算して示せ。
>>238 Luaで
f=io.open("test.txt","r")
t={}
line = f:read()
while line do
tmp={}
for s in string.gmatch(line,"[%w]+") do
table.insert(tmp,s);
end
table.insert(t,{["氏名"]=tmp[1],["年齢"]=tmp[2],["性別"]=tmp[3]});
line = f:read()
end
f:close()
for i=1,#t do
print(t[i]["氏名"].." "..t[i]["年齢"].." "..t[i]["性別"])
end
>>234 はプログラムを解読して書き直さないと出題にならないですね。
面白そうな問題なのでやってみます。
あっという間に問題ばかり溜まってしまいました。中に骨のある問題も多いようです。
私は、1月を過ぎると余裕ができるので一気に解決していきたいなと思っています。
http://pc11.2ch.net/test/read.cgi/db/1252492296/425 # SELECT * FROM tableA WHERE code = 7
# というSQLで以下のように表示されるのですが、
#
# id , code , name , date , 売上
# 1 , 7 , りんご , 2010-01-12 , 350
# 1 , 7 , りんご , 2010-01-07 , 250
# 2 , 7 , みかん , 2010-01-12 , 450
# 2 , 7 , みかん , 2009-05-05 , 550
#
# それを、売上があった日の1営業日後と3営業日後のそれぞれのidの価格も取得 いと考えております。
#
# id , code , name , date , 売上 , 1営業日後売上 , 3営業日後売上
# 1 , 7 , りんご , 2010-01-12 , 350 , 400 , 500
# 1 , 7 , りんご , 2010-01-07 , 250 , 200 , 250
# 2 , 7 , みかん , 2010-01-10 , 450 , 500 , 300
# 2 , 7 , みかん , 2009-05-05 , 550 , 220 , 350
# (ちなみに実際のdateはUNIXTIMEで格納しています。)
# 1営業日後にしているのは、休日の関係で1日後とできないからです。
# ここまでやるのは厳しいでしょうか?
>>243 % Prolog (1/2) 祝日がわからないと1営業日後がわからないので、
% 足掛かりとして、以下の定義をしておきましょう。今後祝日に関しては第二引数を解読しましょう。
国民の祝日に関する法律('第1条','自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞって祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。').
国民の祝日に関する法律('第2条','自由と平和を求めてやまない日本国民は、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために、ここに国民こぞって祝い、感謝し、又は記念する日を定め、これを「国民の祝日」と名づける。').
国民の祝日に関する法律(第2条,'「国民の祝日」を次のように定める。').
国民の祝日に関する法律(第2条,元日,1月1日,'年のはじめを祝う。').
国民の祝日に関する法律(第2条,成人の日,1月の第2月曜日,'おとなになったことを自覚し、みずから生き抜こうとする青年を祝いはげます。').
国民の祝日に関する法律(第2条,建国記念の日,政令で定める日,'建国をしのび、国を愛する心を養う。').
国民の祝日に関する法律(第2条,春分の日 春分日 自然をたたえ、生物をいつくしむ。
国民の祝日に関する法律(第2条,昭和の日,4月29日,'激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。').
国民の祝日に関する法律(第2条,憲法記念日,5月3日,'日本国憲法の施行を記念し、国の成長を期する。').
国民の祝日に関する法律(第2条,みどりの日,5月4日,'自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。').
国民の祝日に関する法律(第2条,こどもの日,5月5日,'こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。).
>>243 % Prolog (2/2) つづき
国民の祝日に関する法律(第2条,海の日,7月の第3月曜日,海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。).
国民の祝日に関する法律(第2条,敬老の日,9月の第3月曜日,多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。).
国民の祝日に関する法律(第2条,秋分の日,秋分日,'祖先をうやまい、なくなった人々をしのぶ。').
国民の祝日に関する法律(第2条,体育の日,'10月の第2月曜日,スポーツにしたしみ、健康な心身をつちかう。').
国民の祝日に関する法律(第2条,文化の日,11月3日,'自由と平和を愛し、文化をすすめる。').
国民の祝日に関する法律(第2条,勤労感謝の日,11月23日,'勤労をたっとび、生産を祝い、国民たがいに感謝しあう。').
国民の祝日に関する法律(第2条,天皇誕生日,12月23日,'天皇の誕生日を祝う。').
国民の祝日に関する法律(第3条,'「国民の祝日」は、休日とする。').
国民の祝日に関する法律(第3条,'2 「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。').
国民の祝日に関する法律(第3条,'3 その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。').
>>243 % Prolog 一営業日後の定義に祝日と曜日の定義が必要になる。
一営業日後(_今日,_一営業日後) :-
曜日(_今日,_曜日),
\+(member(_曜日,[土曜,日曜])),
\+(祝日(_今日)),
翌日(_今日,_翌日),
次の営業日(_翌日,_一営業日後),!.
一営業日後(_今日,_一営業日後) :-
翌日(_今日,_翌日),
一営業日後(_翌日,_一営業日後),!.
三営業日後(_今日,_三営業日後) :-
一営業日後(_今日,_一営業日後),
一営業日後(_一営業日後,_二営業日後),
一営業日後(_二営業日後,_三営業日後),!.
次の営業日(_基準日,_次の営業日) :-
曜日(_基準日,_曜日),
member(_曜日,[土曜,日曜]),
翌日(_基準日,_翌日),
次の営業日(_翌日,_次の営業日),!.
次の営業日(_基準日,_次の営業日) :-
祝日(_基準日),
翌日(_基準日,_翌日),
次の営業日(_翌日,_次の営業日),!.
次の営業日(_次の営業日,_次の営業日).
>>243 % Prolog
'商品売上、1営業日後、3営業日後、比較表示' :-
setof([_id,_name,_date],tableA( _id , 7 , _name , _date , _売上),L1),
write('id, code, name, date, 売上,1営業日後売上,3営業日後売上\n'),
member([_id_1,_name_1,_date_1],L1),
split(_date_1,['-'],L2),
concat_atom(L2,_日付),
一営業日後(_日付,_1営業日後),
三営業日後(_日付,_3営業日後),
データベース日付表現(_1営業日後,_日付1),
データベース日付表現(_3営業日後,_日付3),
findsum(_売上,tableA( _id , 7 , Name , _日付 , _売上),Sum),
findsum(_売上,tableA( _id , 7 , Name , _日付1 , _売上),Sum1),
findsum(_売上,tableA( _id , 7 , Name , _日付3 , _売上),Sum3),
wr('%t,%t,%t,%t,%t,%t\n',[_id_1,7,_name_1,Sum,Sum1,Sum3]),
fail.
'商品売上、1営業日後、3営業日後、比較表示'.
データベース日付表現(_日付,_データベース日付表現) :-
sub_atom(_日付,0,4,_,_年),
sub_atom(_日付,4,2,_,_月),
sub_atom(_日付,6,2,_,_日),
concat_atom([_年,'-',_月,'-',_日],_データベース日付表現).
http://pc12.2ch.net/test/read.cgi/tech/1260532772/780 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): 0,1のみを成分にもつn次正方行列Aは各行を2進数とみなして整数のリストとして表現できる。
# たとえば 3次正方行列は 1,0,0/0,1,0/0,0,1は{4,2,1}
#
# これに掃き出し法を適用し、{5,6,3}と入力したとき{5,3,0}と出力されるプログラムを作れ。
# ヒントとして、行の入れ替えは数字の入れ替えになる。
# n桁2進数xの下位から、上位からの数字はそれぞれどう書けるか考える。
#
# まず正方行列の次数をきめ、入力できる10進数の最大値を表示、その後
# その範囲で数値をn回キーボードから入力した後、掃き出し法を行い、
# その正方行列の行の値を10進数に変換するプログラムです。
http://pc11.2ch.net/test/read.cgi/db/1252492296/434 # ■テーブルデータ
# ○荷物テーブル
# id 中身id 荷受け
# 1 1 2009/12/11
# 2 1 2009/12/21
# 3 2 2010/12/25
# ○中身テーブル
# id 品物 重さ
# 1 本 500
# 2 テレビ 1000
# ○作業テーブル
# 荷物id 作業項目id 作業者名 作業状況
# 1 1 佐藤 完了
# 1 3 志村 作業中
# 2 1 鈴木 完了
# 2 2 鈴木 未
# 2 3 田中 未
# 3 1 佐藤 完了
# 3 3 田中 未
# ○作業項目テーブル
# id 作業内容
# 1 品物を入れる
# 2 領収書を入れる
# 3 封をして発送する
>>250 問題つづき
#
# ■欲しい結果
# 荷物id 品物 重さ 作業者名※1 作業内容※1 作業状況 対応班※2
# 2 本 500 鈴木 領収書を入れる 未 2
# 3 テレビ 1000 田中 領収書を入れる 未 1
# ※1 作業状況が完了以外かつ作業項目idが一番小さいもの
# ※2 重さが1000以上→作業班1、作業者名が鈴木かつ作業状況が未→作業班2、
作業状況にかかわらず、作業者名に田中がある荷物→作業班3
# (班1 > 班2 > 班3の順で優先し、荷物idを重複させない)
#
# ■説明
# 荷受けが2009/12/31以前の荷物かつ対応班が存在するものを抽出したいです。
# 荷物は沢山ありますのでパフォーマンスもできれば考慮したいです。
# 「パッとわからないけどちょっと考えればわかるだろJK」→「2時間考えてもできないorz」(今ここ)
>>217 使用言語:J
('n',.'=',.":,.a),.':',.'e',.'=',.0j15":,.+/\%!a=.i.31x
n= 0:e=1.000000000000000
n= 1:e=2.000000000000000
n= 2:e=2.500000000000000
n= 3:e=2.666666666666667
n= 4:e=2.708333333333333
n= 5:e=2.716666666666667
n= 6:e=2.718055555555556
n= 7:e=2.718253968253968
n= 8:e=2.718278769841270
n= 9:e=2.718281525573192
n=10:e=2.718281801146384
:
n=29:e=2.718281828459045
n=30:e=2.718281828459045
>>253 使用言語:J
f=:monad def '-.=/*400 4 100|y'
f 1800
0
f 2000
1
f 2008
1
f 2010
0
http://pc12.2ch.net/test/read.cgi/tech/1260532772/796 # [1] プログラミング演習
# [2] 標準入力から読み込んだテキストファイルを辞書順に整列して標準出力する。
# 辞書順:文字列比較の順番はASCIIコード文字順をベースとした辞書順であるが、文字順が一部
# が変更される A<a<B<c<C<c.....
# [5] 作業用ファイルwork.dat(内容は自由、サイズ無制限とする。プログラム終了時点で削除する必要は無い
# ものとする。)
# を使用出来る。stdio.hで定義されている標準ライブラリ関数、定数を利用出来る。
# 整列アルゴリズムは自由とする。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/797 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):問題1 戻値を持たず、一つの double 型の引数を持ち、過去に関数が
# 呼ばれた時、全ての引数の値の総和を表示する関数、d_total
# を定義し、動作の確認ができるプログラムとして作成せよ。例えば、
# d_total(0.1);
# d_total(0.2);
# d_total(0.3);
# と呼べば、d_total の内部の処理にて
# 0.1
# 0.3
# 0.6
#
# と表示するということである。
# ただし, プログラム中の変数として、外部変数は使ってはな
# らない。「内部変数か」自動変数のみを使って実現せよ。
# 問題2 戻値を持たず、二つの float 型のポインタの引数を持ち、二つ
# の引数の値を交換する関数、f_swap を定義し、動作の確認がで
# きるプログラムとして作成せよ。
# 問題3 4行4列のint型の行列を、転置するプログラムを作成せよ。動作の確認のため、転置前と転置後
# の行列の内容を表示するようにせよ
http://pc12.2ch.net/test/read.cgi/tech/1260532772/798 # [1] やさしいC
# [2] 次の関数workをコンパイル出来るように,正しく動作するように修正し、
# 正しく実行出来るかどうかを確かめられるプログラムを作りなさい。
# double *work(double[] a,int N){
# double result[N];
# result[0] = a[N-2] ,a[N-1],a[0],a[1] a[2]を1:3:4:3:1の重みで平均した値
# result[1] = a[N-1],a[0],a[1],a[2] を1:3:4:3:1の重みで平均した値
# result[2] = a[0],a[1],a[2],a[3]を1:3:4::3:1の重みで平均した値
# result[3] = a[1],a[2],a[3],a[4] を1:3:4:3:1の重みで平均した値
# ....
# result[N-2] = a[N-4],a[N-3],a[N-2],a[N-1],a[0] を1:3:4:3:1の重みで平均した値
# result[N-1] = a[N-3],a[N-2],a[N-1],a[0],a[1] を1:3:4:3:1の重みで平均した値
# return (double)&result[0];
# }
http://pc12.2ch.net/test/read.cgi/tech/1260532772/800 # [1]Cプログラミング演習
# [2]
# 関数 op(int a,int b,int c)は次の結果を返す。
# 結果: a op1 b op2 c op3 a op4 b op5 c (op1,op2,op3,op4,op5は
# + - * %(剰余) xor and orの何れか一つ)
# +:演算0 -:演算1 *:演算2 /:演算3 xor:演算4 and:演算5 or:演算6
# op1=(3*a+5*b)の7による剰余がkの場合、演算kを選択
# op2=(5*b+4*c)の7による剰余がkの場合、演算kを選択
# op3=(a+3*c)の7による剰余がkの場合、演算kを選択
# op4=(a+2*b)の7による剰余がkの場合、演算kを選択
# op5=(3*c+2*b)の7による剰余がkの場合、演算kを選択
# ここで演算子の優先順位は高い順に + > - > * > % >xor > and > orとする
# 例えば1 + 3 xor 5 * 7 - 5は(1+3) xor (5*(7-5))を意味する
# 関数opをコードせよ。どのような演算が行われたか具体的に出力するprintf文も同時に出力すること。
>>259 訂正
修正前 → +:演算0 -:演算1 *:演算2 /:演算3 xor:演算4 and:演算5 or:演算6
修正後 → +:演算0 -:演算1 *:演算2 %(剰余):演算3 xor:演算4 and:演算5 or:演算6
>>250 欲しい結果(_荷受日下限,_荷受日上限) :-
write('荷物id 品物 重さ 作業者名1 作業内容1 作業状況 対応班2\n'),
荷物テーブル(_id,_中身id,_荷受け),
_荷受け @>= _荷受日下限,
_荷受け @=< _荷受日上限,
中身テーブル(_中身id,_品物,_重さ),
作業テーブル(_id,_作業項目id,_作業者名,_作業状況),
作業項目テーブル(_作業項目id,_作業内容),
作業班(_作業者名,_作業状況,_重さ,_対応班),
write_formatted('%t %t %t %t %t %t %t\n',[_id,_品物,_重さ,_作業者名,_作
業内容,_作業状況,_対応班]),
fail.
欲しい結果(_,_).
作業班(_,_,_重さ,1) :- _重さ >= 1000,!.
作業班(_作業者名,_作業状況,_,2) :- _作業者名=鈴木,_作業状況='未',!.
作業班(田中,_,_,3) :- !.
>>250 変なところで折り返しが出たので書き直し。
% Prolog
欲しい結果(_荷受日下限,_荷受日上限) :-
write('荷物id 品物 重さ 作業者名1 作業内容1 作業状況 対応班2\n'),
荷物テーブル(_id,_中身id,_荷受け),
_荷受け @>= _荷受日下限,
_荷受け @=< _荷受日上限,
中身テーブル(_中身id,_品物,_重さ),
作業テーブル(_id,_作業項目id,_作業者名,_作業状況),
作業項目テーブル(_作業項目id,_作業内容),
作業班(_作業者名,_作業状況,_重さ,_対応班),
write_formatted('%t %t %t %t %t %t %t\n',[_id,_品物,_重さ,_作業者名,_作業内容,_作業状況,_対応班]),
fail.
欲しい結果(_,_).
作業班(_,_,_重さ,1) :- _重さ >= 1000,!.
作業班(_作業者名,_作業状況,_,2) :- _作業者名=鈴木,_作業状況='未',!.
作業班(田中,_,_,3) :- !.
>>201 使用言語: 十進BASIC
OPTION ARITHMETIC DECIMAL_HIGH !10進1000桁モード
INPUT PROMPT "a =":a
INPUT PROMPT "b =":b
PRINT "a + b =";a+b
PRINT "a - b =";a-b
PRINT "a * b =";a*b
END
実行結果
a =1.9999999999999999999999999
b =0.0000000000000000000000001
a + b = 2
a - b = 1.9999999999999999999999998
a * b = .00000000000000000000000019999999999999999999999999
>>253 % Prolog
%
http://prolog.asia/html/prolog/t815.html などにすでにあります。ここでは、
西暦を入力させ、うるう年かどうかを判定する(_西暦) :-
西暦の年号が400で割り切れる年はうるう年(_西暦),!.
西暦を入力させ、うるう年かどうかを判定する(_西暦) :-
西暦の年号が400で割り切れないが、100で割り切れる年はうるう年でない(_西暦),!.
西暦を入力させ、うるう年かどうかを判定する(_西暦) :-
西暦の年号が100で割り切れないが、4で割り切れる年はうるう年(_西暦).
西暦の年号が400で割り切れる年はうるう年(_西暦) :- 割り切れる(_西暦,400),!.
西暦の年号が400で割り切れないが、100で割り切れる年はうるう年でない(_西暦) :-
\+(割り切れる(_西暦,400)),
割り切れる(_西暦,100),!,fail.
西暦の年号が100で割り切れないが、4で割り切れる年はうるう年(_西暦) :-
\+(割り切れる(_西暦,100)),
割り切れる(_西暦,4),!.
割り切れる(A,B) :- 0 is A mod B.
>>260 % Prolog
並び替えを行って人口の大きい順に人口と県名を表示する(_ファイル) :-
see(_ファイル),
findall([_人口,_県名],(repeat,get_line(X),(X=end_of_file,!,fail;
split(X,[','],[_県名,_人口])),L),
seen,
降順に整列する(L,L1),
人口と県名を表示する(L1).
人口と県名を表示する([]) :- !.
人口と県名を表示する([[_人口,_県名]|R]) :-
write_formatted('%t %t\n',[_人口,_県名]),
人口と県名を表示する(R).
>>213 使用言語:J
p:i._1 p: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
>>215 使用言語:maxima
(%i41) display2d:false;
(%o41) false
(%i42) solve([x1+5*x2+x3=2,3*x1+4*x2=2,9*x1+10*x2+4*x3=8],[x1,x2,x3]);
(%o42) [[x1 = 2/5,x2 = 1/5,x3 = 3/5]]
>>215 使用言語:J
]a=:3 3 $ 1 5 1,3 4 0,9 10 4
1 5 1
3 4 0
9 10 4
]b=:2 2 8
2 2 8
(%.a)(+/ .*)b
0.4 0.2 0.6
>>271 使用言語:J
a=: ?100#11
4 25 $ a
2 4 3 9 5 10 4 6 10 3 2 3 0 10 9 7 1 2 2 9 5 2 6 9 2
1 3 6 2 6 5 7 9 8 7 8 10 0 8 4 6 3 4 2 8 3 0 5 4 4
0 2 7 8 1 6 6 8 8 5 8 10 6 6 3 7 1 9 8 5 6 2 0 9 3
6 5 1 3 1 2 0 6 9 2 3 4 1 7 7 10 7 3 2 3 4 3 4 8 8
+/0=a
6
>>272 >>271 使用言語:J
間違えました。0の個数を数えてました。
a=: ?100#11
4 25 $ a
2 4 3 9 5 10 4 6 10 3 2 3 0 10 9 7 1 2 2 9 5 2 6 9 2
1 3 6 2 6 5 7 9 8 7 8 10 0 8 4 6 3 4 2 8 3 0 5 4 4
0 2 7 8 1 6 6 8 8 5 8 10 6 6 3 7 1 9 8 5 6 2 0 9 3
6 5 1 3 1 2 0 6 9 2 3 4 1 7 7 10 7 3 2 3 4 3 4 8 8
+/0~:a
94
>>217 使用言語:maxima
(%i50) for n:0 thru 30 do printf(true,"n=~2d:e=~,15f~%",n,sum(1/i!,i,0,n));
n= 0:e=1.000000000000000
:
n=30:e=2.718281828459045
>>271 % Prolog
'100個の0〜10までの数字を発生させる'(L) :-
length(L,100),
'0〜10までの数字を発生させる'(L).
'0〜10までの数字を発生させる'([]) :- !.
'0〜10までの数字を発生させる'([N|R]) :-
N is random mod 11,
'0〜10までの数字を発生させる'(R).
'0じゃない数字の個数を数えて表示させる'(L) :-
count((member(A,L),number(A),\+(A=0)),_0じゃない数字の個数),
write_formatted('0じゃない数字は%t個です\n',[_0じゃない数字の個数]).
276 :
デフォルトの名無しさん:2010/01/15(金) 21:14:06
http://pc12.2ch.net/test/read.cgi/tech/1260532772/820 # [1] 授業単元:情報処理基礎
# [2] 問題文:二次方程式ax^2+bx+c=0の解を求めるプログラムを作成せよ。
# a,b,cの値を入力する。計算結果は必ず5種類表示すること。
# a=b=c=0の場合、処理を終了する。a=b=0、Cが0以外の場合は「不能」と表示する。
# a=0、bが0以外の場合は「一次方程式」と解を表示する。
# 判別式がD<0の場合、「虚解」と表示する。
# 判別式がD<0の場合以外も、必要な表示、結果を表示します。
>>276 % Prolog
main :-
催促付き整数入力('ひとつ対象となる整数を入力してください : ',_整数),
write('1.数値nを一つ入力し、各桁の和を求めよ。(123→6)\n'),
write('2.数値nを反転した値を表示せよ。(123→321)\n'),
催促付き整数入力('1-2を選択してください : ',_整数2),
目標選択(_整数2,_整数).
目標選択(1,_数値n) :-
'数値nを一つ入力し、各桁の和を求める'(_数値n,_各桁の和),
write_formatted('各桁の和は%tです\n',[_各桁の和]).
目標選択(2,_数値n) :- '数値nを反転した値'を表示する'(_数値n).
'数値nを一つ入力し、各桁の和を求める'(_数値n,_各桁の和) :-
number_codes(_数値n,L),
findsum(U,(member(A,L),U is A-48),_各桁の和).
'数値nを反転した値'を表示する'(_数値n) :-
'数値nを反転した値'(_数値n,_数値nを反転した値),
write_formatted('数値を反転した値は%tです\n',[_数値nを反転した値]).
'数値nを反転した値'(_数値n,_数値nを反転した値) :-
number_codes(_数値n,L1),
reverse(L1,L2),
number_codes(_数値nを反転した値,L2).
280 :
デフォルトの名無しさん:2010/01/15(金) 22:36:02
http://pc12.2ch.net/test/read.cgi/tech/1259990485/701 # 文字列をn文字ずつ&1文字ずつに分割したいのですが
# x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
# x = x.scan(/.{5}/)
# x.collect!{|y|y.scan(/./)}
# p x
# =>[["A","B","C","D","E"],["F","G","H","I","J"],["K","L","M","N","O"],["P","Q","R","S","T"],["U","V","W","X","Y"]]
# みたいに書くと都度、正規表現によるマッチが行われるので遅いです
# もっと高速に実行する方法があったら教えてください。よろしくお願いします
>>280 % Prolog
'文字列をn文字ずつ&1文字ずつに分割'(_文字列,N文字ずつ,L) :-
atom_chars(_文字列,Chars),
'N個組'(N文字ずつ,Chars,L).
'N個組'(_,[],[]) :- !.
'N個組'(N,L,[U|R]) :-
先頭からN個(N,L,U,R1),
'N個組'(N,R1,R).
先頭からN個(_,[],[],[]) :- !.
先頭からN個(0,L,[],L) :- !.
先頭からN個(N,[A|R1],[A|R2],R) :-
M is N - 1,
先頭からN個(M,R1,R2,R).
>>280 使用言語:J
a=:'ABCDEFGHIJKLMNOPQRSTUVWXY'
f=:dyad def ';/&.> (-x)<\y'
5 f a
+-----------+-----------+-----------+-----------+-----------+
|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|
||A|B|C|D|E|||F|G|H|I|J|||K|L|M|N|O|||P|Q|R|S|T|||U|V|W|X|Y||
|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|+-+-+-+-+-+|
+-----------+-----------+-----------+-----------+-----------+
7 f a
+---------------+---------------+---------------+---------+
|+-+-+-+-+-+-+-+|+-+-+-+-+-+-+-+|+-+-+-+-+-+-+-+|+-+-+-+-+|
||A|B|C|D|E|F|G|||H|I|J|K|L|M|N|||O|P|Q|R|S|T|U|||V|W|X|Y||
|+-+-+-+-+-+-+-+|+-+-+-+-+-+-+-+|+-+-+-+-+-+-+-+|+-+-+-+-+|
+---------------+---------------+---------------+---------+
>>276 使用言語:J
g=:monad def '+/"."0":y'
h=:monad def '|.&.":y'
f=:monad define
smoutput ('各桁の和=',":g y),:'反転値 =',":h y
)
f 123
各桁の和=6
反転値 =321
http://pc12.2ch.net/test/read.cgi/tech/1260532772/827 # 下記の機能を備えた極めて単純なデータベースシステムであるカード型データベースシステムの構築を考える。
# 課題7-1
# 下記のような方針でプログラムを作成せよ。
# 新しい科目を登録する機能
# すでに登録されている科目を修正(更新)する機能
# 登録科目のソート(並び替え)を行う機能
# 登録科目の一部分のみを検索して取り出し、表示する機能
# 登録科目から、卒業までに必要な単位を計算し、表示する機能
# データベースファイルの仕様
# データベースファイルについては、本格的なデータベースになると、アクセス性や
# 安定性など様々な要求を満たす必要があるが、ここでは最も単純なテキストファイルとする。
# さらに、書き込みをfprintfで、読み込みをfscanfで行えるように、 1行中に、
# それぞれの項目(フィールド)がスペースで区切られているようなファイルとする。
# なお、この場合、それぞれの項目はスペースを含んでいけないこととなる。
# 履修科目データベースシステムの例においては、例えば、
# 単位の種類(必修、選択必修など)、単位数、年次、前期か後期か、再履修かどうか、成績の6項目を含むこととする。
# ここで、いくつかの選択肢から選択するものについては、数字で置き換えることとする。
# このような仕様に基づいたファイルの例は以下のようなものになる。ここでは、ファイル名は、"ユーザ名_kamokudb.txt"とする。
>>277 % Prolog
'二次方程式ax^2+bx+c=0の解を求める'(0,0,0,_) :- !.
'二次方程式ax^2+bx+c=0の解を求める'(0,0,C,不能) :- \+(C==0),!.
'二次方程式ax^2+bx+c=0の解を求める'(0,B,C,一次方程式) :- \+(B==0),!.
'二次方程式ax^2+bx+c=0の解を求める'(A,B,C,_解) :-
_判別式の値 is (B ^ 2 - 4 * A * C),
'二次方程式ax^2+bx+c=0の解判定'(_判別式の値,A,B,C,_解).
'二次方程式ax^2+bx+c=0の解判定'(_判別式の値,_,_,_,虚解) :- _判別式の値 < 0,!.
'二次方程式ax^2+bx+c=0の解判定'(_判別式の値,A,B,C,_解) :-
_解 is ((-1) * B + sqrt(_判別式の値)) / ( 2 * A ).
'二次方程式ax^2+bx+c=0の解判定'(_判別式の値,A,B,C,_解) :-
_解 is ((-1) * B - sqrt(_判別式の値)) / ( 2 * A ).
>>269 % Prolog (その一)
:- op(350,xf,円).
お客様データベース('長石 輝',ホワイトプラン通話料,2130).
お客様データベース('長石 輝',ホワイトプランメールウェブ利用料金,0).
お客様データベース('長石 輝',パケット使用量,47310).
iphoneのご利用料金(_お客様名,_ご利用料金 円) :-
お客様データベース(_お客様名,ホワイトプラン通話料,_通話料),
お客様データベース(_お客様名,ホワイトプランメールウェブ利用料金,_メール
ウェブ利用料金),
お客様データベース(_お客様名,パケット使用量,_パケット使用量),
'ホワイトプラン(i)'(_通話料,_メールウェブ利用料金,_ホワイトプラン料金
円),
パケット料金(_パケット使用量,_パケット料金 円),
_ご利用料金 is _ホワイトプラン料金 + _パケット料金.
'ホワイトプラン(i)'(_ホワイトプラン料金 円) :-
ホワイトプラン基本使用料・通話料(_通話料 円,_基本使用料・通話料 円),
ホワイトプランメールウェブ利用料金(_メールウェブ利用料金 円),
_ホワイトプラン料金 is _基本使用料・通話料 + _メールウェブ利用料金,!.
ホワイトプラン基本使用料・通話料(_通話料 円,_基本使用料・通話料 円) :-
_基本使用料・通話料 is 980 + _通話料.
>>269 % Prolog
ホワイトプラン基本使用料・通話料(_通話料 円,_基本使用料・通話料 円) :-
_基本使用料・通話料 is 980 + _通話料.
ホワイトプランメールウェブ利用料金(0 円).
パケット料金(_パケット,_パケット料金 円) :-
'S!ベーシックパック(i)'(_パケット料金_1 円),
パケット定額フル(_パケット,_パケット料金_2 円),
_パケット料金 is _パケット料金_1 + _パケット料金_2,!.
'S!ベーシックパック(i)'(315 円).
パケット定額フル(_パケット,1029 円) :- _パケット =< 12250,!.
パケット定額フル(_パケット,_パケット料金 円) :-
_パケット > 12250,
_パケット =< 71250,
_パケット料金 is (_パケット - 12250) * 0.084 + 1029,!.
パケット定額フル(_パケット,5985 円) :- _パケット > 71250,!.
>>258 % Prolog
重み付け平均をRLにセット(AL,RL) :-
_重みならび = [1,3,4,3,1],
sum(_重みならび,_重み合計),
list_nth(N-2,AL,A_2),
list_nth(N-1,AL,A_1),
list_nth(1,AL,A1),
list_nth(2,AL,A2),
append([A_2,A_1|AL],[A1,A2],AL2),
N2 is N + 2,
重み付け平均をRLにセット(3,N2,_重みならび,_重み合計,AL2,RL).
重み付け平均をRLにセット(M,N,_重みならび,_重み合計,AL,[]) :- M > N,!.
重み付け平均をRLにセット(M,N,_重みならび,_重み合計,AL,[_重み付け平均|R]) :-
findall(B,(for(M-2,U,M+2),list_nth(U,AL,B)),L1),
重み付け平均(L1,_重みならび,_重み合計,0,_重み付け平均),
M2 is M + 1,
重み付け平均をRLにセット(M2,N,_重みならび,_重み合計,AL,R).
重み付け平均([A|R1],[B|R2],_重み合計,S1,_重み付け平均) :-
_重み付け平均 is S1 / _重み合計,!.
重み付け平均([A|R1],[B|R2],_重み合計,S1,_重み付け平均) :-
S2 is S1 + A * B,
重み付け平均(R1,R2,_重み合計,S2,_重み付け平均).
>>258 使用言語:J
f=:dyad def '(+/x)%~+/"1 x*(i.#y)|."0 1 y'
1 3 4 3 1 f 1 2 3 4 5
1.25 3.75 5 3.75 1.25
>>231 % Prolog
九九表を作り,テキストファイルに書き出す(_テキストファイル) :-
九九表を作り(_九九表),
tell(_テキストファイル),
書き出す(_九九表),
told.
九九表を作り(M,N,[]) :- M > N,!.
九九表を作り(M,N,[L|R]) :-
findall(K,(for(1,J,9),K is J * M),L),
M2 is M + 1,
九九表を作り(M2,N,R).
テキストファイルに書き出す(_テキストファイル,_ならび) :-
tell(_テキストファイル),
書き出す(_ならび),
told.
書き出す([]) :- !.
書き出す([L|R]) :-
concat_atom(L,' ',S),
write_formatted('%t\n',[S]),
書き出す(R).
>>256 % Prolog (その一)
標準入力から読み込んだテキストファイルを辞書順に整列して標準出力する :-
標準的整列ルール(32,127,_標準的整列ルール),
例外的整列ルール(_例外的整列ルール),
get_lines(user_input,Lines),
concat_atom(Lines,' ',S),
split(S,[' '],_語彙ならび),
辞書順整列(_語彙ならび,_標準的整列ルール,_例外的整列ルール,[],_辞書順に整列された語彙ならび),
語彙ならびを標準出力する(_語彙ならび).
語彙ならびを標準出力する([]).
語彙ならびを標準出力する([_語彙|R]) :-
write_formatted('%t\n',[_語彙]),
語彙ならびを標準出力する(R).
標準的整列ルール(M,N,[]) :- M > N,!.
標準的整列ルール(M,N,[A|R]) :-
\+((M >=97,M =< 122)),
char_code(A,M),
M2 is M + 1,
標準的整列ルール(M2,N,R),!.
標準的整列ルール(M,N,[A,B|R]) :-
M >= 65,M =< 90,
M32 is M + 32,
char_code(A,M),char_code(B,M32),
M2 is M + 1,
標準的整列ルール(M2,N,R),!.
>>293 訂正
% Prolog この定義の一番最後は _辞書順に整列された語彙ならび でないといけない。
標準入力から読み込んだテキストファイルを辞書順に整列して標準出力する :-
標準的整列ルール(32,127,_標準的整列ルール),
例外的整列ルール(_例外的整列ルール),
get_lines(user_input,Lines),
concat_atom(Lines,' ',S),
split(S,[' '],_語彙ならび),
辞書順整列(_語彙ならび,_標準的整列ルール,_例外的整列ルール,[],_辞書順に整列された語彙ならび),
語彙ならびを標準出力する(_辞書順に整列された語彙ならび).
>>192 % Prolog
現在の対ドル為替レート(92.69).
日本円をドルに変換する(_日本円,_ドル,_セント) :-
現在の対ドル為替レート(_現在の為替レート),
_ドル is truncate(float_integer_part(_日本円 / _現在の為替レート)),
_セント is truncate(float_fractional_part(_日本円 / _現在の為替レート) * 100).
日本円をドルとセントに変換して金種を計算する(_日本円,_ドルの金種,_セントの金種) :-
日本円をドルに変換する(_日本円,_ドル,_セント),
ドルの金種計算(_ドル,[100,50,20,10,5,2,1],_ドルの金種),
セントの金種計算(_セント,[50,25,10,5,1],_セントの金種).
ドルの金種計算(_,[],[]) :-
ドルの金種計算(D,[_金種|R1],[[_金種,_枚数]|R2]) :-
_枚数 is truncate(D // _金種),
D2 is truncate(D mod _金種),
ドルの金種計算(D2,R1,R2).
セントの金種計算(_,[],[]) :-
セントの金種計算(C,[_金種|R1],[[_金種,_枚数]|R2]) :-
_枚数 is truncate(C // _金種),
C2 is truncate(C mod _金種),
セントの金種計算(C2,R1,R2).
>>257 % Prolog 問題3 これもこれまで何度も定義された。
行列の転置([[]|_],[]) :- !.
行列の転置(_副行列,[_第一要素ならび|R]) :-
第一要素と残り要素の収集(_副行列,_第一要素ならび,_残り要素ならび),
行列の転置(_残り要素ならび,R),!.
第一要素と残り要素の収集([],[],[]) :- !.
第一要素と残り要素の収集([[A|R1]|R2],[A|R3],[R1|R4]) :-
第一要素と残り要素の収集(R2,R3,R4).
# 基本課題 2a(数式の読み込みと表示)
# 課題 2a と 2b では,算術式を読み,表示し,値を求めるプログラムを作る.
# 限られた時間内で数式処理の本質部分を効率よく学ぶために,
# 入力できる算術式の構文を,次の BNF で定めるものに限る.
#
# 定数 ::= 0 | 1 | … | 9
# 変数 ::= a | b | … | z | A | B | … | Z
# 算術式 ::= 定数
# | 変数
# | (算術式+算術式)
# | (算術式*算術式)
#
# つまり,1桁の定数や1文字の変数の和や積からなる式が入力である.
#
# 入力された算術式を読み込み,2分木データとして格納し,そのデータをもとに
# 入力と同じ算術式を表示する,という処理を繰り返すプログラムを作れ.
#
# 次の要求を満たすものを作り,仕様の不明確な部分は各自で詳細化すること.
#
# ・算術式は標準入力から読む
# ・2つの算術式の区切りは1つの空白 (間隔文字や改行文字など) とする
# ・結果は標準出力に書く
# ・構文に合わない算術式を読んだらプログラムを終了する
# ●基本課題 2b(数式の値の計算)
#
# 課題 2a のプログラムに,算術式の値を計算して表示する機能を追加せよ.
# ただし,変数の値は全て1であるとして,式の値を求めること.
#
# 例えば,入力が (2*3) と (x+(y+z)) の場合,次のような出力をすればよい.
# show: に続いて入力された算術式を,eval: に続いて算術式の値を表示している.
#
# (2*3) ←入力
# show: (2*3)
# eval: 6
#
# (x+(y+z)) ←入力
# show: (x+(y+z))
# eval: 3
#
# まず,算術式の値を求める関数 eval_exp()(exp.c にある)を完成させる.
# 十分な数の検査データを使って動作の正しさを確かめよ.
# ●基本課題 2c(数式データの基本操作)
#
# 算術式の値を変えずに括弧をくくり直す簡単な式変形を考える.例えば,式
#
# (1+(2+3))
# (a*(b*c))
# ((i*x)+((j*y)+(k*z)))
#
# の括弧を左にくくり直すと,それぞれ,次の式になる.
#
# ((1+2)+3)
# ((a*b)*c)
# (((i*x)+(j*y))+(k*z))
#
# 括弧を左にくくり直せる (A+(B+C)) や (A*(B*C)) の形の算術式を
# ((A+B)+C) や ((A*B)*C) の形にする式変形は,式に対応する木を
# 「左に転回」する変形と捉えられる.
>>297 % Prolog
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(_経過,_和) :-
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(1,[],_経過,0,_和).
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,_経過,_経過,_和,_和) :- M > 10,!.
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,_経過1,_経過,S1,_和) :-
M =< 10,
concat_atom([M,'^2'],U),
append(_経過1,[U],_経過11),
concat_atom(_経過11,'+',_経過),
_和 is truncate(M ^ 2 + S1).
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,_経過1,_経過,S1,_和) :-
M =< 10,
concat_atom([M,'^2'],U),
append(_経過1,[U],_経過2),
S2 is truncate(M ^ 2 + S1),
M2 is M + 1,
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M2,_経過2,_経過,S2,_和).
>>297 ruby
sum=0;array=[]
for i in 1..10
sum+=i**2
array.push (i.to_s(10)+"^2")
puts array.join(" + ") + " = " + sum.to_s(10)
end
>>297 使用言語:Io
なんか前にやった問題だなあと、ながめていたらrubyによる解答が
書き込まれた。これを参考にもう一度やってみた。
Io> s:=0;a:="";for(i,1,10,writeln(a=a .. i .. "^2"," = ",s=s+i*i);a=a .. " + ")
>>297 ;; Common Lisp ひさしぶりに挑戦
(dotimes (n 10)
(let (lst)
(dotimes (i (+ n 1)) (push (+ i 1) lst))
(setf lst (reverse lst))
(format t "~A = ~A~%"
(reduce #'(lambda (x y) (concatenate 'string x " + " y))
(map 'list #'(lambda (x) (concatenate 'string (princ-to-string x) "^2")) lst))
(reduce #'+ (map 'list #'(lambda (x) (* x x)) lst)))))
>>297 使用言語:maxima
for i thru 10 do printf(true,"~{~a^2~^ + ~} = ~a~%",a:makelist(j,j,1,i),lsum(k*k,k,a));
http://pc12.2ch.net/test/read.cgi/tech/1260532772/864 # [1] 授業単元: プログラミング演習 (木構造と数式処理)
# [2] 問題文(含コード&リンク):
#
# 算術式の値を変えずに括弧をくくり直す簡単な式変形を考える.例えば,式
#
# (1+(2+3))
# (a*(b*c))
# ((i*x)+((j*y)+(k*z)))
#
# の括弧を左にくくり直すと,それぞれ,次の式になる.
#
# ((1+2)+3)
# ((a*b)*c)
# (((i*x)+(j*y))+(k*z))
#
# 括弧を左にくくり直せる (A+(B+C)) や (A*(B*C)) の形の算術式を((A+B)+C) や ((A*B)*C) の形にする式変形は,式に対応する木を
# 「左に転回」する変形と捉えられる
#
# この操作を実行する関数 rotate_left_exp()を完成させてください。
# 括弧をくくり直すと値の変わる (8+(8*8)) のような式や,括弧をくくり直せる部分が内側にある (a+(b*(c*d))) のような式は,
# 変形しないこと.
>>297 訂正
% Prolog 一引数増やします。
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,_経過,_和) :-
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(1,M,[],_経過,0,_和).
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,M,_経過,_経過,_和,_和) :- M > 10,!.
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,M,_経過1,_経過,S1,_和) :-
M =< 10,
concat_atom([M,'^2'],U),
append(_経過1,[U],_経過11),
concat_atom(_経過11,'+',_経過),
_和 is truncate(M ^ 2 + S1).
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M,MX,_経過1,_経過,S1,_和) :-
M =< 10,
concat_atom([M,'^2'],U),
append(_経過1,[U],_経過2),
S2 is truncate(M ^ 2 + S1),
M2 is M + 1,
'1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(M2,MX,_経過2,_経過,S2,_和).
>>308 (
>>297)
% Prolog これで以下のように使います。
?- '1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(N,S,_和),write_formatted('%t=%t\n',[S,_和]),N>=10.
1^2=1
1^2+2^2=5
1^2+2^2+3^2=14
1^2+2^2+3^2+4^2=30
1^2+2^2+3^2+4^2+5^2=55
1^2+2^2+3^2+4^2+5^2+6^2=91
1^2+2^2+3^2+4^2+5^2+6^2+7^2=140
1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2=204
1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+9^2=285
1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+9^2+10^2=385
N = 10,
S = '1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+9^2+10^2',
_和 = 385.
>>308 (
>>297)
% Prolog または、次のように利用もします。
?- '1から10までの整数の2乗の和 1^2 + 2^2 + 3^2 + ... +8^2 + 9^2 + 10^2 を求める'(N,S,_和).
N = 1,
S = '1^2',
_和 = 1;
N = 2,
S = '1^2+2^2',
_和 = 5;
N = 3,
S = '1^2+2^2+3^2',
_和 = 14;
<中略>
N = 9,
S = '1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+9^2',
_和 = 285;
N = 10,
S = '1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+9^2+10^2',
_和 = 385;
no.
?-
http://pc11.2ch.net/test/read.cgi/db/1252492296/445 # MySQL 5.1での質問です。
#
# A B C
# 1 q name1
# 2 w name2
# 3 e name3
# 4 q name4
# 5 t name5
#
# 上記テーブルのB列の重複を除いたA,B,C列がほしい場合
#
# SELECT DISTINCT B FROM table_name;
#
# ではB列の重複を除くだけで他の列がとれません。他の列も併せて取得する場合はど
のような解決策がありますか?
#
# 望んでる結果は以下のものです。
#
# A B C
# 1 q name1
# 2 w name2
# 3 e name3
# 5 t name5
#
>>311 使用言語:J
A=:,.1;2;3;4;5
B=:'q';'w';'e';'q';'t'
C=:,.'name1';'name2';'name3';'name4';'name5'
A,.B,.C
+-+-+-----+
|1|q|name1|
+-+-+-----+
|2|w|name2|
+-+-+-----+
|3|e|name3|
+-+-+-----+
|4|q|name4|
+-+-+-----+
|5|t|name5|
+-+-+-----+
(~:B)# A,.B,.C
+-+-+-----+
|1|q|name1|
+-+-+-----+
|2|w|name2|
+-+-+-----+
|3|e|name3|
+-+-+-----+
|5|t|name5|
+-+-+-----+
>>316 「~.」が通常のuniqですが、AとCを道連れにするするために
「~:」を使いました。これは、いきなりuniqせずに残す要素を1で
削除する要素を0で表したリストを返します。
「#」はコピーなんですが、1と0のリストを左引数に、操作するデータ
を右引数にすると1に対応するデータだけを返します。
B=:,.'q';'w';'e';'q';'t'
~. B
+-+
|q|
+-+
|w|
+-+
|e|
+-+
|t|
+-+
~: B
1 1 1 0 1
1 1 1 0 1 # B
+-+
|q|
+-+
|w|
+-+
|e|
+-+
|t|
+-+
>>318 「~:」によって、どうして、
01111 ではなく 11101 の選択になるのですか?
>>319 J言語のuniqは重複した要素の内、最初にあらわれたものを
残すようです。
http://pc12.2ch.net/test/read.cgi/tech/1260532772/911 # お願いします
# [1] 授業単元:電子演算機演習
# [2] 問題文(含コード&リンク):
# 2次元の文字配列が、main関数内において次の詞で初期化(空白行も含める)されている。
# 例によって、初期化に用いられた詞の文字数や行数などはわかっていないものとする。
#
# (1)関数NumOfCharで総文字数(空白以外)を、(2)関数NumOfWordで単語数を、(3)関数
# NumOfLineで行数(空白行は数えない。また、空白行が2行以上続くことはない)を、(4)main
# 関数内でキーボードから一文字入力し、関数NumOfCoinで入力した文字と一致する文字数を数えて、
# main関数内でそれらの数を表示する。文字列に小細工をしないこと(単語:空白又は改行から空白
# 又は改行まで)
http://pc12.2ch.net/test/read.cgi/tech/1262163854/238 # Repl-Aceというテキスト置換ツールを使っているんですが、
#
# 1月
# ・1日
# ・2日
# ・3日
# 2月
# ・1日
# ・2日
# ・3日
#
# といったテキストを、
#
# 1月1日
# 1月2日
# 1月3日
# 2月1日
# 2月2日
# 2月3日
#
# といったように置換することができず困っています。
# 単純な文字の置換や簡単な正規表現は理解できるのですが、
# 1月から2月までの「・」を「1月」に置換、2月から3月までの「・」を「2月」に置換、3月から(ry
# を一気に行えるような正規表現ってありますか?
http://pc12.2ch.net/test/read.cgi/tech/1260532772/922 # visual studioのwindowsフォームアプリケーション visual C++のプログラミングについて質問です!!
# かなり急いでます。
# チェックボックスを5個とボタン1個を使いアンケートみたいなプログラムを作りたいのですができません。
#
# 内容としてはチェックの数で表示される答えを違うようにしたいのです。
# 0〜1個つけたら良い
# 2〜3個つけたら普通
# 4〜5個つけたら悪い
# みたいな感じで最後にボタンを押したら評価がでてくるというものです。
# すべてのプログラムを教えてください!!
>>326 % Prolog
'1月から2月までの「・」を「1月」に置換、2月から3月までの「・」を「2月」に置換、
3月から...'(File) :-
get_lines(File,Lines),
月表示行まで読み飛ばし(Lines,R,_月),
'.を月表示に置換'(Lines,_月,L),
ならびを行表示(L).
'.を月表示に置換'([],_,[]) :- !.
'.を月表示に置換'([A|R1],_月,X) :-
sub_atom(A,_,1,_,'月'),
split(A,[月],[_月2|_]),
'.を月表示に置換'(R1,_月2,X).
'.を月表示に置換'([A|R1],_月,[B|R2]) :-
sub_atom(A,0,1,_,'.'),
concat_atom([_月,A],B),
'.を月表示に置換'(R1,_月,R2).
月表示行まで読み飛ばし(Lines,Lines2,_月) :-
append(_,[A|Lines2],Lines),
sub_atom(A,_,1,_,'月'),
split(A,[月],[_月|_]),!.
>>327 A=:'chihayafuru';'yothubato';'tomehane'
B=:7;9;6
mysort=: /:
mysort B 単項演算子として使うと並べ替えるための指標(0オリジン)を返す。
2 0 1
A mysort B 二項演算子として使うと右引数のデータでつくった指標で左引数のデータを並べ替える。
+--------+-----------+---------+
|tomehane|chihayafuru|yothubato|
+--------+-----------+---------+
>>312 % Prolog
program :-
user_parameters(L),
L = [S,A|_],
atom_to_term(A,N,_),
integer(N),
sub_atom(S,N,1,_,X),
write_formatted('Char %t is "%t"\n',[N,X]),
halt.
>>331 --luaで。 優先順位は、長さ>大文字区別無し辞書>バイナリ
function f(a,b)
if a:len()==b:len() then
if a:lower()==b:lower() then return a<b end
return a:lower()<b:lower()
end
return a:len()>b:len() and true or false
end
t={}
for i=1,#arg do
table.insert(t,arg[i])
end
print("before") print(unpack(t))
table.sort(t,f)
print("after") print(unpack(t))
340 :
デフォルトの名無しさん:2010/01/18(月) 21:58:23
ふらっとC#からきました。
宿題ではないんですが、C#でマルコフ連鎖で人工無脳を作りたいのです。
文章を単語に分けたあと(ここまではできてます)、それを配列にいれるんですか?
Rubyだとこう書くらしいんだけど、これをC#だとどう書けばいいんでしょう?
分かち書きにはChasenを使っています。
よろしくアドバイスお願いします。
# マルコフ連鎖で要約
t1 = data[0]['head']
t2 = data[0]['middle']
new_text = t1 + t2
while true
_a = Array.new
data.each do |hash|
_a.push hash if hash['head'] == t1 && hash['middle'] == t2
end
break if _a.size == 0
num = rand(_a.size) # 乱数で次の文節を決定する
new_text = new_text + _a[num]['end']
break if _a[num]['end'] == "EOS"
t1 = _a[num]['middle']
t2 = _a[num]['end']
end
http://d.hatena.ne.jp/zariganitosh/20090628/1246186477
http://pc12.2ch.net/test/read.cgi/tech/1260532772/963 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10384.txt # 括弧をすべて左にくくり直す式変形に加えて,分配法則を使って + を * の 外側へとくくり出す式変形をするプログラムを作ってください.
# ファイル exp.c に,+ を * の外側にくくり出す式変形をする 関数 dist_prod_exp() を作ること.
# 例えば,算術式 ((x+1)*(y+a)) の+を外にくくり出し,括弧を左にくくり直すことで, 次の式が順に得られればよい.
# ((x+1)*(y+a))
# (((x*y)+(1*y))+((x*a)+(1*a)))
# ((((x*y)+(1*y))+(x*a))+(1*a))
#
# 分配法則を使う順序によっては,結果の式の形が変わる.((A+B)*(C+D)) の形の式は,* の左の式 (A+B) を先に分配すると (((A+B)*C)+((A+B)*D))
# になり,右の式 (C+D) を先に分配すると ((A*(C+D))+(B*(C+D))) になる. 同じ位置で2通りに分配できる場合,この課題では,左の式の分配を優先する.
# 2分木の節を格納するためのデータ構造(Tree 型)を,次のように定義する.
#
# typedef struct _tree {
# char node; /* 節のデータ (1文字) */
# struct _tree *left; /* 左の子へのポインタ */
# struct _tree *right; /* 右の子へのポインタ */
# } Tree;
>>343 % Prolog
'4行4列のint型の行列を、転置する'([[A1,A2,A3,A4],[B1,B2,B3,B4],[C1,C2,C3,C4],[D1,D2,D3,D4]],[[A1,B1,C1,D1],
A2,B2,C2,D2],[A3,B3,C3,D3],[A4,B4,C4,D4]]).
>>343 % Prolog "["がひとつ抜けた。これが答えといえるかどうか。
'4行4列のint型の行列を、転置する'([[A1,A2,A3,A4],[B1,B2,B3,B4],[C1,C2,C3,C4],[D1,D2,D3,D4]],[[A1,B1,C1,D1],[A2,B2,C2,D2],[A3,B3,C3,D3],[A4,B4,C4,D4]]).
少なくともint型の検査はできていない。
>>343 使用言語:J
a=:i.4 4
a
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
,./a 各行を「,.」で連結すると転置になる
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
|:a 「|:」は組み込みの転置演算子
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
>>341 使用言語:J
f=:monad define
'p q d'=.y
a=./:~~.,(p*i.d)+/q*i.d
b=.}.(d>:a)#a
smoutput b
smoutput '合計で',(":#b),'個あります'
)
f 3 5 10
3 5 6 8 9 10
合計で6個あります
350 :
345:2010/01/19(火) 23:04:02
>>347 プログラムというのは何をするのかを示すことなのではないか?
>>350 この問いかけはどう受け取ればいいのでしょうか。
「あなたの書き込みは組み込み機能の紹介で
プログラムじゃないよ」ということですか?
補足。説明を論理式で書き表すことができるならば、その論理式が
すなわちプログラムである。というのがPrologの"売り"なんですね。
上の論理式の部分を数式に置き換えて、はたして本当にその数式が
"説明"になっているかということを問題にしているのです。常に
完全に理解している事が前提になっているのではないか、と。
>>354 プログラムを使うためのもの見るか、理解するためのものと見るかという違いかな。
このスレの魅力は議論を排除してプログラムコードが並んでいるところだから、
ここではあまりやって欲しくはないが、興味深いテーマではあるね。
>>353 >私は、オペレータを知らないとそのプログラムの意味がわからない(APL的)ことは、
>関数型言語の欠点ではないかと思っています。
知らないとわからないのは、あたりまえです。
手続き型言語をひとつ覚えると他の手続き型言語のコードがなんとなくわかる
気がするのは前提とする知識がほとんど同じだからじゃないでしょうか。
http://pc12.2ch.net/test/read.cgi/tech/1260922392/22 # 次のゲームを考える
# ・二人のプレイヤーA、Bにそれぞれ持ち点m点を与える
# ・コイントスをして表が出たらAからBへ、裏が出たらBからAへ、1点渡す
# ・コイントスをくりかえして先に持ち点がなくなったほうが負け
#
# 一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム繰り返して、
# 平均何回のコイントスで勝負がつくか、シュミレーションして求めるプログラムを作成してください。
# ただしコイントスを10000回繰り返しても勝負がつかない場合があるかもしれないので、それは回数オーバーとして別にカウントしてください。
#
>>358 % Prolog
文字列を受け取ってスペースと記号を削除した文字列を返す(_文字列,_スペースと記号を削除された文字列) :-
atom_codes(_文字列,Codes),
文字コードならびからスペースと記号を削除する(Codes,Codes2),
atom_codes(_スペースと記号を削除された文字列,Codes2).
文字コードならびからスペースと記号を削除する([],[]) :- !.
文字コードならびからスペースと記号を削除する([A|R1],X) :-
全角記号範囲(_コード下限,_コード上限),
A >= _コード下限,A =< _コード上限,
文字コードならびからスペースと記号を削除する(R1,X),!.
文字コードならびからスペースと記号を削除する([A|R1],X) :-
半角記号範囲(_コード下限,_コード上限),
A >= _コード下限,A =< _コード上限,
文字コードならびからスペースと記号を削除する(R1,X),!.
文字コードならびからスペースと記号を削除する([A|R1],[A|R2]) :-
文字コードならびからスペースと記号を削除する(R1,R2),!.
全角記号範囲(41376,41726).
半角記号範囲(32,47).
半角記号範囲(58,64).
半角記号範囲(91,96).
>>358 使用言語:J
f=:-.&(ucp&',.?、。?')
a=:ucp'a,い、b?ろ?c.は。'
f a
aいbろcは
>>358 使用言語:J
NB.f=:-.&(ucp&',.?、。?')間違えたので、訂正します。ucpの後ろの&はいりませんでした。
f=:-.&(ucp',.?、。?')
a=:ucp'a,い、b?ろ?c.は。'
f a
aいbろcは
http://pc12.2ch.net/test/read.cgi/tech/1248012902/755 # 【 課題 】インターネット書店を作成せよ
# <条件>
# ・画面サイズ→VGAとする
# ・書籍は5ジャンル150冊
# ・1回の注文で5種類まで書籍を注文可能
# ・書籍の値段は20円単位とし、書籍の値段は自由
# ・書籍価格の合計金額の2%のポイントが与えられる。(ただし、ポイントは第一ジャンルは2倍、第二ジャンルは3倍になる)
# ・注文終了後、注文確認画面で注文と支払い代金、獲得ポイントが確認できる。(支払い代金とは、注文図書の合計金額と消費税の和)
# ・貯まったポイントを併用して支払いが可能(ポイントの価値は、1ポイント1円)
# ・書籍の発送は電子メールの添付ファイルで行う(発送は出来なくてよい)
# ・ソフトキーボードのみ使用可能
#
# 【 補足 】実用的な画面インタフェースでは取消機能が必要であるが、ここでは取消機能については
# 考えなくてよい。
# また、ユーザーは正しい操作を行うものと仮定して良い。
>>357 % Prolog (その一)
一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム
繰り返して、平均何回のコイントスで勝負がつくか、シュミレーションして求める(_平
均コイントス数) :-
催促付き整数入力('A,Bが持つコイン数を入力してください :',M),
このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負が
つくか(1,M,_無効ゲーム数,_平均コイントス数),!.
このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつく
か(M,_無効ゲーム数,_平均コイントス数) :-
このゲーム(1,M,_有効コイントス総数,_無効ゲーム数),
\+(_無効ゲーム数 = 1000),
_平均コイントス数 is _有効コイントス総数 / (1000 - _無効ゲーム数).
このゲーム(N,_,0,0) :- N > 1000,!.
このゲーム(N,M,_コイントス総数,_無効ゲーム数) :-
コイントスシミュレーション(1,M,M,_トス数),
N2 is N + 1,
このゲーム(N,_,_コイントス総数の二,_無効ゲーム数),
_コイントス総数 is _コイントス総数の二 + _トス数,!.
このゲーム(N,M,_コイントス総数,_無効ゲーム数) :-
N2 is N + 1,
このゲーム(N,M,_コイントス総数,_無効ゲーム数の一),
_無効ゲーム数 is _無効ゲーム数の一 + 1,!.
>>357 改行位置を間違えたので書き直し。
% Prolog (その一)
一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲームを繰り返して、平均何回のコイントスで勝負がつくか、シュミレーションして求める(_平均コイントス数) :-
催促付き整数入力('A,Bが持つコイン数を入力してください :',M),
このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(1,M,_無効ゲーム数,_平均コイントス数),!.
このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(M,_無効ゲーム数,_平均コイントス数) :-
このゲーム(1,M,_有効コイントス総数,_無効ゲーム数),
\+(_無効ゲーム数 = 1000),
_平均コイントス数 is _有効コイントス総数 / (1000 - _無効ゲーム数).
このゲーム(N,_,0,0) :- N > 1000,!.
このゲーム(N,M,_コイントス総数,_無効ゲーム数) :-
コイントスシミュレーション(1,M,M,_トス数),
N2 is N + 1,
このゲーム(N,_,_コイントス総数の二,_無効ゲーム数),
_コイントス総数 is _コイントス総数の二 + _トス数,!.
このゲーム(N,M,_コイントス総数,_無効ゲーム数) :-
N2 is N + 1,
このゲーム(N,M,_コイントス総数,_無効ゲーム数の一),
_無効ゲーム数 is _無効ゲーム数の一 + 1,!.
>>357 % Prolog (その二)
コイントスシミュレーション(N,_,_,_) :- N > 10000,!,fail.
コイントスシミュレーション(N,A,B,N) :- コイントスをくりかえして先に持ち点がなくなったほうが負け(A,B,_),!.
コイントスシミュレーション(N,A1,B1,X) :-
コイントス(_表か裏か),
表が出たらAからBへ、裏が出たらBからAへ、1点渡す(表,A1,B1,A2,B2),
N2 is N + 1,
コイントスシミュレーション(N,A2,B2,X),!.
表が出たらAからBへ、裏が出たらBからAへ、1点渡す(表,A1,B1,A2,B2) :- A2 is A1 -1,B2 is B1 + 1,!.
表が出たらAからBへ、裏が出たらBからAへ、1点渡す(裏,A1,B1,A2,B2) :- B2 is B1 -1,A2 is A1 + 1,!.
コイントスをくりかえして先に持ち点がなくなったほうが負け(0,_,'Aの負け').
コイントスをくりかえして先に持ち点がなくなったほうが負け(_,0,'Bの負け').
コイントス(_表か裏か) :- N is (random mod 2) + 1,list_nth(N,[表,裏],_表か裏か).
>>351 % Prolog
'リストの指定した位置(末尾以外)にノードを挿入する'(_指定した位置,Node,_リスト,_挿入されたリスト) :-
insert_node(_指定した位置,Node,_リスト,_挿入されたリスト).
insert_node(_,_,[],_) :- !,fail.
insert_node(0,Node,_リスト,[Node|_リスト]) :- !.
insert_node(_指定した位置,Node,[A|R1],[A|R2]) :-
_指定した位置の一 is _指定した位置 - 1,
insert_node(_指定した位置の一,Node,R1,R2).
リストの指定した位置のノードを削除する(_指定した位置,_リスト,_指定した位置のノードが削除されたリスト) :-
delete_node(_指定した位置,_リスト,_指定した位置のノードが削除されたリスト).
delete_node(1,[_|R],R) :- !.
delete_node(_指定した位置,[A|R1],[A|R2]) :-
_指定した位置の一 is _指定した位置 - 1,
delete_node(_指定した位置の一,R1,R2).
>>332 % Prolog
与えられた文字列の各文字を要素とする文字リストを作成し返す(_文字列,_各文字を要素とする文字リスト) :-
make_clist(_文字列,_各文字を要素とする文字リスト).
make_clist(_文字列,_各文字を要素とする文字リスト) :-
sub_atom(_文字列,_,_文字列の長さ,_,_文字列),
make_clist(0,_文字列の長さ,_文字列,_各文字を要素とする文字リスト).
make_clist(N,N,_文字列,[]) :- !.
make_clist(N,_文字列の長さ,_文字列,[_文字|R]) :-
sub_atom(_文字列,N,1,_,_文字),
N2 is N + 1,
make_clist(N2,_文字列の長さ,_文字列,R).
与えられた文字列の各文字を要素とする文字リストの内容を印字する(_文字リスト) :-
print_clist(_文字リスト).
print_clist([]).
print_clist([_文字|R]) :-
put_char(_文字),
print_clist(R).
>>333 % Prolog
'与えられた二つのリストに含まれる文字の並びを辞書式順序(※)で比較し、第一のリストの方が小さければ負の値、大きければ正の値、等しければ0を返す'(_文字リスト_1,_文字リスト_2,_返り値) :-
compare(_文字リスト_1,_文字リスト_2,_返り値).
compare([],[],0).
compare([],[_|_],-1).
compare([_|_],[],1).
compare([A|_],[B|_],-1) :-
char_code(A,CodeA),CodeA >= 65,CodeA =< 90,
char_code(B,CodeB),CodeB >= 97,CodeB =< 122,
CodeC is CodeB - 32,
CodeC >= CodeA,!.
compare([A|_],[B|_],1) :-
char_code(A,CodeA),CodeA >= 97,CodeA =< 122,
char_code(B,CodeB),CodeB >= 65,CodeB =< 90,
CodeC is CodeA - 32,
CodeC =< CodeA,!.
compare([A|_],[B|_],-1) :- A @< B,!.
compare([A|_],[B|_],1) :- A @> B,!.
compare([A|R1],[A|R2],X) :-
compare(R1,R2,X).
>>334 % Prolog
'与えられた文字リストの先頭から見ていき、要素が"<"なら自身と(あれば)直前の要素を、">"なら自身と(あれば)直後の要素を取り除く'(_文字リスト,_編集された文字リスト) :-
edit(_文字リスト,_編集された文字リスト).
edit([],[]).
edit([_,'<'|R1],R2) :- edit(R1,R2),!.
edit(['>',_|R1],R2) :- edit(R1,R2),!.
edit([A|R1],[A|R2]) :- edit(R1,R2).
>>335 % Prolog の場合与えられたリストの変形(破壊代入)は使えない。
引数として三種のリストが与えられると、第一のリスト内に含まれる第二のリストに一致する部分を第三のリストに置き換える(_リスト_1,_リスト2,_リスト_3,L) :-
replace(_リスト_1,_リスト_2,_リスト_3,L).
replace(L1,L2,L3,L) :-
append(L0,L2,L4,L1),
append(L0,L3,L4,L).
>>336 % Prolog リストの変形では得られない点は同じ。
与えられた文字リスト中で複数回現れる文字を残して得られるリストを作成する(_文字リスト,_複数回現れる文字を残して得られるリスト) :-
multiple(_文字リスト,_複数回現れる文字を残して得られるリスト).
multiple(_文字リスト,_複数回現れる文字を残して得られるリスト) :-
findall(_文字,(append(L1,[_文字|L2],_文字リスト),\+(member(_文字,L1)),member(_文字,L2)),_複数回現れる文字を残して得られるリスト).
>>374 % Prolog 全然、説明的でない例
'文字列strを逆順に格納する'(_Str,Rstr) :-
rev_string(Str,Rstr).
rev_string(Str,Rstr) :-
sub_atom(Str,_,Len,_,Str),
findall(Char,(for(0,N,Len-1),sub_atom(Str,_,1,N,Char)),L),
concat_atom(L,Rstr).
>>374 % Prolog ふつうは
'文字列strを逆順に格納する'(_Str,Rstr) :-
rev_string(Str,Rstr).
rev_string(Str,Rstr) :-
atom_chars(Str,Chars),
rev_string(Chars,[],RChars),
atom_chars(Rstr,RChars).
rev_string([],X,X).
rev_string([A|R],Y,X) :- rev_string(R,[A|Y],X).
http://pc12.2ch.net/test/read.cgi/tech/1263824755/38 # [1] 授業単元:応用プログラミング
# [2] 問題文(含コード&リンク):
# 直方体のデータが格納されたファイルを取り扱うプログラムを実装したい。
# プログラムリスト中に必要な関数を実装し、プログラムを完成させよ。尚、プログラムは以下の前提条件(1)−(4)を満たすよう作成せよ。
# (1)新たに大域変数やクラス、クラス内のメンバ変数を宣言してはならない。
#(2)main関数を含む既存の関数、クラス内のメンバ変数は一切変更してはならない。
#(3)直方体のデータが一行毎に、直方体の名前、幅、奥行き、高さ、の順に、スペース区切りで格納されているファイルを読み込める。
#(4)最大20個分のデータを読み込める。
#(5)初めに読み込むファイル名を入力した後、読み込んだデータ数を表示する。
#(6)(5)の表示後、以下に示す操作が繰り返し実行可能であること。
# 操作方法と出力の詳細については、実行例を参考にすること。
# (ア)データを読み込んだ順に表示する。
# (イ)体積、もしくは表面積の大きい順に表示する。
# (ウ)立方体、もしくは正四角柱のみを表示する。
# (エ)直方体を1個指定し、3辺の長さ(幅、奥行き、高さ)を指定した倍率だけ伸縮する。
昨日から悩んでいること。出題が
# 与えられた文字列の各文字を要素とする文字リストを作成し返す関数make_clistと、与えられた文字リスト
# の内容を印字する関数print_clistを作成せよ。
の場合、導入述語名は
'与えられた文字列の各文字を要素とする文字リストを作成し返す関数make_clistと、与えられた文字リストの内容を印字する関数print_clistを作成せよ'(_文字リスト_1,_文字リスト_2,_返り値) :-
make_list(_文字リスト_1,_文字リスト_2,_返り値).
であるべきか、あるいは、
>>370のように、
'与えられた二つのリストに含まれる文字の並びを辞書式順序(※)で比較し、第一のリストの方が小さければ負の値、大きければ正の値、等しければ0を返す'(_文字リスト_1,_文字リスト_2,_返り値) :-
compare(_文字リスト_1,_文字リスト_2,_返り値).
とした方がよいか・・。 前の方の定義だと引数を持っていることが不自然かなと思い採用しなかった。
>>379 二番目の定義が次の問題になってしまった。結果として意味不明。
make_clistがmake_listになってるところもあるし。
>>379はなかったことにしてください。
>>341 % Prolog
'異なる自然数p,qと、もう一つの自然数dを入力する。d以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に表示し、最後にその個数を表示する' :-
'異なる自然数p,qと、もう一つの自然数dを入力する'(_p,_q,_d),
findall(K,'d以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に集め'(_p,_q,_d,L),
concat_atom(L,' ',S),
write_formatted('%t\n',[S]),
length(L,_その個数),
write_formatted('合計で%t個あります\n',[_その個数]),!.
'異なる自然数p,qと、もう一つの自然数dを入力する'(_p,_q,_d) :-
get_line(Line),
split(Line,[' '],[_p,_q,_d]),!.
'd以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に集め'(_p,_q,_d,_kならび) :-
findall(N,for(0,N,10),L1),
findall(_k,(for(0,_k,_d),順列(L1,2,[_m,_n]),'d以下の自然数kのうちで、k=mp+nqと表すことの出来るもの'(_p,_q,_d,_m,_n,_k)),_kならび),!.
'd以下の自然数kのうちで、k=mp+nqと表すことの出来るもの'(_p,_q,_d,_m,_n,_k) :-
_k is _p * _m + _q * _n,
_k =< _d,!.
>>381 訂正
% Prolog
'異なる自然数p,qと、もう一つの自然数dを入力する。d以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に表示し、最後にその個数を表示する' :-
'異なる自然数p,qと、もう一つの自然数dを入力する'(_p,_q,_d),
'd以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に集め'(_p,_q,_d,L),
'表示し'(L),
最後にその個数を表示する(L),!.
表示し(L) :-
concat_atom(L,' ',S),
write_formatted('%t\n',[S]),!.
最後にその個数を表示する(L) :-
length(L,_その個数),
write_formatted('合計で%t個あります\n',[_その個数]),!.
'異なる自然数p,qと、もう一つの自然数dを入力する'(_p,_q,_d) :-
get_line(Line),
split(Line,[' '],[_p,_q,_d]),!.
'd以下の自然数kのうちで、k=mp+nqと表すことの出来るもの(m,nは自然数)を小さい順に集め'(_p,_q,_d,_kならび) :-
findall(N,for(0,N,10),L1),
findall(_k,(for(0,_k,_d),順列(L1,2,[_m,_n]),'d以下の自然数kのうちで、k=mp+nqと表すことの出来るもの'(_p,_q,_d,_m,_n,_k)),_kならび),!.
'd以下の自然数kのうちで、k=mp+nqと表すことの出来るもの'(_p,_q,_d,_m,_n,_k) :-
_k is _p * _m + _q * _n,
_k =< _d,!.
http://pc12.2ch.net/test/read.cgi/tech/1248012902/771 # 【 課題 】
# サーバとクライアントでの間で文字列を送り合うプログラムをつくれ。
# ただし、以下の条件を満たすようにすること。
# アドレス、ポート、名前、文字列はキーボード入力し、お互いに自由に指定できるようにする。
# クライアントで quit が入力された場合、クライアントは接続を切りプログラムを終了し、
# サーバは接続が切られたら、次のクライアントの接続を待つ
# サーバで quit が入力された場合、サーバは接続を切り、次のクライアントの接続を待ち、
# クライアントは接続が切られたらプログラムを終了する
# エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を入力させて、
# その文字列を送るようにする。
>>384 % Prolog programがmainにあたる。
display_name :-
write('私は○○です\n').
program :-
for(1,N,3),display_name,N=3,halt.
>>384 このプログラムのドコが「説明を論理式で書き表すことができるならば、
その論理式がすなわちプログラムである」のだろうか。
387 :
386:2010/01/22(金) 23:43:35
http://pc12.2ch.net/test/read.cgi/tech/1263824755/79 # [1] 授業単元:応用プログラミング
# [2] 問題文(含コード&リンク):
#
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10409.txt #
# 直方体のデータが格納されたファイルを取り扱うプログラムを実装したい。
# プログラムリスト中に必要な関数を実装し、プログラムを完成させよ。尚、プログラムは以下の前提条件(1)−(4)を満たすよう作成せよ。
# (1)新たに大域変数やクラス、クラス内のメンバ変数を宣言してはならない。
# (2)main関数を含む既存の関数、クラス内のメンバ変数は一切変更してはならない。
# (3)直方体のデータが一行毎に、直方体の名前、幅、奥行き、高さ、の順に、スペース区切りで格納されているファイルを読み込める。
# (4)最大20個分のデータを読み込める。
# (5)初めに読み込むファイル名を入力した後、読み込んだデータ数を表示する。
# (6)(5)の表示後、以下に示す操作が繰り返し実行可能であること。
# 操作方法と出力の詳細については、実行例を参考にすること。
# (ア)データを読み込んだ順に表示する。
# (イ)体積、もしくは表面積の大きい順に表示する。
# (ウ)立方体、もしくは正四角柱のみを表示する。
# (エ)直方体を1個指定し、3辺の長さ(幅、奥行き、高さ)を指定した倍率だけ伸縮する。
>>386 >>387 >>382 の方ではなくて? これは結構苦闘してる。
>>385 は「説明を論理式で書き表すことができるならば、その論理式がすなわちプログラムである」の
意識の全くないプログラムだけど。題意もつかめなかった。
>>386 >>385 は
# prolog -e 私は○○です.pro
私の名前は○○です
#
と表示されるためには、mainではなく、述語名がprogramである必要が
あることを示すために書いたコードです。
392 :
391:2010/01/23(土) 04:33:07
すみません。私の名前は○○ですを3回繰り返すのを忘れました。
>>384 % Prolog この問題は編集を余儀なくされました。もっと素直な表現がありそう。
program :-
『私は○○です』と画面に表示する関数display_nameを三回呼び出して出力する,
終了.
『私は○○です』と画面に表示する関数display_nameを三回呼び出して出力する :-
display_name,
display_name,
display_name.
display_name :- write('私は私は○○です\n').
終了 :- halt.
--lua
function display_name()
print "私は私は○○です"
end
function main()
display_name()
display_name()
display_name()
end
main()
>>379 でそれに関することを書きたかったのですが、
># [2] 問題文(含コード&リンク):『私は○○です』と表示する関数を作成して
># main関数でそれを三回呼び出して、画面に三回出力プログラムを作成せよ。
># 表示のための関数の名前は『display_name』とせよ
「関数を作成して」あたりを切り落としたくないのですが、述語名に取り込む
方法が今のところ見つからない。
function display_name(name)
print("私は私は"..name.."です")
end
function main()
name=io.read()
display_name(name)
name=io.read()
display_name(name)
name=io.read()
display_name(name)
end
main()
>>395 これではだめかいwww
program :-
『私は○○です』と表示する関数を作成してmain関数でそれを三回呼び出して、画
面に三回出力プログラムを作成せよ .
『私は○○です』と表示する関数を作成してmain関数でそれを三回呼び出して、画面に
三回出力プログラムを作成せよ :-
『私は○○です』と表示する関数を作成して ,
main.
『私は○○です』と表示する関数を作成して :-
assertz((display_name :- write('私は○○です\n'))).
main :- display_name,display_name,display_name.
>>389 の
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10409.txt には大量の実行例とデータが載っています。2レスに分けて掲載します。
# [実行例]
# ファイル名を入力して下さい => data.txt
# 5個のデータを読み込みました.
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 1
# No. Name Width Depth Height Volume Area
# [ 1] A 1 2 3 6 22
# [ 2] B 3 3 3 27 54
# [ 3] C 3 2 1 6 22
# [ 4] D 2 2 2 8 24
# [ 5] E 5 1 5 25 70
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 1
# 何順に整列しますか?(0:体積 1:表面積) => 0
# No. Name Width Depth Height Volume Area
# [ 2] B 3 3 3 27 54
# [ 5] E 5 1 5 25 70
# [ 4] D 2 2 2 8 24
# [ 1] A 1 2 3 6 22
# [ 3] C 3 2 1 6 22
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 3
# 何を探索しますか?(0:体積 1:表面積) => 1
# No. Name Width Depth Height Volume Area
# [ 2] B 3 3 3 27 54
# [ 4] D 2 2 2 8 24
# [ 5] E 5 1 5 25 70
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 4
# どの直方体ですか?(1〜5) => 1
# 何倍しますか? => 1.5
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 1
# No. Name Width Depth Height Volume Area
# [ 1] A 1.5 3 4.5 20.25 49.5
# [ 2] B 3 3 3 27 54
# [ 3] C 3 2 1 6 22
# [ 4] D 2 2 2 8 24
# [ 5] E 5 1 5 25 70
# 1: 入力順に表示 2: 整列 3: 探索 4: 拡大・縮小 0: 終了
# 何をしますか? => 0
# 終了します.
# データファイル
# A 1 2 3
# B 3 3 3
# C 3 2 1
# D 2 2 2
# E 5 1 5
>>384 使用言語:J
display_name=:[: smoutput '私は○○です。'"_
main=:display_name^:(3)
main ''
私は○○です。
私は○○です。
私は○○です。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/83 # [1]プログラミング演習(大学専門過程演習授業)
# [2] コマンドライン引数で与えられたテキストファイルを読み込み
# 空行でなければ、その行に含まれているスペース、タブを
# 除去したものを標準出力するプログラム。但し英数字と"_"で
# 構成される文字列同士の間には一つのスペースは残す。
# ",'で囲まれた部分に関してはスペース、タブはそのまま残す
# "で囲まれた部分について最後の文字が¥であってはならない。
# 'で囲まれた部分について最後の文字が¥であってはならない。
# (テキストファイルの空行と余計な空白/タブを除去する
# プログラムでクオテーションに配慮したもの)
http://pc12.2ch.net/test/read.cgi/tech/1263824755/93 # [1] 授業単元:プロトタイプ宣言
# [2] 問題文(含コード&リンク):
# 次の式を以下の条件(値)に基づいて計算.表示するプログラムを作成せよ。ただし式は簡単化せずそのままプログラムすることとして、更に表示するときは計算の答えと合� 錣擦鴇魴�値)も表示して分かりやすくせよ。
#
# 計算する式
# {(a+b)c-a(b-c)}/{(c/b)a+abc-ca}
#
# 条件1
# a=3 b=4 c=2
# a=3 b=4.3 c=2.5
# a=32.6 b=57.82 c=2.543
#
# この問題を、
# 式の分だけを関数化した場合
# 式と出力部分を関数化した場合
# の2つの場合でプログラムを作成せよ
>>408 問2
使用言語:J
edit=:monad define
r=.y#~-.(+._1&|.)(<'>')=y
r#~-.(+.1&|.)(<'<')=r
)
]C=:;/'a<bcd>ef>ghi'
+-+-+-+-+-+-+-+-+-+-+-+-+
|a|<|b|c|d|>|e|f|>|g|h|i|
+-+-+-+-+-+-+-+-+-+-+-+-+
edit C
+-+-+-+-+-+-+
|b|c|d|f|h|i|
+-+-+-+-+-+-+
>>408 問3
使用言語:J
exclusive=:dyad def '(x -. y) , y -. x'
]A=:;/'abcdef'
+-+-+-+-+-+-+
|a|b|c|d|e|f|
+-+-+-+-+-+-+
]B=:;/'defghi'
+-+-+-+-+-+-+
|d|e|f|g|h|i|
+-+-+-+-+-+-+
A exclusive B
+-+-+-+-+-+-+
|a|b|c|g|h|i|
+-+-+-+-+-+-+
>>411 使用言語:J
div_enable=: dyad def '+/0=x|y'
]in=:>:i.10
1 2 3 4 5 6 7 8 9 10
3 div_enable in
3
http://pc12.2ch.net/test/read.cgi/tech/1263824755/103 # [1] 授業単元:Cプログラミング演習2
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10420.txt # (2) 2 つの4×4 行列を2 次元配列に格納し,それらの積を求めるプログラムを作成せよ.以下の関数を
# 利用すること.
# void mult_array(int a0[4][4], int a1[4][4], int result[4][4])
# a0,a1 入力された行列の値が格納された2 次元配列のポインタ
# result 演算結果の行列の値が格納された2 次元配列のポインタ
# 戻り値 なし
# 入力に関して
# キーボードからまず,1 つめの行列の1 行目の4 つの整数をスペース1 つ開けて1 行で入力し,
# 改行する.以下同様に1 つめの行列の2 行目,3 行目,4 行目,2 つめの行列の1・・・4 行目
# を入力する.この一連の入力時,入力を促す文字等は決して表示しないこと.
# 出力に関して
# 1行目に結果の行列の1 行目をスペース1 つあけて特に整形せず数値のみ出力(+改行),以下同
# 様に2 行目,3 行目,4 行目を特に整形せず数値のみ出力する.指定した数値・改行以外の文
# 字等の出力は一切行わないこと.
http://pc12.2ch.net/test/read.cgi/tech/1263824755/104 #
# 課題1 20 桁までの自然数の足し算と掛け算を浮動小数点演算を用いないで実施するプログラムlongcomp.c を
# 作成し、C のソースコードを提出しなさい。足し算は必須課題、掛け算はオプション課題です。
# 実行形式をlongcomp とした動作仕様は以下である1
# >./longcomp 12345678901234567890 + 12345678901234567890
# >12345678901234567890 + 12345678901234567890 = 24691357802469135780
# >./longcomp 1234567890 * 1234567890
# >1234567890 * 1234567890 = 1524157875019052100
http://pc12.2ch.net/test/read.cgi/tech/1263824755/105 #
# 課題2 b01, b001 のように二進数をb で始まるように表記する。二進数の集合を、できるだけ少ないノード数
# の二分木に分類するためには、二分木のノードに蓄積する二進数の桁数を可変にすることが有効である。
# こうすることで二進数表記した値(たとえばキーワードとか、位置とか、日付とか)に紐づけられたデータを少ない検索で見つけることができる。
# 扱う二進数の集合を、たとえば
# b00, b001, b0011, b00111, b1000, b11100, b0
# として、これらを図1に示すようにニ分木に分類して、帰りがけ(ポストオーダ)で次のように出力するプログラム(tree) を作成し、C のソースコードを提出しなさい。
# >./tree
# >1 1 1 0 0 000 1100 1 b
#
http://pc12.2ch.net/test/read.cgi/tech/1263824755/124 # [1] 授業単元: Cプログラミング入門
# [2] 問題文(含コード&リンク): 入力された2つの文字列(日本語その他バイト文字は不可)
# を比較するプログラムを作成せよ。ただし、大文字小文字の違いは無視。単語間に連続して
# スペース・タブが複数入っていても単独のスペースとしない。
#
# [5] その他の制限: 文字列とポインタまでやってます。
# 入力に関して、キーボードから1つ目の文字列を1行で入力し、改行する。
# この時、入力を促す文字は一切表示しない。入力文字数は128文字まで。
# 出力に関して、一致すれば何も表示しない。不一致の場合は最初に不一致となる
# 入力1の文字と入力2の文字(1文字+スペース+1文字+改行)を表示する。
# どちらかが末端の場合は代わりにスペースで埋める。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/137 # [1] 授業単元: プログラミング概論
# [2] 問題文:"in_file"という名前のファイルの中に18個の整数データが空白や改行コードで区切られて並んでいると仮定した上で、
# この入力ファイルの中のデータを1行に5個ずつきれいに並べて"out_file"という名前のファイルに
# 出力するCプログラムを作成せよ。
# 入力ファイルの内容が
# -1111111111 2222222 333333 4444 55 6 7 8 9 0 1 2 3 4
# 5 6 7890123
# -5666
# の時には、例えば次のような内容を"out_file"に書き出す
# _-1111111111_____2222222______333333________4444__________55
# _________________6_______________7______________8_____________9___________0
# ________________ 1_______________2______________3_____________4___________5
# _________________6_____7890123________-5666
#
>>418 ;; Common Lisp
(defun sort-ave (lst)
(let ((abs-ave (floor (abs (/ (reduce #'+ lst) (length lst))))))
(sort lst
#'(lambda (a b)
(let ((ax (abs (- (abs a) abs-ave))) (bx (abs (- (abs b) abs-ave))))
(if (= ax bx)
(< a b)
(< ax bx)))))))
(defun main ()
(let ((num (read)) lst)
(cond ((<= num 100)
(dotimes (i num)
(push (read) lst))
(format t "~{~A ~}~%" (sort-ave lst))))))
>>418 使用言語:J
f=:monad def '}.|:/:~|:y,:~|y-<.(+/%#)y'
f 0 7 8 9 2 2 5 5 5 3
3 5 5 5 2 2 7 0 8 9
http://pc12.2ch.net/test/read.cgi/tech/1263824755/154 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
http://ime.nu/www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html # 等しい合計点
#
# 太郎と花子はそれぞれカードを何枚か持っている.
# 各カードには点数が書かれている.太郎のカードと花子のカードを 1 枚ずつ交換して,
# それぞれの持つカードの合計点数が等しくなるようにしたい.
# どのカードとどのカードを交換したらよいか.
#
# ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする.
# Input
# 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられ
# n m
# s1
# s2
# ...
# 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み,
# n は太郎のカードの枚数,m は花子のカードの枚数を表す.続く n+m 行には,
# 各カードの点数が 1 行にひとつずつ並ぶ.
# 最初の n 個の点数 (s1 から sn まで) は太郎のカードの点数,
# 残りの m 個の点数 (sn+1 から sn+m まで) は花子のカードの点数を表す.
# n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする.
# 入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される.
>>423 使用言語:J
plus =:+
minus=:-
f=:monad def '+/".;._2(1!:1)y'
f <'pm3.txt'
_316
>>413 使用言語:J
mult_array=: +/ .*
]A=:i.4 4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
A mult_array A
56 62 68 74
152 174 196 218
248 286 324 362
344 398 452 506
>>419 使用言語:J
read=: 1!:1
wrire=: 1!:2
format=: 8!:2
a=: read <'in_file'
b=: '13.0'format ".each _5,\cutopen,,;._2 a
(,b,.LF)write<'out_file'
http://pc12.2ch.net/test/read.cgi/tech/1263824755/167 # 上の105ですが、もう一度質問させて頂きます。
# なぜなら、課題2対しての回答がないからです。
# 皆様よろしくお願いします。
#
# [1] データ構造とプログラミング
# [2]b01, b001 のように二進数をb で始まるように表記する。二進数の集合を、できるだけ少ないノード数
# の二分木に分類するためには、二分木のノードに蓄積する二進数の桁数を可変にすることが有効である。こう
# することで二進数表記した値(たとえばキーワードとか、位置とか、日付とか)に紐づけられたデータを少な
# い検索で見つけることができる。
# 扱う二進数の集合を、たとえば
# b00, b001, b0011, b00111, b1000, b11100, b0
# として、これらを図1に示すようにニ分木に分類して、帰りがけ(ポストオーダ)で次のように出力するプロ
# グラム(tree) を作成し、C のソースコードを提出しなさい。
# >./tree
# >1 1 1 0 0 000 1100 0 1 b
#
>>419 % Prolog ここまでするか、とお思いでしょうが・・
'入力ファイルの中のデータを1行に5個ずつきれいに並べて"out_file"という名前のファイルに出力する'(_整数ならび) :-
入力ファイルの中のデータ(_整数ならび),
最大桁数(_整数ならび,_最大桁数),
_整数表示桁 is _最大桁数 + 2,
concat_atom(['%',_整数表示桁,d],_表示フォーマット),
'1行に5個ずつきれいに並べて'(_整数ならび,_5個組整数ならび),
tell('out_file),
出力する(_5個組整数ならび,_表示フォーマット),
told.
入力ファイルの中のデータ(_整数ならび) :- '"in_file"という名前のファイルの中に18個の整数データが空白や改行コードで区切られて並んでいる'(_整数ならび),!.
'"in_file"という名前のファイルの中に18個の整数データが空白や改行コードで区切られて並んでいる'(_整数ならび) :-
get_lines('infile',Lines),
concat_atom(Lines,' ',S),
split(S,[' '],_整数ならび),
length(_整数ならび,18),!.
'1行に5個ずつきれいに並べて'(_整数ならび,_5個組整数ならび) :- 'N個組'(5,_整数ならび,_5個組整数ならび),!.
出力する([],_) :- !.
出力する([L|R],_表示フォーマット) :- '1行出力する'(L,_表示フォーマット),出力する(R,_整数表示桁).
出力する([L|R],_表示フォーマット) :-
'1行出力する'(L,_表示フォーマット),
出力する(R,_整数表示桁).
'1行出力する'([],_) :- write('\n'),!.
'1行出力する'([N|R],_表示フォーマット) :- write_formatted(_表示フォーマット,[N]),'1行出力する'(R,_表示フォーマット).
>>433 (
>>432) 訂正
% Prolog 訂正するのを忘れていた。
出力する([],_) :- !.
出力する([L|R],_表示フォーマット) :- '1行出力する'(L,_表示フォーマット),出力する(R,_表示フォーマット).
>>374 使用言語:J
rev_string=: ,~/
rev_string 'SEC'
CES
|. 'SEC'
CES
>>418 % Prolog (その一)
>>421の短さに唖然!
複数の整数を平均値に近い順にソートする(_整数ならび,_平均値に近い順に整列された
整数ならび) :-
'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_
入力する整数の個数),
指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数
ならび),
相加平均(_整数ならび,_平均値の一),
_平均値 is truncate(_平均値の一),
平均値からの隔たりによる整列(_平均値からの隔たりのならび,_平均値からの隔た
りを鍵として付加して整列された整数ならび),
整列した整数をスペース1つのみあけて1行で出力する(_平均値からの隔たりを鍵と
して付加して整列された整数ならび).
'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力
する整数の個数) :-
repeat,
get_integer(_入力する整数の個数),
_入力する整数の個数 =< 100,!.
指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数なら
び) :-
length(_整数ならび,_入力する整数の個数),
get_split_line([' '],_整数ならび).
>>418 % Prolog (その二)
>>435は改行位置を間違えた行が数行あります。
平均値からの隔たりによる整列([X|Xs],_平均値,Ys) :-
U is X - _平均値,
平均値からの隔たりにより分割する(Xs,U,_平均値,Littles,Bigs),
平均値からの隔たりによる整列(Littles,_平均値,Ls),
平均値からの隔たりによる整列(Bigs,_平均値,Bs),
append(Ls,[X|Bs],Ys) .
平均値からの隔たりによる整列([],_,[]).
平均値からの隔たりにより分割する([X|Xs],Y,_平均値,[[U,X]|Ls],Bs) :-
U is X - _平均値,
U =< Y,
平均値からの隔たりにより分割する(Xs,Y,_平均値,Ls,Bs),!.
平均値からの隔たりにより分割する([X|Xs],Y,_平均値,Ls,[[U,X]|Bs]) :-
U is X - _平均値,
U > Y,
平均値からの隔たりにより分割する(Xs,Y,_平均値,Ls,Bs) .
平均値からの隔たりにより分割する([],Y,_,[],[]).
整列した整数をスペース1つのみあけて1行で出力する([]) :- !.
整列した整数をスペース1つのみあけて1行で出力する([[A,B]]) :- write_formatted('%t\n',[A]) :- !.
整列した整数をスペース1つのみあけて1行で出力する([[B,A]|R]) :-
write_formatted('%t ',[A]),
整列した整数をスペース1つのみあけて1行で出力する(R)
>>436 # 平均値との距離が等しい場合は値の小さな整数が優先されるものとする。
この判断が漏れている。
>>418 間違いが多いようなので書き直し(申し訳ない)
% Prolog (その一)
複数の整数を平均値に近い順にソートする(_整数ならび,_平均値に近い順に整列された
整数ならび) :-
'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_
入力する整数の個数),
指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数
ならび),
相加平均(_整数ならび,_平均値の一),
_平均値 is truncate(_平均値の一),
平均値からの隔たりによる整列(_平均値からの隔たりのならび,_平均値,_平均値か
らの隔たりを鍵として付加して整列された整数ならび),
整列した整数をスペース1つのみあけて1行で出力する(_平均値からの隔たりを鍵と
して付加して整列された整数ならび).
'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力
する整数の個数) :-
repeat,
get_integer(_入力する整数の個数),
_入力する整数の個数 =< 100,!.
指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数なら
び) :-
length(_整数ならび,_入力する整数の個数),
get_split_line([' '],_整数ならび).
>>418 % Prolog (その二)
>>438はやはり改行がうまくいかなかった。
平均値からの隔たりによる整列([X|Xs],_平均値,Ys) :-
U is X - _平均値,
平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Littles,Bigs),
平均値からの隔たりによる整列(Littles,_平均値,Ls),
平均値からの隔たりによる整列(Bigs,_平均値,Bs),
append(Ls,[X|Bs],Ys) .
平均値からの隔たりによる整列([],_,[]).
平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :-
V is X - _平均値,
V < U,
平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!.
平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :-
U is X - _平均値,
X < Y,
平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!.
平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,Ls,[[U,X]|Bs]) :-
平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs) .
平均値からの隔たりにより分割する([],Y,_,[],[]).
整列した整数をスペース1つのみあけて1行で出力する([]) :- !.
整列した整数をスペース1つのみあけて1行で出力する([[A,B]]) :- write_formatted('%
t\n',[A]),!.
整列した整数をスペース1つのみあけて1行で出力する([[B,A]|R]) :-
write_formatted('%t ',[A]),
整列した整数をスペース1つのみあけて1行で出力する(R).
http://pc12.2ch.net/test/read.cgi/tech/1263824755/197 # [1] 計算機概論
# [2] 8bit整数が8つ与えられている。これをunsigned char配列と
# みなしa[]と名付ける。
# unsigned char 整数のor,not演算だけを用いて1<=n<=8からa[n]を
# 計算するC計算式を出力するプログラム
# 例:a[]={1,2,3,4,5,6,7,8}; 出力 return n;
# a[]={1,0,1,0,1,0,1,0}; 出力 return !(!n or 11111110b);
http://pc12.2ch.net/test/read.cgi/tech/1263824755/200 # [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
# A組、B組、C組にそれぞれn人の生徒がいて、
# A組の生徒が一列に並んでいる。
# このとき、B組の生徒をA組の生徒の隣に並ばせたいが
# なるべく隣同士で身長に差がないようにしたい。
# どうやって計算すればいいでしょう?
# 加えて、C組の生徒もB組の隣に並ばせたい場合はどうすれば?
# (身長の配列) double height_a[n], height_b[n], height_c[n];
>>444 % Prolog
なるべく隣同士で身長に差のない並び方(La,Lb,N,LbX) :-
findmin([S,L],ならび候補(La,Lb,N,L,S),Min),
Min = [_,LbX],!.
ならび候補(La,Lb,N,L,S) :-
順列(Lb,N,L),
findsum(U,(for(1,M,N),list_nth(M,La,A),list_nth(M,L,B),U is (B-A) ^ 2),S).
http://pc12.2ch.net/test/read.cgi/tech/1262163854/406 # 下のような2つのファイルから
# 平均を出したいんですがどのようにすればいいのでしょうか?
# ---file A---
# 1 87
# 2 89
# 3 40
# 4 90
# 5 33
#
# ---file B---
# 1 45
# 2 22
# 3 78
# 4 60
# 5 19
#
# ほしい結果は
# ---file C---
# 1 (87+45)/2
# 2 (89+22)/2
# 3 (49+78)/2
# 4 (90+60)/2
# 5 (33+19)/2
# です。
>>444 使用言語:J
よくわかりませんが、こんなふうではだめでしょうか?
A組のならびから身長の順位表をつくる。
B組をこの「A組順」でソートする。
]a=:145+?10#40
178 155 176 179 169 146 161 179 177 153
]b=:140+?10#50
178 167 186 142 165 166 172 173 181 181
a,:(/:~b)/:/:a
178 155 176 179 169 146 161 179 177 153
181 166 173 181 172 142 167 186 178 165
>>446 % Prolog
'2つのファイルから平均を出す'('fileA','fileB','fileC') :-
'2つのファイルから2つのならびを取り出す'('fileA','fileB',L1,L2),
fileAのデータを基礎に平均を計算してfileCに出力する('fileC',L1,L2),!.
'2つのファイルから2つのならびを取り出す'('fileA','fileB',L1,L2) :-
get_split_lines('fileA',[' '],L1),
get_split_lines('fileB',[' '],L2),!.
fileAのデータを基礎に平均を計算してfileCに出力する('fileC',L1,L2) :-
tell('fileC'),
fileAのデータを基礎に平均を計算して出力する(L1,L2),
told.
fileAのデータを基礎に平均を計算して出力する([],_) :- !.
fileAのデータを基礎に平均を計算して出力する([[N,A]|R1],L2) :-
member([N,B],L2),
C is (A + B) / 2,
write_formatted('%t (%t+%t)/2=%t',[M,A,B,C]),
fileAのデータを基礎に平均を計算して出力する(R1,L2).
>>449 % Prolog
入力された数字が偶数なら、trueを返す :-
get_integer(N),
入力された数字が偶数なら、trueを返す(N).
入力された数字が偶数なら、trueを返す(N) :- 0 is N mod 2.
>>449 % Prolog
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(_診断) :-
get_integer(N),
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,_診断).
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,true) :- 0 is N mod 2.
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,false).
>>452 (
>>449) 訂正
% Prolog
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(_診断) :-
get_integer(N),
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,_診断).
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,true) :- 0 is N mod 2,!.
'入力された数字が偶数なら、trueを返す。それ以外ならfalse'(N,false).
>>450 % Prolog
得点を入力して以下のルールに従った成績を返す(_成績) :-
get_integer(_得点),
得点を入力して以下のルールに従った成績を返す(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :-
以下のルール(_得点,_,_成績).
以下のルール(_得点,'90点以上','S') :- _得点 >= 90,!.
以下のルール(_得点,'80点以上','A') :- _得点 >= 80,!.
以下のルール(_得点,'60点以上','B') :- _得点 >= 60,!.
以下のルール(_得点,'それ未満','C') :- _得点 < 60,!.
>>450 % Prolog 少し模索
得点を入力して以下のルールに従った成績を返す(_成績) :-
get_integer(_得点),
得点を入力して以下のルールに従った成績を返す(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が90点以上'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が80点以上'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が60点以上'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が60点未満'(_得点,_成績).
'得点が90点以上'(_得点,'S') :- _得点 >= 90,!.
'得点が80点以上'(_得点,'A') :- _得点 >= 80,_得点<90,!.
'得点が60点以上'(_得点,'B') :- _得点 >= 60,_得点<80,!.
'得点がそれ未満'(_得点,'C') :- _得点 < 60,!.
>>450 % Prolog
得点を入力して以下のルールに従った成績を返す(_成績) :-
get_integer(_得点),
得点を入力して以下のルールに従った成績を返す(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が90点以上の成績はS'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が80点以上の成績はA'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点が60点以上の成績はB'(_得点,_成績).
得点を入力して以下のルールに従った成績を返す(_得点,_成績) :- '得点がそれ未満のはC'(_得点,_成績).
'得点が90点以上の成績はS'(_得点,'S') :- _得点 >= 90,!.
'得点が80点以上の成績はA'(_得点,'A') :- _得点 >= 80,_得点<90,!.
'得点が60点以上の成績はB'(_得点,'B') :- _得点 >= 60,_得点<80,!.
'得点がそれ未満の成績はC'(_得点,'C') :- _得点 < 60,!.
>>456 訂正 成績がひとつ落ちた
'得点がそれ未満のはC' -> '得点がそれ未満の成績はC'
>>449 使用言語:Io
Number even:=method(self % 2 == 0)
Io> 23 even
==> false
Io> 24 even
==> true
>>450 使用言語:J
f=: monad def 'y{''CBAS''#~2-~/\0 60 80 90 101'
f 0
C
f 59
C
f 60
B
f 79
B
f 80
A
f 89
A
f 90
S
f 100
S
>>449 使用言語:J
even=: 0=2&|
even 23
0
even 24
1
>>449 使用言語:Scilab
-->deff('r = even(n)', 'r = modulo(n, 2) == 0')
-->even(23)
ans =
F
-->even(24)
ans =
T
>>449 使用言語:Arc
arc> (even 5)
nil
arc> (even 4)
t
arc> (def even? (n) (is (mod n 2) 0))
#<procedure: even?>
arc> (even? 23)
nil
arc> (even? 24)
t
>>449 使用言語:
(%i26) even(n):=is(mod(n,2)=0);
(%i27) even(23);
(%o27) false
(%i28) even(24);
(%o28) true
(%i29) f(n):=mod(n,2)=0;
(%i30) f(23);
(%o30) 1 = 0
(%i31) f(24);
(%o31) 0 = 0
(%i32) if f(4) then "even" else "odd";
(%o32) even
isがないとtrue,falseの表示にならないようだ。
>>464 書き忘れましたが、使用言語は maxima です。
>>449 使用言語:scheme(Gauche)
gosh> (even? 23)
#f
gosh> (even? 24)
#t
gosh> (define (even n) (= (modulo n 2) 0))
even
gosh> (even 23)
#f
gosh> (even 24)
#t
>>449 使用言語:Common Lisp(xyzzy)
(evenp 23)
nil
(evenp 24)
t
(defun even (n) (= (mod n 2) 0))
even
(even 23)
nil
(even 24)
t
>>449 使用言語:十進BASIC
論理式は制御構文でしか使えないので真偽値を受け渡しすることはできないようだ。
なので、真偽値を返す関数は、真のときの値、偽のときの値を適当にきめてやりとりするしかないみたい。
ここでは、真のとき1を偽のとき0を返すようにした。
FUNCTION even(n)
IF MOD(n,2)=0 THEN
LET even=1
ELSE
LET even=0
END IF
END FUNCTION
PRINT even(23)
PRINT even(24)
END
実行結果
0
1
>>431 % Prolog Prologでリングバッファは表現できるが無意味。究竟Prologのキューはスタック操作。
'New'(X-X).
'Enque'(_要素,X-[_要素|Y],X-Y).
'Deque'(_要素,[_要素|X]-Y,X-Y).
'Empty'(X-Y) :- X == Y.
キュー操作 :- 'New'(Q1),キュー操作機能選択(Q1).
キュー操作.
キュー操作機能選択(Q1) :-
get_line(_機能選択),
キュー操作機能選択(_機能選択,Q1,Q2),
キュー操作機能選択(Q2),!.
キュー操作機能選択(q,_,_) :- !,fail.
キュー操作機能選択(d,Q1,Q2) :- 'Deque'(_要素,Q1,Q2), write_formatted('%t\n',[_要素]),!.
キュー操作機能選択(s,Q1,Q1) :- キュー表示(Q1),!.
キュー操作機能選択(A,Q1,Q2) :- atom_to_term(A,N,_),'Enque'(N,Q1,Q2),!.
キュー表示(X-X) :- !.
キュー表示(X-Y) :- \+(var(X),var(Y),キュー表示(X-[Y]),!.
キュー表示(X-Y) :- \+(var(Y)),
append(U,Y,X),
concat_atom(U,' ',S),
write_formatted('%t\n',[S]),!.
470 :
469:2010/01/28(木) 05:16:26
ついでに言うとこれは説明不能ww ということは、
重リストを使ったキュー操作はあまり推奨できるプログラムではないのかも。
>>462 % Prolog 関数名kaiyoはたぶんミスパンチと思うので
kaijo(0,1) :- !.
kaijo(N,X) :- N1 is N - 1,kaijo(N1,Y),X is N * Y.
>>462 % Prolog
'キーボードから正の整数nを入力し、n!を計算して画面表示する' :-
repeat,
催促付き整数入力('正の整数を入れてください :',N),
N >= 0,
kaijo(N,X),
write_formatted('%tの階乗は%tです。\n',[N,X]),!.
kaijo(0,1) :- !.
kaijo(N,X) :- N1 is N - 1,kaijo(N1,Y),X is N * Y.
>>426 % Prolog もっと複雑な問題らしい。一応基礎部分ということで。
累乗の計算の逆を行うプログラムの基礎部分(A,A ^ 1) :- atomic(A),!.
累乗の計算の逆を行うプログラムの基礎部分((A * A),A ^ 2) :- atomic(A),!.
累乗の計算の逆を行うプログラムの基礎部分((B * A) * A,A ^ N) :-
累乗の計算の逆を行うプログラムの基礎部分((B * A),A ^ N1),
N is N1 + 1,!.
>>426 % Prolog
>>473は利用しないことになってしまった。
累乗の計算の逆を行うプログラム(_乗算項,X) :-
乗算項をならびに変換(_乗算項,L1),
quicksort(L1,L2),
累乗の計算の逆を行うプログラム項構成(L2,X).
乗算項をならびに変換(A,[A]) :- atomic(A),!.
乗算項をならびに変換((B*A),[A|R]) :-
atomic(A),
乗算項をならびに変換(B,R).
累乗の計算の逆を行うプログラム項構成([A],A) :- !.
累乗の計算の逆を行うプログラム項構成([A,A|R1],A ^ N) :-
累乗の計算の逆を行うプログラム項部分構成([A,A|R1],[],A ^ N),!.
累乗の計算の逆を行うプログラム項構成([A,A|R1],A ^ N * Y) :-
累乗の計算の逆を行うプログラム項部分構成([A,A|R1],R,A ^ N),!.
累乗の計算の逆を行うプログラム項構成(R,Y),!.
累乗の計算の逆を行うプログラム項構成([A,B|R1],A * Y) :-
累乗の計算の逆を行うプログラム項構成([B|R1],Y),!.
累乗の計算の逆を行うプログラム項部分構成([A],[],A ^ 1) :- !.
累乗の計算の逆を行うプログラム項部分構成([A,A|R1],R,A ^ N) :-
累乗の計算の逆を行うプログラム項部分構成([A|R1],R,A ^ N1),
N is N1 + 1,!.
累乗の計算の逆を行うプログラム項部分構成([A,B|R],[B|R],A ^ 1) :- !.
>>449 使用言語:tcl
% proc even {n} {expr $n%2==0}
% even 23
0
% even 24
1
>>449 使用言語:Xtal
ix:004>even:fun(n) n%2==0;
ix:005>even(23).p;
false
ix:006>even(24).p;
true
>>449 使用言語:Scala
scala> def even(n:Int):Boolean={n%2==0}
even: (Int)Boolean
scala> even(23)
res3: Boolean = false
scala> even(24)
res4: Boolean = true
>>449 使用言語:Clojure
user=> (even? 23)
false
user=> (even? 24)
true
user=> (defn even [n] (= (mod n 2) 0))
#'user/even
user=> (even 23)
false
user=> (even 24)
true
>>449 使用言語:R
> even <- function(n){n%%2==0}
> even(23)
[1] FALSE
> even(24)
[1] TRUE
>>453 問題がfalseとなっているから仕方ないのかも知れないが、
failにしておいた方が無難。call(fail)で真偽値に戻せるから。falseだと、
K-Prolog Compiler version 6.0.4 (C) KLS Research, Inc.
15: ?- fail.
no
16: ?- false.
existence_error: "procedure" found at "false"
Culprit: "false/0"
17: ?-
のようなことになる。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/307 # [1] Cプログラミング入門:
# [2]
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10460.txt # 次のプログラムを作成し二つのファイルを提出せよ。
# 1:0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に
# 格納せよ.(乱数使用:学籍番号で初期化)学籍番号:200
# 2:次に異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納せよ.
# 3:ソート方法 A を用いて配列 COM,MAN の要素をそれぞれ小さい
# 順に並べよ.
# 4:配列 COM に含まれる配列 MAN の数字の個数 count を求めよ.
# 5:最後に,配列 COM,MAN の全要素,変数 count を
# result.out に書き込め.
# 6:出力形式は自由とするが,main 関数内は 10 行以内にすること.
# ソート方法A
# 1 :作業用の配列として、要素が 100 個の int 型の配列 Work を用意
# する.
# 2 :配列 Work の各要素は、0 に初期化する.
# 3 :ソートしたい配列 x の要素を順番に読んで、Work[ その値 ] を +1
# する.
# 4 :作業3を全ての x の要素について行った後、Work の要素を小さい
# ほうから順番に読んで、Work の値が 0 でなければ、x に書き戻し
# ます。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/309 # [1] C言語プログラミング演習(大学任意科目)
# [2] コマンドラインで指定された各テキストファイルに対して個別に以下の処理を行うCプログラムを作成
# ☆テキストファイルを通読し、各行のインデント深度の最大値を求める(それをNとおく)
# ☆テキストファイルの先頭から再度読み出し、それぞれの行についてインデント深度がnなら
# ば、インデント深度をN-nに変更したものを標準出力する。
# ☆新しいテキストファイルのNが判明した時点で、その改行とファイル名、改行を標準出力する。
# ここでインデント深度とは、行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合
# 深度=nとする。
>>481 % Prolog 例によって配列はリスト(ならび)とします。
'10個の要素を持つ動的な整数配列(ならび)を作り、1から10までの整数を代入し、値を表示し、メモリを解放する' :-
length(L,10),
ならびに値を設定する(L),
write_formatted('%t\n',[L]),
fail.
'10個の要素を持つ動的な整数配列(ならび)を作り、1から10までの整数を代入し、値を表示し、メモリを解放する'.
ならびに値を設定する(L) :-
ならびに値を設定する(1,L).
ならびに値を設定する(10,[10]) :- !.
ならびに値を設定する(N,[N|R]) :- N2 is N + 1,ならびに値を設定する(N2,R).
>>482 % Prolog
名簿を呼びだし、名前で検索しその結果を新しいファイルに保存する(_名簿ファイル,_出力ファイル,_検索する名前) :-
名簿を呼び出し(_名簿ファイル,L),
名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前),!.
名簿を呼び出し(_名簿ファイル,L) :-
get_split_lines(_名簿ファイル,[' ',','],L),!.
名前で検索しその結果を新しいファイルに保存する(_出力ファイル,L,_名前) :-
tell(_出力ファイル),
名前で検索しその結果を新しいファイルに保存する(L,_名前),
told.
名前で検索しその結果を新しいファイルに保存する([],_) :- !.
名前で検索しその結果を新しいファイルに保存する([[_名字,_名前,_住所,_電話番号]|R],_名前) :-
write_formatted('%t,%t,%t,%t\n',[_名字,_名前,_住所,_電話番号]),
名前で検索しその結果を新しいファイルに保存する(R,_名前),!.
名前で検索しその結果を新しいファイルに保存する([_|R],_名前) :-
名前で検索しその結果を新しいファイルに保存する(R,_名前),!.
>>483 % Prolog 1:
'1:0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'(COM) :-
'COMを確保する'(COM),
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'([],COM).
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'(COM,COM) :- !.
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'(L1,COM) :-
'0〜99の数字'(N),
\+(member(N,L1)),
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'([N|L1],COM),!.
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'(L1,COM) :-
'0〜99 の 100 個の数字から異なる 30 個を選び,配列 COM[30] に格納する'(L1,COM),!.
'COMを確保する'(COM) :- length(COM,30).
'0〜99の数字'(N) :- N is random mod 100.
>>483 % Prolog 2:
'2:次に異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納せよ'(MAN) :-
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN) :-
'MANを確保'(MAN,6),
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'([],MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN,MAN) :- !.
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN) :-
get_integer(N),
\+(member(N,L1)),
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'([N|L1],MAN) :- !.
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN).
>>483 訂正
% Prolog 2: 順番にという以上入力と逆順になってはマズイ。
'2:次に異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納せよ'(MAN) :-
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN) :-
'MANを確保'(MAN,6),
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'([],MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(MAN,MAN) :- !.
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN) :-
get_integer(N),
\+(member(N,L1)),
append(L1,[N],L2),
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L2,MAN) :- !.
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN).
'異なる 6 個の数字を入力し,順番に配列 MAN[6] に格納する'(L1,MAN).
>>483 % Prolog 3: ソート方法AはPrologのリスト(ならび)仕様に書き換えました。効率は大変悪い。
'ソート方法 A を用いて配列 COM,MAN の要素をそれぞれ小さい順に並べる'(L1,L2) :-
ソート方法A(L1,L2).
ソート方法A(L1,L2) :-
'作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work),
'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(L1,Work),
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(L1,L2).
'作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work) :-
length(Work,100).
'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([],Work) :- !.
'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([N|R1],Work) :-
list_nth(N,Work,1),
'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(R1,Work),!.
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'([],[]) :- !.
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'([A|R1],[A|R2]) :-
\+(var(A)),
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(R1,R2),!.
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'([V|R1],L2) :-
var(V),
'全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(R1,L2).
>>483 % Prolog 4:
'配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[],[]) :- !.
'配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[N|R1],[[N,Count]|R2]) :-
count(member(N,COM),Count),
'配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,R1,R2).
count([],0) :- !.
count([_|R],Count) :- count(R,Count1),Count is Count1 + 1,!.
count(P,Count) :- findsum(1,P,Count).
>>483 % Prolog 4: どうやら、Countとは含まれる総数のことらしい。それで・・
'4:配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,Count) :-
'配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,L),
findsum(M,member([_,M],L),Count),!.
http://pc12.2ch.net/test/read.cgi/tech/1197620454/580 # 下記のプログラムを関数を用いて実行したいのですが、どのようにすれば良いでしょうか?
# 回答(できたら簡単な解説)の明記をお願いします。
#
# 問題1:入力したプログラムから以下のように出力するプログラムを作成する。
# (実行結果例)
# 文字列を入力: 今日は、晴れです。
#
# 今日は、晴れです。
# 日 す
# は で
# 、 れ
# 晴 晴
# れ 、
# で は
# す 日
# 。すでれ晴、は日今
#
http://pc12.2ch.net/test/read.cgi/tech/1197620454/580 # 問題2:ファイル入力した漢字データ(全角)を読み込み、行数を数えながら逆から表示するプログラム。
# (実行結果例)
# (例として次のような C:\test2.txtを入力する)
# 今日は、晴れです。昨日は、雨で
# した。明日は、曇でしょう。明後
# 日は、快晴でしょうか。 ←の文章を以下のようなプログラムにする。
#
# ファイル名を入力してください:C:\test2.txt
#
# 1:で雨、は日昨。すでれ晴、は日今
# 2:後明。うょしで曇、は日明。した
# 3:。かうょしで晴快、は日
#
http://pc12.2ch.net/test/read.cgi/tech/1197620454/581 # 問題3:ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)
とワード数を数えるプログラム。
# (実行結果例)
# (例として次のような C:\test3.txtを入力する)
# And friends just can't be found
# Like a bridge over troubled water
# I will lay me down ←の文章を以下のようなプログラムにする。
#
# ファイル名を入力してください:C:\test3.txt
# 1:And friends just can't be found
# ⇒31文字、6ワード
# 2:Like a bridge over troubled water
# ⇒33文字、6ワード
# 3:I will lay me down
# ⇒18文字、5ワード
#
http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # 【質問テンプレ】
# ・DBMS名とバージョン: SQLite 3
# ・テーブルデータ:長いため下記に記載
# ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。
# ・説明:長いため下記に記載
#
# ●テーブルデータ
# =======================================================================================================================
# ■entries
# | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID |
# -----------------------------------------------------------------------------------------------------------------------
# ■entries_text
# | title | content | authors | tags |
# -----------------------------------------------------------------------------------------------------------------------
# ■entries_text_content
# | docid | c0title | c1content | c2authors | c3tags |
# -----------------------------------------------------------------------------------------------------------------------
# ■sqlite_sequence
# | name | seq |
# =======================================================================================================================
http://pc11.2ch.net/test/read.cgi/db/1252492296/472 # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。
#
# 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した
# [id]フィールドと同じ値のレコードも削除。
#
# 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と
# 同じレコード番号のレコードを削除。 ※idフィールドがない為
#
# 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。
# 【entries】テーブルの[id]フィールド
# 【entries_text_content】テーブルの[docid]フィールド
#
# 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。
#
# 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を
# 設定したい。
>>483 % Prolog 5:
'配列 COM,MAN の全要素,変数 count をresult.out に書き込め'(COM,MAN,Count) :-
tell('result.out'),
write_formatted('%q.\n',['COM'=COM]),
write_formatted('%q.\n',['MAN'=MAN]),
write_formatted('%q.\n',['Count'=Count]),
told.
>>502 ゲームはロジックの間に挿入される副作用に値打ちがあるのだから、
述語構成は
r(Z) :- 停止条件(Z),!.
r(X).
r(X) :- filter(X,Y),r(Y).
のステッパ型パターンが望ましいのかな。実際には、
u(X) :- r(X),_副作用,fail.
といった副作用述語が並ぶことになる。
>>495 % Prolog
問題1 :-
文字ならびの取得(Chars),
取得したならびの反転(Chars,Chars2),
第一文字と最終文字を除外(Chars,L2),
第一文字と最終文字を除外したならびの反転(L2,L3),
第一行目の印字(Chars),
第二行目以降の印字(L2,L3),
最終行の印字(Chars2),!.
文字ならびの取得(Chars) :- get_chars(Chars).
取得したならびの反転(Chars,Chars2) :- reverse(Chars,Chars2),!.
第一文字と最終文字を除外(Chars,L2) :- append([_],L2,[_],Chars),!.
第一文字と最終文字を除外したならびの反転(L2,L3) :- reverse(L2,L3),!.
第一行目の表示(L) :- ならびの文字表示(L),nl,!.
第二行目以降の表示(L2,L3) :- 転置([L1,L3],L4),ならびの行表示(L4),!.
最終行の印字(L3) :- ならびの文字表示(L),nl,!.
ならびの行表示([]) :- write('\n'),!.
ならびの行表示([A|R]) :- write_formatted('%t\n',[A]),ならびの行表示(R).
>>504 (
>>495) 書き直し
% Prolog インデントしてないところがあって読みにくいから書き直し。
問題1 :-
文字ならびの取得(Chars),
取得したならびの反転(Chars,Chars2),
第一文字と最終文字を除外(Chars,L2),
第一文字と最終文字を除外したならびの反転(L2,L3),
第一行目の印字(Chars),
第二行目以降の印字(L2,L3),
最終行の印字(Chars2),!.
文字ならびの取得(Chars) :- get_chars(Chars).
取得したならびの反転(Chars,Chars2) :- reverse(Chars,Chars2),!.
第一文字と最終文字を除外(Chars,L2) :- append([_],L2,[_],Chars),!.
第一文字と最終文字を除外したならびの反転(L2,L3) :- reverse(L2,L3),!.
第一行目の表示(L) :- ならびの文字表示(L),nl,!.
第二行目以降の表示(L2,L3) :- 転置([L1,L3],L4),ならびの行表示(L4),!.
最終行の印字(L3) :- ならびの文字表示(L),nl,!.
ならびの行表示([]) :- write('\n'),!.
ならびの行表示([A|R]) :- write_formatted('%t\n',[A]),ならびの行表示(R).
>>505 (
>>495) もう一度すみません。
% Prolog
問題1 :-
文字ならびの取得(Chars),
取得したならびの反転(Chars,Chars2),
第一文字と最終文字を除外(Chars,L2),
第一文字と最終文字を除外したならびの反転(L2,L3),
第一行目の表示(Chars),
第二行目以降の表示(L2,L3),
最終行の表示(Chars2),!.
文字ならびの取得(Chars) :- get_chars(Chars).
取得したならびの反転(Chars,Chars2) :- reverse(Chars,Chars2),!.
第一文字と最終文字を除外(Chars,L2) :- append([_],L2,[_],Chars),!.
第一文字と最終文字を除外したならびの反転(L2,L3) :- reverse(L2,L3),!.
第一行目の表示(L) :- ならびの文字表示(L),nl,!.
第二行目以降の表示(L2,L3) :- 転置([L1,L3],L4),ならびの行表示(L4),!.
最終行の表示(L3) :- ならびの文字表示(L),nl,!.
ならびの行表示([]) :- write('\n'),!.
ならびの行表示([A|R]) :- write_formatted('%t\n',[A]),ならびの行表示(R).
>>496 % Prolog
ファイル入力した漢字データ(全角)を読み込み、行数を数えながら逆から表示する(_ファイル名) :-
ファイル入力した漢字データ(全角)を読み込み(_ファイル名,Lines),
行数を数えながら逆から表示する(Lines),!.
ファイル入力した漢字データ(全角)を読み込み(_ファイル名,Lines) :-
get_lines(_ファイル名,Lines).
行数を数えながら逆から表示する(Lines) :-
行数を数えながら逆から表示する(1,Lines).
行数を数えながら逆から表示する(_,[]) :- !.
行数を数えながら逆から表示する(N,[_行|R]) :-
文字列の反転(_行,_反転した行),
write_formatted('%t:%t\n',[N,_反転した行]),
N2 is N + 1,
行数を数えながら逆から表示する(N2,R).
文字列の反転(_文字列,_反転した文字列) :-
atom_chars(_文字列,_文字ならび),
reverse(_文字ならび,_反転した文字ならび),
atom_chars(_反転した文字列,_反転した文字ならび).
>>497 % Prolog
'ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数える'(_ファイル名) :-
'ファイルのデータ(英文)を読み込み'(_ファイル名,Lines),
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(Lines).
'ファイルのデータ(英文)を読み込み'(_ファイル名,Lines) :- get_lines(_ファイル名,lines).
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(Lines) :-
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(1,Lines).
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(_,[]) :- !.
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(N,[Line|R]) :-
文字数を数える(Line,_文字数),
ワード数を数える(Line,_ワード数),
write_formatted('=>%t:%t文字、%tワード\n',[N,_文字数,_ワード数]),
N2 is N + 1,
'一行毎の文字数(スペースも含む)とワード数を数えて表示する'(N2,R).
文字数を数える(Line,_文字数) :- sub_atom(Line,0,_文字数,0,Line),!.
ワード数を数える(Line,_ワード数) :-
split(Line,[' ','.'],語彙ならび),
length(語彙ならび,_ワード数),!.
>>498 % Prolog
'1月1日が金曜日の平年(たとえば2010年)について、月日の入力データから、曜日を求める' :-
催促付き整数入力('月を入力してください:',_月),
催促付き整数入力('日を入力してください:',_日),
曜日を求める(_月,_日,_曜日),
write_formatted('%t月%t日は%t日です\n',[_月,_日,_曜日]),!.
曜日を求める(_月,_日,_曜日) :- 曜日を求める(1,1,_月,_日,金曜,_曜日).
曜日を求める(_月,_日,_月,_日,_曜日,_曜日) :- !.
曜日を求める(_月1,_日1,_月,_日,_曜日1,_曜日) :-
翌日(_月1,_日1,_翌日の月,_翌日の日),
曜日連鎖(_曜日1,_曜日2),
曜日を求める(_翌日の月,_翌日の日,_月,_日,_曜日2,_曜日).
翌日(2,28,3,1) :- !.
翌日(_月,30,_翌日の月,1) :- member(_月,[4,6,9,11]),_翌日の月 is _月 + 1,!.
翌日(_月,31,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]),_翌月の月 is _月 + 1,!.
翌日(_月,_日,_月,_翌日の日) :- _翌日の日 is _日 + 1.
曜日連鎖(月曜,火曜).
曜日連鎖(火曜,水曜).
曜日連鎖(水曜,木曜).
曜日連鎖(木曜,金曜).
曜日連鎖(金曜,土曜).
曜日連鎖(土曜,日曜).
曜日連鎖(日曜,月曜).
http://code.nanigac.com/forum/view/453 # Prologでリスト操作をする関数をいくつか書いているんですが、
# どうもうまく動いてくれません。
# うまく動いてくれないのがいくつかあるのですが、全部あげたら
# 切りがないですし、図々しすぎるので、とりあえず
# test1関数とtest2関数の2つ(2つでも図々しいきがするけれど)の相談に乗ってください。
#
# test1関数
# 2つのリストを受け取って2つを(交互に)合わせたリストを作る
# 例1、test([a,b,c],[1,2,3],X). --> X = [a,1,b,2,c,3]
# 例2、test([a,b,c],X,[a,1,b,2,c,3]). --> X = [1,2,3]
# 例3、test([a,b,c],[1,2,3],[a,1,b,2,c,3]). --> true
# 例4、test([a,b,c],[1,2,3],[a,b,c,1,2,3]). --> false
>>510 % Prolog
test1([],[],[]).
test1([A|R1],[B|R2],[A,B|R3]) :- test1(R1,R2,R3).
http://ime.nu/code.nanigac.com/forum/view/453 # test2関数
# 2つのリストを受け取り、まず一つ目のリストからダブリを取り除く。
# そして、それが二つ目のリストと(順番も含めて)同じかチェックする。
# 例1、test2([a,b,c,c,b,a],[a,b,c]). --> true
# 例2、test2([a,b,c,b,c,],[c,b,a]). --> false (順番が違うので)
# 例3、test2([a,a,b,b,c,c],X). --> X = [a,b,c]
>>512 % Prolog
test2([],[]).
test2([A|R1],[A|R2]) :-
ならびの削除(A,R1,R3),
test2(R3,R2).
ならびから削除(_,[],[]).
ならびから削除(A,[A|R1],R2) :- ならびから削除(A,R1,R2).
ならびから削除(A,[B|R1],[B|R2]) :- \+(A=B),ならびから削除(A,R1,R2).
http://pc11.2ch.net/test/read.cgi/db/1252492296/474 # SQL Server Compact 3.5 で、a_tbl と b_tbl のコードが一致した場合に
# a_tbl に、b_tblの名前をセットするみたいなことしたいのですが無理ですか?
#
# UPDATE a_tbl
# SET name = b_tbl.name
# FROM b_tbl
# WHERE a_tbl.no = b_tbl.no
#
# 実行すると、「FROM 句はこのクエリの種類では使用できません」ってエラーになります。
# SQL Server 2008 だと問題ないのですが・・・
>>519 % Prolog
'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする' :-
a_tbl(_no,_name1),
b_tbl(_no,_name2),
update_a_tbl(_no,_name2),
fail.
'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする'.
update_a_tbl(_no,_name2) :-
retract(a_tbl(_no,_)),
assertz(a_tbl(_no,_name2)),
fail.
update_a_tbl(_,_).
>>515 % Prolog
'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って、その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ' :-
'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って(_正の整数),
その数が3の倍数かまたは各桁の数字のいづれかに3が入っている(_正の整数,_診断),
write_formatted('%t\n',[_診断]),!.
'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って(_正の整数):-
repeat,
get_integer(_正の整数),
integer(_正の整数),
_正の整数 >= 0,!.
その数が3の倍数かまたは各桁の数字のいづれかに3が入っている(_数,'YES') :-
0 is _数 mod 3,!.
その数が3の倍数かまたは各桁の数字のいづれかに3が入っている(_数,'YES') :-
各桁の数字のいづれか(_数,L),
member(3,L),!.
その数が3の倍数かまたは各桁の数字のいづれかに3が入っている(_,'NO').
各桁の数字のいづれか(N,[N]) :- N < 10,!.
各桁の数字のいづれか(N,[M|R]) :-
M is N mod 10,
M2 is N // 10,
各桁の数字のいづれか(M2,R).
>>521 (
>>515) 一部表示し直し
% Prolog
'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って、その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ' :-
'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って(_正の整数),
その数が3の倍数かまたは各桁の数字のいづれかに3が入っている(_正の整数,_診断),
write_formatted('%t\n',[_診断]),!.
>>484 % Prolog (その一)
インデント深度とは(_行,_インデント深度) :-
'行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合深度=nとする'(_行,_n),
_n = _インデント深度,!.
'行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合深度=nとする'(_行,_n) :-
sub_atom(_行,_n,1,_,C),
\+(C=' '),
\+(C='\t'),!.
>>523 (
>>484)
% Prolog (その一) 「インデント深度とは」の「とは」は説明的ではあるが実用上好ましいとはいえない。
% 備考的な部分の定義ではしばしば迷うところ。普通は以下だが、
インデント深度(_行,_インデント深度) :-
'行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合深度=nとする'(_行,_n),
_n = _インデント深度,!.
% 辞書引きの際は実務的な定義を参照する感じの定義。
インデント深度とは(_行,_インデント深度) :- インデント深度(_行,_インデント深度).
% ひっくり返して、実用時に辞書を引く感じ。
インデント深度(_行,_インデント深度) :- インデント深度とは(_行,_インデント深度).
>>523 (
>>484)
% Prolog 出題が不完全でtab処理ができていない。普通は、
tab(空白,6).
'行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合深度=nとする'(_行,_n) :-
atom_chars(_行,Chars),
行頭からタブ、空白以外の文字が現れるまでの文字数(0,Chars,_n).
行頭からタブ、空白以外の文字が現れるまでの文字数(_n,[],_n) :- !.
行頭からタブ、空白以外の文字が現れるまでの文字数(_n,[A|_],_n) :- \+(A='\t'),\+(A=' '),!.
行頭からタブ、空白以外の文字が現れるまでの文字数(N,['\t'|R],_n) :-
tab(空白,M),
N2 is N + M,
行頭からタブ、空白以外の文字が現れるまでの文字数(N2,R,_n),!.
行頭からタブ、空白以外の文字が現れるまでの文字数(N,[' '|R],_n) :-
N2 is N + 1,
行頭からタブ、空白以外の文字が現れるまでの文字数(N2,R,_n),!.
>>525 (
>>484) 書き直し。すみません。
% Prolog 出題が不完全でtab処理ができていない。普通は、
tab(空白,6).
'行頭からタブ、空白以外の文字が現れるまでがn回(n>=0)現れた場合深度=nとする'(_行,_n) :-
atom_chars(_行,Chars),
行頭からタブ、空白以外の文字が現れるまでの文字数(0,Chars,_n).
行頭からタブ、空白以外の文字が現れるまでの文字数(_n,[],_n) :- !.
行頭からタブ、空白以外の文字が現れるまでの文字数(_n,[A|_],_n) :- \+(A='\t'),\+(A=' '),!.
行頭からタブ、空白以外の文字が現れるまでの文字数(N,['\t'|R],_n) :-
tab(空白,M),
N2 is N + M,
行頭からタブ、空白以外の文字が現れるまでの文字数(N2,R,_n),!.
行頭からタブ、空白以外の文字が現れるまでの文字数(N,[' '|R],_n) :-
N2 is N + 1,
行頭からタブ、空白以外の文字が現れるまでの文字数(N2,R,_n),!.
>>514 % Prolog
'キーボードから(標準入力から)スペースで区切られた3つの実数 a b c を 受け取って(最後は改行)、二次方程式 ax2+bx+c=0 の解を画面に(標準出力に)出力せよ。二次方程式の解は複素数の範囲で考えること。' :-
'キーボードから(標準入力から)スペースで区切られた3つの実数 a b c を 受け取り(A,B,C),
二次方程式の解(A,B,C,X).
'キーボードから(標準入力から)スペースで区切られた3つの実数 a b c を 受け取り(A,B,C) :-
get_line(Line),
split(Line,[' '],L),
findall(V,(member(A,L),atom_to_term(A,V,_)),[A,B,C]),!.
二次方程式の解(A,B,C,X) :-
_判別式 is B ^ 2 - 4 * A * C,
判別式により解を求める(_判別式,A,B,C,X).
判別式により解を求める(_判別式,A,B,C,X) :-
( _判別式 > 0; _判別式 > 0.0),!,
( X is ((-1) * B + sqrt(_判別式)) / ( 2 * A);
X is ((-1) * B + sqrt(_判別式)) / ( 2 * A)).
判別式により解を求める(_判別式,A,B,C,X) :-
(_判別式 = 0;_判別式 = 0.0),!,
X is ((-1) * B) / ( 2 * A).
判別式により解を求める(_判別式,A,B,C,X) :-
( _判別式 < 0; _判別式 < 0.0),!,
U is (-1) / (2 * A),
V is sqrt((-1) * _判別式)),
( X = (U + iV); X = (U - iV)).
529 :
デフォルトの名無しさん:2010/01/30(土) 13:33:48
Microsoft社 Visual Studio C++のソフトウェアを用いて
チャットアプリケーションを作れと言われたのですが、
当方C言語系がとても苦手で困っています;;
システムの仕様は
・1対1の環境でのみ動作。
・サーバ側はポート番号を指定して、クライアントからの接続を待つ。
・クライアント側はサーバのIPアドレスとポート番号を指定して、サーバに接続する。
・この時の通信はTCPで行う。
・クライアントが通信をやめたい場合は"endc"
・サーバ側がやめたい場合は"ends"と入力。
・WinSockを使用してWindowsのコンソールプログラムとして基本的な簡易なチャット
以上の条件でプログラミングしていただけると幸いです。
よろしくお願いします m__)m
>>532 全然違うというのは日本語として変かな。
javaの宿題とルールが違っている上に、馬名である特徴も今のところほとんどありません。
今後、血統や競争成績の検索やコメントを付与する機能を付け加えたいと思います。
>>530 % Prolog (その一)
空白を含む文字列の空白を取り除いて解析する(_文字列,_項) :-
文字列から空白を取り除く(_文字列,_空白を取り除かれた文字列),
文字列を解析して項を生成する(_空白を取り除いた文字列,_項).
文字列から空白を取り除く(_文字列,_空白を取り除かれた文字列) :-
atom_chars(_文字列,Chars),
ならびから空白要素を取り除く(Chars,_空白を取り除かれたならび),
atom_chars(_空白を取り除かれた文字列,_空白を取り除かれたならび).
ならびから空白要素を取り除く([],[]) :- !.
ならびから空白要素を取り除く([' '|R1],R2) :-
ならびから空白要素を取り除く(R1,R2),!.
ならびから空白要素を取り除く([A|R1],[A|R2]) :-
ならびから空白要素を取り除く(R1,R2),!.
文字列を解析して項を生成する(_文字列,_項) :- atom_to_term(_文字列,_項,_).
http://pc12.2ch.net/test/read.cgi/tech/1252382593/516 # 2つの同じ要素数のリスト (Num a) => [a] を、
# 片方を1要素分横にずらして和を取りたいです。
# たとえば [1, 2, 3] と [7, 8, 9] であれば
# [1, 2, 3, 0] と [0, 7, 8, 9] の和です。
#
# 今は定義を素直に実装して次のようにやってます。
# shearAdd :: (Num a) => [a] -> [a] -> [a]
# shearAdd as bs = zipWith (+) (as ++ [0]) (0 : bs)
#
# もっと洗練された方法はあるでしょうか。
# たとえば (++) 演算子は左辺のリストの要素数が大きいと不利なので、
# これを改善できるとか。
>>539 使用言語:J
f=:dyad def '(x,0)+0,y'
1 2 3 f 7 8 9
1 9 11 9
>>481 使用言語:J
>:i.10
1 2 3 4 5 6 7 8 9 10
>>483 問1
使用言語:J
]COM=: 30?100
95 18 11 58 67 85 60 21 30 10 81 27 47 0 35 75 24 69 23 26 29 98 54 92 40 34 45 52 33 79
http://pc12.2ch.net/test/read.cgi/tech/1263824755/362 # ../test/read.cgi/tech/1263824755/361
# ≪問題と条件≫
# 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、
# ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。
# (実行)
# >free1.exe test.txt test2.txt
#
# でしょ?
>>545 >>483 使用言語:J
複数の問題だと勘違いしていたのでやり直しました。
read=: 1!:1
write=: 1!:2
f=: monad define
COM=. 30?100
MAN=. y
Work=. 100#0
COM=. I.1(COM)}Work
MAN=. I.1(MAN)}Work
count=. +/MAN e. COM
data=. ,((":COM),(":MAN),:":count),.LF
data write<'result.out'
)
f 5 10 77 85 99 43
read<'result.out'
4 9 12 14 16 20 21 22 23 26 30 31 34 36 37 40 60 61 62 63 65 67 70 77 82 84 92 93 98 99
5 10 43 77 85 99
2
>>539 % Prolog
ならびをずらして加算(L1,L2,L) :-
append(L1,[0],L3),
append([0],L2,L4),
行列の転置([L3,L4],L5),
findsum(U,member(U,L5),L).
>>539 使用言語:R
> f <- function(a,b) c(a,0)+c(0,b)
> f(c(1,2,3),c(7,8,9))
[1] 1 9 11 9
>>539 使用言語:maxima
(%i3) f(a,b):=endcons(0,a)+cons(0,b);
(%o3) f(a, b) := endcons(0, a) + cons(0, b)
(%i4) f([1,2,3],[7,8,9]);
(%o4) [1, 9, 11, 9]
>>539 使用言語:Scilab
-->deff('r=f(a,b)','r=[a,0]+[0,b]')
-->f(1:3,7:9)
ans =
1. 9. 11. 9.
>>547 % Prolog
program :-
user_parameters([FileIn,FileOut]),
open(FileIn,read,Input,[type(binary)]),
open(FileOut,write,Output),
get_byte(Input,C),
free1(0,Input,Output,C),
close(Output),
close(Input).
free1(_,_,_,-1) :- !.
free1(16,Input,Output,C) :-
write(Output,'\n'),
free1(0,Input,Output,C),!.
free1(M,Input,Output,C) :-
free1(M,Input,Output,C) :-
N進数(16,C,A),
write(Output,A),
get_byte(Input,C2),
M2 is M + 1,
free1(M2,Input,Output,C2).
% N進数/3の定義は
http://nojiriko.asia/prolog/j68_493.html 参照
>>537 % Prolog (その一)
% consult/1,reconsult/1,assertz/1,retract/1,clause/2,listing/1 を最終的に使用します。
% 実務ではもっとずっと丁寧にチェックしながら進みます。ここでは簡単に
住所の登録 :-
名字は(_名字),
名前は(_名前),
郵便番号は(_郵便番号),
住所は(_住所),
電話番号は(_電話番号),
メールアドレスは(_メールアドレス),
住所の登録((_名字,_名前,_郵便番号,_住所,_電話番号,_メールアドレス),!.
住所の登録(_名字,_名前,_郵便番号,_住所,_電話番号,_メールアドレス) :-
\+(住所録(_名字,_名前,_郵便番号_1,_住所_1,_電話番号_1,_メールアドレス_1)),
assertz(住所録(_名字,_名前,_郵便番号,_住所,_電話番号,_メールアドレス)),
write('登録を完了しました\n'),!.
住所の登録(_名字,_名前,_郵便番号,_住所,_電話番号,_メールアドレス) :-
住所録(_名字,_名前,_郵便番号_1,_住所_1,_電話番号_1,_メールアドレス_1),
この氏名は既に登録がありますが(_名字,_名前,_郵便番号_1,_住所_1,_電話番号_1,_メールアドレス_1,_郵便番号,_住所,_電話番号,_メールアドレス),!.
この氏名は既に登録がありますが(_名字,_名前,_郵便番号_1,_住所_1,_電話番号_1,_メールアドレス_1,_郵便番号,_住所,_電話番号,_メールアドレス) :-
write_formatted('%t %tという氏名は以下の通り既に登録がありますが\n%t %t %t%t %t %t',[_名字,_名前,_名字,_名前,_郵便番号_1,_住所_1,_電話番号_1,_メールアドレス_1]),
write('別人と考えて登録してよいでしょうか Y or N でお答えください : '),
get_line(Line),
この氏名は既に登録がありますが(Line,_名字,_名前,_郵便番号,_住所,_電話番号,_メールアドレス).
http://pc12.2ch.net/test/read.cgi/tech/1263824755/409 # [1] C言語演習
# [2]
# int x[10]={-1,2,-3,4,-5,6,-7,8,-9,10}
# int y[10]={-5,-4,-3,-2,-1,1,2,3,4,5}
# が与えられている。
# 値x[0]*y[0]+2*x[1]*y[1]+3*x[2]*y[2]+4*x[3]*y[3]+5*x[4]*y[4]+6*x[5]*y[5]
# が最大/最小になるようにx,yの各要素を並べ替えたものを出力するプログラム
>>557 の訂正として出されましたが、それぞれ独立の問題としましょう。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/409 # [1] C言語演習
# [2]
# int x[10]={-1,2,-3,4,-5,6,-7,8,-9,10}
# int y[10]={-5,-4,-3,-2,-1,1,2,3,4,5}
# が与えられている。
# 値x[0]*y[0]-2*x[1]*y[1]+3*x[2]*y[2]-4*x[3]*y[3]+5*x[4]*y[4]-6*x[5]*y[5]+7*x[6]*y[6]-8*x[7}*y[7]+9*x[8]}*y[8]-10*x[9]*x[9]
# が最大/最小になるようにx,yの各要素を並べ替えたものを出力するプログラム
>>559 問題のつづきです。
#
# SQL操作 SELECTでリストアップされる項目リスト
# をコンソール出力させる。
#
# SELECT X.TANNINN,X.NAME,X.SUUGAKU,X.KOKUGO
# FROM SEISEKIHYOU AS X
# WHERE
# SUUGAKU>=KOKUGO
# AND
# SUUGAKU>=RIKA
# AND
# SUUGAKU>=SYAKAI
# AND
# SUUGAKU>=EIGO
# AND
# (KOKUGO+SUUGAKU+RIKA+SYAKAI+EIGO)/5.0
# >=(SELECT (AVG(KOKUGO)+AVG(SUUGAKU)+AVG(RIKA)
# +AVG(SYAKAI)+AVG(EIGO))/5.0 FROM SEISEKIHYOU
# GROUP BY TANNINN) HAVING COUNT(*)>=
# (SELECT COUNT(*) FROM SEISEKHYOU GROUP BY
# TANNINN HAVING TANNINN=X.TANNNIN)
#
# ORDER BY X.TANNIN,X.NAME,X.SUUGAKU;
>>538 % Prolog (その一)
program :-
user_parameters([_ファイル名]),
'EOFがコントロールZであるファイルの読み込み'(Lines),
tell(_ファイル名),
write_formatted('%10s %4s\n',[名前,年齢]),
'名前・年齢の行表示'(Lines),
told.
'EOFがコントロールZであるファイルの読み込み'(Lines) :-
get_code(Code),
'EOFがコントロールZであるファイルの読み込み'(Code,Lines),!.
'EOFがコントロールZであるファイルの読み込み'(-1,[]) :- !.
'EOFがコントロールZであるファイルの読み込み'(Code,[[_名前,_年齢]|R]) :-
'EOFがコントロールZであるファイルの行読み込み'(Code,RCode,Codes),
atom_codes(Line,Codes),
split(Line,[' ',','],[_名前,_年齢]),
'EOFがコントロールZであるファイルの読み込み'(RCode,R).
'EOFがコントロールZであるファイルの行読み込み'(-1,-1,[]) :- !.
'EOFがコントロールZであるファイルの行読み込み'(26,-1,[]) :- !.
'EOFがコントロールZであるファイルの行読み込み'(10,Code2,[]) :-
ひとつ先読みが同時に終了ステータスにもなる(Code2),!.
'EOFがコントロールZであるファイルの行読み込み'(Code1,RCode,[Code1|R]) :-
get_code(Code2),
'EOFがコントロールZであるファイルの行読み込み'(Code2,RCode,R).
>>538 % Prolog (その二)
ひとつ先読みが同時に終了ステータスにもなる(Code2) :- get_code(Code2),!.
名前・年齢の行表示([]) :- !.
名前・年齢の行表示([[_名前,_年齢]|R]) :-
write_formatted('%12s%t\n',[_名前,_年齢]),
名前・年齢の行表示(R).
> EOFがコントロールZであるファイルの読み込み
w
http://pc12.2ch.net/test/read.cgi/tech/1262163854/556 # こんばんは.失礼します.
# 現在,次のような課題に取り組んでいます.
# もしよろしければこの難問をハックしていただけないでしょうか.
# (できればCで・・・)
#
# N個の要素があり,その,すべての組み合わせ(2^N組)に対して,
# それぞれに値が決まっているものとします.
# そして,ある組み合わせの値は,その組み合わせの中の部分集合の
# どんな和よりも大きいです.
#
# また0個の集合では値は0とします.
#
# こうした場合に,全ての組み合わせの値を以上のルールに則ったまま
# 乱数を用いて決定したいと考えています.
#
# 具体的には
# 要素が一つの組み合わせは乱数.たとえばAのみの集合の場合 v(A)=random
# 要素が2つでは,v(A,B)=v(A)+v(B) + random
# 3つでは,v(A,B,C) = max(v(A,B)+v(C), v(B,C)+v(A), v(C,A)+v(B)) + random
# となります.
#
# この方式で,全ての組み合わせに値を当てはめることを考えているのですが
# コードに落とし込むことが出来ません.
>>566 つづき
# 今のところ,各組み合わせを以下のような二進数で表そうと考えています.(N=3の場
合)
# 各行の一列目が1はAがその組み合わせにいることを意味し,
# 二列目はB,三列目はCを表しています.
#
# ABC V
# 000 0
# 001 rc
# 010 rb
# 011 ?
# 100 ra
# 101 ?
# 110 ?
# 111 ?
#
>>495 使用言語:J
f=: monad define
l=.(#y)-2
t=.(l,l)$ ucp' '
g=.}.}:y
y,(|:g),t,|.g),|.y
)
f ucp'今日は、晴れです。'
今日は、晴れです。
日 す
は で
、 れ
晴 晴
れ 、
で は
す 日
。すでれ晴、は日今
>>559 % Prolog
'SQL操作に対応する述語定義'(X) :-
findall([TANNINN,NAME,SUGAKU,KOKUGO],
(
findall(TANNINN,'SEISEKIHYOU'(TANNINN,_,_,_,_,_,_),L1),sort(L1,L2),
'SEISEKIHYOU'(TANNINN,NAME,KOKUGO,SUUGAKU,RIKA,SYAKAI,EIGO),
SUUGAKU>=KOKUGO,SUUGAKU >= RIKA,SUUGAKU>=SYAKAI,SUUGAKU>=EIGO,
U1 is (KOKUGO+SUUGAKU+RIKA+SYAKAI+EIGO)/5.0,
findall(AVGs,(member(TANNINN2,L2),findavg([KOKUGO2,SUUGAKU2,RIKA2,SYAKAI2,EIGO2],'SEISEKIHYOU'(TANNINN2,NAME2,KOKUGO2,SUUGAKU2,RIKA2,SYAKAI2,EIGO2),AVGs)),L3),
sum(L3,SUM1),
U2 is SUM1 / 5.0,
U1 >= U2,
findavg(KOKUGO3,('SEISEKIHYOU'(TANNINN,_,KOKUGO3,_,_,_,_),KOKUGOAVG),
KOKUGO > AVGKOKUGO)
),L4),
sort(L4,L5),
member(X,L5).
>>496 使用言語:J
f=: monad define
t=.<;._2 y
for_i. i.#t do.
smoutput (":>:i),':',":|.;i{t
end.
)
read=: 1!:1
f ucp read <'test2.txt'
1:で雨、は日昨。すでれ晴、は日今
2:後明。うょしで曇、は日明。たし
3:。かうょしで晴快、は日
>>556 何をいっているのかわからないので元スレを覗いてきます。
>>542 % Prolog 例えばこんな具合に書き進める。これからが大変。
販売員の正しい行動(_お客様,_お客様の要求,_販売員の正しい行動) :-
お客様の要求の要約(_お客様,_お客様の要求,_お客様の要求の要約),
お客様の要求の要約から販売員の正しい行動を考える(_お客様の要求の要約,_販売員の正しい行動).
お客様の要求の要約(_お客様,_お客様の要求,_お客様の要求の要約) :-
お客様がどんな方か明確にする(_お客様,_お客様の情報),
お客様が関心をお持ちの分野を明確にする(_お客様,_お客様の情報,_お客様が関心をお持ちの分野),
お客様の情報を解析して要求を要約する(_お客様,_お客様の要求,_お客様の情報,_お客様が関心をお持ちの分野,_お客様の要求の要約).
お客様がどんな方か明確にする(_お客様,_お客様の情報) :- 顧客情報(_お客様,_お客様の情報).
お客様が関心をお持ちの分野を明確にする(_お客様,_お客様の情報,_お客様が関心をお持ちの分野) :-
購買情報(_お客様,_過去の購買情報ならび,_過去のクレームならび),
関心のある分野診断(_お客様,_過去の購買情報ならび,_過去のクレームならび,_お客様が関心をお持ちの分野).
お客様の情報を解析して要求を要約する(_お客様,_お客様の要求,_お客様の情報,_お客様が関心をお持ちの分野,_お客様の要求の要約) :-
句構造解析(_お客様の要求,_解析された句構造),
句構造からキーワードを拾い出して意味を推定する(_解析された句構造,_キーワードならび,_お客様の要求の要約).
>>497 使用言語:J
f=: monad define
t=:<;._2 y
for_i. i.#t do.
s=.;i{t
w=.":#cutopen s
smoutput (":>:i),':',":s
smoutput '=>',(":#s),'文字、',w,'ワード'
end.
)
read=: 1!:1
f read<'test3.txt'
1:And friends just can't be found
=>31文字、6ワード
2:Like a bridge over troubled water
=>33文字、6ワード
3:I will lay me down
=>18文字、5ワード
>>498 使用言語:J
f=: monad define
'M D'=.y
t=.0 0 31 59 90 120 151 181 212 243 273 304 334
w=.ucp'木金土日月火水'
a=.(7|(M{t)+D){w
smoutput (":M),(ucp'月'),(":D),(ucp'日は、'),a,ucp'曜日です。'
)
f 9 15
9月15日は、水曜日です。
>>510 使用言語:J
f=: dyad def ';,|:(;/x),:;/y'
'asdfgh' f '123'
a1s2d3fgh
>>512 使用言語:J
test2=: dyad def 'y-:~.x'
'abccba' test2 'abc'
1
'abcbc' test2 'cba'
0
>>579 % Prolog (その一)
金種計算(0,_,[]) :- !.
金種計算(_おつり残高,[],[]) :- _おつり残高 > 0,write('レジ不足です\n'),!,fail.
金種計算(_おつり残高,[_金種|R1],[(_金種,B)|R2]) :-
_おつり残高 >= _金種,
金種が足りる(_おつり残高,_金種,N,B),
_残り金額 is _おつり残高 mod _金種,
金種計算(_残り金額,R1,R2).
金種計算(_おつり残高,[_金種|R1],[(_金種,N)|R2]) :-
_おつり残高 >= _金種,
金種が足りない(_おつり残高,_金種,N,B),
_残り金額 is _おつり残高 - _金種 * N,
金種計算(_残り金額,R1,R2).
金種計算(_おつり残高,[_金種|R1],R2) :-
_おつり残高 >= _金種,
\+(レジの中(_金種,N)),
金種計算(_おつり残高,R1,R2).
金種計算(_おつり残高,[_金種|R1],R2) :-
_おつり残高 < _金種,
金種計算(_おつり残高,R1,R2).
金種が足りる(_おつり残高,_金種,N,B) :-
レジの中(_金種,N),
B is _おつり残高 // _金種,
N >= B,!.
金種が足りない(_おつり残高,_金種,N,B) :-
レジの中(_金種,N),
B is _おつり残高 // _金種,
N < B,!.
>>579 (その二)
% Prolog こちらがトップレベル
>>580 はレジの中身を更新するのを忘れている
おつりの計算(_お買い上げ金額,_うけとったお金,_金種) :-
_受け取ったお金 > _お買い上げ金額,
_おつり is _うけとったお金 - _お買い上げ金額,
金種計算(_おつり,[10000,5000,2000,1000,500,100,50,10,5,1],_金種).
>>580 >>581 一般に、給料計算の一部に金種計算が現れる場合は、銀行がその金種を
用意するものと考えられるから、レジの中身についての考慮は必要ないが、
おつりの場合はレジの内容が計算を主導する。
>>225 % Prolog (その一)
'0から10の中からランダムに整数の2組を決める。それを平面上の座標と、座標を10個つくる。'(_10個の座標点ならび) :-
'座標を10個つくる。'(1,_10個の座標点ならび).
座標を10個つくる。'(N,[]) :- N > 10,!.
座標を10個つくる。'(N,[[X,Y]|R]) :-
'0から10の中からランダムに整数の2組を決める。'(X,Y),
N2 is N + 1,
座標を10個つくる。'(N2,R).
'0から10の中からランダムに整数の2組を決める。'(X,Y) :- X is random mod 9,Yis random mod 9.
ユーザに座標を入力させ、その点から最も遠い点と近い点を求める。(_10個の座標点ならび,X,Y,_最も遠い点,_最も近い点) :-
ユーザに座標を入力させ、(X,Y),
その点から最も遠い点と近い点を求める(_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標),
ユーザ座標と10個の座標点の表示(_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標).
ユーザに座標を入力させ、(X,Y) :-
催促付き整数入力('X座標を入力してください :',X),
催促付き整数入力('Y座標を入力してください :',Y),!.
その点から最も遠い点と近い点を求める。(_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標) :-
ユーザの入力点からの距離ならびを得る(_10個の座標点ならび,X,Y,_ユーザの入力点からの距離ならび),
ユーザの入力座標から最も遠い点を得る(_ユーザの入力点からの距離ならび,X,Y,_最も遠い点X座標,_最も遠い点Y座標),
ユーザの入力座標から最も近い点を得る(_ユーザの入力点からの距離ならび,X,Y,_最も近い点X座標,_最も近い点Y座標),!.
>>225 % prolog (その二)
ユーザの入力点からの距離ならびを得る([],_,_,[]) :- !.
ユーザの入力点からの距離ならびを得る([[X1,Y1]|R1],X,Y,[[_距離,X1,Y1]|R2]) :-
_距離 is sqrt(((Y1-Y)^2 + (X1-X)^2)),
ユーザの入力点からの距離ならびを得る(R1,X,Y,R2).
ユーザの入力座標から最も遠い点を得る(_ユーザの入力点からの距離ならび,X,Y,_最も遠い点X座標,_最も遠い点Y座標) :-
findmax(L,member(L,_ユーザの入力点からの距離ならび),[_最も遠い距離,_最も遠い点X座標,_最も遠い点Y座標]).
ユーザの入力座標から最も近い点を得る(_ユーザの入力点からの距離ならび,X,Y,_最も近い点X座標,_最も近い点Y座標) :-
findmin(L,member(L,_ユーザの入力点からの距離ならび),[_最も近い距離,_最も近い点X座標,_最も近い点Y座標]).
ユーザ座標と10個の座標点の表示(_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標) :-
ユーザ座標と10個の座標点の表示(0,0,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標).
ユーザ座標と10個の座標点の表示(M,N,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標) :- N > 9,!.
ユーザ座標と10個の座標点の表示(M,N,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標) :-
M > 9,N2 is N + 1,wr('\n'),
ユーザ座標と10個の座標点の表示(0,N2,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標),!.
ユーザ座標と10個の座標点の表示(M,N,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標) :-
座標点表示(M,N,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標),
M2 is M + 1,
ユーザ座標と10個の座標点の表示(M,N2,_10個の座標点ならび,X,Y,_最も遠い点のX座標,_最も遠い点のY座標,_最も近い点のX座標,_最も近い点のY座標).
>>225 % Prolog (その三)
座標点表示(X,Y,_,X,Y,_,_,X,Y) :- write('◎'),!.
座標点表示(X,Y,_,X,Y,_,_,_,_) :- write('×'),!.
座標点表示(_最も遠い点のX座標,_最も遠い点のY座標,_,_,_,_最も遠い点のX座標,_最も遠い点のY座標,_,_) :- write('●'),!.
座標点表示(_最も近い点のX座標,_最も近い点のY座標,_,_,_,_,_,_最も近い点のX座標,_最も近い点のY座標) :- write('○'),!.
座標点表示(M,N,_10個の座標点ならび,_,_,_,_,_,_) :- member([M,N],10個の座標点ならび),write('△'),!.
座標点表示(_,_,_,_,_,_,_,_,_) :- write(' '),!.
>>227 % Prolog
program :-
user_parameters([A,B]),
atom_to_term(A,_実数1,_),
atom_to_term(B,_実数2,_),
sasho(_実数1,_実数2,_差,_商,_診断),
program_1(_差,_商,_診断),!.
sasho(_実数1,_実数2,_差,_商,0) :-
(_実数2 = 0.0;_実数=0),
_差 is _実数1 - _実数2,!.
sasho(_実数1,_実数2,_差,_商,1) :-
\+(_実数2 = 0.0),
\+(_実数=0),
_差 is _実数1 - _実数2,
_商 is _実数1 / _実数2,!.
program_1(_差,_商,0) :- write_formatted('%t',[_差]),!.
program_1(_差,_商,1) :- write_formatted('%t,%t',[_差,_商]),!.
>>227 訂正
% Prolog 除数検査の中で _実数2 とするべきところを _実数 としていたものがある。
program :-
user_parameters([A,B]),
atom_to_term(A,_実数1,_),
atom_to_term(B,_実数2,_),
sasho(_実数1,_実数2,_差,_商,_診断),
program_1(_差,_商,_診断),!.
sasho(_実数1,_実数2,_差,_商,0) :-
(_実数2 = 0.0;_実数2=0),
_差 is _実数1 - _実数2,!.
sasho(_実数1,_実数2,_差,_商,1) :-
\+(_実数2 = 0.0),
\+(_実数2=0),
_差 is _実数1 - _実数2,
_商 is _実数1 / _実数2,!.
program_1(_差,_商,0) :- write_formatted('%t',[_差]),!.
program_1(_差,_商,1) :- write_formatted('%t,%t',[_差,_商]),!.
http://pc12.2ch.net/test/read.cgi/tech/1197620454/586 # 問題こちら↓
# 階乗 n! を計算する関数を作成し,
# 順列
# n個の異なるものからr個取り出して並べる。
# このときの順列の総数をnPrとあらわす。
# nPr=n(n-1)(n-2)・・・(n-r+1)
# を計算する関数を作成し,
#
# 組み合わせ
# 異なるn個からr個取り出して組を作る。
# このときの組合せの総数をnCrとあらわす。
# nCr = nPr/r!
#
# を計算するプログラムを作成してください。できればFORTRANで。
>>588 % Prolog
nPr(N,R,X) :-
U is N - R + 1,
階乗(U,N,X).
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) :- (!))) .
>>216 % Prolog
search(Text,Pat,Start) :-
sub_atom(Text,Start,_,_,Pat),!.
search(_,_,-1).
search(Start) :-
write('Text :'),get_line(Text),
write('Pat :'),get_line(Pat),
search(Text,Pat,Start),!.
>>214 % Prolog
述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す :-
findall(_値,数値(_,_値),L1),
quicksort(L1,L2),
abolish(数値/2),
述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(1,L2).
述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(_,[]) :- !.
述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(M,[N|R]) :-
assertz(数値(M,N)),
M2 is M + 1,
述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(M2,R).
>>530 使用言語:J
op=:a:,;/'+-'
a=:,;&.>,{(<a:,<'-')0},(<op),.<&.>":L:0;/>:i.9
;"1,.&(<'=100'),.a{~I.(<100)=".&.>a
123+45-67-8-9=100
123+4-5-67-89=100
123-45+67-89=100
123-4+5+6+7-8-9=100
12+3+4+5-6+7-89=100
12+3-4-5+67+8+9=100
12-3+4-5-6-7+89=100
1+23-4-56+7+8+9=100
1+23-4-5+6+78-9=100
1+2+34-5-67-8-9=100
1+2+3-4-5+6+78+9=100
-1-2-3-4+5+6+78+9=100
595 :
デフォルトの名無しさん:2010/02/04(木) 00:50:42
優勝賞金500万円
http://www.jaist.ac.jp/ICGA-events-2010/olympiad/ 1989年にロンドンで第1回目のコンピュータオリンピアードが開催されました。
毎年開催される本イベントでは,コンピュータゲームプレイヤー同士が競技し,世界最高位を決定します。
これまでの優勝者には,Neurogammon(バックギャモン, 1989年), Chinook (チェッカー, 1989年および1990年) そして Tacos(将棋, 2005年, 2006年, 2008年, 2009年)などがあります。
コンピュータオリンピアードは国際コンピュータゲーム協会(ICGA)が主催して実施されています。
競技部門には,アマゾン,バックギャモン,ブリッジ,コンピュータプール,六目並べ,象棋,ドッツアンドボックス,国際ドローツ,囲碁,9路盤囲碁,ヘックス,ハバナ,ラインズオブアクション,
将棋,スラカルタなどがあります。
この他のゲームもコンピュータによる競技会を開催する可能性があります。主催者までコンタクトしてください。
2010年に第15回目となるコンピュータオリンピアードは金沢市内で開催されます。
ICGAとJAISTとの共同イベントとして9月25日から10月2日にかけて金沢市内で開催されます。
各競技の日程は後日決定します。
参加申し込みなどの詳細も後日お知らせ致します。
>>595 % Prolog
コンピュータオリンピアード(優勝賞金,500万円).
コンピュータオリンピアード('URL','
http://www.jaist.ac.jp/ICGA-events-2010/olympiad/').
コンピュータオリンピアード(歴史,第1回目,ロンドン,1989).
コンピュータオリンピアード(開催,毎年).
コンピュータオリンピアード(主催,'国際コンピュータゲーム協会(ICGA)').
コンピュータオリンピアード(出場者,コンピュータゲームプレイヤー同士).
コンピュータオリンピアード(競技部門,アマゾン).
コンピュータオリンピアード(競技部門,バックギャモン).
コンピュータオリンピアード(競技部門,ブリッジ).
コンピュータオリンピアード(競技部門,コンピュータプール).
コンピュータオリンピアード(競技部門,六目並べ).
コンピュータオリンピアード(競技部門,象棋).
コンピュータオリンピアード(競技部門,ドッツアンドボックス).
コンピュータオリンピアード(競技部門,国際ドローツ).
コンピュータオリンピアード(競技部門,囲碁).
コンピュータオリンピアード(競技部門,'9路盤囲碁').
コンピュータオリンピアード(競技部門,ヘックス).
コンピュータオリンピアード(競技部門,ハバナ).
コンピュータオリンピアード(競技部門,ラインズオブアクション).
コンピュータオリンピアード(競技部門,X) :- 新しい競技種目になる(X).
コンピュータオリンピアード(開催予定,第15回,金沢市内,'2010年','自9月25日','至10月2日').
コンピュータオリンピアード(第15回大会開催形態,共同エベント).
コンピュータオリンピアード(第15回大会共同エベント,主催,'ICGA').
コンピュータオリンピアード(第15回大会共同エベント,主催,'JAIST').
コンピュータオリンピアード(第15回大会,競技日程,後日決定).
コンピュータオリンピアード(参加申し込みなどの詳細,後日お知らせ致します).
http://pc12.2ch.net/test/read.cgi/tech/1263824755/455 # [1] 授業単元: アルゴリズム
# [2] 問題文(含コード&リンク):課題2−2と2−3です。
# 課題2-2
# コマンドライン引数で入力される任意個の実数を,malloc関数で動的に確保した配列に 格納するように,kadai2_1.c を修正したプログラム kadai2_2.c を作成せよ.
#
# 実行例は課題2-1と同じ.
# --------------------------------------------------------------------------------
# 課題2-3
# コマンドライン引数で入力される任意個の実数に対し,整数部(integer part)と小数部(fractional part)に分割し,実行例のように出力するプログラム kadai2_3.c を作成せよ.ただし,以下の仕様を満足すること.
#
# 実数値,整数部,小数部をメンバにもつ構造体を定義し,構造体の配列として利用すること.
# 構造体の配列は,malloc関数を利用して動的に確保すること.
# 整数部,小数部の分割および構造体メンバへの格納は,dividePart関数を定義して利用すること.
# 構造体配列の内容を実行例のように出力する printData関数を定義して利用すること.
# 構造体配列の内容もとに整数部の合計,小数部の合計,実数値の合計を出力する printSum関数を定義して利用すること.
http://pc12.2ch.net/test/read.cgi/tech/1263824755/456 # [1] 授業単元: データ演習
# [2] 問題文(含コード&リンク):
# できなかった問題は11−1です。
# 課題10−1を使う問題なので、できている10−1のソースコードを一緒に入れています。
# どなたか、よろしくお願いします。
# 課題10-1
# コマンドライン引数で指定される整数列を順番に二分探索木に登録し,キーボードから入力される値を探索するプログラム kadai10_1.c を作成せよ.
# また,最初に inorderで木をなぞった結果を示せ.
#
# 課題10−1に番兵を導入したプログラム kadai11_1.c を作成せよ.
#
# ヒント:番兵用に1個のノードを定義し,ノードのNULLポインタが番兵を指すようにすればよい.
# 挿入関数と探索関数,inorder, main関数を変更すればよい.挿入時の挿入ノードを決める操作も番兵を使えばよい.
# その際,初期状態として,rootが番兵を指す状態から開始する必要がある.
>>597 % Prolog
program :-
user_parameters(L),
dividePart(L,L1),
assertz('
>>597 構造体'(L1)).
dividePart([],[]) :- !.
dividePart([A|R1],[(整数部(_整数部),小数部(_小数部),(実数値(_実数値))|R2]) :-
atom_to_term(A,_実数値,_),
_整数部 is float_integer_part(_実数値),
_小数部 is float_fractional_part(_実数値),
dividePart(R1,R2).
printData :-
'
>>597 構造体'(L),
printSum(L,0.0,0.0,0.0).
printSum([],_整数部の合計,_小数部の合計,_実数値の合計) :-
write_formatted('整数部の合計=%t,小数部の合計=%t,実数値の合計=%t\n',[_整数部の合計,_小数部の合計,_実数値の合計]),!.
printSum((整数部(_整数部),小数部(_小数部),(実数値(_実数値))|R1],_整数部の合計1,_小数部の合計1,_実数値の合計1) :-
_整数部の合計2 is _整数部 + _整数部の合計1,
_整数部の合計2 is _小数部 + _小数部の合計1,
_実数値の合計2 is _実数値 + _実数値の合計1,
printSum(R1,_整数部の合計2,_小数部の合計2,_実数値の合計2).
>>596 の二節を訂正します
% Prolog
コンピュータオリンピアード(競技部門,X) :- 新しい競技種目になる(X).
=>
コンピュータオリンピアード(競技部門,X) :-
コンピュータオリンピアード(新しい競技種目になる,X).
コンピュータオリンピアード(開催予定,第15回,金沢市内,'2010年','自9月25日','至10月2日').
=>
コンピュータオリンピアード(開催予定,第15回,金沢市内,'自2010年9月25日','至2010年10月2日').
下は原文のニュアンスから少し遠くなりますが。
'9月25日'-'10月2日'のような構造を持ったデータを持ってきたくないんです。
>>601 それなら、
コンピュータオリンピアード(開催予定,第15回,金沢市内,'2010年').
コンピュータオリンピアード('第15回',開催日時,'9月25日から10月2日まで').
の方がいいのでは。
文の解析を残すのがいいかどうかというところだね。
603 :
602:2010/02/04(木) 08:07:27
コンピュータオリンピアードを述語に持って来ているということは、
これがクラスという意識が多少はあるのかな?
>>602 コンピュータオリンピアード('第15回',開催予定日,'9月25日から10月2日まで').
ですか。
「9月25日から10月2日まで」に比べて「9月25日から10月2日にかけて」は
ふくらみがありますね。こういう部分の表現は自然言語に敵わない。
いや、自然言語は大袈裟で単に「掛かる」という言葉のふくらみかな。
>>603 検索の都合もあるw ゼネラルデータベースのように特権的なテーブルとか
述語を持たない系は魅力がありますが、現実には大変でしょう。しかしまあ、
アナーキズムも再評価されているようですから、わからないですよね。
http://pc12.2ch.net/test/read.cgi/tech/1153585095/340 # 【 課題 】
# 次の要求を満たすフィルタプログラムを作れ。
# 1.標準入力から行を読み込み、空白をカンマに変換し、標準出力に出力する
# 2.連続した複数の空白はひとつの空白と同じと見なす
# 3.タブ文字も空白と見なす
# 4.オプション等は設けない
# 5.フィルタとして動作するので余分なメッセージ類は一切出力しない
#
# 例として「1 Bill 1955 Oct 28」と入力したら「1,Bill,1955,Oct,28」と出力されるようにします。
>>606 % Prolog (その一) 例で ","の後に空白が一つ入っているのは誤りだと思う。
program :-
repeat,
標準入力から行を読み込み(_行),
空白をカンマに変換し、標準出力に出力する(_行).
空白をカンマに変換し、標準出力に出力する(end_of_file) :- !.
空白をカンマに変換し、標準出力に出力する(_行) :-
空白をカンマに変換し、(_行,_変換された行),
標準出力に出力する(_変換された行),
fail.
標準入力から行を読み込み(_行) :-
get_line(_行).
空白をカンマに変換し、(_行,_変換された行) :-
atom_chars(_行,Chars),
文字ならびの空白をカンマに変換(Chars,Chars2),
atom_chars(_変換された行,Chars2).
文字ならびの空白をカンマに変換([],[]) :- !.
文字ならびの空白をカンマに変換(L,[',']) :- 空白またはタブならび(L),!.
文字ならびの空白をカンマに変換(L1,[',',A|R2]) :-
append(L0,[A|R3],L1),
\+(A=' '),\+(A='\t'),
空白またはタブならび(L0),
文字ならびの空白をカンマに変換(R3,R2),!.
文字ならびの空白をカンマに変換([A|R1],[A|R2]) :-
文字ならびの空白をカンマに変換(R1,R2),!.
>>606 % Prolog (その二)
空白またはタブならび([' ']) :- !.
空白またはタブならび(['\t']) :- !.
空白またはタブならび([' '|R]) :-
空白またはタブならび(R),!.
空白またはタブならび(['\t'|R]) :-
空白またはタブならび(R),!.
標準出力に出力する(_行) :- write_formatted('%t\n',[_行]).
http://pc12.2ch.net/test/read.cgi/tech/1260922392/27 # 微分方程式の境界値問題
#
# y''(x) = f(y(x)), 0<x<1, y(0)=y(1)=0
#
# の解を数値的に求める方法のひとつとして、射的法(shooting method)
# があります。自然数nを与えて、区間[0,1]をn等分して、ykをy(k/n)
# の近似式として、漸化式(ここから下のyの後ろのカッコの中身は添え字と思え)
# y(0) = 0, y(1)= t,
# y(k+1) = 2y(k) - y(k-1) + 1/n²f(y(k)), k=1,2,…,2n-1,
# の解の数値的y(n)=0 を満たすものを、上の問題の近似解として求める方法です。
# yn=0となる数列を求めるために、ynを未知パラメータtの関数とみなして、tに関する二分法を使います。
#
# 正の実数aを適当に定めて、
# f(y) = ay(1 - y)
# の場合の近似解y(k)を、誤差10-6の範囲で求めるプログラムを作成してください。
# 自然数nは適当に決めてください。(2のベキ乗にするのが無難です)
# 実数あの値は、とりあえず20にしてみてください。
# (注意:a≧10でないと…)
>>52 音通(恨み,浦見).
音通(恨み,裏見).
この系統は根深い。
>>515 使用言語:J
g=:(0=3&|)+.(3 e. 10.inv)
f=:[:;{&('NO';'YES')
f g 11
NO
f g 12
YES
f g 13
YES
>>206 % Prolog (その一)
自分で五つの問題文を入力して練習するタイピング練習ソフト :-
自分で五つの問題文を入力して(1,_五つの問題文),
問題文は入力した五つの中から10題がランダムに出題される(1,_五つの問題文,_問題文ならび),
タイプ練習(_問題文ならび,_正解数),
write_formatted('正解数は%tです\n',[_正解数]).
自分で五つの問題文を入力して(N,[]) :- N > 5,!.
自分で五つの問題文を入力して(N,[_問題文|R]) :-
問題文を入力して(_問題文1),
問題文の長さを調整する(_問題文1,_問題文),
N2 is N + 1,
自分で五つの問題文を入力して(N2,R).
問題文を入力して(_問題文) :- write_formatted('%tつ目の問題文 :',[N]),get_line(問題文),!.
問題文の長さを調整する(_問題文,_問題文) :-
sub_atom(_問題文,0,_長さ,_,_問題文),
_長さ =< 20,!.
問題文の長さを調整する(_問題文1,_問題文) :-
sub_atom(_問題文1,0,20,_,_問題文).
>>206 % Prolog (その二)
問題文は入力した五つの中から10題がランダムに出題される(N,_,[]) :- N > 10,!.
問題文は入力した五つの中から10題がランダムに出題される(N,_問題集,[_問題|R]) :-
M is (random mod 5) + 1,
list_nth(M,_問題集,_問題),
N2 is N + 1,
問題文は入力した五つの中から10題がランダムに出題される(N2,_問題集,R).
タイプ練習([],0) :- !.
タイプ練習([_問題文|R],_正解数) :-
write_formatted('%t\n',[_問題文]),get_line(Line),
_問題文 = Line,
タイプ練習(R,_正解数2),
_正解数 is _正解数2 + 1,!.
タイプ練習([_|R],_正解数) :- タイプ練習(R,_正解数).
>>212 % Prolog
'2つの名前を入力しステータス(ランダム)を決定し 勝敗表示する' :-
'2つの名前を入力し'(_名前1,_名前2),
'ステータス(ランダム)を決定し'(_名前1のステータス,_名前2のステータス),
勝負表示する(_名前1,_名前2,_名前1のステータス,_名前2のステータス),!.
'ステータス(ランダム)を決定し'(_名前1のステータス,_名前2のステータス) :-
_名前1のステータス is random mod 100 + 1,
_名前2のステータス is random mod 100 + 1.
勝負表示する(_名前1のステータス,_名前2のステータス) :-
_名前1のステータス > _名前2のステータス,
write_formatted('%tの勝ちです\n',[_名前1]),!.
勝負表示する(_名前1のステータス,_名前2のステータス) :-
_名前1のステータス < _名前2のステータス,
write_formatted('%tの勝ちです\n',[_名前2]),!.
勝負表示する(_名前1のステータス,_名前2のステータス) :-
_名前1のステータス = _名前2のステータス,
write('引き分けです\n'),!.
>>238 % Prolog ここでは構造体=述語定義と解釈してみる。
'構造体を利用して、氏名,年齢,性別が5人分書かれたテキストファイルを読み込んで、画面に表示する'(_テキストファイル) :-
'構造体を利用して、氏名,年齢,性別が5人分書かれた次のようなテキストファイルを読み込んで、(_テキストファイル,Lines),
abolish(氏名・年齢・性別/3),
'氏名・年齢・性別構造体として定義'(Lines).
画面に表示する,!.
'構造体を利用して、氏名,年齢,性別が5人分書かれたテキストファイルを読み込んで、(_テキストファイル,Lines) :-
get_lines(_テキストファイル,Lines),!.
'氏名・年齢・性別構造体として定義'([]) :- !.
'氏名・年齢・性別構造体として定義'([Line|R]) :-
split(Line,[' '],[_氏名,_年齢,_性別]),
assertz(氏名・年齢・性別(氏名(_氏名),年齢(_年齢),性別(_性別))),
'氏名・年齢・性別構造体として定義'(R).
画面に表示する :-
write('%20s %6s %4s\n',[氏名,年齢,性別]),
氏名・年齢・性別(氏名(_氏名),年齢(_年齢),性別(_性別)),
write_formatted('%20s %6d %4s\n',[_氏名,_年齢,_性別]),
fail.
画面に表示する.
>>515 使用言語:J
同じ値がでないステータスの生成なので引き分けはない。
f=:dyad define
'xs ys'=. 2?10000
smoutput x,' status ',":xs
smoutput y,' status ',":ys
smoutput (;(xs<ys){x;y),' win'
)
'scala' f 'clojrure'
scala status 8546
clojrure status 8515
scala win
>>229 % Prolog
'テキストファイルの内容を,別のテキストファイルにコピーする'(_コピー元ファイル,_コピー先ファイル) :-
open(_コピー元ファイル,read,Input,[type(binary)]),
open(_コピー先ファイル,write,Output,[type(binary)]),
repeat,
一文字読む(Input,C),
一文字書き出す(Output,C),
close(Input),
close(Output),!.
一文字読む(Input,C) :- get_byte(C).
一文字書き出す(Output,-1) :- !.
一文字書き出す(Output,C) :- put_byte(Output,C),fail.!.
テキストファイルの中身の内容を画面に出力(_コピー元ファイル,_コピー先ファイル) :-
get_lines(_コピー元ファイル,Lines1),
get_lines(_コピー先ファイル,Lines2),
'2テキストを並べて行表示'(Lines1,Lines2),!.
'2テキストを並べて行表示'([],[]) :- !.
'2テキストを並べて行表示'([A|R1],[B|R2]) :-
write_formatted('%t %t\n',[A,B]),
'2テキストを並べて行表示'(R1,R2).
>>232 % Prolog
モンテカルロ法で円周率を計算する(_円周率) :-
モンテカルロ法で円周率を計算する(1,10000,0,_円周率),!.
モンテカルロ法で円周率を計算する(M,N,Y,X) :- M > N,X is 4.0 * Y / N,!.
モンテカルロ法で円周率を計算する(M,N,Y,X) :-
U1 is ((random mod 10000) / 10000) ^ 2,
U2 is ((random mod 10000) / 10000) ^ 2,
U1 + U2 =< 1.0,
Y2 is Y + 1,
M2 is M + 1,
モンテカルロ法で円周率を計算する(M2,N,Y2,X),!.
モンテカルロ法で円周率を計算する(M,N,Y,X) :-
M2 is M + 1,
モンテカルロ法で円周率を計算する(M2,N,Y,X),!.
>>244 % Prolog
オイラー級数を用いて、πの近似値を求める(_円周率) :-
findsum(U,(for(1,N,100000),U is 1 / (N * N)),Sum),
_円周率 is sqrt(6 * Sum).
Prolog氏かっけー。
622 :
620:2010/02/05(金) 19:16:08
大学が ->受験->春休み になるから、出題なくなりますね。未解決問題を
しばらくは潰していきます。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/483 # [1] C言語プログラミング初歩(専門学校)
# [2] int型の配列変数A[64][32]をB[32][64]に代入する.
# 次の対応があるようにすること
# A[0][0] -> A[0][1] -> A[0][31] ->A[1][0] ->....->A[63][31]
# B[0][0] -> B[0][1]-> B[0][31] -> B[0][32]->....->B[31][63]
# (上の段と下の段が一致)
# A[m][n]には値 (m+n) % 31が入っているものとする。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/480 # [2] プログラム
# 環境
# [3.1] OS:Linux
# [3.2] コンパイラ名:gcc
# [3.3] 言語:C++
# 以下の実行結果はどうなるか
#
#
# #include<stdio.h>
# #define N10
# int main(){
# int i,wa=0;
# for(i=1;i<N;i++){
# if((i%2) == 0) continue;
# wa+=i;}
# printf("%d\n",wa);
# return 0;}
#
# これを、C言語を他の言語に書き換える課題とします。
>>624 % Prolog
ならびを2要素ごとに纏める([],[]) :- !.
ならびを2要素ごとに纏める([L1,L2|R1],[L3|R2]) :-
append(L1,L2,L3),
ならびを2要素ごとに纏める(R1,R2).
>>624 % Prolog
'A[m][n]には値 (m+n) % 31が入っている'(A) :-
'A[m][n]には値 (m+n) % 31が入っている'(0,A),!.
'A[m][n]には値 (m+n) % 31が入っている'(M,[]) :- M > 31,!.
'A[m][n]には値 (m+n) % 31が入っている'(M,[L|R]) :-
'A[m][n]には値 (m+n) % 31が入っている'(M,0,L),
M2 is M + 1,
'A[m][n]には値 (m+n) % 31が入っている'(M2,R).
'A[m][n]には値 (m+n) % 31が入っている'(M,N,[]) :- N > 63,!.
'A[m][n]には値 (m+n) % 31が入っている'(M,N,[X|R]) :-
X is (M + N) mod 31,
N2 is N + 1,
'A[m][n]には値 (m+n) % 31が入っている'(M,N2,R),!.
>>625 % Prolog
'Prologでの表現' :-
'Prologでの表現'(1,X),
write_formatted('%t\n',[X]).
'Prologでの表現'(9,0) :- !.
'Prologでの表現'(N,X) :-
0 is N mod 2,
N2 is N + 1,
'Prologでの表現'(N2,Y),
X is Y + 1,!.
'Prologでの表現'(N,X) :-
\+(0 is N mod 2),
N2 is N + 1,
'Prologでの表現'(N2,X).
>>629 % Prolog
キーボードから英文を1文字ずつ入力し母音の出現数をカウントする。その数だけアスタリスクを表示する :-
キーボードから英文を1文字ずつ入力し(Chars),
母音の出現数をカウントする(Chars,L),
その数だけアスタリスクを表示する(L).
キーボードから英文を1文字ずつ入力し(Chars) :-
get_chars(Chars).
母音の出現数をカウントする(L) :-
findall('*',(member(A,Chars),member(A,['A','E','I','O','U',a,e,i,o,u])),L).
その数だけアスタリスクを表示する(L) :-
concat_atom(L,S),
write_formatted('%t\n',[S]).
>>630 (
>>629) 訂正
% Prolog 述語 母音の出現数をカウントする の第一引数が落ちていました。
キーボードから英文を1文字ずつ入力し母音の出現数をカウントする。その数だけアスタリスクを表示する :-
キーボードから英文を1文字ずつ入力し(Chars),
母音の出現数をカウントする(Chars,L),
その数だけアスタリスクを表示する(L).
キーボードから英文を1文字ずつ入力し(Chars) :-
get_chars(Chars).
母音の出現数をカウントする(Chars,L) :-
findall('*',(member(A,Chars),member(A,['A','E','I','O','U',a,e,i,o,u])),L).
その数だけアスタリスクを表示する(L) :-
concat_atom(L,S),
write_formatted('%t\n',[S]).
>>629 % Prolog 母音出現数をカウントする 以下は、この定義の方が自然かもしれない。
% でも、私はアスタリスクの表示でカウントしているとする
>>631の方が好きだ。
キーボードから英文を1文字ずつ入力し母音の出現数をカウントする。その数だけアスタリスクを表示する :-
キーボードから英文を1文字ずつ入力し(Chars),
母音の出現数をカウントする(Chars,_カウント),
その数だけアスタリスクを表示する(_カウント).
キーボードから英文を1文字ずつ入力し(Chars) :-
get_chars(Chars).
母音の出現数をカウントする(Chars,_カウント) :-
count((member(A,Chars),member(A,['A','E','I','O','U',a,e,i,o,u])),_カウント).
その数だけアスタリスクを表示する(_カウント) :-
length(L,_カウント),
all(L,'*'),
concat_atom(L,S),
write_formatted('%t\n',[S]).
http://pc12.2ch.net/test/read.cgi/tech/1263824755/502 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 入力された2つの文字列str1,str2を比較し、str1にstr2の文字列が含まれている場合に1を、
# 含まれていない場合に-1を返す関数、strcmpを作成せよ。
# int strcmp( char *str1, char *str2);
# ex. str1=”abaabab” , str2=”aab” 1
# ex. str1=”abaabab” , str2=”abb” -1
>>633 % Prolog
入力された2つの文字列Str1,Str2を比較し、Str1にStr2の文字列が含まれている場合に1を、含まれていない場合に-1を返す(Str1,Str2,1) :-
sub_atom(Str1,_,_,_,Str2),!.
入力された2つの文字列Str1,Str2を比較し、Str1にStr2の文字列が含まれている場合に1を、含まれていない場合に-1を返す(Str1,Str2,(-1)) :-
\+(sub_atom(Str1,_,_,_,Str2)),!.
>>633 % Prolog 「1を返す」という部分が微妙な位置にある例。
入力された2つの文字列Str1,Str2を比較する(Str1,Str2,_診断) :-
'Str1にStr2の文字列が含まれている場合に1を返す'(Str1,Str2,_診断),!.
入力された2つの文字列Str1,Str2を比較する(Str1,Str2,_診断) :-
'Str1にStr2の文字列が含まれていない場合に-1を返す'(Str1,Str2,_診断),!.
'Str1にStr2の文字列が含まれている場合に1を返す'(Str1,Str2,1) :-
sub_atom(Str1,_,_,_,Str2),!.
'Str1にStr2の文字列が含まれていない場合に-1を返す'(Str1,Str2,(-1)) :-
\+(sub_atom(Str1,_,_,_,Str2)),!.
>>633 % Prolog
入力された2つの文字列Str1,Str2を比較し、Str1にStr2の文字列が含まれている場合に1を、含まれていない場合に-1を返す(Str1,Str2,1) :-
'Str1にStr2の文字列が含まれている'(Str1,Str2),!.
入力された2つの文字列Str1,Str2を比較し、Str1にStr2の文字列が含まれている場合に1を、含まれていない場合に-1を返す(Str1,Str2,(-1)) :-
'Str1にStr2の文字列が含まれていない'(Str1,Str2),!.
'Str1にStr2の文字列が含まれている'(Str1,Str2) :-
sub_atom(Str1,_,_,_,Str2),!.
'Str1にStr2の文字列が含まれていない'(Str1,Str2) :-
\+(sub_atom(Str1,_,_,_,Str2)),!.
>>634-
>>636 要するにどこで組込述語を含む原初的な述語を目標とする節に行き着くか。そこまで
自然な説明として目標を辿ることができるように定義できるか、ということ。
ここで原初的な述語とは、先祖定義に現れる親子/2のような述語。
先祖(X,Y) :- 親子(X,Y).
先祖(X,Y) :- 親子(X,Z),先祖(Z,Y).
親子(義朝,頼朝).
親子(為朝,義朝).
ふつう祖先だったかw
http://pc12.2ch.net/test/read.cgi/tech/1248012902/839 # 【 課題 】5個以上の学生番号(2桁程度の数字で良い)、
# 名前、身長をプログラム中でセットし、
# 学生番号または名前をもとに身長を調べるプログラム。
# 学生番号と名前の入力データ、検索結果の身長データを両方表示する機
能があること。
# 【 形態 】1. Javaアプリケーション(main()で開始)/
# 【 期限 】2/10(水)
#
# たぶん二分探索使うかと思うのですが
# よくわかりません!すみませんがよろしくおねがいします!!
>>640 % Prolog
学生(11,源亮,168).
学生(33,高階高子,156).
学生(7,九条良常,173).
学生(61,石川広也,162).
学生(16,藤原隆甫,177).
学生番号または名前をもとに身長を調べる(_学生番号または名前,_身長) :-
integer(_学生番号または名前),
学生(_学生番号または名前,_名前,_身長),
write_formatted('学生番号=%t,名前=%t,身長=%t\n',[_学生番号または名前,_名前,_身長]).
学生番号または名前をもとに身長を調べる(_学生番号または名前,_身長) :-
atom(_学生番号または名前),
学生(_学生番号,_学生番号または名前,_身長),
write_formatted('学生番号=%t,名前=%t,身長=%t\n',[_学生番号,_学生番号または名前,_身長]).
>>641 % Prolog
write_formatted/2で結果を表示するのに、第二引数に"_身長"が付いているのは
奇妙ですね。これは同姓同名の有り得ることを思い起こさせるための配慮と
考えてください。
http://pc11.2ch.net/test/read.cgi/db/1252492296/500 # MYSQLなんですけど
#
# date data
# 2010/01/01 hoge1
# 2010/01/05 hoge2
#
# みたいなテーブルから
#
# 2010/01/01 hoge1
# 2010/01/02 NULL
# 2010/01/03 NULL
# 2010/01/04 NULL
# 2010/01/05 hoge2
#
# のような結果の出せるSQLを求めてます。
#
# select * from table between date '2010/01/01' and '2010/01/05'
#
# とするとデータのある2レコードしか出ないのですが、
# データがない部分も日付を出しつつ、デフォルトのデータないよっていう文字列を出せると助かります。
>>644 % Prolog こんな述語定義が必要。日付連鎖は未定義かも知れない。後で。
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付下限,_日付上限) :-
日付からデータを表示する。存在しない日はデータをNULLとして表示(_日付下限),
日付連鎖(_日付下限,_日付),
日付からデータを表示する。存在しない日はデータをNULLとして表示(_日付),
_日付=_日付上限.
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付) :-
_日付 = (_年/_月/_日),
table(_日付,Data),
write_formatted('%2d%2d%2d %t\n',[_年,_月,_日,Data]),!.
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付) :-
_日付 = ( _年/_月/_日),
\+(table(_日付,Data)),
write_formatted('%2d%2d%2d NULL\n',[_年,_月,_日]),!.
http://pc12.2ch.net/test/read.cgi/tech/1248012902/847 # 【 課題 】電話番号検索を行うjavaプログラムを、探索アルゴリズムを用いて作成せよ。
# 【 補足 】・最初に顧客番号(2桁の数字)、顧客名(Yamadaなど姓のみ)、
# 電話番号(09012345678の形式、ハイフンなし)という顧客データを10人以上プログラム中でセットし、
# 顧客番号または姓をもとに電話番号を調べるアルゴリズムを作成する。
# ・顧客番号と顧客名の入力データ、電話番号データを両方表示させる機能をつけなければならない。
# ・(もし可能なら)データリストへの顧客データの追加or削除機能を盛り込みたい
>>646 % Prolog 実際には、入力された項・要素の形式検査をしますが。
電話番号を10件登録する :-
write('引数として、顧客番号(2桁の数字)、顧客名(Yamadaなど姓のみ)、電話番号(09012345678の形式、ハイフンなしの三つの項をもつ複合項、電話番号を10件入力します\n'),
for(1,N,10),write_formatted('%t件目 : '),read(X),assertz(X),N=10.
顧客データの追加(_追加する項) :- assertz(_追加する項).
顧客データの削除(_追加する項) :- retract(_削除する項).
電話番号の検索(_顧客番号,_顧客名,_電話番号) :- 電話番号(_顧客番号,_顧客名,_電話番号).
>>647 訂正 write_formatted/2の引数が目標で1個になってしまっているところがあった。
% Prolog 実際には、入力された項・要素の形式検査をしますが。
電話番号を10件登録する :-
write('引数として、顧客番号(2桁の数字)、顧客名(Yamadaなど姓のみ)、電話番号(09012345678の形式、ハイフンなしの三つの項をもつ複合項、電話番号を10件入力します\n'),
for(1,N,10),write_formatted('%t件目 : ',[N]),read(X),assertz(X),N=10.
顧客データの追加(_追加する項) :- assertz(_追加する項).
顧客データの削除(_追加する項) :- retract(_削除する項).
電話番号の検索(_顧客番号,_顧客名,_電話番号) :- 電話番号(_顧客番号,_顧客名,_電話番号).
>>649 % Prolog
% Prologではアドレス操作はできない。したがって、この問題は解けない。
>>648 (
>>646)
% Prolog さすがにちょっと乱暴だったか。
顧客データの追加(_顧客番号,_顧客名,_電話番号) :- assertz(電話番号(_顧客番号,_顧客名,_電話番号)).
顧客データの削除(_顧客番号,_顧客名,_電話番号) :- retract(電話番号(_顧客番号,_顧客名,_電話番号)).
>>648 % Prolog この「いろんな言語で宿題スレ」に書き込みだしてから初めて read/1 を使っています。
% この組込述語は入力を項として解釈する便利で基本的なものですが、
% 入力時にピリオドで終了する必要があります。これを一般ユーザに要請するのは
% 現実的ではないと考えて、get_line/1等を用いてきました。
% 利用者がPrologの項とそのルールについて理解している場合はreadを使って
% 構わないと思います。なお細かいことですが、read/1の場合、
% 標準では処理系がプロンプトを表示するが普通です。その表示するプロンプトの
% 変更なども組込述語で行えるようになっています。
http://pc12.2ch.net/test/read.cgi/tech/1263824755/535 # [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# まず次の内容のテキストファイルを準備せよ。
# (メモ帳で作成し、test02.txtという名前で保存すること)
#
# abc
# 123
# def
# 456
# ghi
# 789
# jkl
# 000
#
# 次に、作成したテキストファイルから内容を読み出し、
# 各行の先頭に 01 02 03 というように番号を付加して
# 画面に出力するプログラムを作成せよ。
>>654 % Prolog
'テキストファイルから内容を読み出し、各行の先頭に 01 02 03 というように番号を付加して画面に出力する' :-
get_lines('test02.txt',L),
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(1,L).
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(_,[]) :- !.
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(N,[Line|R]) :-
write_formatted_atom('%2d',[N],A),
空白を0に置換する(A,A2),
write_formatted('%t %t\n',[A2,Line]),
N2 is N + 1,
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(N2,R).
空白を0に置換する(A,A2) :-
atom_chars(A,L),
ならびの置換(' ','0',L,L2),
atom_chars(A2,L2).
>>653 % Prolog
ある述語の引数を表示する場合の一般解は :-
ある述語(_引数),
write_formatted('%t\n'm,[_引数]),
fail.
ある述語の引数を表示する場合の一般解は.
でしょう。
>>641では同姓同名をきっちりと表示することをサボっています。
それでそのことをこの述語を利用するプログラマに注意するために変数の引数を
強制しています。こうして置けば、この述語をテストした時に
?- 学生番号または名前をもとに身長を調べる(藤原隆甫,_身長).
_身長 = 177
という解を示してインタプリタが停止します。これがPrologプログラマをして
同姓同名への配慮が必要かどうか判断させる契機となるということです。
>>656 変な"m"が混入してしまいました。
write_formatted('%t\n'm,[_引数]), -> write_formatted('%t\n',[_引数]),
です。
>>654 % Prolog 出題の元スレの覗いていたら、%02d というformat表記が出ていた。
% もしかしてと試みたら私のPrologでも同じ。これまでの私の人生は何だったんだwww
% ということで、
'テキストファイルから内容を読み出し、各行の先頭に 01 02 03 というように番号を付加して画面に出力する' :-
get_lines('test02.txt',L),
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(1,L).
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(_,[]) :- !.
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(N,[Line|R]) :-
write_formatted('%02d %t\n',[N,Line]),
N2 is N + 1,
'各行の先頭に 01 02 03 というように番号を付加して画面に出力する'(N2,R).
>>644 % Prolog これも実はヘッドゼロサプライだったのだけれど、サボっていた。
% 直そうと見たら、スラッシュも落ちていた。修正。
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付下限,_日付上限) :-
日付からデータを表示する。存在しない日はデータをNULLとして表示(_日付下限),
日付連鎖(_日付下限,_日付),
日付からデータを表示する。存在しない日はデータをNULLとして表示(_日付),
_日付=_日付上限.
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付) :-
_日付 = (_年/_月/_日),
table(_日付,Data),
write_formatted('%02d/%02d/%02d %t\n',[_年,_月,_日,Data]),!.
'日付からデータを表示する。存在しない日はデータをNULLとして表示'(_日付) :-
_日付 = ( _年/_月/_日),
\+(table(_日付,Data)),
write_formatted('%02d/%02d/%02d NULL\n',[_年,_月,_日]),!.
>>645 (
>>644)
% Prolog 日付連鎖は
日付連鎖(_日付,_今日) :- var(_日付),前日・今日(_日付,_今日).
日付連鎖(_日付,_今日) :- var(_日付),前日・今日(_前日,_今日),日付連鎖(_日付,_前日).
日付連鎖(_今日,_日付) :- var(_日付),前日・今日(_今日,_日付).
日付連鎖(_今日,_日付) :- var(_日付),前日・今日(_今日,_翌日),日付連鎖(_翌日,_日付).
前日・今日(_前日の年/12/31,_年/1/1) :- 一つ違い(_前日の年,_年),!.
前日・今日(_年/2/29,_年/3/1) :- うるう年(_年),!.
前日・今日(_年/2/28,_年/3/1) :- not(うるう年(_年)),!.
前日・今日(_年/_前月/30,_年/_月/1) :- 一つ違い(_前月,_月),member(_前月,[4,6,9,11]),!.
前日・今日(_年/_前月/31,_年/_月/1) :- 一つ違い(_前月,_月),member(_前月,[1,3,5,7,8,10,12]),!.
前日・今日(_年/_月/_前日,_年/_月/_日) :- 一つ違い(_前日,_日),!.
一つ違い(M,N) :- integer(M),!,N is M + 1 .
一つ違い(M,N) :- integer(N),!,M is N - 1 .
うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- not(0 is _年 mod 4),fail.
# t_date 1_dekidaka a_dekidaka
# 2010/01/28 1000 1500
# 2010/01/29 1026 0
# 2010/01/30 0 3400
# みたいな感じなんですけど。
>>661 上半分がちぎれてしまった。
http://pc11.2ch.net/test/read.cgi/db/1252492296/502 # すいませんが、SQLを教えてください MySQL 5.1.35です
# 日付テーブル dailytbl
# t_date 西暦日付
#
# 出来高aテーブル
# code 1,2,3〜
# a_date 西暦日付
# dekidaka
#
# 出来高bテーブル
# code a,b,c〜
# a_date 西暦日付
# dekidaka
#
# 日付テーブルのt_dateに沿って出来高を表示させたいです。
# 出来高aテーブルにしても、出来高bテーブルにしても出来高のない日が
# ありますが、出来高のない日はdekidakaを0として表示させたい
#
# イメージとしては
# 日付テーブル 出来高aテーブル 出来高bテーブル
# t_date 1_dekidaka a_dekidaka
# 2010/01/28 1000 1500
# 2010/01/29 1026 0
# 2010/01/30 0 3400
# 2010/01/31 0 5500
# みたいな感じなんですけど。
>>662 % Prolog
日付テーブルのt_dateに沿って出来高を表示する :-
write('日付テーブル 出来高aテーブル 出来高bテーブル\n'),
日付テーブル(_西暦日付),
出来高aテーブルの取得(_西暦日付,_出来高a),
出来高bテーブルの取得(_西暦日付,_出来高b),
write_formatted('%t %10d %10d\n',[_西暦日付,_出来高a,_出来高b]),
fail.
日付テーブルのt_dateに沿って出来高を表示する.
出来高aテーブルの取得(_西暦日付,_出来高a) :- 出来高aテーブル(_西暦日付,_出来高a),!.
出来高aテーブルの取得(_,0).
出来高bテーブルの取得(_西暦日付,_出来高b) :- 出来高bテーブル(_西暦日付,_出来高b),!.
出来高bテーブルの取得(_,0).
>>662 % Prolog 日付テーブルにそって常に全部表示するというのは現実味がない。
日付テーブルのt_dateに沿って出来高を表示する(_日付下限,_日付上限) :-
write('日付テーブル 出来高aテーブル 出来高bテーブル\n'),
日付テーブル(_西暦日付),
_西暦日付>=_日付下限,
_西暦日付=<_日付上限,
出来高aテーブルの取得(_西暦日付,_出来高a),
出来高bテーブルの取得(_西暦日付,_出来高b),
write_formatted('%t %10d %10d\n',[_西暦日付,_出来高a,_出来高b]),
fail.
日付テーブルのt_dateに沿って出来高を表示する(_,_).
>>663 (
>>662)
% Prolog もう一つの表記法を示す。この表記法もread/1と同様このスレでは
% 私は故意に使用しなかった。
日付テーブルのt_dateに沿って出来高を表示する :-
write('日付テーブル 出来高aテーブル 出来高bテーブル\n'),
(
日付テーブル(_西暦日付),
( 出来高aテーブル(_西暦日付,_出来高a);\+(出来高aテーブル(_西暦日付,_)),_出来高a=0),
( 出来高bテーブル(_西暦日付,_出来高b);\+(出来高bテーブル(_西暦日付,_)),_出来高b=0),
write_formatted('%t %10d %10d\n',[_西暦日付,_出来高a,_出来高b]),
fail;
true
).
http://pc12.2ch.net/test/read.cgi/tech/1248012902/850 # 【 課題 】‐出題内容‐
# Testプロジェクトのsrc直下にパッケージtest5を作成し、下記のテストプログラムを作成する。そして、TripTestをパスする実装を作成しなさい。
# <TripTestの説明>
# 日本旅行(JapanTrip)とアメリカ旅行(AmericaTrip)それぞれの旅費を算出する機能を実装する。抽象クラスTripを作成すること。
# 日本旅行もアメリカ旅行も食費(1万円)と宿泊費(3万円)は全く同じ金額で変わらないものとする。
# それぞれの食費、宿泊費、交通費はそのまま金額が取得でき、旅費合計は食費と宿泊費と交通費を足したものである。
#
# package test5;
#
# import static org.junit.Assert.*;
# import org.junit.Test;
# public class TripTest {
# @Test // 旅費を算出するテストプログラム
# public void testCost() throws Exception {
# Trip jpTrip = new JapanTrip();
# assertEquals(10000, jpTrip.getFoodCost()); // 食費
# assertEquals(30000, jpTrip.getRoomCost()); // 宿泊費
# assertEquals(50000, jpTrip.getTravelCost()); // 交通費
# assertEquals(90000, jpTrip.getTotalCost()); // 旅費合計(食費+宿泊費+交通費)
# Trip americaTrip = new AmericaTrip();
# assertEquals(10000, americaTrip.getFoodCost()); // 食費
# assertEquals(30000, americaTrip.getRoomCost()); // 宿泊費
# assertEquals(300000, americaTrip.getTravelCost()); // 交通費
# assertEquals(340000, americaTrip.getTotalCost()); // 旅費合計(食費+宿泊費+交通費)
# }
# }
>>666 % Prolog 旅費を算出するまでもない。
旅費(日本,食費,10000).
旅費(日本,宿泊費,30000).
旅費(日本,交通費,50000).
旅費(日本,合計,_旅費合計) :-
旅費(日本,食費,_食費),
旅費(日本,宿泊費,_宿泊費),
旅費(日本,交通費,_交通費),
_旅費合計 is _食費 + _宿泊費 + _交通費.
旅費(アメリカ,食費,10000).
旅費(アメリカ,宿泊費,30000).
旅費(アメリカ,交通費,300000).
旅費(アメリカ,合計,_旅費合計) :-
旅費(アメリカ,食費,_食費),
旅費(アメリカ,宿泊費,_宿泊費),
旅費(アメリカ,交通費,_交通費),
_旅費合計 is _食費 + _宿泊費 + _交通費.
#
http://pc12.2ch.net/test/read.cgi/tech/1248012902/848 # 【 課題 】クラスの継承
http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/920.zip # 課題11-2
# オブジェクト指向型の特徴である多態性(ポリモーフィズム)を利用して
# AnimalクラスのDogとCatからbarkメソッドを呼び出し、実行結果と同じメッセージが
# 表示されるプログラムを作成しなさい。
# 【 Animalクラス仕様 】
# barkメソッドが宣言されている。(処理内容:「動物が吠えている」と表示する。)
#
# 【 Dogクラス仕様 】
# Animalクラスを継承。
# Animalクラスのbarkメソッドをオーバーライト(処理内容:「犬がワンワン吠えている!!」と表示する。)
#
# 【 Catクラス仕様 】
# Animalクラスを継承。
# Animalクラスのbarkメソッドをオーバーライト(処理内容:「猫がニャーニャー鳴く!!」と表示する。)
#
# 【 Kad11_2クラス 】
# Animalクラスの参照変数animal1を宣言し、参照先はAnimalオブジェクトとする。
# Animalクラスの参照変数animal2を宣言し、参照先はDogオブジェクトとする。
# Animalクラスの参照変数animal3を宣言し、参照先はCatオブジェクトとする。
# animal1、animal2、animal3のオブジェクトに対してbarkメソッドを実行する。
>>668 % Prolog
動物(猫,吠える) :- write('ニャーニャーと鳴く!!'),!.
動物(犬,吠える) :- write('ワンワン吠えている!!'),!.
動物(_,吠える) :- write('動物が吠えている').
>>668 % Prolog 主語が抜けた。
動物(猫,吠える) :- write('猫がニャーニャーと鳴く!!'),!.
動物(犬,吠える) :- write('犬がワンワン吠えている!!'),!.
動物(_,吠える) :- write('動物が吠えている').
>>668 % Prolog (その一) 課題11-3
得点表を入力した上で平均点を付加して一覧表示する :-
write('入力人数は? >'),get_integer(_入力人数),
得点表入力(1,_入力人数,L),
得点表表示(L).
得点表入力(N,_入力人数,[]) :- N > _入力人数,!.
得点表入力(N,_入力人数,[[_名前,_得点ならび]|R]) :-
write_formatted('%t人目 受験科目数 :',[N]),get_integer(_受験科目数),
write('名前 :'),get_line(_名前),
科目別得点入力(_受験科目数,_得点ならび),
N2 is N + 1,
得点表入力(N2,_入力人数,R).
科目別得点入力(3,[_国語,_数学,_英語]) :-
write('国語 :'),get_integer(_国語),
write('数学 :'),get_integer(_数学),
write('英語 :'),get_integer(_英語),!.
科目別得点入力(5,[_国語,_数学,_英語,_社会,_理科]) :-
write('国語 :'),get_integer(_国語),
write('数学 :'),get_integer(_数学),
write('英語 :'),get_integer(_英語),
write('社会 :'),get_integer(_社会),
write('理科 :'),get_integer(_理科),!.
>>668 % Prolog (その二) 課題11-3
得点表表示(L) :- 得点表見出し表示,得点表明細表示(L).
得点表見出し表示 :- write(' 国語 数学 英語 社会 理科 | 平均点\n').
得点表明細表示([[_名前,[_国語,_数学,_英語]]|R]) :-
_平均点 is (_国語+_数学+_英語) // 3,
write_formatted('%t %t %t %t | %t\n',[_名前,_国語,_数学,_平均点]),
得点表明細表示(R),!.
得点表明細表示([[_名前,[_国語,_数学,_英語,_社会,_理科]]|R]) :-
_平均点 is (_国語+_数学+_英語+_社会+_理科) // 5,
write_formatted('%t %t %t %t %t %t | %t\n',[_名前,_国語,_数学,_英語,_社会,_理科,_平均点]),
得点表明細表示(R),!.
http://pc12.2ch.net/test/read.cgi/tech/1263824755/547 # [1] 情報処理応用
# [2] Fortranで,
#
#
# 階乗 n! を計算する関数を作成し,
#
# 順列
# n個の異なるものからr個取り出して並べる。
# このときの順列の総数をnPrとあらわす。
# nPr=n(n-1)(n-2)・・・(n-r+1)
# を計算する関数を作成し,
#
# 組み合わせ
# 異なるn個からr個取り出して組を作る。
# このときの組合せの総数をnCrとあらわす。
# nCr = nPr/r!
# を計算するプログラムを作成してください
http://pc12.2ch.net/test/read.cgi/tech/1263824755/554 # [1] 授業単元:プログラミング 1
# [2] 問題文(含コード&リンク):
# /*************************
# ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1をstr2 に変換するのに要する操作の最低回数である
# ・ 1文字挿入する
# ・ 1文字削除する
# ・ 1文字を他の1文字に置き換える
# たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である
#
# str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい
#
# この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする.
# ******************************/
http://pc12.2ch.net/test/read.cgi/tech/1263824755/548 # [1]C言語課題
# [2] コマンドラインに与えられた文字列が単数で自然数を表しているとして
# 以下の例のように出力されるプログラムを作れ
# 入力==>3
# 132
# 231
# 入力==>5
# 1304
# 2552
# 4031
# 入力==>10
# 136107
# 259084
# 480952
# 710631
# 入力==>20
# 13610150016
# 25914201711
# 48131918127
# 71218191384
# 11172014952
# 16001510631
>>677 % Prolog
二つの数列の和によってできる数列を表示する(L1,L2) :-
二つの数列の和によってできる数列(L1,L2,L),
write_formatted('%t+%t=%t\n',[L1,L2,L3]).
二つの数列の和によってできる数列([],L,L) :- !.
二つの数列の和によってできる数列(L,[],L) :- !.
二つの数列の和によってできる数列([A|R1],[B|R2],[C|R3]) :-
C is A + B,
二つの数列の和によってできる数列(R1,R2,R3).
>>674 % Prolog 積分で、の意味かな。とりあえず球の体積の公式で。
球の体積(_半径,_球の体積) :-
_球の体積 is ( 4 / 3 ) * pi * _半径 ^ 3.
>>673 階乗(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) :- (!))).
nPr(N,R,X) :-
M is N - R + 1,
階乗(M,N,X).
nCr(N,R,X) :-
U is N - R + 1,
階乗(U,N,K1),
階乗(R,K2),
X is K1 // K2.
>>677 使用言語:J
A=:+:>:i.10
A
2 4 6 8 10 12 14 16 18 20
B=:2^i.10
B
1 2 4 8 16 32 64 128 256 512
A + B
3 6 10 16 26 44 78 144 274 532
>>679 (
>>677) 訂正
% Prolog L3とするべきところがLになっていた。
二つの数列の和によってできる数列を表示する(L1,L2) :-
二つの数列の和によってできる数列(L1,L2,L3),
write_formatted('%t+%t=%t\n',[L1,L2,L3]).
二つの数列の和によってできる数列([],L,L) :- !.
二つの数列の和によってできる数列(L,[],L) :- !.
二つの数列の和によってできる数列([A|R1],[B|R2],[C|R3]) :-
C is A + B,
二つの数列の和によってできる数列(R1,R2,R3).
% C/C++の宿題スレで採りあげやすい出題がなかったので一日完全休養しました。
>>633 使用言語:J
f=: dyad def '-_1^+./y E. x'
'abaabab' f 'aab'
1
'abaabab' f 'abb'
_1
>>625 使用言語:J
f=: monad def '+/>:I.2|>:i.<:y'
f 10
25
http://pc12.2ch.net/test/read.cgi/tech/1263824755/602 # [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# #include <stdio.h>
# int main(void){
# int a=0,k;
# for (k=0;k<100;k++){a++;
# if(a%5==0&&a%9==0)printf("A\n");
# else if(a%5==0)printf("B\n");
# else if(a%9==0)printf("C\n");
# else printf("%d\n",a);
# }return 0;}
# この処理のプログラムをスペース、改行を含み140字以内で書き直したい。
%
% 別の言語で同じ意味のプログラムを140字以内でということにしましょう。
>>686 使用言語:J
smoutput&>((0 i.~45 5 9|]){(;/'ABC'),<)"0>:i.100
>>686 % Prolog
main:-for(1,N,100),(q(N),u(N)->A='A';q(N)->A='B';u(N)->A='C';A=N),write(A),nl,N
=100.
q(N):-0 is N mod 5.
u(N):-0 is N mod 9.
>>686 使用言語:R
a=b=1:100;a[b%%5==0]="B";a[b%%9==0]="C";a[b%%45==0]="A";write(a,"")
>>686 使用言語:Lua
for i=1,100 do print(({i,"B","C","A"})[2-i*i*i*i%5+2*0^(i%9)])end
>>686 % Prolog
main:-for(1,N,100),(0=:=N mod 5,0=:=N mod 9->A='A';0=:=N mod 5->A='B';0=:=N mod 9->A='C';A=N),write(A),nl,N=100.
>>687 仮に45は反則ということにすると、どうなりますか?
>>692 >>686 使用言語:J
smoutput&>((0 i.~[:(,~+/)5 9|]){(;/'ABC'),<)"0>:i.100
>>686 使用言語:maxima
f(a,b):=1-signum(mod(a,b));for i thru 100 do print([i,"B","C","A"][f(i,5)+f(i,9)*2+1]);
http://pc12.2ch.net/test/read.cgi/tech/1263824755/555 # [1]C言語とプログラミング
# [2] キーボードから3つの整数を受け取り大きさの小さい順に出力するプログラムを作りなさい。
# 但しmain関数内ではint変数一つだけが使えるものとします。またmain関数の再帰呼び出しも
# 出来ません。(main関数の引数、argc,argvをint変数として使用することも勿論禁止します)
# main関数のみで構成されるプログラムとして下さい。
# 入力される数は1から10までの範囲にあることを常にチェックし、それ以外の入力の場合は
# 再入力を促して下さい。
>>697 再帰は禁止でしたね。うっかりしました。
再入力はrepeat/0を使えば書けますが、repeat自体が再帰そのものですから、
あまり意味がないですね。
Prologでは
>>697のmainのような膨大な冗長述語の定義は稀ではないので、
ここでは題意から離れて、その述語の生成に焦点を当ててみました。
>>696 // F#
[<EntryPoint>]
let main _ =
"1〜10の数字を3つ入力:"
|> Seq.unfold (printf "%s" >> System.Console.ReadLine >> System.Int32.TryParse
>> function
| true, x when 1 <= x && x <= 10 -> Some(Some(x), "次を入力:")
| _ -> Some(None, "1〜10の数字を再入力:"))
|> Seq.choose id |> Seq.take 3 |> Seq.sort |> Seq.iter (printf "%d ")
0
>>696 使用言語:J
エラーチェックに苦労してなんとも悲惨なことになってしまった。データnをn番目の素数で表して
変数aに掛けていき、最後に因数分解(ここで勝手にソートしてくれた)して素数からnに変換。
f=: monad define
a=.1
label_b. smoutput '(1-10)?' select. ".(1!:1)1
case. 1 do. a=.a*p:1 case. 2 do. a=.a*p:2 case. 3 do. a=.a*p:3 case. 4 do. a=.a*p:4 case. 5 do. a=.a*p:5
case. 6 do. a=.a*p:6 case. 7 do. a=.a*p:7 case. 8 do. a=.a*p:8 case. 9 do. a=.a*p:9 case. 10 do. a=.a*p:10
case. do. goto_b.
end.
label_c. smoutput '(1-10)?' select. ".(1!:1)1
case. 1 do. a=.a*p:1 case. 2 do. a=.a*p:2 case. 3 do. a=.a*p:3 case. 4 do. a=.a*p:4 case. 5 do. a=.a*p:5
case. 6 do. a=.a*p:6 case. 7 do. a=.a*p:7 case. 8 do. a=.a*p:8 case. 9 do. a=.a*p:9 case. 10 do. a=.a*p:10
case. do. goto_c.
end.
label_d. smoutput '(1-10)?' select. ".(1!:1)1
case. 1 do. a=.a*p:1 case. 2 do. a=.a*p:2 case. 3 do. a=.a*p:3 case. 4 do. a=.a*p:4 case. 5 do. a=.a*p:5
case. 6 do. a=.a*p:6 case. 7 do. a=.a*p:7 case. 8 do. a=.a*p:8 case. 9 do. a=.a*p:9 case. 10 do. a=.a*p:10
case. do. goto_d.
end.
smoutput _1 p:q:a
)
http://pc12.2ch.net/test/read.cgi/tech/1248012902/868 # 【 課題 】GUIを使った簡易テキストエディターのプログラムです。
# ---------------------------------------------------------------------------
# テキストを入力してください: I am a student!
# フォント変換後のテキスト: I am a student!
# --------------------------------------------------------------------------
# 上のような形で、JTextField オブジェクト内に文字を入力した後、
# その下に“Helvetica”, Bold, 24のフォントで変換した文字を表示させたいのですが。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI 】JTextFieldとJLabelオブジェクトを使用します
# 【 期限 】2/14(水) 夜まで
# 【 補足 】Java初心者でよく分かりません。よろしくお願いします。
>>701 % Prolog SWI-PrologにはXPCEというグラフィックライブラリが
% 付いているのですが、私はうまく使うことができずにいます。
% それでこの課題はパス。
>>702 >>698なんかも、これはPrologではできません!とした方が親切なんじゃないの?
多少とも、Prologを知らしめたいという願いがあるのなら。
できるのにできないって言うのはただのネガキャンにしかなんねえだろ
大域変数を標準に取り込むかは現在ISOの作業グループで検討中。
元々の出題の意図は「ひとつの変数だけ使って」ということでしょうから、
代入できない論理変数ではできるはずもない。大域変数を使用できたとしても、
少なくとも一つ論理変数が必要でこれは題意に沿うかどうか。
それで、冗談のような方向へ逃げてみた。
もっとも元スレを読み直してみたら、私のと同じ発想の回答がずっと前に
書き込まれていた。
706 :
705:2010/02/13(土) 15:13:25
代入できない論理変数 --> 破壊代入できない論理変数
に訂正。
大域変数については、実は現在ほとんどの処理系がサポートしています。
しかし、私はこのスレで使うつもりはありません。
707 :
705:2010/02/13(土) 15:18:17
>>705 またまた訂正。元スレを読み直したら --> 出題元スレを読み直したら
>>701 // F#
open System.Windows.Forms
open System.Drawing
type TinyEditorForm() =
inherit Form(Text = "TinyEditor", Width = 450, Height = 150)
let labelInput = new Label(Text = "テキストを入力してください:", Left = 10, Top = 10, Width = 140)
let textboxInput = new TextBox(Left = 160, Top = 10, Width = 240)
let labelOutput = new Label(Text = "フォント変換後のテキスト:", Left = 10, Top = 50, Width = 140)
let textboxOutput = new TextBox(ReadOnly = true, Left = 160, Top = 50, Width = 240, Height = 50, Font = new Font("Helvetica", 24.f, FontStyle.Bold))
do
textboxInput.TextChanged |> Event.map (fun _ -> textboxInput.Text)
|> Event.add (fun text -> textboxOutput.Text <- text)
base.Controls.AddRange [|labelInput; textboxInput; labelOutput; textboxOutput|]
[<System.STAThread>]
do
new TinyEditorForm() |> Application.Run
>>709 使用言語:J
] a=:5 5$ucp'あいうえおかきくけこさしすせそたちつてとなにぬねの'
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
f=:monad def '(1?(#y)){y'
f a
あいうえお
f a
たちつてと
http://pc11.2ch.net/test/read.cgi/db/1252492296/521 # 販売集計処理について教えてください。
# 商品テーブル
# 商品名 販売本数
# ─── ────
# お菓子
# お弁当
# 飲み物
#
# 販売履歴テーブル
# 商品名
# ───
# 飲み物
# お菓子
# お弁当
# お菓子
# お菓子
# 飲み物
# お弁当
# お弁当
#
# 商品テーブルの各商品が、販売履歴テーブルに何件ずつあるかを集計し、
# 商品テーブルの販売本数に記録させたいと思っております(日次処理)。
>>710 % Prolog
'5行の文字列のいずれかをランダムに返す'(_文字列) :-
findall(S,文字列(S),L),
N is random mod 5 + 1,
list_nth(N,L,_文字列).
文字列(あいうえお).
文字列(かきくけこ).
文字列(さしすせそ).
文字列(たちつてと).
文字列(なにぬねの).
>>710 % Prolog 非決定性にするには
'5行の文字列のいずれかをランダムに返す'(_文字列) :-
findall(S,文字列(S),L),
'5行の文字列のいずれかをランダムに返す'(L,_文字列).
'5行の文字列のいずれかをランダムに返す'(L,_文字列) :-
N is random mod 5 + 1,
list_nth(N,L,_文字列).
'5行の文字列のいずれかをランダムに返す'(L,_文字列) :-
'5行の文字列のいずれかをランダムに返す'(L,_文字列).
文字列(あいうえお).
文字列(かきくけこ).
文字列(さしすせそ).
文字列(たちつてと).
文字列(なにぬねの).
% ただし、
% ?- ..<Aゾーン>.. ,'5行の文字列のいずれかをランダムに返す'(_文字列), ..<Bゾーン>.. ,fail.
% のように使うと<Bゾーン>の記述によっては<Aゾーン>には決してバックトラックしないことに注意。
>>713 % Prolog
% <Aゾーン>にバックトラックさせるためには例えば、
'5行の文字列のいずれかをランダムに返す'(L,_文字列) :-
N is random mod 5 + 1,
list_nth(N,L,なにぬねの),!.
'5行の文字列のいずれかをランダムに返す'(L,_文字列) :-
N is random mod 5 + 1,
list_nth(N,L,_文字列).
'5行の文字列のいずれかをランダムに返す'(L,_文字列) :-
'5行の文字列のいずれかをランダムに返す'(L,_文字列).
% これで一度なにぬねのが利用された後はこの述語は非決定性の性質を一旦失う。
>>711 % Prolog
販売履歴(飲み物).
販売履歴(お菓子).
販売履歴(お弁当).
販売履歴(お菓子).
販売履歴(お菓子).
販売履歴(飲み物).
販売履歴(お弁当).
販売履歴(お弁当).
販売集計処理 :-
一意な商品名ならびを得る(L),
商品テーブルに追加(L).
一意な商品名ならびを得る(L) :- setof(_商品名,販売履歴(_商品名),L).
商品テーブルに追加([]) :- !.
商品テーブルに追加([_商品名|R]) :-
count(販売履歴(_商品名),_販売本数),
assertz(商品(_商品名,_販売本数)),
商品テーブルに追加(R).
>>711 // F#
let countCommodities cs hs =
let cnt = hs |> Seq.countBy id |> Map.ofSeq
List.map (fun c -> (c, defaultArg (Map.tryFind c cnt) 0)) cs
let commodities = ["お菓子"; "お弁当"; "飲み物"]
let salesHistory = ["飲み物"; "お菓子"; "お弁当"; "お菓子";
"お菓子"; "飲み物"; "お弁当"; "お弁当"]
countCommodities commodities salesHistory
>>701 使用言語:なでしこ
文字スタイルの指定方法はわかりませんでした。
母艦は「フォント変換表示」
「テキストを入力してください」と表示
入力欄とはエディタ
その幅は200
「フォント変換後のテキスト」と表示
出力欄とはラベル
そのテキストは「」
その幅は200
その文字書体は「Helvetica」
その文字サイズは24
入力欄を変更した時は〜出力欄のテキストは入力欄のテキスト
http://pc12.2ch.net/test/read.cgi/tech/1263824755/654 # 【質問テンプレ】
# [1] 授業単元:データ構造とアルゴリズム
# [2] 問題文(含コード&リンク):
# 生徒数1000人分の学力テスト(五教科)の得点データが有る。ここで、任意の生徒Aと
# 得点の傾向が一番近い生徒の番号を高速で抽出できるようデータ構造を組みなさい。
# (合計点が近い、ではなく、各教科の得点の傾向が大事のようです。)
#
# 生徒のデータはstruct seito{int tensuu[5];};こんな感じです。
# 単に全部検索して得点差を計算したのを提出したらダメと言われました。
# こういう問題を解く定石のようなものがあるのでしょうか・・・
# 先輩方、よろしくお願いします。
>>718 イメージとしてはレーダーチャートの五角形のかたちを「傾向」として
その重心を「近さ」のものさしにしたいけど、さっとコードにする能力はない。
最近傍探索を高速にできるアルゴリズムかな?kd木?
それか、「各教科の得点の傾向」を「点数の比率」と受け取るなら
コサイン尺度を使って普通に最近傍探索でもいいかも
# 公認野球規則二・〇四には、
#
# 「ボール」 ストライクゾーンを通過しなかった投球、または地面に
# 触れた投球で、いずれも打者が打たなかったものである。
#
# とある。この定義をプログラムとして表現しなさい。
>>722 % Prolog
ボール(X) :-
投球(X),
\+(通過した(X,ストライクゾーン)),
\+(打った(打者,X)).
ボール(X) :-
投球(X),
触れた(X,地面),
\+(打った(打者,X)).
>>722 % Prolog
ボール(公認野球規則二・〇四,X) :-
'ストライクゾーンを通過しなかった投球、または地面に触れた投球で、いずれも打者が打たなかったものである。'(X).
>>722 % Prolog
% Prolog
公認野球規則(二・〇四,ボール,X) :-
'ストライクゾーンを通過しなかった投球、または地面に触れた投球で、いずれも打者が打たなかったものである。'(X).
>>723 % Prolog 一枚のカードを作る/2 や トランプのようにならびを切る/4 は
%
http://nojiriko.asia/prolog/c134_683.html 参照
ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :-
findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]).
役(L,1,0) :- sort(L,L1),ペア(L1),!.
役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!.
ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!.
ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!.
ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!.
ペア([A|R]) :- ペア(R).
フラッシュ(_,[]) :- !.
フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R).
トランプの準備(X) :-
findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード),
トランプを切るようにならびを切る(41,53,_整列したカード,X),!.
>>727 (
>>723)
% Prolog ペア度数の数え方ですが、ワンペアを1 ツーペアを2 と勘定するなら
% ここでは採用していないがスリーカーズを3 フォーカーズを4と数えるなどもあるかもしれない。
役(L,N,0) :- sort(L,L1),ペア(L1,0,N),\+(N=0),!.
役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!.
ペア([],N,N) :- !.
ペア([A,B],N1,N) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),N is N1 + 1,!.
ペア([A,B,C|R],N1,N) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R,N1,N),!.
ペア([A,B,C|R],N1,N) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),N2 is N1 + 1,ペア([C|R],N2,N),!.
ペア([A|R],N1,N) :- ペア(R,N1,N).
>>729 % Prolog jbis/2 の定義を長くなるのでここでは省略して。
父系の収集(_目標馬,_五代血統書,X) :-
五代血統書に於いて父系は最初の5要素以内に現れる(_目標馬,_五代血統表,X),!.
父系の収集(_目標馬,[_一代父,_二代父,_三代父,_四代父,_五代父|_],[_一代父,_二代父,_三代父,_四代父,_五代父|R]) :-
jbis(_五代父,_五代遡った五代血統表),
父系の収集(_目標馬,_五代遡った五代血統表,R).
五代血統書に於いて父系は最初の5要素以内に現れる(_目標馬,_五代血統表,X) :-
append(L1,[_目標馬|_],_五代血統書),
length(L1,N),
N < 5,
append(L1,[_目標馬],X),!.
>>730 (
>>729)
% Prolog jbis/2 の定義を書くと長くなるのでここでは省略して。
>>730 実はこんなに単純ではない。
最終的に五代遡らない内に牝馬が現れてしまうことがある。
父系に目標馬が存在しなかった場合だ。このことは、
五代血統表は牡馬、牝馬の区別ができるための情報を
持つ必要があることを意味する。これがめんどうなら
jbis/2に於いて牝馬が現れたら、それ以降の情報を
切り捨ててしまう方法もある。これだと五代血統表と
名乗ることはできず「_五代父系ならび」とでもなるが。
>>732 (
>>729)
% Prolog 理屈の上では、三頭の始祖馬が出てきたら、とすればそれで良さそう
% ですが、実際には血統不詳で切れている血統表も存在するからこれでは済まない。
父系の収集(_目標馬,_五代血統表,X) :-
member(_始祖馬,['Byerley Turk','Darley Arabian','Godolphin Arabian']),
append(L1,[_始祖馬|_],_五代血統表),
length(L1,N),
N < 5,
\+(member(_目標馬,L1)),
!,fail.
父系の収集(_目標馬,_五代血統書,X) :-
五代血統書に於いて父系は最初の5要素以内に現れる(_目標馬,_五代血統表,X),!.
父系の収集(_目標馬,[_一代父,_二代父,_三代父,_四代父,_五代父|_],[_一代父,_二代父,_三代父,_四代父,_五代父|R]) :-
jbis(_五代父,_五代遡った五代血統表),
父系の収集(_目標馬,_五代遡った五代血統表,R).
734 :
デフォルトの名無しさん:2010/02/18(木) 11:19:38
父系でも血統不詳なんてあるの?
>>734 データベースがある程度完備していればない。だから
>>733は間違い。
Eclipseの時代まで遡ると種牡馬欄が空欄で母系だけ3-4代伸びている場合が
あるのだけれど、これは何だろう。
http://pc11.2ch.net/test/read.cgi/db/1252492296/545 # ・データ
# ■Relationテーブル
# TaskNo RelationTaskNo
# 1 2
# 2 3
# 2 4
# 4 5
# : :
#
# 上記はタスクと、そのタスクに関連するタスクのNoを保持しているテーブルです。
# このようなテーブルから、指定したTaskNoに関連するタスクを取得して、
# その関連タスクにまた関連するタスクを…といった形でデータを取得したいのです。
# 以前SQLServerで似たような結果を取得した際は
# WITH RELATIONS (TaskNo,RelationTaskNo)
# AS
# (SELECT TaskNo,RelationTaskNo FROM Relation WHERE TaskNo = 取得したい番号
# UNION ALL
# SELECT R.TaskNo,R.RelationTaskNo
# FROM Relation AS R INNER JOIN RELATIONS AS CTE ON R.RelationTaskNo = CTE.TaskNo)
# SELECT * FROM RELATIONS
# (当時の環境が手元にないため構文が微妙に間違っているかも…)
# どなたかご存じだったら知恵を貸してください。
>>736 % Prolog
'RelationTaskNoS'(TaskNo,[TaskNo|R]) :-
'Relation'(TaskNo,RelationTaskNo),
'RelationTaskNoS(RelationTaskNo,R).
'RelationTaskNoS'(TaskNo,[TaskNo]).
>>739 // F#
// click : 最大クリック数、page : 全ページ数
let minLink click page =
Seq.initInfinite id
|> Seq.find (fun x -> List.sumBy (pown x) [0 .. click] >= page)
>>729 // F#
open System.Text.RegularExpressions
let paternal last =
use client = new System.Net.WebClient()
let rec paternal' url =
seq {
let page = "
http://www.jbis.or.jp" + url + "pedigree/" |> client.DownloadString
let firstRow = Regex.Match(page, @"<tr>(.+?)</tr>", RegexOptions.Singleline).Groups.[1].Value
let horses = Regex.Matches(firstRow, @"<(?:td|th).*?><a href=""(.+?)"">(.+?)</a>")
|> Seq.cast<Match> |> Seq.map (fun m -> (m.Groups.[1].Value, m.Groups.[2].Value))
|> Seq.cache
yield! Seq.map snd horses
yield! Seq.nth (Seq.length horses - 1) horses |> fst |> paternal' }
let horses = paternal' "/horse/0000742976/" |> Seq.cache
Seq.take (Seq.findIndex ((=) last) horses + 1) horses
paternal "Eclipse" |> Seq.iter (printfn "%s")
# 以下は「中世の秋」ホイジンガ/堀越孝一訳(中公文庫による)の冒頭ちかくの段落です。
# ここにあらわれる文章をプログラム言語で書き換えなさい。
#
# 夏と冬の対照は、わたしたちの経験からはとても考えられないほど強烈だったが、
# 光と闇、静けさと騒がしさとの対照もまた、そうだったのである。現在、都市に住む
# 人びとは、真の暗闇、真の静寂を知らない。ただひとつまたたく灯、遠い一瞬の叫ぶ
# 声がどんな感じのものかを知らない。
>>743 使用言語:J
x1=:450
y1=:454.4
x2=:452
y2=:454.8
(y1,y2)%.2 2$x1,1,x2,1
0.2 364.4
>>743 % Prolog
'一次方程式y=ax+bの二点[x1,y1][x2,y2]から係数a,bを求める'(X1,Y1,X2,Y2,A,B) :-
A is (Y1 - Y2) / (X1 - X2),
B is Y1 - (A * X1).
>>709 使用言語:Clojure
user=> (def A ["あいうえお","かきくけこ","さしすせそ","たちつてと","なにむねの"])
#'user/A
user=> (defn f [x] (x (int(* (Math/random)(.length x)))))
#'user/f
user=> (f A)
"たちつてと"
user=> (f A)
"かきくけこ"
>>742 % Prolog 第二節目は
# 人びとは、真の暗闇、真の静寂を知らない。ただひとつまたたく灯、遠い一瞬の叫ぶ
# 声がどんな感じのものかを知らない。
知らない(人びと,_何かを) :-
知らない(_何かを).
知らない(_暗闇) :-
真の暗闇(_暗闇).
知らない(_静寂) :-
真の静寂(_静寂).
知らない(人びと,_何かの,_感じ) :-
感じ(_何かの,_感じ).
感じ(_またたく灯) :-
またたく灯(_またたく灯),
ただひとつ(_またたく灯).
感じ(_叫ぶ声) :-
叫ぶ声(_叫ぶ声),
遠い(_叫ぶ声),
一瞬の(_叫ぶ声).
>>749 % Prolog
'標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数jを求める。ただし再帰関数を用いる。'(J) :-
催促付き整数入力('自然数を入れてください :',I),
'i<(2のj乗)となる最小の自然数jを求める'(1,0,I,J).
'i<(2のj乗)となる最小の自然数jを求める'(J1,J,I,J) :- J1 > I,!.
'i<(2のj乗)となる最小の自然数jを求める'(J1,_,I,J) :-
J2 is J1 * 2,
'i<(2のj乗)となる最小の自然数jを求める'(J2,J1,I,J).
>>751 (
>>749) 訂正
% Prolog 第一節の本体。
'i<(2のj乗)となる最小の自然数jを求める'(J1,J,I,J) :- J1 >= I,!.
'i<(2のj乗)となる最小の自然数jを求める'(J1,_,I,J) :-
J2 is J1 * 2,
'i<(2のj乗)となる最小の自然数jを求める'(J2,J1,I,J).
>>751 >>752 (
>>749) 問題読み違えました。訂正。
% Prolog
'標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数jを求める。ただし再帰関数を用いる。'(J) :-
催促付き整数入力('自然数を入れてください :',I),
'i<(2のj乗)となる最小の自然数jを求める'(1,I,J).
'i<(2のj乗)となる最小の自然数jを求める'(J,I,J) :- J > I,!.
'i<(2のj乗)となる最小の自然数jを求める'(J1,I,J) :-
J2 is J1 * 2,
'i<(2のj乗)となる最小の自然数jを求める'(J2,I,J).
>>749 使用言語:J
g=:dyad def 'if. y<2^x do. <:x else. (>:x) g y end.'
f=:monad def 'if. y<3 do. '''' return. else. 1 g y end.'
f 2
f 10
3
f 100
6
>>749 // F#
// 自然数の入力処理に再帰関数を使用してみる
open System
let rec input msg =
printf "%s:" msg
match Console.ReadLine() |> Int32.TryParse with
| true, i when i > 0 -> i
| _ -> input "自然数を入力してってば"
let i = input "自然数を入力してください"
Seq.initInfinite ((+) 1) |> Seq.find (pown 2 >> (<) i) |> printfn "%d"
>>755 // F#
// なぜか 5/7 だけないのを考慮
List.sum [for i in 1N .. 2N .. 97N -> i / (i + 2N)] - 5N / 7N
http://pc11.2ch.net/test/read.cgi/db/1252492296/572 # 社員
# ・ID
# ・名前
# ・現在の課ID
# ・その他社員情報いろいろ(各列は独立した要素)
#
# 異動歴
# ・社員ID
# ・異動番号(社員ID単位の通し番号)
# ・課ID
#
# のような構造とした場合、このデータベースを使うアプリケーション上では、
# 社員というオブジェクトがあって、異動歴という可変長配列を、
# IDや名前と同じように社員オブジェクトのメンバに持たせたいです。
#
# 社員検索のSQLから引っかかった社員オブジェクトを作る際、
# WHEREやJOINで社員と異動歴をつなげた状態で検索すると
# 同じIDの社員レコードが異動歴ごとに連続して出てきてしまいます。
#
# 異動歴を固定数の列として社員テーブルに持たせてしまえば
# なにも悩まずに1つのレコードから社員オブジェクトを作れるのですが、
# このようなケースの場合、異動歴の可変長配列を作るためだけに
# 異動歴テーブル単体をあとから再検索することになるのでしょうか?
>>755 % Prolog 5/7 はうっかりミスということにして。bignumの必要あり。
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(_分子,_分母) :-
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(97,_分
子,_分母).
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(97,97,99) :- !.
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(N,_分子,_分母) :-
M is N + 2,
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(M,_分子2,_分母2),
_分子1 is ( N * _分母2 + M * _分子2),
_分母1 is M * _分母2,
約分(_分子1,_分母1,_分子,_分母),!.
>>759 (
>>755) 訂正
% Prolog 初期値が違っていた(97->1)のと改行位置を直してなかった。
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(_分子,_分母) :-
'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99を合計する'(1,_分子,_分母).
>>758 % Prolog その他社員情報は別述語を定義するべきなので割愛。
社員異動情報(_社員異動情報) :-
findall(ID,社員(ID,_,_),L),
findall([ID,_名前,_現在の課ID,_異動情報],(member(ID,L),社員異動情報(ID,_名前,_現在の課ID,_異動情報)),_社員異動情報).
社員異動情報(ID,_名前,_現在の課ID,_異動情報) :-
社員(ID,_名前,_現在の課ID),
findall([_異動番号,_課ID],異動歴(ID,_異動番号,_課ID),L),
sort(L,_異動情報),!.
>>755 使用言語:J
5/7はあるものとして。
+/(}:%}.)>:+:i.50
45.1245
有理数を使った場合。JではA/BをArBと表記する。
また、数値の末尾にxをつけると有理数リテラルになる。
+/(}:%}.)>:+:i.50x
49157712611924558897925120243494707766897r1089380862964257455695840764614254743075
>>755 使用言語:maxima
5/7はあるものとして。
(%i18) sum((i*2+1)/(i*2+3),i,0,48);
49157712611924558897925120243494707766897
-----------------------------------------
1089380862964257455695840764614254743075
>>755 使用言語:Clojure
5/7はあるものとして。
user=> (reduce + (map #(/ % (+ % 2)) (range 1 98 2)))
49157712611924558897925120243494707766897/1089380862964257455695840764614254743075
最初、他の言語での結果と違う結果になった。range の範囲を間違えていた。
下のようになる。
user=> (range 1 5)
(1 2 3 4)
>>755 使用言語:R
5/7はあるものとして。
> a<-seq(1,97,2)
> cat(sum(a/(a+2)))
45.12445
% Prologの苦手とする問題でしたので採用しました。
http://pc11.2ch.net/test/read.cgi/db/1252492296/577 # アップデータ文を使う練習問題を解いていて、どうしてもわからなくなりました。
# 一つのテーブルないで、ある行(A)を参照して、他の行(B)にその値をいれたいです。
# 簡単にかくと
# A B
# 1 1
# 2 1
# 3 1
# 4 1
# というところを
#
# A B
# 1 1
# 2 2
# 3 3
# 4 4
#
# としたいのです。
# アップデート文を一つ使って、一行分変える事はできるのですが、
# 全部で100行変えたい場合は、今のままだとSQL文を100回使わないと
# 変えられません。
>>767 % Prolog では節の出現位置に意味があるため定義された順序は変えられない。
% 行位置を指定してretract/assertをすることもできない。
update767 :- retract(テーブル(A,B)),update767_2(A,B),fail.
update767.
update767_2(A,B) :- A>=1,A=<100,assertz(A,A).
update767_2(A,B) :- \+((A>=1,A=<100)),assertz(A,B).
>>766 % Prolog
キーボードから5人分の点数を入力して、合計、平均、最高点、最低点を表示する :-
キーボードから5人分の点数を入力して(_点数ならび),
合計、平均、最高点、最低点を表示する(_点数ならび).
キーボードから5人分の点数を入力して(_点数ならび) :-
write('5人分の点数をカンマで区切って一行で入力してください : '),
get_line(_入力行),
split(_入力行,[','],_点数ならび).
合計、平均、最高点、最低点を表示する(_点数ならび) :-
findavg(_点数ならび,_平均),
findmax(_点数ならび,_最高点),
findmin(_点数ならび,_最低点),
write_formatted('平均=%t点,最高点=%t点,最低点=%t点\n',[_平均,_最高点,_最低点]).
>>742 % Prolog
現在、都市に住む人びとは、真の暗闇、真の静寂を知らない(_現在,_人びと,_都市,_真の闇,_真の静寂) :-
現在(_人びと,_現在),
都市に住む(_人びと,_都市),
人びと(_人びと),
知らない(_人びと,_真の暗闇),
知らない(_人びと,_真の静寂),
真の静寂(_真の静寂),
真の暗闇(_真の暗闇).
真の暗闇(_真の暗闇) :- 暗闇(_真の暗闇),真の(_真の暗闇).
真の静寂(_真の静寂) :- 静寂(_真の静寂),真の(_真の静寂).
現在(_人びと,_現在) :- 現在(_現在),生きる(_人びと,_現在).
都市に住む(_人びと,_都市) :- 都市(_都市).
>>772 訂正
% Prolog 引数に現れる _真の闇 は _真の暗闇 の間違いです。
>>772 % Prolog 書き直しました。一部目標の順序も変更。
現在、都市に住む人びとは、真の暗闇、真の静寂を知らない(_現在,_人びと,_都市,_真の暗闇,_真の静寂) :-
現在(_人びと,_現在),
都市に住む(_人びと,_都市),
人びと(_人びと),
真の暗闇(_真の暗闇),
知らない(_人びと,_真の暗闇),
真の静寂(_真の静寂),
知らない(_人びと,_真の静寂).
真の暗闇(_真の暗闇) :- 暗闇(_真の暗闇),真の(_真の暗闇).
真の静寂(_真の静寂) :- 静寂(_真の静寂),真の(_真の静寂).
現在(_人びと,_現在) :- 現在(_現在),生きる(_人びと,_現在).
都市に住む(_人びと,_都市) :- 都市(_都市).
775 :
デフォルトの名無しさん:2010/03/03(水) 09:02:36
>>774 > ... 真の(_真の暗闇),
のところだけど、
... 真の(暗闇,_真の暗闇), ...
であるべきでは?
>>771 % Prolog
'角度0から90°,10°刻みのsin,cos,tanの表を作成する' :-
member(F,[sin,cos,tan]),
functor(_式,F,1),
arg(1,_式,R),
for(0,N,9),
N2 is N * 10,
R is pi * N2 / 180,
X is _式,
assertz('角度0から90°,10°刻みのsin,cos,tanの表'(F,N2,X)),
N = 9,
fail.
'角度0から90°,10°刻みのsin,cos,tanの表を作成する'.
>>770 % Prolog
成績を表示する :-
成績を登録する,
登録された成績を表示する.
成績を登録する :-
処理する人数は40人であるとする.
処理する人数は40人であるとする :-
for(1,N,40),
write_formatted('%t番の成績を入力せよ\n',[N]),
get_integer(_点数),
assertz(成績(N,_点数)),
write_formatted('%t番の成績として%点を登録しました\n',[N,_点数]),
N = 40,!.
登録された成績を表示する :-
成績(N,_点数),
write_formatted('%t番目の成績は%t点です\n',[N,_点数]),
fail.
登録された成績を表示する.
>>778 % Prolog
要素変換([],_,[]) :- !.
グリッド要素変換([[X,Y,V],[X2,Y2,V2]|R1],Sum,[[X,Y1,Avg]R2]) :-
\+(X=X2),
Y1 is Y // 5,
M is Y mod 5,
Avg is (Sum + V) / M,
グリッド要素変換([[X2,Y2,V2]|R1],0,R2),!.
グリッド要素変換([[X,Y,V],[X,Y2,V2]|R1],Sum,[[X,Y1,Avg]|R2]) :-
0 is Y mod 5,
Y1 is Y // 5,
Avg is (Sum + V) / 5,
グリッド要素変換([[X2,Y2,V2]|R1],0,R2),!.
グリッド要素変換([[X,Y,V],[X,Y2,V2]|R1],Sum,L) :-
Sum2 is Sum + V,
グリッド要素変換([[X,Y2,V2]|R1],Sum2,L),!.
>>779 (
>>778)
% Prolog 第一節に文字置換を書け損ねた。
グリッド要素変換([],_,[]) :- !.
グリッド要素変換([[X,Y,V],[X2,Y2,V2]|R1],Sum,[[X,Y1,Avg]R2]) :-
\+(X=X2),
Y1 is Y // 5,
M is Y mod 5,
Avg is (Sum + V) / M,
グリッド要素変換([[X2,Y2,V2]|R1],0,R2),!.
グリッド要素変換([[X,Y,V],[X,Y2,V2]|R1],Sum,[[X,Y1,Avg]|R2]) :-
0 is Y mod 5,
Y1 is Y // 5,
Avg is (Sum + V) / 5,
グリッド要素変換([[X2,Y2,V2]|R1],0,R2),!.
グリッド要素変換([[X,Y,V],[X,Y2,V2]|R1],Sum,L) :-
Sum2 is Sum + V,
グリッド要素変換([[X,Y2,V2]|R1],Sum2,L),!.
書け損ねた -> 掛け損ねた w
http://pc11.2ch.net/test/read.cgi/db/1252492296/594 #(問)
# ID | DATE | DATA
# --+----------+-----
# 1 | 2007-11-11 | aaa
# 2 | 2007-11-11 | bbb
# 1 | 2007-11-10 | ccc
# 3 | 2007-11-12 | ddd
# 3 | 2007-11-11 | eee
# 4 | 2007-11-10 | fff
# 1 | 2007-11-12 | ggg
#
# このようなテーブルから、各idに対して最新の5件だけ抽出しなさい
>>782 % Prolog
各idに対して最新の5件だけ抽出する(_テーブル名,L) :-
functor(Q,_テーブル名,3),
setof(ID,Q,L1),
整列(L1,L2),
findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L).
idに対して最新の5件だけ抽出する(ID,Q,L) :-
arg(1,Q,ID),
findall(L1,(call(Q),Q=..[_|L1]),L2),
整列(L2,L3),
length(L,5),
最新の5件だけ抽出する(L3,L).
最新の5件だけ抽出する(L3,L) :-
append(_,L,L3),!.
最新の5件だけ抽出する(L,L) :- !.
>>782 % Prolog
各idに対して最新の5件だけ抽出する(_テーブル名,L) :-
functor(Q,_テーブル名,3),
重複を排除したidならびの抽出(ID,Q,L1),
整列(L1,L2),
findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L).
idに対して最新の5件だけ抽出する(ID,Q,L) :-
目標Qの第一引数はID(ID,Q),
idに対して組ならびを抽出する(Q,L3),
最新の5件だけ抽出する(L3,L).
idに対して組ならびを抽出する(Q,L3) :-
findall(L1,(call(Q),引数部分だけ抽出する(Q,L1)),L2),
整列(L2,L3),!.
重複を排除したidならびの抽出(ID,Q,L1) :- setof(ID,Q,L1).
目標Qの第一引数はID(ID,Q) :- arg(1,Q,ID),!.
引数部分だけ抽出する(Q,L1) :- Q =.. [_|L1].
最新の5件だけ抽出する(L3,L) :-
length(L,5),
append(_,L,L3),!.
最新の5件だけ抽出する(L,L) :- !.
http://pc12.2ch.net/test/read.cgi/tech/1263824755/826 # [1] 授業単元:C++
# [2] 問題文(含コード&リンク):
# 任意の整数から整数までの合計を計算するプログラムを作成せよ。ただし、必ず、(始めに入れた数字)<(最後に入れた数字)となるように数値を入力するものとする。
# 始めの数を入力せよ
# 156
# 終わりの数を入力せよ
# 328
# 156から328までの合計は41866です。
#
# 上の問題では(始めに入れた数字)<(最後に入れた数字)としたが、
# これを、(始めに入れた数字)≧(最後に入れた数字)と入力しても合計を計算できるようなプログラムも作成せよ
>>785 % Prolog
任意の整数から整数までの合計を計算する(_開始整数,_終了整数,_合計) :-
findsum(N,for(_開始整数,N,_終了整数),_合計).
http://pc12.2ch.net/test/read.cgi/tech/1248012902/967 # 【 課題 】
# ○県、市別に男女の人数を集計するプログラムを作成せよ。
#
# 千葉県 柏市 男
# 千葉県 松戸市 男
# 埼玉県 さいたま市 女
# 千葉県 柏市 男
# 埼玉県 越谷市 男
# 千葉県 松戸市 男
# 埼玉県 岩槻市 女
# 千葉県 柏市 女
# 埼玉県 さいたま市 女
#
# [実行例]
# 千葉県 柏市:男2人女1人
# 千葉県 松戸市:男1人0人
# 埼玉県 さいたま市:男0人女2人
# (以下略)…
#
>>787 % Prolog
県、市別に男女の人数を集計する(_ファイル,_集計ならび) :-
get_split_lines(_ファイル,[' '],L1),
整列(L1,L2),
県、市別に男女の人数を集計する(0,L2,_集計ならび).
県、市別に男女の人数を集計する(N,[[_県,_市,_性別]],[[_県,_市,_性別,N2]]) :-
N2 is N + 1,!.
県、市別に男女の人数を集計する(N,[[_県,_市,_性別],[_県,_市,_性別]|R1],R2) :-
N2 is N + 1,
県、市別に男女の人数を集計する(N2,[[_県,_市,_性別]|R1],R2),!.
県、市別に男女の人数を集計する(N,[[_県,_市,_性別]|R1],[[_県,_市,_性別,N2]|R2) :-
N2 is N + 1,
県、市別に男女の人数を集計する(0,R1,R2),!.
>>789 % Prolog
入力した整数の桁を数える :-
催促付き整数入力('整数値を入力せよ\n',N),
入力した整数の桁を数える(N,_桁),
write_formatted('%t桁である。\n',[_桁]).
入力した整数の桁を数える(N,1) :- 0 is N // 10,!.
入力した整数の桁を数える(N,X) :-
M is N // 10,
入力した整数の桁を数える(M,Y),
X is Y + 1.
>>790 % Prolog クイックソートのみ。
クイックソート(_対象ならび,_整列された値ならび) :-
第一要素を分割値とする(_対象ならび,_分割値,_残り対象ならび),
分割値に対しての大小でならびを二分割する(_分割値,_残り対象ならび,_分割値より小さいかまたは等しい値ならび,_分割値より大きい値ならび),
分割されたならびを部分的に整列する(_分割値より小さいかまたは等しい値ならび,_整列された分割値より小さいかまたは等しい値ならび),
分割されたならびを部分的に整列する(_分割値より大きい値ならび,_整列された分割値より大きい値ならび),
整列された二つのならびと分割値を結合する(_分割値,_整列された分割値より小さいかまたは等しい値ならび,_整列された分割値より大きい値ならび,_整列された値ならび).
クイックソート([],[]).
第一要素を分割値とする([_分割値|_残り対象ならび],_分割値,_残り対象ならび).
分割値に対しての大小でならびを二分割する(_,[],[],[]) :- !.
分割値に対しての大小でならびを二分割する(_分割値,[A|R1],[A|R2],R3) :-
A @=< _分割値,
分割値に対しての大小でならびを二分割する(_分割値,R1,R2,R3),!.
分割値に対しての大小でならびを二分割する(_分割値,[A|R1],R2,[A|R3]) :-
A @> _分割値,
分割値に対しての大小でならびを二分割する(_分割値,R1,R2,R3),!.
分割されたならびを部分的に整列する(_分割された値ならび,_整列された分割された値ならび) :-
クイックソート(_分割された値ならび,_整列された分割された値ならび),!.
整列された二つのならびと分割値を結合する(_分割値,_整列された分割値より小さいかまたは等しい値ならび,_整列された分割値より大きい値ならび,_整列された値ならび) :-
append(_整列された分割値より小さいかまたは等しい値ならび,[_分割値|_整列された分割値より大きい値ならび],_整列された値ならび),!.
>>776 (
>>771) 訂正
% Prolog tan(pi/2) は除外が適切か。
'角度0から90°,10°刻みのsin,cos,tanの表を作成する' :-
member(F,[sin,cos,tan]),
functor(_式,F,1),
arg(1,_式,R),
for(0,N,9),
\((N=9,F=tan)),
N2 is N * 10,
R is pi * N2 / 180,
X is _式,
assertz('角度0から90°,10°刻みのsin,cos,tanの表'(F,N2,X)),
N = 9,
fail.
'角度0から90°,10°刻みのsin,cos,tanの表を作成する'.
>>793 さらに訂正
\((N=9,F=tan)), -> \+((N=9,F=tan)),
http://pc11.2ch.net/test/read.cgi/db/1252492296/599 # 以下のSQLで最新日の2000円以上の売上があった商品を抽出しているんですが、
# SELECT * FROM SALES WHERE uriage >= 2000 AND date = (select max(date) from SALES)
# 「その商品の前回売上があった日の売上額」と「前回の売上と比べてどれだけ増えたのかの増加率」
# を出したい場合どうしたらいいでしょう?
#
# 商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率
# 3 | 1267714800 | 2500 | ????? | ?????
# 4 | 1267714800 | 2800 | ????? | ?????
#
# [日付の形式はunixtimeで、データ登録の際は日付だけ変更させ、時間と秒は常に統一させています]
>>795 % Prolog
前回売上との比較売上表(_年/_月/_日) :-
setof(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび),
write('商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率\n'),
member(_商品ID2,_売上のあった商品IDならび),
当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),
前回売上があった日(_商品ID2,_日付,_前回売上があった日),
前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),
売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),
fail.
前回売上との比較売上表(_,_,_).
前回売上があった日(_商品ID,_日付,_前回売上があった日) :-
localtime(_日付,_年1,_月1,_日1,_,_,_,_),
findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日).
前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-
findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計).
当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-
findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計).
売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-
write_formatted('%14d | %2d/%2d/%2d | %12.0f | %12.0f | -------------- | ----\n',[_商品ID2,_年/_月/_日,_売上金額計]),!.
売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-
_売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,
write_formatted('%14d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!.
>>796 (
>>795) 訂正
% Prolog 最初の5行が微妙に変わっています。
前回売上との比較売上表(_年/_月/_日) :-
findall(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび),
sort(_売上のあった商品IDならび,_売上のあった商品IDならび2),
write('商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率\n'),
member(_商品ID2,_売上のあった商品IDならび2),
当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),
前回売上があった日(_商品ID2,_日付,_前回売上があった日),
前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),
売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),
fail.
前回売上との比較売上表(_,_,_).
前回売上があった日(_商品ID,_日付,_前回売上があった日) :-
localtime(_日付,_年1,_月1,_日1,_,_,_,_),
findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日).
前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-
findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計).
当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-
findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計).
売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-
write_formatted('%14d | %2d/%2d/%2d | %12.0f | %12.0f | -------------- | ----\n',[_商品ID2,_年/_月/_日,_売上金額計]),!.
売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-
_売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,
write_formatted('%14d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!.
http://pc11.2ch.net/test/read.cgi/db/1252492296/602 # MYSQLを使っています。
# SELECT * FROM aaa WHERE id = ●
# この●の部分が複数ある場合、例えば 3,9,14,43,413,545のような場合に
# 一度に結果を取り出したいのですが、どういう風にかけばいいでしょうか?
# 他のテーブルにid_list = "3 9 14 43 413 545"
# のように入っていているのですが
# これをsplitしてid=3 id=9のようにして
# SELECT * FROM aaa WHERE id = ●を繰り返すコードにしてるですが
# 数増えたらとんでもないことになるじゃん・・・って気づきました。
#
>>798 % Prolog
'SELECT * FROM aaa WHERE id = ●'(IdList,Id,Data) :-
split(IdList,[' '],L),
aaa(Id,Data),
member(Id,L).
// F#
//
>>766 open System
let statistics() =
let rec input n =
printf "%d人目の点数を入力せよ:" n
match Console.ReadLine() |> Int32.TryParse with
| true, x -> x | _ -> input n
let scores = [for i in 1 .. 5 -> input i]
(List.sum scores, List.averageBy float scores, List.max scores, List.min scores)
//
>>767 type Table = { A : int; B : int }
let update = List.map (fun t -> { t with B = t.A })
// F#
//
>>771 open System
let trigonometric() =
printfn "deg sin cos tan"
[0 .. 10 .. 90] |> List.map (function
| 90 -> (90, 1., 0., Double.NaN)
| d -> let r = float d * Math.PI / 180. in (d, sin r, cos r, tan r))
|> List.iter (fun (x, s, c, t) -> printfn "%3d %10.8g %10.8g %10.8g" x s c t)
//
>>782 type Table = { ID : int; DATE : System.DateTime; DATA : string }
let latest5 tables =
tables |> Seq.groupBy (fun t -> t.ID)
|> Seq.map (snd >> Seq.toList >> List.sortBy (fun t -> t.DATE) >> List.rev >> Seq.truncate 5)
|> Seq.concat
なんだかPrologばっかりだな
転載してる人=Prologの人
なのかな?
// F#
//
>>785 open System
let sum() =
let rec input msg =
printfn "%sの数を入力せよ" msg
match Console.ReadLine() |> Int32.TryParse with
| true, x -> x | _ -> input msg
let (a, b) = (input "初め", input "終わり")
[min a b .. max a b] |> List.sum |> printfn "%dから%dまでの合計は%dです。" a b
//
>>787 type Table = { Pref : string; City : string; Sex : string }
let count tables =
tables |> Seq.groupBy (fun t -> (t.Pref, t.City))
|> Seq.map (fun (address, ts) ->
let cs = ts |> Seq.countBy (fun t -> t.Sex) |> Map.ofSeq
let cs' = List.map (fun s -> (s, defaultArg (Map.tryFind s cs) 0)) ["男"; "女"]
(address, cs'))
>>785 使用言語:J
f=:dyad def '+/(x<.y)+i.>:|y-x'
156 f 328
41866
328 f 156
41866
>>771 使用言語:J
a=:,.10 * i.10
b=:1r180p1 * a
c=:'deg';'sin';'cos';'tan'
c,:a;;/8j6":1 2 3 o./b
+---+--------+--------+--------+
|deg|sin |cos |tan |
+---+--------+--------+--------+
| 0 |0.000000|1.000000|0.000000|
|10 |0.173648|0.984808|0.176327|
|20 |0.342020|0.939693|0.363970|
|30 |0.500000|0.866025|0.577350|
|40 |0.642788|0.766044|0.839100|
|50 |0.766044|0.642788|1.191754|
|60 |0.866025|0.500000|1.732051|
|70 |0.939693|0.342020|2.747477|
|80 |0.984808|0.173648|5.671282|
|90 |1.000000|0.000000|********|
+---+--------+--------+--------+
>>785 使用言語:R
> f<-function(a,b)sum(a:b)
> f(1,10)
[1] 55
> f(10,1)
[1] 55
>>790 // F#
/// バブルソート
let bsort xs =
let rec bsort' = function
| [] -> [] | a::[] -> a::[]
| a::b::rs when a > b -> b::bsort' (a::rs)
| a::b::rs -> a::bsort' (b::rs)
[for _ in 1 .. List.length xs - 1 -> bsort'] |> List.fold (fun x f -> f x) xs
/// 挿入ソート
let isort xs =
let a = ResizeArray()
xs |> List.iter (fun x ->
match ResizeArray.tryFindIndex ((<) x) a with
| Some(i) -> a.Insert(i, x)
| None -> a.Add x)
ResizeArray.toList a
/// クイックソート
let rec qsort = function
| [] -> []
| x::xs ->
let (a, b) = List.partition ((>=) x) xs
qsort a @ [x] @ qsort b
>>790 続き
// F#
/// ヒープソート
let hsort xs =
let a = List.toArray xs
let swap i j = let t = a.[j] in a.[j] <- a.[i]; a.[i] <- t
let rec toHeap i len =
let (c1, c2) = (i * 2 + 1, i * 2 + 2)
if c2 < len then
toHeap c1 len; toHeap c2 len
match List.maxBy (Array.get a) [i; c1; c2] with
| m when m <> i -> swap i m; toHeap m len
| _ -> ()
elif c2 = len && a.[i] < a.[c1] then swap i c1
for len = a.Length downto 2 do
toHeap 0 len; swap 0 (len - 1)
Array.toList a
// 処理時間計測
let random = System.Random()
let xs = [for _ in 1 .. 1000 -> random.Next(1000)]
[bsort; isort; qsort; hsort] |> List.iter (fun f ->
let watch = System.Diagnostics.Stopwatch.StartNew()
f xs |> ignore
watch.Stop()
printfn "%O" watch.Elapsed)