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


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

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



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

2 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 10:15:16 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2a(数式の読み込みと表示)
#
# 課題 2a と 2b では,算術式を読み,表示し,値を求めるプログラムを作る.
#
# 限られた時間内で数式処理の本質部分を効率よく学ぶために,
# 入力できる算術式の構文を,次の BNF で定めるものに限る.
#
# 定数 ::= 0 | 1 | … | 9
# 変数 ::= a | b | … | z | A | B | … | Z
# 算術式 ::= 定数
# | 変数
# | (算術式+算術式)
# | (算術式*算術式)
#
# つまり,1桁の定数や1文字の変数の和や積からなる式が入力である.
#
# 入力された算術式を読み込み,2分木データとして格納し,そのデータをもとに
# 入力と同じ算術式を表示する,という処理(下図)を繰り返すプログラムを作れ.
#

3 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 10:18:27 ]
>>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,'*')),!.

4 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 10:23:44 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2b(数式の値の計算)
#
# 課題 2a のプログラムに,算術式の値を計算して表示する機能を追加せよ.
# ただし,変数の値は全て1であるとして,式の値を求めること.
#
# 例えば,入力が (2*3) と (x+(y+z)) の場合,次のような出力をすればよい.
# show: に続いて入力された算術式を,eval: に続いて算術式の値を表示している.
#
# (2*3) ←入力
# show: (2*3)
# eval: 6
#
# (x+(y+z)) ←入力
# show: (x+(y+z))
# eval: 3
#
# まず,算術式の値を求める関数 eval_exp()(exp.c にある)を完成させる.
# 十分な数の検査データを使って動作の正しさを確かめよ.
#

5 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 10:24:43 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/309
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt
# ●基本課題 2c(数式データの基本操作)
# 算術式の値を変えずに括弧をくくり直す簡単な式変形を考える.例えば,式
# (1+(2+3))
# (a*(b*c))
# ((i*x)+((j*y)+(k*z)))
# の括弧を左にくくり直すと,それぞれ,次の式になる.
# ((1+2)+3)
# ((a*b)*c)
# (((i*x)+(j*y))+(k*z))
# 括弧を左にくくり直せる (A+(B+C)) や (A*(B*C)) の形の算術式を
# ((A+B)+C) や ((A*B)*C) の形にする式変形は,式に対応する木を
# 「左に転回」する変形と捉えられる(下図).
#
# www.cs.info.mie-u.ac.jp/~toshi/lectures/tree/exp012.png → www.cs.info.mie-u.ac.jp/~toshi/lectures/tree/exp013.png
#
# この操作を実行する関数 rotate_left_exp()(exp.c にある)を完成させよ.
# この関数を使い,可能な場合にだけ算術式の括弧を左にくくり直す関数
# assoc_left() を ex2.c に作って動作確認せよ.

6 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:00:48 ]
pc12.2ch.net/test/read.cgi/tech/1136994325/977
# ターミナル上でテキストを編集するプログラムを作成せよ
# 以下のコマンドも使えるようにする事
#
# i =テキスト挿入
# p =単語の手前にポインタ移動
# d =入力した数だけポインタの後ろの文字を消す
# c =入力した文字列をポインタの後の文字列に置き換える
# s =ポインタの後に空白挿入
# q =終了
#


7 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:03:24 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/112
# 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
#  ポーカーゲーム(の一部)をC言語にて作成する。
#
#  ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
#    カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
#    プレイヤは配られたカードの中から交換するものを選択できるようにする。
#    ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
#    プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
#  表示、カードの選択は標準入出力を利用してください。
#


8 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 12:09:23 ]
>>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').


9 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 12:38:54 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/509
# 【 課題 】prolog.asia/img/841.jpg
# 図の有向グラフの最短経路を求めよ。
# 初期値がMAXでアルゴリズムを作れ。


10 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:08:52 ]
>>4
% Prolog

算術式の値を計算して表示 :-
  get_line(Line),
  算術式解析(Line,_,1,_,_式),
  write_formatted('show:%t\n',[_式]),
  X is _式,
  write_formatted('eval:%t\n',[X]).

% 算術式解析/5 他の定義は pc12.2ch.net/test/read.cgi/tech/1261443439/3 参照



11 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:16:58 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/365
# [1] 授業単元:初級プログラミング
# [2] 問題文(含コード&リンク):マインスイーパーを作ってください。
# ・縦の列はABC...で、横の列は123...で表示し、座標を繰り返し入力する
# ・枡の大きさは自由である(難易度ごとに大きさを選べる等要工夫)
# ・地雷の位置は毎回ランダムであること
# ・指定(入力)した座標には周囲の地雷の数を表示させる
# ・地雷のある座標を入力するか、全ての安置を入力することでクリアとする
# ・その他、工夫等が見られると加点

12 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:44:32 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/353
# [1] 授業単元:基礎プログラミング講義
# [2] 問題文(含コード&リンク):以下の処理はサブ関数で作成する。数値(n)を反転した値を表示せよ。123→321
#


13 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:49:40 ]
>>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).

14 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 15:57:49 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 02:04:11 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/388
# [1] 授業単元:計算機入門及び演習
# [2] 問題文(含コード&リンク):ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10300.txt
# prolog.asia/txt/10300.txt


16 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 03:34:55 ]
>>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).

17 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 03:39:42 ]
>>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 mailto:sage [2009/12/23(水) 04:08:35 ]
>>6 は行エディタを指定しているらしいけれど、どうせやるなら、Emacs風にいきたいw

19 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 04:11:57 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/635
# 【 課題 】コマンドラインから数値を受け取り、その数値の因数を全て表示するプログラムを完成させなさい。
# 【 形態 】1. Javaアプリケーション(main()で開始)


20 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 04:23:00 ]
>>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).




21 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:18:44 ]
このスレのPrologの回答アーカイブ nojiriko.asia/prolog/
落雷事故以来停止していますが、来週に復旧する予定です。今は雪が
積もってしまって、少々ラッセルしないとたどり着けないので一週間先
に延ばしました。

22 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:25:12 ]
pc12.2ch.net/test/read.cgi/tech/1258320456/52
# 【 課題 】和歌について考察する問題。
# 歌 ... こぬ人を待つほの浦の夕凪にやくやもしほの身もこがれつつ (定家)
# これはかなり複雑なうたです。
# 人をまつとは「待つ」であり、「松」です。まつ帆だからです。松の姿に似た帆です。
# もちろん松は浦の背景でもあります。浦は夕凪ですから心は風を「待って」もいます。
# 風はありませんから、待ってもこぬ人なのです。風があの人なのかそれとも帆船なのか
# 微妙です。浦は「浦」であると同時に心の「裏」であり、あの人(風)の気持ちを「占」なふ、
# うらでもあります。
# 「焼くや」(やいているのだろうか)とは、恋に焦がれて身を焼いているのであり、
# やくやもしほとは藻塩(自分)が陽にあぶられ、渇き、焼かれ、煙でいぶされ、さらに
# 煮られ、再び乾かされというような、製塩法の愛の地獄絵であり、身もこがれという
# 言葉には「藻」がここでも含まれています。製塩の煙は夕凪の浦に実際に漂って
# いるのかもしれません。
# 以上のような、この歌に含まれる語とそれからくる連想をプログラムで表現しなさい。

23 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:30:37 ]
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
# の数値解をオイラー法によって求めよ。
#


24 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:32:24 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/112
# 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):
#  ポーカーゲーム(の一部)をC言語にて作成する。
#
#  ポーカーゲーム(の一部)は以下の条件を満足させてください。
#
#    カードのシャッフルを行い、プレイヤ、ディーラにそれぞれ5枚ずつカードを配る。
#    プレイヤは配られたカードの中から交換するものを選択できるようにする。
#    ディーラ側の選択ルーチンはダミーの関数(たとえば全部交換、交換しない等)を用意すれば十分です。
#    プレイヤ、ディーラそれぞれの役を判定して勝敗を表示する。
#
#  表示、カードの選択は標準入出力を利用してください。
#



25 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:37:08 ]
sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
# 3.以下のプログラムを作成
# 3x3マスのマルバツゲームのボードを作成
# ○側と×側が交互に2次元座標上の位置を入力
# 入力後、毎回ボードを表示する
# たて、よこ、斜めのいずれかに○か×が3つ並んだ
# 時点でプログラムを終了


26 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:38:27 ]
pc12.2ch.net/test/read.cgi/tech/1255709298/596
# [1] 授業単元:
# アルゴリズムとプログラミング
# [2] 問題文(含コード&リンク):
# 下のアドレスのプログラムに追加して、ダイクストラ法のプログラムを完成させてください
# ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10070.txt
# プログラムに使用するデータファイル↓
# ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10071.txt
# 次のプログラムに、以下の2〜6の処理を追加してダイクストラのプログラムを完成させてください。
# 2、送信ノードに接続されている全てのノードについて、接続リンクの長さを送信ノードからの距離とする。
# 3、送信ノードに接続されている全てのノードのうち、最短の距離を持つノードを確定とする
# 4、確定したノードに接続されている全てのノードについて、送信ノードからこの確定ノードを経由して到達する経路の距離を計算し、これまでの距離より短ければ更新する
# 5、まだ確定していないノードのうち、送信ノードからの距離が最短のノードを確定とする
# 6、全てのノードが確定するまで4,5の処理を繰り返す。


27 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:44:54 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/209
# [1] 授業単元:Cプログラミング入門
# [2] 問題文(含コード&リンク):
# 五目並べの作成
# 主に終了判定関数、コンピューターによる着手の生成関数の作成
# サンプルプログラム:ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10289.txt
#

28 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:46:32 ]
#【 課題 】
#「0.2+0.4+0.6+・・・・・+10.0の計算を行うプログラムを作成せよ。」と
# いう課題文が与えられたとする。
# この文を、公差数列 0.2,0.4,0.6...10.0の和を計算する課題であると認識する
# ことができる最小限のプログラムを示せ。


29 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:51:43 ]
pc12.2ch.net/test/read.cgi/tech/1245017721/12
# 実際の問題を簡単にした問題例です。
#
# 流れ:
# キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
# ということを目標金額まで繰り返し、到達したらその金がなくなるまで
# 家でごろ寝し、なくなったらまた働く
#
# キャラクタは
#   ・バイトをする : 手持ちが1増える
#   ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
#   ・家で寝る : 貯金が1減る
# の状態を取ります。
# 財布の許容量は3、目標貯金額は5とします。
#

30 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 05:56:02 ]
pc12.2ch.net/test/read.cgi/tech/1136788500/434
# 50人のクラス(男子35人)から5人の委員をランダムに選ぶ。このとき選ばれた委員の中に男3人、女2人が入る確率をBASICで求めよ。
#



31 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 06:01:59 ]
# <<課題>
pc12.2ch.net/test/read.cgi/tech/1244449887/364
# [1] 授業単元: プログラミング実験
# [2] 問題文(含コード&リンク): 
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9455.txt
#【課題1】
#
# 完全列挙法(力ずく法)を用いて巡回セールスマン問題(TSP) を解くプログラムを作成せよ。
# (※1 : 適当に出発点を設定し、そこから出発するすべての閉路を求めその中で最短のものを選択、出力する)
# (※2 : 都市数は外部から入力するものとする)
# (注意 : プログラムを動かすとき決して大きな都市数を与えてはならない)

32 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 06:03:02 ]
#【課題2】
#
# 順次生成・比較法により、閉路を順次生成し、これまでの最短経路長をもった閉路と閉路長を比較することによってTPSを解くプログラムを作成せよ。
# (※1 : 適当に出発点を定め、そこを出発点とする閉路をひとつ生成し、それをとりあえず最短閉路とする)
# (※2 : 新たに経色を生成し、その閉路長をその時点での最短閉路長と比較し、短い方を最短閉路とする)
# (※3 : 上記のことを全ての閉路について繰り返し、最短閉路を求める)

33 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 07:04:58 ]
pc12.2ch.net/test/read.cgi/tech/1250204272/923
# [1] 授業単元: プログラミング
# [2] 問題文:ナップサック問題のプログラムを利用し、グラフ彩色問題に当てはめる(色は4色で)


34 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 07:09:09 ]
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 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 17:44:52 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/405
# [1]授業単元:プログラミング
# [2] 課題:覆面算
# ttp://www.iba.k.u-tokyo.ac.jp/~iba/C/lesson1.html
#
# osaka + kyoto = tokyo
#
# 覆面算を解く。
# 同じ文字は同じ数字を、違う文字は異なる数字を表す。
# 先頭の文字が0にならないことに注意する。

36 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:35:26 ]
>>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

37 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 00:30:41 ]
>>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.

:- 加算表定義.

38 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 04:47:02 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/421
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 問1 辺の和が3以上1000以下の直角三角形の個数を求めよ。
# 各辺の長さは自然数で、ある直角三角形の各辺を定数倍したものもカウントすることとする。
# 問2 問1 で検索した直角三角形のうち、最も面積の大きい直角三角形の3辺の長さ
#


39 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 04:58:45 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/273
# [1] 授業単元: 数理計画法
# [2] 問題文(含コード&リンク): シンプレックス法のプログラムを作成せよ。


40 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 06:56:20 ]
辺の和が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 mailto:sage [2009/12/24(木) 07:17:15 ]
>>38
% Prolog

42 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 09:07:33 ]
>>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)),!.


43 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 09:17:34 ]
>>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]),!.

44 名前:40,41,42,43 mailto:sage [2009/12/24(木) 10:09:01 ]
辺の和が3以上1000以下の直角三角形という最初の部分が正しく書けていなかったので
後で両方とも書き直します。

45 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 11:01:39 ]
>>40
の方針でやると、半日経っても答えは返らないのでは。Prologではね


46 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:14:15 ]
>>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.

47 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:19:58 ]
>>46

述語名とそれへの副目標を

辺の和がM以下の直角三角形 -> 辺の和がMin以上Max以下の直角三角形

に変更してください。

48 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:59:46 ]
>>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.


49 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:07:40 ]
# [1] 授業単元:Prolog初歩
# [2] 課題:以下の情報を述語として定義しなさい。
#
# 賞味期限
# 16…予約はじまる
# 22…予約最盛期
# 23…我慢できない
# 24…最盛期
# 25…ロスタイム
# 26…半額
# 27…更に半額
# 28…返品
# 29…廃棄処分
# 30…廃棄処分逃れてもカビ
#

50 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:13:16 ]
>>49
% Prolog

:- op(500,xfx,…).

賞味期限(16…予約はじまる).
賞味期限(22…予約最盛期).
賞味期限(23…我慢できない).
賞味期限(24…最盛期).
賞味期限(25…ロスタイム).
賞味期限(26…半額).
賞味期限(27…更に半額).
賞味期限(28…返品).
賞味期限(29…廃棄処分).
賞味期限(30…廃棄処分逃れてもカビ).



51 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:50:47 ]
>>49
% Prolog

賞味期限(16,予約はじまる).
賞味期限(22,予約最盛期).
賞味期限(23,我慢できない).
賞味期限(24,最盛期).
賞味期限(25,ロスタイム).
賞味期限(26,半額).
賞味期限(27,更に半額).
賞味期限(28,返品).
賞味期限(29,廃棄処分).
賞味期限(30,廃棄処分逃れてもカビ).


52 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 17:11:44 ]
>>22
% Prolog こんなところから。

重層的な対象(待つ,人).
重層的な対象(待つ,風).
重層的な対象(焼く,身).
重層的な対象(焼く,藻).

形態的近似(松,帆).
形態的近似(帆,松).

音通(待つ,松).
音通(松,待つ).
音通(裏,占).
音通(占,裏).
音通(裏,浦).
音通(浦,裏).
音通(占,浦).
音通(浦,占).

連想(X,Y) :- 音通(X,Y).
連想(X,Y) :- 形態的近似(X,Y).
連想(X,Y) :- 連想(X,Z),連想(Z,Y).

53 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 18:12:47 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 18:29:49 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/652
# 【 課題 】キーボードから文字入力し、":"で文字列分割をし、結果を表示する。
# 文字列分割の際にはsplitメソッドを利用すること。


55 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 18:52:34 ]
>>54
% Prolog

'キーボードから文字入力し、":"で文字列分割をし、結果を表示する' :-
  get_line(Line),
  split(Line,[':'],L),
  write_formatted('%t\n',[L]).

56 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 21:44:44 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/431
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 20000〜40000までの自然数のうち、数字の9を2個含む素数の個数を調べよ
#



57 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 22:41:59 ]
>>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).

58 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 03:29:44 ]
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の" "の中の書き方に注意すること)

59 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 06:58:36 ]
>>12
使用言語: J

f=:|.&.":

f 56789
98765
1 + f 56789
98766

60 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 07:00:36 ]
>>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 ).



61 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 07:05:28 ]
>>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) :- (!))),!.

62 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 07:55:10 ]
>>56
PHP
codepad.org/nfttcf8D

63 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 07:58:46 ]
>>56
使用言語: J

+/2=+/"1'9'=":,.p:a+i.(_1&p:40000)-(a=._1&p:20000)
141

64 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 11:27:52 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 11:57:00 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/442
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt
#
# ★演習問題3*
# "izumi","Kanto","Kudo","Sato","Sugawara","Matuda","Wada"の7個の
# 文字列の長さを求めて表示しなさい.ただし,ポインタのボインタを用いること.
#
# (実行結果)
# 6 :izumi
# 5 : kanto
# 4 : Kudo
# 4 : Sato
# 8 : Sugawara
# 6 : Matuda
# 4 : Wada


66 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:04:17 ]
>>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個の文字列の長さを求めて表示する'.

67 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:09:16 ]
>>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個の文字列の長さを求めて表示する'.

68 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:15:11 ]
>>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).

69 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:17:10 ]
>>68
splitの下の行のインデントが狂いました。


70 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:20:47 ]
そうそう。
インデントはPrologの実行にはまったく関係ありません。
これを習慣にしている人には見易いかなという程度の問題です。

冬休みに入って課題が出ない日がしばらくは続くでしょうね。



71 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 13:54:28 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/442
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt
#
# 演習問題1
# 入力されたデーク数に応じた配列を確保し,入力されたデータをその配列に保存し,
それらの和を求めよ.
# (実行結果例)
# データの数は?10
# 1番目のデータを人力してください:1
# 2番目のデータを入力してください:2
# 3番目のデータを入力してください:3
# 4番目のデータを入力してください:4
# 5番目のデータを入力してください:5
# 6番目のデータを人力してください:6
# 7番目のデータを入力してください:7
# 8番目のデータを入力してください:8
# 9番目のデータを入力してください:9
# 10番目のデータを入力してください:10
# 和=55

72 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 14:00:34 ]
>>71
% Prolog

入力されたデーク数に応じた配列を確保し,入力されたデータをその配列に保存し,それらの和を求める :-
  催促付き整数入力('データの数は?',N),
  findsum(X,(for(1,M,N),催促付き整数入力('%t番目のデータを入力してください:',[M],X)),_和),
  write_formatted('和=%t\n',[_和]).

73 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 14:40:46 ]
>>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.

74 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 15:26:57 ]
>>65
使用言語: J

(,.~#&.>)'izumi';'Kanto';'Kudo';'Sato';'Sugawara';'Matuda';'Wada'
+-+--------+
|5|izumi |
+-+--------+
|5|Kanto |
+-+--------+
|4|Kudo |
+-+--------+
|4|Sato |
+-+--------+
|8|Sugawara|
+-+--------+
|6|Matuda |
+-+--------+
|4|Wada |
+-+--------+

75 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:11:50 ]
pc12.2ch.net/test/read.cgi/tech/1258158172/314
# [1] 授業単元: プログラミング
#
# [2] 問題文(含コード&リンク):
# 遺伝的アルゴリズムを基にTSP(巡回セールスマン問題)の近似解法のプログラムを書け。
# ただし都市数の数は5〜6個程度で、都市間の距離は自由に決めてよいとする。
#

76 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:12:52 ]
# [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)を繰り返す


77 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:19:25 ]
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のラベルをつける。

78 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:29:29 ]
chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号194)
# [1] 授業単元: 情報処理
# [2] 問題文(含コード&リンク):ファイルからデータ(迷路空間)を読み込む処理と構造体・リストを用いた、
# 迷路空間を作成せよ。
# 読み込むデータは右図のような形式であり、    ******
# 各記号は次の意味を持つものとする。       *8000*
# * : 壁                     ****0*
# 0 : 通路                    **000*
# 8 : 通路 & スタート               *90*0*
# 9 : 通路 & ゴール                ******
# 迷路空間は、必ず長方形であることを前提とする。
# そして、再帰を用いた迷路空間の探索プログラムも作成せよ。
# 最短経路と後戻りした記録付き経路のどちらを表示しても構わないが両方表示した方がポイント高し


79 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:51:53 ]
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.


80 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:16:22 ]
pc12.2ch.net/test/read.cgi/tech/1258158172/389
# [1] 授業単元:C言語実習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10187.txt
# ■問題1
#  任意の画素数をもつ画像をアフィン変換(移動,拡大縮小,回転,せん断)するプログラムを作成せよ.
#  変換後の画像は画像ファイルとして保存すること.
#
# ■問題2
#  問題1で作成したプログラムに,逆アフィン変換を行う機能を追加せよ。
#  そして,アフィン変換,逆アフィン変換(最近傍法),逆アフィン変換(線形補間法)での結果に違いがあることを確認せよ.
#
#  ※逆アフィン変換とは,出力画像の座標値(X, Y)に対して逆変換を行うことで,入力画像の座標値(x, y)を求めるものである.
#
# (注意)
#  変換後の座標値が,配列のサイズ(縦と横)を越えるかどうかを確認し,超える場合は適切な例外処理を行うこと.




81 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:25:52 ]
pc12.2ch.net/test/read.cgi/tech/1258158172/81
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):公開鍵と秘密鍵を作り、これらを使い暗号化と復号化を行うプログラムを書け。(RSA暗号)
# [4] 期限: 2009/11/17朝まで
# 暗号化と復号化の手順は
# ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10129.txt
#

82 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:55:57 ]
宿題スレ難問集の様相を呈してきました。
HaskellやOCamlそして、Scalaなどの使い手がバッサバッサとプログラミングして
くれるといいんだがな。

83 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 19:22:44 ]
>>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)

84 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 19:59:17 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:49:13 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/442
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク): ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt
#
# ★演習問題5
# 人力されたクラスの人数と科目の数に応じた配列を確保し,入力されたデータをその配列に保存し,科目ごとの和を求めよ。
# 例として,人数を3とし,科目数を3とした場合,それぞれの科日数に対する点数を読み込み,結果が正しく出力されるかを確認せよ。
# (時間があれば,人数や科日数を適当に変えて,動作を確認せよ)
# (実行結果例)
# クラスの人数は?4
# 科目の数は?3
# 1番目の学生
# 85
# 74
# 63
# < 中略>
# 各科目の和は以下の通りです
# 222
# 213
# 269

86 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:26:12 ]
>>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).

87 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:00:33 ]
>>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

88 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 05:18:54 ]
pc12.2ch.net/test/read.cgi/tech/1260532772/464
# 1:単元名 C言語
# 2:問題文
# 元金、単利と複利の利率に対して、次のものを求めるプログラムを作成しなさい。
#
# 30年後の残高。
# 30年以内に複利の残高は単利の残高を上回るか。
# 上回るならば何年後か。

89 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 06:17:05 ]
>>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

90 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 06:36:52 ]
'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,_利率,_年目,_利息,_残高).



91 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 06:38:57 ]
>>90 訂正
% Prolog www

福利 -> 複利

92 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 06:45:46 ]
>>90
残高という述語名は好ましくないだろう。


93 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:07:39 ]
>>90
% Prolog

'30年以内に複利の残高は単利の残高を上回るか。'(_元金,_複利の利率,_単利の利率) :
  findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
  findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
  行列の転置([L1,L2],L3),
  member([A,B],L3),
  A > B.

94 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:13:12 ]
>>93 一ヶ所書き直し。さてどこでしょう?

>>90
% Prolog

'30年以内に複利の残高は単利の残高を上回るか。'(_元金,_複利の利率,_単利の利率) :-
  findall(_残高1,残高(複利,30,_元金,_複利の利率,_,_残高1),L1),
  findall(_残高1,残高(単利,30,_元金,_単利の利率,_,_残高2),L2),
  行列の転置([L1,L2],L3),
  member([A,B],L3),
  A > B.


95 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:21:38 ]
>>93 >>94
リンクを>>90 としてあるけどこれは>>88です。
さて、>>90の残高の中で表示をしているので、>>94の課題でも、
客年の何年目、利息、残高が煩く表示されてしまう。
?- tell('/dev/null'),'30年以内に複利の残高は単利の残高を上回るか。'(1000,0.045,0.031),told.
とでもやればよいか。
これでも、上回らないと中の副目標がfailになって、toldが実行されないままとなる。


96 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:28:12 ]
それもそうだけど、
複利の利率の方が大きいのでは1年目で片がついてしまうw


97 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:41:11 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:42:40 ]
>>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],_何年後).

99 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:55:00 ]
>>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 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:57:58 ]
どこが間違ってるのか、コメントしてよ。
間違いの部分を読むのは勉強になるから。




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

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







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

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

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