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


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

いろんな言語で宿題スレ



1 名前:a36 ◆K0BqlCB3.k [2009/05/21(木) 12:30:47 ]
他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。
なお、宿題スレが存在する言語についてはその言語のスレで解答してください。

C/C++の宿題片付けます 126代目
pc12.2ch.net/test/read.cgi/tech/1242655611/

Python の宿題ここで答えます Part 1
pc12.2ch.net/test/read.cgi/tech/1153585095/

★★ Java の宿題ここで答えます Part 67 ★★
pc12.2ch.net/test/read.cgi/tech/1232627790/

Pascalの宿題は俺にやらせろ!!Part2
pc12.2ch.net/test/read.cgi/tech/1136994325/

BASICの宿題はお前にまかせた
pc12.2ch.net/test/read.cgi/tech/1136788500/

Rubyの宿題教えてください。2限目
pc12.2ch.net/test/read.cgi/tech/1200175247/

C#,C#の宿題片付けます。
pc12.2ch.net/test/read.cgi/tech/1197620454/

423 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 07:47:05 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/932
# 【 課題 】ボウリングのスコアを付けるプログラムを作成せよ。
# 各投球ごとの倒れたピン数を入力し、スコア一覧を出力。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】4. 制限なし
# 【 期限 】本日、7/10 15:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】1つのメソッド10行以内、引数・戻り値を持つメソッド最低3つ作成のこと。

424 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 07:51:05 ]
>>423 (バッチ処理版)
% Prolog
nojiriko.asia/prolog/t423.html

425 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:40:09 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題V
# n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m)
# 再帰呼び出しを行う関数 sum を作成して問題を解くこと.
# 関数 sum は,引数を n, m とし,n から m までの和を返すもとのとする.


426 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:44:01 ]
>>425
% Prolog

'n から m までの整数の和を求める'(N,N,N) :- !.
'n から m までの整数の和を求める'(N,M,_和) :-
  N < M,
  N2 is N + 1,
  'n から m までの整数の和を求める'(N2,M,_和_2),
  _和 is N + _和_2.


427 名前:デフォルトの名無しさん [2009/07/10(金) 12:13:08 ]
(defun sum (n m) (if (= n m) n (+ n (sum (1+ n) m))))


428 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:36:25 ]
>>425

sum(N,M,Sum) :-
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3),
  sum_1(L1,L2,L3),
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3).

sum_l(L,L,L) :- not(var(L)).
sum_l(L1,L2,X) :- append(L1,Z,X),sum_l([_|L1],L2,Z).

integer_to_varlist(N,L) :- integer(N),list(L),length(L,N).
integer_to_varlist(N,L) :- integer(N),var(L),length(L,N).
integer_to_varlist(N,L) :- var(N),list(L),length(L,N).
integer_to_varlist(N,L) :- var(N),var(L).

429 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:43:22 ]
>>426 さすがに冗長かな。

sum(N,M,Sum) :-
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3),
  sum_1(L1,L2,L3),
  integer_to_varlist(N,L1),
  integer_to_varlist(M,L2),
  integer_to_varlist(Sum,L3).

sum_l(L,L,L) :- not(var(L)).
sum_l(L1,L2,X) :- append(L1,Z,X),sum_l([_|L1],L2,Z).

integer_to_varlist(N,L) :- var(N),var(L).
integer_to_varlist(N,L) :- not((var(N),var(L))),length(L,N).

430 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 13:00:37 ]
>>429

integer_to_varlist(N,L) :- var(N),var(L).
integer_to_varlist(A,A) :- not(var(A)),A=[].
integer_to_varlist(L1,L2) :-
  not(var(L1)),
  not(var(L2)),
  L1=[N|R1],
  L2=[L|R2],
  integer_to_varlist(N,L),
  integer_to_varlist(R1,R2).
integer_to_varlist(N,L) :- not((var(N),var(L))),length(L,N).

integer_to_varlist/2は複雑になったがこれはユーティリティだから
構わない。これで

sum(N,M,Sum) :-
  integer_to_varlist([N,M,Sum],[L1,L2,L3]),
  sum_l(L1,L2,L3),
  integer_to_varlist([N,M,Sum],[L1,L2,L3]).

とすっきりする。

431 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 15:45:54 ]
>>430
?- sum(N,M,55).
N = 55,
M = 55;
N = 1,
M = 10;
N = 9,
M = 13;
N = 27,
M = 28;
no.
?-



432 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 03:58:23 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/901
# [1] 授業単元: C言語プログラミング演習
# [2] 問題文(含コード&リンク): プログラムを実行すると
# 行列1:
# 1,2,3
# 4,5,6
# 7,8,9
# 行列2:
# 3,4,5
# 6,7,8
# 9,10,11
# と表示する。最後に行列1と行列2の積を計算し、以下のように表示
# するプログラム。
# [行列1と行列2の積は
# ?,?,?
# ?,?,?
# ?,?,?]


433 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 04:24:30 ]
>>432
% Prolog
t432 :-
  _行列1 = [[1,2,3],[4,5,6],[7,8,9]],
  _行列2 = [[3,4,5],[6,7,8],[9,10,11]],
  write('行列1:\n'),行列表示(_行列1),
  write('行列2:\n'),行列表示(_行列2),
  行列の積(_行列1,_行列2,_行列3),
  write('行列1と行列2の積は\n'),行列表示(_行列3).

行列表示([]).
行列表示([_行|R]) :- concat_atom(_行,',',[_表示文字列]),write_formatted('%t\n',[_表示文字列]),行列表示(R).

行列の積(L1,L2,X) :- 行列の転置(L2,L3),行列の積の一(L1,L3,X).

行列の積の一([],_,[]) :- !.
行列の積の一([A|R1],L,[S1|R3]) :- 行列の積の二(A,L,S1),行列の積の一(R1,L,R3).

行列の積の二(_,[],[]) :- !.
行列の積の二(A,[B|R2],[C|R3]) :- 行列の積の三(A,B,C),行列の積の二(A,R2,R3).

行列の積の三([],[],0) :- !.
行列の積の三([A|R1],[B|R2],S) :- S1 is A * B,行列の積の三(R1,R2,S2),S is S1 + S2 .

行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3) .

行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2),行列の転置(R2,R1),!.


434 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:14:27 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/916
# 【質問テンプレ】
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):(1) 平均、標準偏差
# (2) 得点の高い順の点数のリスト

435 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:19:44 ]
>>434
% Prolog

t434 :-
  '10人分の試験の点数を読み取る'(L),
  平均(L,_平均),標準偏差(L,_標準偏差),
  write_formatted('平均 : %t\n標準偏差 : %t\n',[_平均,_標準偏差]).

平均(L,M) :- length(L,N),平均(L,N,0.0,M).

平均([],N,S,M) :- M is S / N,!.
平均([A|R],N,S,M) :- S1 is S + A,平均(R,N,S1,M).

標準偏差(L,V) :- length(L,N),平均(L,M),標準偏差(L,N,M,0.0,V).

標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!.
標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V).

'10人分の試験の点数を読み取る'(L) :- '10人分の試験の点数を読み取る'(1,L). !.

'10人分の試験の点数を読み取る'(11,[]) :- !.
'10人分の試験の点数を読み取る'(M,[I|R]) :-
  write_formatted(' %t: ',[M]),
  get_line(Atom),
  atom_to_term(Atom,I,_),
  M2 is M + 1,
  '10人分の試験の点数を読み取る'(M2,R).

436 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 19:20:14 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/922
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):
# if文を使って、月数に応じてコメントを表示するプログラム(1月ならばwinter、
# 3月ならspringといった具合に)を作る。
# 月は1月\uff5e12月までなので、13月以上の数値を打ち込んだ場合はerrorと表示させること。

437 名前:デフォルトの名無しさん [2009/07/11(土) 20:47:08 ]
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):

たとえば
3481
という数字(4桁/0含む)が与えられたとき
0 = 3 + 4 - 8 + 1
1 = 3 + 4 - 8 * -1
2 = -(3 + 4 - 8 - 1)
3 = 3 * 4 - 8 - 1
4 = (3 / (4 + 8))^-1
...
のように加減乗除のみで整数を順に造っていってください

438 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 20:54:33 ]
x^y は加減乗算ではないよ。

439 名前:デフォルトの名無しさん [2009/07/11(土) 21:09:05 ]
4 = (4 + 8) / (3 * 1)

440 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 04:14:13 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/929
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに
# 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。
# 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。
#
# 出力例:俺は、カレーが大好きだ。
#
# データファイルは以下を使用すること。
# 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン
# その人 政治家 ネズミ  の12個
# 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン
# お金  の10個
# 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい
# に全力を尽くす を新しいものに交換した ?なにそれ美味いの?
# について深く考えた を捨てた に塩をふりかけた の11個

441 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:02:07 ]
>>440
% Prolog (1/2)
t440 :-
  get_lines('t440_1.txt',Lines),
  構造定義(Lines),
  findall(_文,文(_文,[]),_文集),
  '20文を選択して表示'(_文集).

'20文を選択して表示'(_文集) :-
  length(_文集,Len),
  Div is Len // 20,
  tell('t440_2.txt'),
  for(1,N,20),
  Nth is N * Div,
  list_nth(Nth,_文集,_選択文),
  write_formatted('%t%t%t%t%t\n',[_選択文]),
  N = 20,
  told.




442 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:03:56 ]
>>440
% Prolog (2/2)

文(_文,R) :- 主語(_文,R1),後置部(R2,R3),目的語(R2,R3),述部(R3,R4),句点(R4,R).

後置部(L,R) :- 後置詞(L,R1),読点(R1,R).
後置詞(['は'|R],R).
読点(['、'|R],R).
句点(['。'|R],R).

構造定義(Lines) :-
  member(_行,Lines),
  split(_行,[':',':',' ',' '],[F|L2]),
  append(L3,[_],L2),
  要素定義(F,L3),
  fail;
  true.

要素定義(F,L) :-
  member(A,L),
  P =.. [F,[A|R],R],
  assertz(P),
  fail;
  true.


443 名前:440 mailto:sage [2009/07/12(日) 06:11:44 ]
>>440 訂正 write_formattedの表現に誤りがありました。

'20文を選択して表示'(_文集) :-
  length(_文集,Len),
  Div is Len // 20,
  tell('t440_2.txt'),
  for(1,N,20),
  Nth is N * Div,
  list_nth(Nth,_文集,_選択文),
  concat_atom(_選択文,_選択文文字列),
  write_formatted('%t\n',[_選択文文字列]),
  N = 20,
  told.

444 名前:443 mailto:sage [2009/07/12(日) 06:12:58 ]
>>440 ではなくて >>442 の訂正でした。

445 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 06:20:53 ]
>>440
% Prolog ここに書き直しました。
nojiriko.asia/prolog/t440.html

446 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 10:36:30 ]
>>436
% Prolog
nojiriko.asia/prolog/t436.html

447 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 13:52:15 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/923
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):下に示すように,最初に整数を読み込み,
# その後,その個数だけ整数を読み込んでいき,そ
# の合計と平均を表示するプログラムを作成せよ。
# 整数は何個ですか: 6
# No.1 : 65
# No.2 : 23
# No.3 : 47
# No.4 : 9
# No.5 : 153
# No.6 : 777
# 合計値: 1074
# 平均値: 179.00

448 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 14:06:09 ]
>>447
% Prolog

t447 :-
  write('整数は何個ですか: '),
  get_line(Line),
  atom_to_term(Line,N,_),
  整数をn個読み込む(1,N,L),
  sum(L,Sum),
  avg(L,Avg),
  write('合計値: %t\n平均値: %t\n',[Sum,Avg]).

整数をn個読み込む(M,N,[]) :- M > N,!.
整数をn個読み込む(M,N,[_整数|R]) :-
  write_formatted('No.%t: ',[M]),
  get_line(Line),
  atom_to_term(Line,_整数,_),
  M2 is M + 1,
  整数をn個読み込む(M2,N,R).

sum([],0).
sum([A|R],X) :- sum(R,Y),X is A + Y.

avg(L,X) :- length(L,Len),Len > 0,sum(L,Sum),X is Sum / Len.

449 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 15:56:25 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/946
# 【質問テンプレ】
# [1] 授業単元 C言語
# [2] 問題文(含コード&リンク):
# 二つのバイナリファイルの中身を比較して等しいか、等しくないかを
# 比較して結果を返す関数を作る

450 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 15:58:28 ]
>>449
% Prolog

二つのバイナリファイルの中身を比較(_ファイル1,_ファイル2,_診断) :-
open(ファイル1,read,_ストリーム1,[type(binary)]),
  open(ファイル2,read,_ストリーム2,[type(binary)]),
  get_byte(_ストリーム1,A),
  get_byte(_ストリーム2,B),
  二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,A,B,_診断),
  close(_ストリーム1),
  close(_ストリーム2).

二つのバイナリファイルの中身を比較(_,_,-1,-1,等しい) :- !.
二つのバイナリファイルの中身を比較(_,_,A,B,等しくない) :- not(A=B),!.
二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,A,A,_診断) :-
  get_byte(_ストリーム1,C),
  get_byte(_ストリーム2,D),
  二つのバイナリファイルの中身を比較(_ストリーム1,_ストリーム2,C,D,_診断).

451 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 18:03:48 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/424
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9644.txtにある
# 50コのデータを利用して
# 最大値と最小値を取り出すプログラムを以下の1,2の関数を用いて2つ作れ
# 1 return文を用いたケース
# 2 グローバル変数を用いたケース
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9644.txt
# ポインタは使用不可です
#ファイル名はseiseki.txtでお願いします
# 70 56 66 45 88
# 66 85 68 55 73
# 55 65 53 67 55
# 85 72 76 58 65
# 92 70 45 73 55
# 56 57 52 62 82
# 72 62 33 85 95
# 46 95 48 72 34
# 83 42 88 92 56
# 68 65 91 82 66



452 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 18:34:55 ]
>>451
% Prolog

整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
  get_chars(_ファイル,Chars),
  concat_atom(Chars,Atom),
  split(Atom,['\n',' '],L),
  ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).

ならびの中の最小値・最大値([],X,Y,X,Y) :- !.
ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :-
  A < Min,
  ならびの中の最小値・最大値(R,A,Max,_最小値,_最大値).
ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :-
  A > Max,
  ならびの中の最小値・最大値(R,Min,A,_最小値,_最大値).
ならびの中の最小値・最大値([_|R],Min,Max,_最小値,_最大値) :-
  ならびの中の最小値・最大値(R,Min,Max,_最小値,_最大値).


453 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 18:36:57 ]
>>452 また間違い。
整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
  get_chars(_ファイル,Chars),
  concat_atom(Chars,Atom),
  split(Atom,['\n',' '],[A|L]),
  ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).

454 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 18:48:58 ]
>>447
StateT の練習

-- Haskell

import Control.Monad.State
import Data.Function (on)
import System.IO (hFlush, stdout)

t447 :: Int -> IO (Int,Double)
t447 m = evalStateT (t447' m 1) []
where
t447' :: Int -> Int -> StateT [Int] IO (Int,Double)
t447' m i = do
ls <- get
liftIO $ (putStr $ "No." ++ show i ++ ": ") >> hFlush stdout
s <- liftIO $ getLine
modify (++[read s])
if i == m then get >>= return . sumAndAverage else t447' m (i+1)

sumAndAverage :: [Int] -> (Int,Double)
sumAndAverage = f . foldl (\(s,l) x -> (s+x,l+1)) (0,0)
where
f :: (Int,Int) -> (Int,Double)
f (s,l) = (s, on (/) fromIntegral s l)

main = t447 6 >>= putStrLn . toString
where
toString :: (Int,Double) -> String
toString (s,a) = "sum: "++show s++"\naverage: "++show a

455 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 21:08:36 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/950
# 【質問テンプレ】
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 下に示すように,要素数が7 でint 型の配列に読み込んだ全要素を逆順に
# 並べ替えるプログラムを作成せよ.
#
# vx[ 0] : 58
# vx[ 1] : 32
# vx[ 2] : 17
# vx[ 3] : 46
# vx[ 4] : 22
# vx[ 5] : 73
# vx[ 6] : 69
# vx[ 0] = 69
# vx[ 1] = 73
# vx[ 2] = 22
# vx[ 3] = 46
# vx[ 4] = 17
# vx[ 5] = 32
# vx[ 6] = 58

456 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 21:14:39 ]
>>455
% Prolog
% ここでは定義された単位節の一引数だけソートして差し替えると問題としてみよう。
nojiriko.asia/prolog/t455.html

457 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 23:05:14 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/957
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 100個の乱数を発生させ最大値、最小値、平均を求める
# また最大値、最小値それぞれ何番目にあるか答えよ

458 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 23:31:59 ]
>>457
% Prolog
nojiriko.asia/prolog/t457.html


459 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 23:52:08 ]
>>457
-- Haskell

import System.Random (getStdRandom, random)
import Control.Monad (replicateM)
import Data.List (maximumBy, minimumBy)
import Data.Function (on)

main = do
rands <- replicateM 100 (getStdRandom random :: IO Int)
let i = zip [1..] rands
putStrLn $ "(index, maximum) = " ++ show (maximumBy (compare `on` snd) i)
putStrLn $ "(index, minimum) = " ++ show (minimumBy (compare `on` snd) i)
putStrLn $ "average = " ++ show (on (/) fromIntegral (sum rands) 100)

460 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 05:00:41 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/960
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# 下に示すように,要素数が5 でint 型の配列に、5 人の学生の身長を読み込んで、その
平均
# 身長を求めるプログラムを作成せよ。
# 身長を入力してください
# 1 番: 178
# 2 番: 175
# 3 番: 165
# 4 番: 179
# 5 番: 172
# 平均身長: 173.8


461 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 05:16:24 ]
>>460
% Prolog
% nojiriko.asia/prolog/t460.html

'5 人の学生の身長を読み込んで、その平均身長を求める' :-
  '5 人の学生の身長を読み込んで、'(_身長ならび),
  sum(_身長ならび,_合計),
  _平均身長 is _合計 / 5,
  write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
  findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
  write_formatted('%t 番: ',[N番目]),
  数値を得る(_身長),
  _身長 > 0.0,
  _身長 < 220.0,!.
身長を得る(N番目,_身長) :-
  write('身長が適切な数値ではありませんでした。再入力が必要です\n'),
  身長を得る(N番目,_身長).

数値を得る(_数値) :-
  get_line(_改行までの文字列),
  atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).



462 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 05:38:06 ]
>>461 入力検査の部分を修正。
'5 人の学生の身長を読み込んで、その平均身長を求める' :-
'5 人の学生の身長を読み込んで、'(_身長ならび),
sum(_身長ならび,_合計),
_平均身長 is _合計 / 5,
write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
write_formatted('%t 番: ',[N番目]),
数値を得る(_身長),
身長として適切な数値であるか検査する(_身長),!.
身長を得る(N番目,_身長) :-
身長を得る(N番目,_身長).

身長として適切な数値であるか検査する(_身長) :- _身長 > 0.0,_身長 < 230.0,!.
身長として適切な数値であるか検査する(_身長) :-
write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

数値を得る(_数値) :-
get_line(_改行までの文字列),
atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).

463 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 05:40:58 ]
>>462 もう一度書き直し。すみません。
'5 人の学生の身長を読み込んで、その平均身長を求める' :-
  '5 人の学生の身長を読み込んで、'(_身長ならび),
  sum(_身長ならび,_合計),
  _平均身長 is _合計 / 5,
  write_formatted('平均身長: %t\n',[_平均身長]),

'5 人の学生の身長を読み込んで、'(_身長ならび) :-
  findall(_身長,(for(1,N番目,5),身長を得る(N番目,_身長)),_身長ならび).

身長を得る(N番目,_身長) :-
  write_formatted('%t 番: ',[N番目]),
  数値を得る(_身長),
  身長として適切な数値であるか検査する(_身長),!.
身長を得る(N番目,_身長) :-
  身長を得る(N番目,_身長).

身長として適切な数値であるか検査する(_身長) :- _身長 > 0.0,_身長 < 230.0,!.
身長として適切な数値であるか検査する(_身長) :-
  write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

数値を得る(_数値) :-
  get_line(_改行までの文字列),
  atom_to_term(_改行までの文字列,_数値,_),
  number(_数値).

464 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 05:43:49 ]
>>463
コピペの際に誤って改行してしまいましたが、Prologでは

  write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.

のように文字列のなかで改行すると構文エラーとなります。

465 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 09:32:01 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/949
# 【質問テンプレ】
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9733.txt
# 課題:
# ・キーボードから正整数を入力し、その逆数を正確に計算し、ディスプレイに
# 表示させる。(循環小数である場合には、循環部分が分かるように表示を工夫する。)
# 内容:
# n(nは任意の正整数)の逆数を正確に計算し、計算過程で出た商、余りを逐次
# 配列に入れていく。計算途中で同じ商、余りが出たら循環小数と判定でき、
# 0が出たら割り切れると判定できる。

466 名前:デフォルトの名無しさん [2009/07/13(月) 09:59:38 ]
>>465
(do ((x (read) (read)) (a nil))
((or (not (integerp x)) (<= x 0)))
(setf a (cons x a))
(if (= x 1)
(format t "~A ~S~%" x a)
(format t "1/~A ~S~%" x a)))

どうぞ


467 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 13:25:57 ]
>>465
% Prolog
nojiriko.asia/prolog/t465.html

468 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 13:42:10 ]
>>465
% Prolog
逆数を正確に計算(_最大桁,_正整数,_逆数表示) :-
  逆数表示(_最大桁,_正整数,[[0,1]],_逆数表示),!.

逆数表示(N,_,Y,X) :- N < 0,逆数表示(Y,[],X),!.
逆数表示(N,_整数,[[D,0]|Y],X) :- 逆数表示([[D,0]|Y],[],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _商2 is _剰余 // _整数,
  _剰余2 is (_剰余 mod _整数) * 10,
  append(L1,[[_商2,_剰余2]|L2],[[_商,_剰余]|Y]),
  append([[']...',_]|L1],[[_商2,_剰余2],['[',_]|L2],Z),
  逆数表示(Z,[],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _整数 > _剰余,
  _剰余2 is _剰余 * 10,
  N2 is N - 1,
  逆数表示(N2,_整数,[[0,_剰余2],[_商,_剰余]|Y],X),!.
逆数表示(N,_整数,[[_商,_剰余]|Y],X) :-
  _整数 < _剰余,
  _商2 is _剰余 // _整数,
  _剰余2 is (_剰余 mod _整数) * 10,
  N2 is N - 1,
  逆数表示(N2,_整数,[[_商2,_剰余2],[_商,_剰余]|Y],X),!.

逆数表示([],[_|X],S) :- concat_atom(['0','.'|X],S),!.
逆数表示([[A|_]|R1],Y,S) :- 逆数表示(R1,[A|Y],S).

469 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 17:49:03 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/550
# [1] 授業単元: Ruby演習 [2] 問題文、kansai2channeler.hp.infoseek.co.jp/
c i-bin/joyful/img/9426.txt
# Rubyの問題がわかりません 助けてください
#
# (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい
#
# p wday["sunday"] #=> "日曜日"
# p wday["monday"] #=> "月曜日"
# p wday["saturday"] #=> "土曜日"
#
# (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい
#
# (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ
い。
# 「sunday」は日曜日のことです。
# 「monday」は月曜日のことです。
#
# (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正
規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ
ッドstr2hashを定義してください。
#
# p str2hash("bule 青 white 白\uff3cnred赤");
# #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"}

470 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 16:41:33 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/958
# 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】7/14 am6:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】
# あいう
# かきく
# さしす
# 上記のようなテキストファイルを読み込み、
# あかさ
# いきし
# うくす
# のように別のテキストファイルに書き出す感じです。

471 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 17:02:10 ]
>>470
% Prolog
テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
open(InFile,read,Input),
open(OutFile,write,Output),
findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
max(Chars,Max),
空白文字を付加して行の文字数一致させる(Max,LL,LL2),
行列の転置(LL2,LL3),
出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
concat_atom(L,S),
write_formatted(Output,'%t\n',[S]),
出力ファイルに書き出す(Output,R).

空白文字を付加して行の文字数を一致させる(Max,LL1,LL2) :-
findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).



472 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 17:08:27 ]
>>470 書き直し
% Prolog nojiriko.asia/prolog/t470.html

テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
  open(InFile,read,Input),
  open(OutFile,write,Output),
  findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
  max(Chars,Max),
  空白文字を付加して行の文字数一致させる(Max,LL,LL2),
  行列の転置(LL2,LL3),
  出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
  concat_atom(L,S),
  write_formatted(Output,'%t\n',[S]),
  出力ファイルに書き出す(Output,R).

空白文字を付加して行の文字数を一致させる(Max,LL1,LL2) :-
  findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).


473 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 17:31:04 ]
pc12.2ch.net/test/read.cgi/tech/1136994325/954
# pascal pcpad
# 1個の自然数nを適当決めて、nチームが参加する
# リーグ戦の全試合を表示するプログラムを書きなさい。

474 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 17:33:35 ]
>>473
% Prolog nojiriko.asia/prolog/t473.html

リーグ戦の全試合を表示するプログラム(N) :-
  findall(M,for(1,M,N),L),
  組合せ(L,2,[A,B]),
  write_formatted('%t-%t\n',[A,B]),
  fail;
  true.

組合せ(X,1,[A]) :-
  member(A,X).
組合せ([A|Y],N,[A|X]) :-
  N > 1,
  M is N - 1,
  組合せ(Y,M,X).
組合せ([_|Y],N,A) :-
  N > 1,
  組合せ(Y,N,A).

475 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 04:06:15 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/103
# 【質問テンプレ】
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-b
in/joyful/img/9753.txt
# 2.入力された年月の1日が何曜日かを調べる。
#   曜日のチェックはZellerの公式を使用する。Zellerの公式は、
#
#   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) +
8 ) / 5 ] + d ) % 7
#
#           ※ 上記の公式中の y は年、 m は月、 d は日を表し、
#             []はその数を越えない最大の整数を表す。(例: [13.6]は13
になる)
#
#   で、曜日を表す値は次のようになっている。
#
#     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3,
#
# 木曜日 = 4, 金曜日 = 5, 土曜日 = 6,
#
#   ※但し、1月と2月は前年の13月14月として計算するものとする。

476 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 04:18:51 ]
>>475
% Prolog

'Zellerの公式'(_年,1,_日,_曜日) :-
  _前年 is _年 - 1,
  'Zellerの公式'(_前年,13,_日,_曜日),!.
'Zellerの公式'(_年,2,_日,_曜日) :-
  _前年 is _年 - 1,
  'Zellerの公式'(_前年,14,_日,_曜日),!.
'Zellerの公式'(_年,_月,_日,_曜日) :-
  _年=Y,_月=M,_日=D,
  _曜日を表す値 is (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7,
  曜日を表す値(_曜日を表す値,_曜日).

曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).
曜日を表す値(7,日曜).

477 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 07:09:47 ]
>>476 まちがえた!
% Prolog nojiriko.asia/prolog/t475.html

曜日を表す値(0,日曜).
曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).

478 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 10:54:19 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/107
# [1] 授業単元: デジタル信号処理
# [2] 問題文(含コード&リンク): 2つのテキストファイル(double型)を読み込み、
# 畳み込み和を計算し、別のファイルに出力せよ。

479 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 11:02:01 ]
>>478
% Prolog nojiriko.asia/prolog/t478.html

t478(N,Infile1,Infile2,Outfile) :-
  get_lines(Infile1,L1),
  get_lines(Infile2,L2),
  findall(F1,(member(A1,L1),atom_to_term(A2,F1,_)),_フィルタならび),
  findall(F2,(member(A2,L2),atom_to_term(A2,F2,_)),_サンプルならび),
  畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和),
  畳み込み和出力(Outfile,_畳み込み和).

畳み込み和(N,_フィルタならび,_サンプルならび,_畳み込み和) :-
  length(L,N),
  append(L,_,_サンプルならび),
  reverse(_サンプルならび,_逆順サンプルならび),
  畳み込み和の二(_フィルタならび,_逆順サンプルならび,_畳み込み和).

畳み込み和の二([],_,0.0) :- !.
畳み込み和の二([A|R1],[B|R2],X) :-
  畳み込み和の二(R,R2,Y),
  X is A * B + Y.

畳み込み和出力(Outfile,_畳み込み和) :-
  open(Outfile,write,Output),
  write_formatted(Output,'%t\n',[_畳み込み和]),
  close(Output).

480 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 18:41:51 ]
OSでSoundBlaster16のリセットをしたいのだが、どうもなかなかリセットが上手くいかない。
できればアセンブラのサンプルコード欲しいのだが誰か頼む

・SB16の詳細
faculty.petra.ac.id/irwankj/ap2/sb16doc.html

・ここにもサンプルコードがあるけど、どうも何をやっているのか良く分からない・・
www.nondot.org/sabre/os/files/Sound/SoundBlaster/SBDETECT.ASM

481 名前:デフォルトの名無しさん [2009/07/16(木) 11:50:34 ]
>>473

(defun comb (lim)
(do ((n1 1 (1+ n1)) (c 0))
((> n1 lim))
(do ((n2 (1+ n1) (1+ n2)))
((> n2 lim))
(setf c (1+ c))
(format t "no.~5A ~A - ~A~%" c n1 n2))))

;20チームだと↓

(comb 20)




482 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 17:02:20 ]
>>473
-- Haskell

comb :: Int -> [(Int,Int)]
comb n = comb' [1..n]
where
comb' :: [Int] -> [(Int,Int)]
comb' [] = []
comb' (x:xs) = map ((,) x) xs ++ comb' xs

main = print $ comb 3

483 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 17:29:23 ]
>>469
% Prolog これは遊びです。フラットな単位節でなくこのような形式で定義する積極的な理由は見つかりません。
prolog.asia/prolog/t469.html

484 名前:483 mailto:sage [2009/07/16(木) 17:31:06 ]
>>483 間違えました。
nojiriko.asia/prolog/t469.html

でした。

485 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 17:39:20 ]
>>475
% Prolog (1)-(4) まで全て定義おわりました。
nojiriko.asia/prolog/t475.html

486 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 00:10:16 ]
| ?- search(hanoi,S,G,P,A).

:- [search].
/* 初期状態と目標状態 これは、2枚のハノイ */
initial_state(hanoi, [[1,2,3],[],[]]).
goal_state(hanoi, [[],[],[1,2,3]]).
%------------------ ハノイの塔
operator(hanoi, left_to_right(Disk), [[Disk|RestA], B, C], [RestA, B, [Disk|C]]) :-
con2(Disk, C).

operator(hanoi, left_to_center(Disk), [[Disk|RestA], B, C], [RestA, [Disk|B], C]) :-
con2(Disk, B). % 移動先で制約2を満たしていることをチェック

operator(hanoi,center_to_left(Disk), [A, [Disk|RestB], C], [[Disk|A], RestB, C]) :-
con2(Disk, A).

operator(hanoi, center_to_right(Disk), [A, [Disk|RestB], C], [A, RestB, [Disk|C]]) :-
con2(Disk, C).

%-- 制約2
% 一番上にあるディスクよりも、小さいことを検査
/* ?- con2(2, [1,3]).
?- con2(1, [2,3]). */

コレを完成させるにはどうすればいいのでしょうか?

487 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:52:13 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/157
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt
#
# 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、
# かつ2回以上使用される数字が存在しないものを魔方陣という。
# 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を
# 出力するプログラムを作成せよ。
# 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」
# と出力するとする。
#
# la_lb_l__l
# l__l__l__l
# l__l__l__l
#


488 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:53:14 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/160
# [1]プログラミング
# [2] 課題
# 言語: C もしくは C++ 言語
#
# (1)以下のプログラムを作成しなさい(数当てゲーム)
#
# *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を
# 待つ。
# 変数aを定義して、10までの乱数を発生させて変数aに代入する。
# キーボードからの入力があれば、先に発生させた乱数と一致しているならば
# 「あたり!!」と表示する。
# 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を
# 表示する)

489 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 03:28:41 ]
>>488
% Prolog

数当てゲーム :-
  repeat,
  _a is ramdom mod 10 + 1,
  write('好きな数字を入力してください '),
  get_line(Line),
  atom_to_term(Line,N,_),
  数当てゲーム診断(_a,N),
  Line = end_of_file.

数当てゲーム診断(A,A) :-
  write('あたり!!\n').
数当てゲーム診断(_,B) :-
  not(integer(B)),
  write('入力されたのは整数ではありません\n').
数当てゲーム診断(A,N) :-
  not(A == N),
  write_formatted('残念乱数は%tです\n',[A]).



490 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 07:27:53 ]
>>487
% Prolog
nojiriko.asia/prolog/t487.html

491 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 10:30:13 ]
>>486
ハノイの塔の課題をその仕様通り自然に定義していったらどうなるか?
興味がありますが、私が何か書き込めるまでにはもう少し時間が必要なので、
最小サンプルで確認することによって、ディスクの大小順序問題を
スキップしてしまっている最もよく知られたアルゴリズムによる
プログラム例を nojiriko.asia/prolog/hanoi.html に示します。

問題を直感的に理解するには
「Prologプログラミング入門」安部憲広著 共立出版刊 の29頁 図3.3
がよいと思います。



492 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 12:40:40 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/970
# 配列に関する基本問題
# フィールド int型の配列numberのみ
# コンストラクタ 引数で与えられたScannerから整数を順次読み取る、
# 最初に読み取った整数を配列サイズとみなし、int型の配列を生成し
# numberで参照する
# その後整数を読み取ってnumber[0],number[1]、・・・・と順に代入していき、
# 配列サイズ分だけ読み取る
# number中の全要素,最大値、最小値を表示

493 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 12:46:04 ]
>>492
% Prolog こういう手続き的なのも可能。

t492 :-
  get_integer(N),
  length(L,N),
  for(1,M,N),
  get_integer(I),
  list_nth(M,L,I),
  M = N,
  max(L,Max),
  min(L,Min),
  write_formatted('全要素 = %t\n最大値 = %t\n最小値 = %t\n',[L,Max,Min]).

get_integer(N) :-
  repeat,
  get_line(Line),
  atom_to_term(Line,N,_),
  integer(N).


494 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 14:33:32 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/900
# 3つの自然数の合計が10になるような組み合わせを
# すべて列挙するプログラムを書け
# 1+1+8と1+8+1のように並び順が異なるだけのものは
# 同一と考え、重複して出力しないようにすることが望ましい

495 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 14:37:18 ]
>>494
% Prolog

t494 :-
  重複組合せ([1,2,3,4,5,6,7,8,9],3,[A,B,C]),
  10 is A + B + C,
  write_formatted('%t + %t + %t\n',[A,B,C]),
  fail.
t494.

重複組合せ(X,1,[A]) :-
  member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
  N > 1,
  M is N - 1,
  重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
  N > 1,
  重複組合せ(Y,N,A).



496 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 14:59:38 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/902
# 個数Nが与えられたとき
# N個の自然数の合計が10になるような組み合わせをすべて列挙する
# プログラムを書け

497 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 15:05:56 ]
>>496
% Prolog

t496(N) :-
  重複組合せ([1,2,3,4,5,6,7,8,9,10],N,L),
sum(L,10),
concat_atom(L,' + ',S),
write_formatted('%t\n',[S]),
fail.
t496(_).

sum([],0) :- !.
sum([A|R],X) :- sum(R,Y),X is A + Y.

498 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 15:07:10 ]
>>496 書き直し。
% Prolog

t496(N) :-
  重複組合せ([1,2,3,4,5,6,7,8,9,10],N,L),
  sum(L,10),
  concat_atom(L,' + ',S),
  write_formatted('%t\n',[S]),
  fail.
t496(_).

sum([],0) :- !.
sum([A|R],X) :- sum(R,Y),X is A + Y.

499 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 21:28:54 ]
>>488
import System.Random (getStdRandom, randomR)
import qualified System.IO.UTF8 as U

main = do
a <- getStdRandom $ randomR (0,10) :: IO Int
c <- getLine
U.putStrLn $ if (read c) == a then "あたり!!" else "残念乱数は" ++ show a ++ "です"

500 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 22:02:58 ]
>>487
import Control.Monad (guard)
import Data.List (permutations)

t487 :: Int -> Int -> [[Int]]
t487 a b = do
xs@[c,d,e,f,g,h,i] <- permutations $ filter (\x -> and [x /= a, x /= b]) [1..9]
let n = a+b+c
guard $ and [d+e+f == n, g+h+i == n, a+d+g == n, b+e+h == n, c+f+i == n, a+e+i == n, c+e+g == n]
return (a:b:xs)

main = let a = t487 8 1 in if null a then putStrLn "Impossible" else mapM_ printer a
where
printer :: [Int] -> IO ()
printer [] = return ()
printer (a:b:c:xs) = print [a,b,c] >> printer xs

501 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 22:26:05 ]
>>492
import Control.Monad (foldM)

t492 :: Int -> IO (Int,Int)
t492 n = foldM f (maxBound :: Int,minBound :: Int) [1..n]
where
f (a,b) _ = do
s <- getLine
let n = read s
return (min a n, max b n)

main = getLine >>= t492 . read >>= print



502 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 22:53:38 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/175
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
#
# 下に示すように,キーボードから二つの文字列を読み込み,どちらの文字列が
# 何文字長いか
# を表示するプログラムを作成せよ.なお,二つの文字列が同じ長さならば,
# 「二つの文字列は同じ長さです.」と表示させること.
#
# 文字列A : Good
# 文字列B : Morning
# 文字列B の方が3 文字長いです.

503 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 22:55:55 ]
>>502
% Prolog nojiriko.asia/prolog/t502.html

入力文字列長の比較 :-
  write('文字列A ? '),
  get_line(A),
  write('文字列B ? '),
  get_line(B),
  名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
  write_formatted('%t\n',[_診断).

名前付き文字列長の診断(_名前1,_文字列1,_名前2,_文字列2,_診断) :-
  atom_chars(_文字列1,L1),
  atom_chars(_文字列2,L2),
  length(L1,_長さ1),
  length(L2,_長さ2),
  _長さの差 is _長さ1 - _長さ2
  名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断),!.

名前付き文字列長の診断の二(_,_,0,'二つの文字列は同じです。') :- !.
名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :-
  _長さの差 > 0,
  concat_atom([_名前1,の方が,_長さの差,文字長いです。],_診断),!.
名前付き文字列長の診断の二(_名前1,_名前2,_長さの差,_診断) :-
  _長さの差 < 0,
  _長さの差1 is abs(_長さの差),
  concat_atom([_名前2,の方が,_長さの差1,文字長いです。],_診断).

504 名前:503 mailto:sage [2009/07/17(金) 23:01:55 ]
>>503 訂正

  名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
->
  名前付き文字列長の診断(文字列A,A,文字列B,B,_診断),

505 名前:503 mailto:sage [2009/07/17(金) 23:32:27 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/973
# 課題 ttp://uploaders.ddo.jp/upload/1mb/count.cgi?1up6511.zip
#
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI  】制限なし
# 【 期限 】7月21日
# 【 Ver  】1.6.0_11
#
# zipフォルダに詳細ファイルを入れました


506 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:35:14 ]
>>505
% Prolog nojiriko.asia/prolog/t505.html

rev_str(X,Y) :- reverse_atom(X,Y).

reverse_atom(X,Y) :-
  atom_chars(X,L),
  reverse(L,L2),
  atom_chars(Y,L2).

507 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:49:23 ]
>>494
>>496

import Data.List (sort)

h :: (Ord a) => Int -> [a] -> [[a]]
h 1 xs = map (\ls -> [ls]) xs
h n xs = concat $ map (\x -> map (\ys -> x:ys) (h (n-1) (filter (>= x) xs))) xs

t496 :: Int -> [[Int]]
t496 n = filter ((==10) . sum) $ h n [1..9]

main = print $ t496 3

508 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:05:10 ]
>>502
import System.IO (hFlush, stdout)
import qualified System.IO.UTF8 as U
main = do
U.putStr "文字列A: " >> hFlush stdout
a <- getLine
U.putStr "文字列B: " >> hFlush stdout
b <- getLine
let n = length a
let m = length b
U.putStrLn $ case compare n m of
GT -> "文字列Aの方が" ++ show (n-m) ++ "文字長いです"
LT -> "文字列Bの方が" ++ show (m-n) ++ "文字長いです"
EQ -> "二つの文字列は同じ長さです"

509 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:21:54 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/904
# [課題]
# ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を
# 取り除く
# ・一度に取ることのできるマッチ棒は1から3本
# ・山を空にしたプレーヤが勝ち
# 人間2人でこのゲームを行なうプログラムを作成せよ.
#
# プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと,
# 勝負がついたかどうかのチェックを行なうこと。
# また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの
# 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような
# プログラムにすること。

510 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:24:37 ]
>>509
% Prolog
nojiriko.asia/prolog/t509.html

511 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:42:42 ]
>>491さん
暇になったらお願いします




512 名前:493 mailto:sage [2009/07/18(土) 05:40:06 ]
>>493 大間違い! これではリストに整数が貯まらない。再帰はしかたない。
t492 :-
  get_integer(N),
  length(L,N),
  t492(L),
  max(L,Max),
  min(L,Min),
  write_formatted('全要素 = %t\n最大値 = %t\n最小値 = %t\n',[L,Max,Min]).

t492([]) :- !.
t492([I|R]) :-
get_integer(I),
t492(R).

get_integer(N) :-
  repeat,
  get_line(Line),
  atom_to_term(Line,N,_),
  integer(N).

% バックトラックすると値の束縛は解かれてしまうから。

513 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 17:34:59 ]
これまでの Prolog による回答の索引を作りました。

nojiriko.asia/prolog/index.html

514 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 18:08:40 ]
Prologで盛り上がっているのは、あんた一人だけだよ

515 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 18:11:20 ]
prolog恐ろしす・・・

516 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 19:08:20 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/196
# [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に
# スタックに一時的に格納するプログラムを作成する
# このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり
# ポップしたりする過程が分かるプログラムを作成する。
# なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる
#
# [プログラムの例]
# 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり
# ポップしたりするたびにデータベースに格納された全データを表示する。

517 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 05:02:52 ]
>>516
% Prolog nojiriko.asia/prolog/t516.html
t516(Instream,Stack1,Stack2) :-
  get_code(Instream,Code),
  t516(Instream,Code,Stack1,Stack2).

t516(Instream,-1,Stack1,Stack2) :-
  t516_popall(Stack1,Stack3,[],L),
  atom_codes(Atom,L),
  assertz(database(Atom)),!.
t516(Instream,10,Stack1,Stack2) :-
  t516_popall(Stack1,Stack3,[],Codes),
  atom_codes(Atom,Codes),
  assertz(database(Atom)),
  get_code(Instream,Code),
  t516(Instream,Code,Stack3),!.
t516(Insteam,A,Stack1,Stack2) :-
  push(A,stack1,Stack3),
  get_code(Instream,B),
  t516(Instream,B,Stack3,Stack2).

t516_popall(Stack,Stack,X,X) :- empty(Stack),!.
t516_popall(Stack1,Stack2,Y,X) :-
  pop(A,Stack1,Stack3),
  t516_popall(Stack3,Stack2,[A|Y],X).

empty([]) :- write('stack empty :: []\n\n').

push(A,Stack,[A|Stack]) :- write_formatted('push:%t :: %t --> %t\n',[A,Stack,[A|Stack]]).

pop(A,[A|Stack],Stack) :- write_formatted('pop:Pop :: %t --> %t Pop=%t\n',[[A|Stack],Stack,A]).

518 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 06:25:56 ]
>>514
チュートリアルの題材を求めるのが狙いなので、他の言語の人の
書き込みを待たずに進めてしまってちょっと申し訳けない。
Prologの場合は、低水準のコードにサイト上でなかなか出会えないと
いうことがあって、そこが初心者にとって辛いところです。
そこらあたりの欠落を些かでも埋められればと書き込んでいます。
繰り返し、いろんな表記法で、できれば螺旋状に発展していければ
おもしろいと思うのですが、間違いの訂正に数レスとられることが
多くて、1000スレまでの間では貧弱なものにしかなりそうもない。
それにしても、「C/C++の宿題片付けます 12*代目」の方々には感謝です。

519 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 13:34:31 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/213
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,キーボードから文字列を読み込み,その文字列が
# 回文(前から読んでも後ろから読んでも同じ)かどうかを判定するプログラムを
# 作成せよ.なお,入力する文字列は半角の英数字および記号のみと仮定してよい.
#
# 文字列を入力してください: abcba
# 回文です.

520 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 13:41:43 ]
>>519
% Prolog

回文読み込み :-
  get_char(C),
  回文読み込み(C,[],X,X),
  write('回文です\n').

回文読み込み('\n',X,X,[]).
回文読み込み(C,Y,X,[C|R]) :-
  get_char(C2),
  回文読み込み(C2,[C|Y],X,R).

521 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 03:00:05 ]
連休見なかったらC/C++の宿題片付けますスレが60も進んでしまった トホホ



522 名前:デフォルトの名無しさん [2009/07/21(火) 09:30:44 ]
(labels ((str-input nil
(format t "文字列を入力してください: ")
(read-line)))
(do ((l (str-input) (str-input)))
((= (length l) 0))
(if (equal l (reverse l))
(format t "回文です~%")
(format t "回文ではありません~%"))))

こんな感じです


523 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:23:09 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/292
# [1] 授業単元:プログラミングI
# [2] 問題文(含コード&リンク):
# typedef struct node *Tree;
# typedef struct node{
# int data;
# Tree left_subtree;
# Tree right_subtree;
# }Node;
#
# 2分木の大きさ(節点の個数)を調べて返す関数
# int size(Tree t)を定義せよ

524 名前:デフォルトの名無しさん [2009/07/21(火) 12:26:07 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/291
# [1] 授業単元:コンピュータリテラシー
# [2] 問題文(含コード&リンク):問題文と参考は以下です
#   kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt
# ・試験の過程を記録
# 1,番号、得点を入力したあと平均点を計算
# 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする)
# 3,番号、得点、平均との差を出力
# 以上のプログラムを作成

525 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:32:04 ]
>>523
(define (nodenum t)
(cond ((not (pair? t)) 0)
((or (not (pair? (cdr t))) (not (pair? (cddr t)))) "error:not a binary tree")
(else (+ 1 (nodenum (cadr t)) (nodenum (caddr t))))))
(nodenum '(1 leaf leaf)) ;1
(nodenum '(1 'leaf)) ;error
(nodenum '(1 (2 leaf leaf) (3 leaf (4 leaf leaf)))) ;4

526 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:44:29 ]
>>524
(define bt '((1 60) (3 75) (4 100) (2 80)))
(define (average bt) (exact->inexact (/ (fold + 0 (map cadr bt)) (length bt))))
(define (sorter kind bt)
(cond ((eq? kind 'bangou) (sort bt (lambda (x y) (< (car x) (car y)))))
((eq? kind 'tokuten) (sort bt (lambda (x y) (> (cadr x) (cadr y)))))
(else "designate sort kind")))
(define (output bt)
((lambda (ave)
(map (lambda (x)
(print "bangou:" (car x))
(print "tokuten:" (cadr x))
(print "heikin_diff:" (- (cadr x) ave))
(newline)) bt))
(average bt)))
(average bt)
(sorter 'bangou bt)
(sorter 'tokuten bt)
(output bt)

527 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:57:44 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/256
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され,
# 2行目以降はその数の不定長文字列が空白で区切られているような入力
# ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに
# 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ
# を保持する.
# struct t_list {
# char **attributes;
# struct t_list *next;
# };
# またにはソースファイルには,生成した単方向連結リストの内容を
# 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行
# に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ.
# なお,入力ファイル名はコマンドライン
# 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も
# 含めること.また,プログラム自身を除く引数の数が0個,
# もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする
# 入力ファイル:www.uploda.tv/v/uptv0033032.txt

528 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 14:47:09 ]
>>523
% Prolog

二分木の総節数([],0).
二分木の総節数(_節,_節の大きさ) :-
  節(_節,_左枝,_右枝),
  二分木の総節数(_左枝,_左枝の大きさ),
  二分木の総節数(_右枝,_右枝の大きさ),
  _節の大きさ is _左枝の大きさ + _右枝の大きさ + 1.

529 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 15:36:10 ]
>>524
% Prolog
nojiriko.asia/prolog/t524.html

530 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:53:46 ]
>>527
% Prolog
nojiriko.asia/prolog/t527.html

531 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:58:18 ]
>>523
-- Haskell

data BTree a = Node (BTree a) a (BTree a) | Nil

size :: BTree a -> Int
size Nil = 0
size (Node tl _ tr) = 1 + (size tl) + (size tr)

main = print $ size node
where
node = Node (Node (Node Nil 2 Nil) 4 Nil) 0 (Node Nil 2 Nil)



532 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:35:39 ]
>>524
import System.IO (hFlush, stdout)
import qualified System.IO.UTF8 as U
import Control.Monad.Writer
import Data.Function (on)
import Data.List (sortBy)

main = do
U.putStrLn "終了の際は0を二回押す"
grades <- execWriterT t524
U.putStr "(1)学籍番号順 (2)成績順: " >> hFlush stdout
s <- getLine
let cmp = case (read s) of
1 -> compare `on` fst
2 -> compare `on` snd
let av = average $ map snd grades
mapM_ (printer av) $ sortBy cmp grades
where
printer av (g,s) = U.putStrLn $ "学籍番号" ++ (show g) ++ " 成績" ++ (show s) ++ " 平均との差" ++ (show ((fromIntegral s) - av))

t524 :: WriterT [(Int,Int)] IO ()
t524 = do
liftIO $ U.putStr "学籍番号: " >> hFlush stdout
gakuseki <- liftIO getLine
liftIO $ U.putStr "成績: " >> hFlush stdout
seiseki <- liftIO getLine
let g = read gakuseki
let s = read seiseki
unless (g == 0 && s == 0) $ tell [(g,s)] >> t524

average :: [Int] -> Double
average = uncurry ((/) `on` fromIntegral) . foldl (\(s,l) x -> (s+x, l+1)) (0,0)

533 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:57:16 ]
>>527
main = do
_ <- getLine -- just ignore
conn <- getContents
print $ map words $ lines conn

534 名前:デフォルトの名無しさん [2009/07/21(火) 19:25:20 ]
全くの初心者で、全然わからないんですがよろしくお願いします。アセンブラらしいです。


[課題] キーボードから10進数表示で2桁以下の正の整数を二つ受け取り,これらの積を求めGR1に保存するプログラムを作成しなさい。
ただし,以下の仕様を満たすこと。

掛け算は(上の例の方法ではなく)以下の(参考)の方法で行い,さらに副プログラム内で行うこと
キーボードから受け取った文字列を数値に変換する部分も副プログラムを用いて作成すること
キーボードからは10進数表示で2桁以下の正の整数が必ず入力されると仮定してよい(それ以外の文字列が入力された場合の対応を考えなくてよい)。

(参考) 二つの数の掛け算は,それぞれの2進数表現を考え,加算とシフトを用いることによって実現できる。たとえば,13x3 を計算するとき,13,3の2進数表現 1101,11 に対して通常の掛け算を筆算で行うように



と計算できる。すなわち,この例では

掛ける数の最下位(一番右)のビットが1なので,1101 を(0 ビットシフトして)(0に)加える。
掛ける数の右から2番目のビットが1なので,1101 を 1 ビットシフトして 11010 として1の結果に加える。
という手順により,二つの数の積を計算することができる。

掛ける数を1ビットずつ右にシフトしたとき,最下位ビットが1であればオーバーフローが発生する。
オーバーフローの発生はJOV命令でチェックできる(7/7の演習内容参照)ので,掛ける数の2進数表現においてどのビットが1であるかは直ちにわかる。
また右シフトを繰り返して0になるとZFフラグが1になるので,右シフトを停止するためにはJZE命令を使用すれば良い。

535 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 07:32:01 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/303
# [1] 授業単元:
# インタラクティブッコミュニケーション
# [2] 問題文(含コード&リンク):
# 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、
# main()内のprintf()で結果を出力するプログラムを作成せよ。
# 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは
# 負の値が入力されるまで繰り返されるものとする。
#
# www.ncc-1701.jp/kakei/InteractiveComm/Class10/InteractiveComm_10.html
# の一番下の演習。
# 最終的にはこの形に
# www.ncc-1701.jp/kakei/InteractiveComm/Class10/exercise10.gif

536 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 07:59:46 ]
>>535
% Prolog 題意とは違いますが為替レートはリアルタイムに取得しています。
nojiriko.asia/prolog/t535.html

537 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 11:29:25 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/300
# [1] 授業単元:プログラミング基礎
# [2] 繰り返しをwhileもしくはdo\uff5ewhile文を使って作成しなさい。
#
# 任意の数字を入力し、その数字分まで1つずつ加算して表示する。
# 入力した数字までいったら逆に1になるまで表示する。
#
# 例
# 8
#
# *
# **
# ***
# ****
# *****
# ******
# *******
# ********
# *******
# ******
# *****
# ****
# ***
# **
# *

538 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 11:50:49 ]
>>537
% Prolog ちょっと捻ってみた(コウイウコトヲシテハイケナイ)。

t537(N) :- M is N - 1,length(Z,M),t537([*],Z).

t537(L,Z) :- append(L,_,Z),t537_w(L),t537([*|L],Z).
t537(L,Z) :- t537_w(L),fail.
t537([*],_) :- !.

t537_w(L) :- concat_atom(L,S),write_formatted('%t\n',[S]).

539 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 11:57:44 ]
>>537 一部変更。
% Prolog

t537(N) :- length(L,N),L=[_|Z],t537([*],Z).

t537(L,Z) :- append(L,_,Z),t537_w(L),t537([*|L],Z).
t537(L,Z) :- t537_w(L),fail.
t537([*],_) :- !.

t537_w(L) :- concat_atom(L,S),write_formatted('%t\n',[S]).


540 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 12:41:10 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/297
# [1] 授業単元: 数値解析プログラミング
# [2] 問題文(含コード&リンク): ∫\u20801/1+xx の積分を
# 方形公式、台形公式、シンプソン公式を用いて数値計算するプログラムを作成せよ

541 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:30:31 ]
>>540 (1)
% Prolog

f(X,Y) :- Y is 1 / (1 + x ^ 2).

シンプソンの公式(A,B,M,X) :-
  D is (B - A) / (2 * M),
  f(A,S),
  N is 2 * M - 1,
  シンプソン公式の二(1,N,A,D,S,S2),
  f(B,Z),
  X is (S2 + Z) * D / 3.

シンプソンの公式の二(M,N,_,_,X,X) :- M > N,!.
シンプソンの公式の二(M,N,A,D,Y,X) :-
  U is A + M * D,
  Mod is M mod 2,
  シンプソンの公式の三(Mod,U,Y,Z),
  M2 is M + 1,
  シンプソンの公式の二(M2,N,A,D,Z,X).

シンプソンの公式の三(0,X,S,S2) :- f(X,Y),S2 is S + 2 * Y.
シンプソンの公式の三(1,X,S,S2) :- f(X,Y),S2 is S + 4 * Y.



542 名前:541 mailto:sage [2009/07/22(水) 14:42:49 ]
>>541 訂正 X が x になっていた。
f(X,Y) :- Y is 1 / (1 + X ^ 2).

543 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:01:58 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/431
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):下記
# [3] 環境
#  [3.1] OS:WindowsVista SP1
#  [3.2] Visual stdio2008
#  [3.3] 言語:C
# [4] 期限:2009年7月23日午前7時まで
# [5] その他の制限:できるだけ簡単に
#
# 倍精度浮動小数点型変数で数値を入力し,
# 小数点以下を切り捨て・切り上げ・四捨五入するプログラムを作成せよ.
# ただし, 条件式は使用せず, 型変換を必ず使用すること.

544 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 08:23:13 ]
>>537
(define (f x)
(dotimes (i x) (dotimes (j (+ i 1)) (display "*"))(newline))
(dotimes (i x) (dotimes (j (- x i 1)) (display "*"))(newline)))
(port-for-each f read)

545 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 09:08:46 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/448
# [1] 授業単元:数値情報解析
# [2] 問題文:ニュートン法により代数方程式を解くプログラムを作りなさい。
#       適当な初期値を自分で設定し、3つの真解すべてを求めなさい。
#       ただし、結果画面には(1)収束解(2)初期値(3)反復回数が表示されている
こと。
#       このとき、1回の実行で3つの真解すべてを求める必要はない。
#       初期値を与え直しながら実行した結果画面が3枚示されていれば
#       よいものとする。
# ・ 解くべき代数方程式 : x^3 - 6x^2 + 7x +2 = 0
# ・収束条件 : ε < 10^-10
#       ・微分は自分で計算した結果(3x^2 - 12x + 7 = 0)をソースファイルに
#        直接入力してよいものとする。

546 名前:デフォルトの名無しさん [2009/07/23(木) 12:39:50 ]
>>545

(defun f (x)
(let* ((xx (* x x)) (xxx (* xx x)))
(+ xxx (* -6l0 xx) (* 7l0 x) 2l0)))

(defun d (x)
(let ((xx (* x x)))
(+ (* 3l0 xx) (* -12l0 x) 7l0)))

(defconstant err 1.0l-10)

(defun solv (x0)
(do ((n 0) (x x0) xtmp (endf nil))
(endf (format t "x = ~A x0=~A n=~A ~%" x x0 n))
(setf xtmp (- x (/ (f x) (d x))))
(if (< (abs (- x xtmp)) err)
(setf endf t))
(setf x xtmp
n (1+ n))))

(defun input (s)
(format t s)
(read))

(do ((x (input "初期値 x0? ") (input "初期値 x0? ")))
((not (numberp x)))
(solv x))

こんな感じ?


547 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 16:00:08 ]
>>545
% Prolog
nojiriko.asia/prolog/t545.html

548 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 17:06:20 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/450
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 下に示す2 行3 列の行列a, b の差を求めて表示するプログラムを作成せよ.
#
# a =
# (
# 6 3 4
# 5 1 2
# )
# b =
# (
# 1 2 3
# 4 5 6
# )


549 名前:デフォルトの名無しさん [2009/07/23(木) 17:10:15 ]
>>548
% Prolog

a([[6,3,4],[5,1,2]]).
b([[1,2,3],[4,5,6]]).

t548 :-
a(A),b(B),行列の差(A,B,C),
write_formatted('%t\n',[C]).

行列の差([],[],[]) :- ! .
行列の差([A|R1],[B|R2],[C|R3]) :- 行列の差の一(A,B,C),行列の差(R1,R2,R3),!.

行列の差の一([],[],[]) :- !.
行列の差の一([A|R1],[B|R2],[C|R3]) :- C is A - B,行列の差の一(R1,R2,R3),!.

550 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 18:38:58 ]
なんかこのスレ
コードばっかで良スレっぽいな

551 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 19:47:08 ]
>>537
main = do
n <- getLine >>= return . read
mapM_ (putStrLn . flip replicate '*') [1..n]
mapM_ (putStrLn . flip replicate '*') $ reverse [1..n-1]



552 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:11:31 ]
>>548
msub :: (Num a) => [[a]] -> [[a]] -> [[a]]
msub = zipWith (zipWith (-))

main = do
mapM_ print $ a `msub` b
where
a = [[6, 3, 4], [5, 1, 2]]
b = [[1, 2, 3], [4, 5, 6]]

553 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 21:22:33 ]
>>543
% Prolog 条件式(Prologの場合,節の選択)なしで切り上げ、思いつきません!

切り下げ(_浮動小数点数,_切り下げられた整数) :-
_切り下げられた整数 is truncate(float_integer_part(_浮動少数点数)).

四捨五入(_浮動小数点数,_四捨五入された整数) :-
_四捨五入された整数 is truncate(0.5 + float_integer_part(_浮動少数点数)).


554 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:04:05 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/457
# [1] 授業単元 C++
#
# [2] 問題文(含コード&リンク)
# テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、
# 新たなファイルに書き出しなさい。ただし、N≧0とする。
# コマンドパラメーター:入力ファイル名、出力ファイル名、N
#
# <解答例>
# Hello( )Bye←入力ファイル
# N=3の場合
# Hello( )Bye←出力ファイル

555 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:26:34 ]
>>554
% Prolog (1/2)

t554(_入力ファイル,_出力ファイル,_空白文字数) :-
  length(L,_空白文字数),
  all(L,' '),
  get_chars(_入力ファイル,Chars),
  replace_chars(Chars,['\t'],L,Chars2),
  put_chars(_出力ファイル,Chars2).

replace_chars([],_,_,[]) :- !.
replace_chars(L1,L2,L3,L4) :-
  append(L2,R1,L1),
  replace_chars(R1,L2,L3,L5),
  append(L3,L5,L4),!.
replace_chars([A|R1],L2,L3,[A|R4]) :-
  replace_chars(R1,L2,L3,R4).


556 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:28:55 ]
>>554
% Prolog (2/2) ユーティリティ

get_chars(File,L) :-
open(File,read,Input),
get_char(Input,X),
get_chars(Input,X,L),
close(Input),!.

get_chars(Input,end_of_file,[]) :- !.
get_chars(Input,X,[X|R]) :-
get_char(Input,Y),
get_chars(Input,Y,R) .

put_chars(F,L) :-
open(F,write,Output),
stream_put_chars(Output,L),
close(Output),!.

stream_put_chars(_,[]) :- !.
stream_put_chars(Stream,[Char|R]) :-
put_char(Stream,Char),
stream_put_chars(Stream,R),!.

all([],_).
all([V|R],V) :- all(R,V).

557 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:30:45 ]
>>554 書き直し
% Prolog (2/2) ユーティリティ

get_chars(File,L) :-
  open(File,read,Input),
  get_char(Input,X),
  get_chars(Input,X,L),
  close(Input),!.

get_chars(Input,end_of_file,[]) :- !.
get_chars(Input,X,[X|R]) :-
  get_char(Input,Y),
  get_chars(Input,Y,R) .

put_chars(F,L) :-
  open(F,write,Output),
  stream_put_chars(Output,L),
  close(Output),!.

stream_put_chars(_,[]) :- !.
stream_put_chars(Stream,[Char|R]) :-
  put_char(Stream,Char),
  stream_put_chars(Stream,R),!.

all([],_).
all([V|R],V) :- all(R,V).

558 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:38:53 ]
>>543
Haskell では RealFrac クラスに floor, ceil, round が定義されている

main = do
v <- getLine >>= return . read
mapM_ (print . ($ v)) [floor, ceiling, round]

559 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 23:01:29 ]
>>554

import System.Environment (getArgs)
import System.IO
import Control.Exception (bracket)

main = do
[infile, outfile, n] <- getArgs
h <- openFile infile ReadMode
conn <- hGetContents h
let s = t554 (read n) conn
bracket (openFile outfile WriteMode) hClose $ flip hPutStr s
hClose h

t554 :: Int -> String -> String
t554 _ [] = []
t554 n ('\t':xs) = replicate n ' ' ++ t554 n xs
t554 n (x:xs) = x : t554 n xs

560 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 08:19:20 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/910
# コンピュータと人間か対戦する形で実行する3目並べのプログラムを作成せよ
#
# *先攻、後攻はゲーム毎に乱数で決定する
# *人間が手を打った場合、コマを置ける場所かどうかのチェックを行うこと
# *勝ち負けの判定を行うこと
# *コンピュータ側の手はランダムでも良いが、可能な範囲で工夫してみよ

561 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:59:03 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/473
# [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだデータ文字列を、
# データベースに格納する前にキューに一時的に格納するプログラムを
# 作成する。このとき、データをまとめたデータ文字列を一つずつ、キューへ
# エンキューしたり、デキューしたりする過程が分かるプログラムを作成する。
# なお、キューを実現するライブラリは、キューのための別のヘッダにまとめる。
# [そのほか]
# ・入力ストリームから読み込んだデータ文字列を、キューにエンキューしたり、
# デキューしたりするたびにデータベースに格納された全データを表示する。
# ・構造体オブジェクトは動的な記憶域に生成する。
# ・生徒の名前、試験の点数を構造体オブジェクトに格納することとする。
# ・関数の処理にコメントをつけて、キューをどのように実現しているか、
# そのプログラムの処理内容が分かるようにする。
# [このプログラムの流れ]
# (1)ファイルやキーボードなどの入力ストリームから
# データをデータ文字列として読み込む
# (2)このデータ文字列をキューに一時的に蓄える
# (3)キューからデータ文字列を取り出す
# (4)このデータ文字列からそれぞれデータを取り出して
# 文字列や数値データに変換する
# (5)変換したデータをデータベース(構造体の配列など)に格納してまとめて管理する

# (6)このデータベースからデータを参照し、ディスプレイに出力する



562 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 17:50:28 ]
>>561
% Prolog
% 仕様通りだと面白くないので、要素を読み込む毎にキューに追加、
% 改行が来るとキューからすべて読み出すように変更した。
nojiriko.asia/prolog/t561.html

563 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 04:17:39 ]
>>562
すみません。二ヶ所、述語名の付け違いがありました。
書き直しました。

564 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 11:25:17 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/535
# [1] C++
# [2] 問題文(含コード&リンク):
# (1) 演算子+,-,*,/と整数と浮動小数点数からなる計算式の文字列から
# 計算木を作成せよ。計算木は次のようなc_tree構造体を使うとする。
#
# struct c_tree
# {
# int type;
# union { int n_value; double d_value; };
# c_tree *left, *right;
# };
# typeは、'+', '-', '*', '/', 'n', 'd'のいずれか。
#
# (2) 優先順位に注意してc_tree構造体からなる計算木から
# 計算式の文字列を作成せよ。

565 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 13:48:46 ]
>>564
ちょっと長くなったので codepad で
Parsec はすばらしい

Haskell
codepad.org/0JybDotF

566 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:23:08 ]
(quote exp)

567 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 04:34:19 ]
# [1] 授業単元: プログラミング
# [2]問題文:以下の2つの構造体を用い,sample_data2.txt を単方向連結リストに保存す
るプログラム extra8 を作成せよ.item_list 中の item は各行中の数値を保持し,t_li
st 中の itemset は1行分のデータを保持するものとする.
# struct item_list {
# int item;
# struct item_list *next;
# };
# struct t_list {
# struct item_list itemset;
# struct t_list *next
# };
# ソースファイルの名前は extra8.c とする.また,extra8.c には,
# 生成した単方向連結リストの内容を標準出力に出力する関数 print_tlist を
# 含むものとし,以下の実行例のように print_tlist により各行の内容を出力
# するものとする.
# なお,入力ファイル名はコマンドライン引数で指定するものとし,入力ファイルが
# オープンできなかった場合の処理も含めること.また,プログラム自身を除く
# 引数の数が0個,もしくは2個以上の場合は,何もせず適切なメッセージを出力して
# 終了するものとする.
# (実行例1)
# > .\extra8 sample_data2.txt
# Itemset: 1,3,9,13,23,25,34,36
# Itemset: 2,3,9,14,23,26,34,36,39,40,52,55,59

568 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 07:42:02 ]
>>567
% Prolog

extra8 :-
  user_parameters([File]),
  get_lines(File,Lines),
  findall(Item_list,(member(Line,Lines),split(Line,[','],Item_list)),T_list),
  assertz(t_list(T_list)).

print_tlist :-
  t_list(T_list),
  member(Item_list,T_list),
  print_tlist_format(Item_list,Format),
  write_formatted(Format,Item_list),
  fail.
print_tlist.

print_tlist_format(Item_list,Format) :-
  length(Item_list,Len),
  length(L,Len),
  all(L,'%t'),
  concat_atom(L,',',S),
  concat_atom(['Items : ,S,'\n'],Format),!.

569 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 20:03:33 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/574
# [1] 授業単元:プログラミング序論演習
# [2] 問題文(含コード&リンク): CUI上で動くメーラーを作れ

570 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 20:08:29 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/559
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9844.txt
# 電流I[A]: 0.3 0.4 0.5 0.6 0.7 0.8
# 電圧V[V]: 11.6 12.3 12.8 13.4 23.7 14.8
#
# この電流Iと電圧Vとの関係を最小二乗法によって、
# 以下に示す1次関数で近似したい
#
# V=a0+a1I
#
# この時の係数a0とa1 また相関係数を求めなさい。

571 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 20:12:00 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/53
# 【 課題 】
# 以下のURLから正規表現を用いてキーワードの部分のみ抽出する
# プログラムを作成せよ。
#
# www.google.co.jp/search?q=キーワード&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a



572 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:08:42 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/580
# [1] 授業単元: 論理学
# [2] 問題文: 整数からなる配列を受け取り、その最大値を除いた配列を
# 出力するメソッドを定義せよ。
# ただし、配列の長さが3未満のときはnilを出力する。

573 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:13:29 ]
>>572
% Prolog

t572(L,X) :- length(L,Len),Len < 3,!,write('nil\n').
t572(L,X) :-
  max(L,Max),
  ならびから削除(Max,L,X).

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

574 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:59:08 ]
>>571
-- Haskell

import Text.Regex
import qualified System.IO.UTF8 as U

main = let Just [_,keyword] = matchRegex reg str in U.putStrLn keyword
where
reg = mkRegex "(\\?|&)q=([^&]+)"
str = "www.google.co.jp/search?q=キーワード&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a"

575 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:32:46 ]
>>572
nil は [] で代用した

-- Haskell
import Data.List (delete)

t572 :: (Ord a) => [a] -> [a]
t572 xs | length xs < 3 = []
| otherwise = delete (maximum xs) xs

main = print $ t572 [1,3,2]

576 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:03:39 ]
>>570
-- Haskell

leastSquares :: (Fractional a) => [a] -> [a] -> (a,a)
leastSquares xs ys = ((n*sxy-sx*sy)/(n*sxx-sx*sx), (sxx*sy-sxy*sx)/(n*sxx-sx*sx))
where
n = fromIntegral $ length xs
sx = sum xs
sy = sum ys
sxy = sum $ zipWith (*) xs ys
sxx = sum $ map (^2) xs

pearson :: (Floating a) => [a] -> [a] -> a
pearson xs ys = a / (sqrt b) * (sqrt c)
where
mx = (sum xs) / (fromIntegral (length xs))
my = (sum ys) / (fromIntegral (length ys))
a = sum $ zipWith (\x y -> (x-mx)*(y-my)) xs ys
b = sum $ map (\x -> (x-mx)^2) xs
c = sum $ map (\y -> (y-my)^2) ys

main = do
let (a,b) = leastSquares is vs
putStrLn $ "a0=" ++ show b ++ ", a1=" ++ show a
print $ pearson is vs
where
is = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8]
vs = [11.6, 12.3, 12.8, 13.4, 13.7, 14.8]

577 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 04:54:25 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/604
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9849.txt
# 配列を引数とする再帰呼び出しによるマージソート
#
#  入出力配列を引数とする再帰的手続きを作成し、マージソートを実現せよ。
# ただし、各入力要素X[i]は整数値をとるものとする。関数として、
# 長さnの配列Xをマージソートによって小さい順に並べ替えた配列Yを求める
# msort(int X[],int n,int Y[]),すでに並べ替えられている長さn1の配列Y1と長さn2の
# 配列Y2を併合した配列Yを求めるmerge(int Y1[],int n1,int Y2[],int n2,intY[]),
# 長さnの配列Xの各要素のアドレス、ならびに内容を表示するshow_addr(int X[],int n)を用意する。

578 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 05:04:17 ]
>>577
% Prolog
debug(off).

msort([],[]).
msort([X],[X]).
msort(_ならび,_sortされたならび) :-
  ならびを分割(_ならび,_ならび1,_ならび2),show_list(分割,[_ならび,_ならび1,_ならび2]),
  msort(_ならび1,_整列されたならび1),show_list(msort,[ならび1,_整列されたならび1]),
  msort(_ならび2,_整列されたならび2),show_list(msort,[ならび2,_整列されたならび2]),
  merge(_整列されたならび1,_整列されたならび2,_整列されたならび),show_list(merge,[_整列されたならび1,_整列されたならび2,_整列されたならび]).

ならびを分割([],[],[]).
ならびを分割([X],[X],[]).
ならびを分割([A,B|R1],[A|R2],[B|R3]) :- ならびを分割(R1,R2,R3).

merge([],X,X) :- !.
merge(X,[],X) :- !.
merge([A|R1],[B|R2],[A|R3]) :- A @< B,merge(R1,[B|R2],R3).
merge([A|R1],[B|R2],[B|R3]) :- A @>= B,merge([A|R1],R2,R3).

show_list(_,_) :- debug(off).
show_list(_述語,_ならびのならび) :- debug(on),write_formatted('%t: %t\n',[_述語,_ならびのならび]).

579 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 06:15:55 ]
>>571
% Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を
% 使ってみる。
% sub_atom/10の定義はprolog.asia/prolog/t264_u.html 参照。

t571(URL,_キーワード) :-
sub_atom(URL,_,_,_,_,'?q=',G,_,_,_),
sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!.

580 名前:579 mailto:sage [2009/07/28(火) 06:32:16 ]
>>571 >>579 sub_atom/10のリンクを間違えました。再掲。
% Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を
% 使ってみる。
% sub_atom/10の定義はnojiriko.asia/prolog/t264_u.html 参照。

t571(URL,_キーワード) :-
  sub_atom(URL,_,_,_,_,'?q=',G,_,_,_),
  sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!.

581 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:18:26 ]
>>577
-- Haskell

import Data.Function (on)

merge :: (Ord a) => [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge a@(x:xs) b@(y:ys) | x < y = x : merge xs b
| otherwise = y : merge a ys

msort :: (Ord a) => [a] -> [a]
msort [] = []
msort [x] = [x]
msort xs = uncurry (merge `on` msort) $ splitAt ((length xs) `div` 2) xs

main = print $ msort [4,1,2,7,5]



582 名前:デフォルトの名無しさん [2009/07/29(水) 01:53:48 ]
>>570
相関係数ってどう定義されてんの?


583 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 04:41:04 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/659
# [1] C言語
# [2] 入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを
# 調べるプログラムcount_char.cを作成せよ。
#
# 実行例
# String: cbbbAcAccZ
# A: **
# Z: *
# b: ***
# c: ****
# %


584 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 04:43:43 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/660
# [1] C言語
# [2] 2つのファイルを比較し,内容が異なっている最初の行の行番号と内容を
#   標準出力に表示するプログラムを作成せよ。
#   ファイル名はコマンドライン入力により受け取ることとする。
# [3] 環境
#  [3.1] OS:Windows
#  [3.2] コンパイラ:gcc 3.4
#  [3.3] 言語:C
# [4] 期限:2009年7月31(金)
# [5] その他の制限:ポインタ履修済みです


585 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 05:00:03 ]
>>584
% Prolog

t584 :-
  user_parameters([File1,File2]),
  get_lines(File2,L1),
  get_lines(File2,L2),
  append(L,[A|_],L1),
  append(L,[B|_],L2),
  \+(A=B),
  length(L,Len),
  _行番号 is Len + 1,
  write_formatted('行番号=%t %t=%t %t=%t\n',[_行番号,File1,A,File2,B]).


586 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 06:08:46 ]
>>583
% Prolog

t583(_文字列) :-
  atom_chars(_文字列,Chars),
  t583_1(Chars,[],QL),
  member([U,Q-[]],QL),
  concat_atom(Q,S),
  write_formatted('%t: %t\n',[U,S]),
  fail.
t583(_).

t583_1([],X,X).
t583_1([A|R],QL,X) :-
  t583_2(A,QL,QL2),
  t583_1(R,QL2,X).

t583_2(A,[],[[A,QA]]) :-
  新しいキューを作る(Q),
  キューに要素を追加する('*',Q,QA),!.
t583_2(A,[[A,QA]|R],[[A,QB],R]) :-
  キューに要素を追加する('*',QA,QB),!.
t583_2(A,[U|R1],[U|R2]) :-
  t583_2(A,R1,R2).

新しいキューを作る(X-X).
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).

587 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 11:18:28 ]
>>583
-- Haskell

import Data.Char (isAlpha)
import Data.Map (Map, fromListWith, toList)

countChar :: String -> Map Char Int
countChar = fromListWith (+) . flip zip (repeat 1) . filter isAlpha

main = getContents >>= mapM_ putStrLn . prettify . countChar
where
prettify :: Map Char Int -> [String]
prettify = map (\(k,v) -> k : ": " ++ (replicate v '*')) . toList

588 名前:585 mailto:sage [2009/07/30(木) 12:54:13 ]
>>584 >>585 訂正
  get_lines(File2,L1),
  get_lines(File2,L2),
とありますが、上の行は get_lines(File1,L1), です。

589 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 07:42:41 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/688
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):本文が長すぎて書き込めないので下に
# 分けて書き込みます
pc12.2ch.net/test/read.cgi/tech/1247438792/689
pc12.2ch.net/test/read.cgi/tech/1247438792/690
pc12.2ch.net/test/read.cgi/tech/1247438792/691


590 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 07:46:16 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/704
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt
# リストを用いた成績処理
# リストを用いて個人データを格納する表を作成
# 処理番号を入力して処理の切り替えを行う
# 1.成績一覧表示, 2.個人成績表示,
# 3.個人平均点表示,4.科目平均点表示,
# 0.終了
# リストに新たにデータを追加する時は学生番号順に並ぶように追加する.
# リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.
#
# 入力する成績データ(この順番で入れる)
# 学番名前英語数学化学物理
# 106 tada 65 80 90 100
# 101 kouda 50 85 70 65
# 103 hanako 70 75 65 80
# 104 akane 60 95 80 75
# 102 tarou 90 80 85 65
# 105 nara 80 70 50 95

591 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 08:29:12 ]
pc12.2ch.net/test/read.cgi/tech/1248012902/76
# 【 課題 】タートルグラフィックスを描写するプログラムを作成する。
#       rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/775.zip
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】8/2
# 【 Ver  】 java version 1.6.0_14
# 【 補足 】どう手を付けたらいいのか分からない状態です…
#        実装するのはright left forwardの3つだけでいいみたいです。
#        よろしくお願いします。
nojiriko.asia/jpeg/IMG_0001.jpg



592 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:29:53 ]
>>589
% Prolog (第1ステップ)
nojiriko.asia/prolog/t589.html

593 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 21:02:07 ]
>>590
% Prolog
nojiriko.asia/prolog/t590.html

594 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 22:59:25 ]
pc12.2ch.net/test/read.cgi/tech/1247636661/364
# 質問です。
#
# 入退室の時間を自分で打ち込んで、それをデータとして貯めるというシステムを作り
たいんですが、こういうシステムを
# 作る場合はPHPとMySQLで作れるんでしょうか。よろしくお願いします。
#


595 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 23:39:15 ]
>>594
% Prolog (1/2)
入退室 :-
  入退室管理ディレクトリ(Dir),
  concat_atom(['ls -N ',Dir,'listing.*.pro'],S),
  shs(S,L),
  max(L,File),
  reconsult(File).

入室(_氏名) :-
  A is time,
  localtime(A,B,_月,_日,_,_,_時,_分,_秒),
  assertz(入退室(入室,_氏名,_年,_月,_日,_時,_分,_秒)),
  入退室保存ファイル(_入退室保存ファイル),
  tell(_入退室保存ファイル),
  listing(入退室),
  told,!.

退室(_氏名) :-
  A is time,
  localtime(A,B,_月,_日,_,_,_時,_分,_秒),
  assertz(入退室(退室,_氏名,_年,_月,_日,_時,_分,_秒)),
  入退室保存ファイル(_入退室保存ファイル),
  tell(_入退室保存ファイル),
  listing(入退室),
  told,!.

596 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 23:42:55 ]
>>594
% Prolog (2/2)
% システム運用の最初に/var/nyutaishitsu/listing.100000.proを生成して置きます
入退室管理ディレクトリ('/var/nyutsishitsu/').

入退室保存ファイル(F) :-
  入退室管理ディレクトリ(Dir),
  concat_atom(['ls -N ',Dir,'listing.*.pro'],S),
  shs(S,L),
  max(L,File),
  sub_atom(File,_,6,4,A),
  atom_to_term(A,N,_),
  N2 is N + 1,
  concat_atom(['/var/nyutaishitsu/listing.',N2,'.pro'],F),!.

597 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 23:58:20 ]
>>594 >>595 >>596
不適切なところが少々ありました。訂正はこれらで。
nojiriko.asia/prolog/t594.html

598 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 09:56:28 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/743
# [1] 授業単元:プログラミング基礎
# [2] 問題文(含コード&リンク):
# 2つの整数をキーボードから入力し、それらの最大公約数を表示する
# プログラムを作成せよ。
# 最大公約数と、2つの数字を割り切る最大の整数のことである。
# 例えば12と18の最大公約数は6,24と48の最大公約数は24である。

599 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 10:01:52 ]
>>598
% Prolog
t598 :-
  write('最大公約数を求めます。一行にひとつ整数を入力してください : '),
  get_line(Line1),atom_to_terms(Line1,N1,_),
  get_line(Line2),atom_to_terms(Line2,N2,_),
  appendを使って最大公約数を求める(N1,N2,X),
  write_formatted('%tと%tの最大公約数は%tです\n',[N1,N2,X]).

appendを使って最大公約数を求める(N1,N2,X) :-
  length(L1,N1),
  length(L2,N2),
  最大公約数(L1,L2,[_],[_],LX),
  length(LX,X).

appendを使って最大公約数を求める(L1,L2,L,X,X) :-
  not((append(L,_,L1),append(L,_,L2))),!.
appendを使って最大公約数を求める(L1,L2,L,_,X) :-
  割り切れる(L1,L),
  割り切れる(L2,L),
  appendを使って最大公約数を求める(L1,L2,[_|L],L,X).
appendを使って最大公約数を求める(L1,L2,L,Y,X) :-
  appendを使って最大公約数を求める(L1,L2,[_|L],Y,X).

割り切れる([],_) :- !.
割り切れる(L,DL) :-
  append(DL,L3,L),
  割り切れる(L3,DL).


600 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 12:05:02 ]
>>598
-- Haskell では Prelude に gcd が含まれている
import Control.Monad (replicateM)
main = replicateM 2 readLn >>= print . foldl1 gcd

601 名前:599 mailto:sage [2009/08/02(日) 15:07:41 ]
>>598 >>599
間違っていました。
途中、'最大公約数'/5 という述語が副目標として登場しますが、
これは、'appendを使って最大公約数を求める'/5 の間違えです。
nojiriko.asia/prolog/t598.html の方を見て下さい。



602 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 18:47:48 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/918
# 所謂覆面算で
# 英字一文字が一桁の数字(0-9)で表されるとき
# one
# + nine
# + twenty
# + fifty
# = eighty
# となる組み合わせを検索してください
# 各行の先頭の文字は0以外です


603 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 18:50:25 ]
>>602
% Prolog
nojiriko.asia/prolog/t602.html

604 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 20:28:36 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/759
# [1] 授業単元:工学実験
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9870.txt
#
# 課題内容: 組クラスを作成しなさい。組クラスは教員と学生からなる。
# 教員は1人で学生は最大40人とする。学籍番号で検索する機能をつけること。
# 学生には名前、住所、学籍番号(文字列型)という属性があり、教員には
# 名前、住所、教員番号(文字列型)という属性があるとする。
# 教員と学生の共通部分をまとめたクラスを定義し、それを継承する形で
# 教員クラスと学生クラスを定義せよ。
# それぞれの属性にはgetter、setter、表示関数を定義せよ。
# 継承した教員クラスで、名前を表示する関数では、「○○教授」、「○○助教授」
# などのように役職名を添えて表示する関数として、上書き定義せよ。
# これらの機能が正しく動作することを確認するmain関数(適当なサンプル)も
# あわせて作ること。

605 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 06:36:08 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/777
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# ttp://dl1.getuploader.com/g/4a7538af-eda0-4179-9e58-2a304038400b/komekome1221/4/%E5%95%8F%E9%A1%8C%E5%88%86.txt

606 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 07:11:34 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/776
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 以下の機能を持った関数を含むプログラムを作成せよ.
# 1.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いて作成せよ.
# 2.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いないで作成せよ.

607 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 07:20:42 ]
>>606 [2]
% Prolog 見かけ再帰を含みませんが、実はfor/3やconcat_atom/3は再帰なしには書けない・・・

t606_2(N,R,X) :-
  findall(N1,for(N,N1,R+1),L1),
  findall(N2,for(R,N2,1),L2),
  concat_atom(L1,'*',S1),
  concat_atom(L2,'*',S2),
  atom_to_term(S1,Term1,_),
  atom_to_term(S2,Term2,_),
  X is Term1 / Term2.


608 名前:607 mailto:sage [2009/08/03(月) 08:05:18 ]
>>606 >>607 また違っていたようです。

t606_2(N,R,X) :-
  Y is N-R+1,
  findall(N1,for(N,N1,Y),L1),
  findall(N2,for(R,N2,1),L2),
  concat_atom(L1,'*',S1),
  concat_atom(L2,'*',S2),
  atom_to_term(S1,Term1,_),
  atom_to_term(S2,Term2,_),
  X is Term1 // Term2.


609 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 18:40:06 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/786
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):台形公式により関数y=x^2とx軸によって
# 挟まれる部分のx=0〜x=8までの範囲の面積を求めよ。
# 分割は4で計算せよ。

610 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 18:47:56 ]
>>609
% Prolog
nojiriko.asia/prolog/t609.html

611 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 20:56:19 ]
>>602
-- Haskell で.総当たり
import Data.List (permutations)

t602 = [xs | xs@[e,f,g,h,i,n,o,t,w,y] <- permutations [0..9],
o /= 0, n /= 0, t /= 0, f /= 0, e /= 0,
a [o,n,e] + a [n,i,n,e] + a [t,w,e,n,t,y] + a [f,i,f,t,y] == a [e,i,g,h,t,y]]
where
a xs = foldl (\s i -> 10*s + i) 0 xs

main = print $ head $ t602



612 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 21:18:14 ]
>>606
-- Haskell で.foldl1 は末尾再帰だから許して

comb n r | r == 0 = 1
| n == r = 1
| otherwise = comb (n-1) r + comb (n-1) (r-1)

fact n = foldl1 (*) [1..n]
comb' n r = fact n `div` (fact r * fact (n-r))

main = print $ comb' 4 2

613 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 08:59:20 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/794
# 【質問テンプレ】
# [1] 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):ハッシュ(チェイン法)を使ってkeyを検索し、
# 該当するものがあればそのdataを表示する。
# (実際には検索してkeyとdataを返すまでです)
# 詳しくはこちらで ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9879.txt
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9881.txt


614 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 09:02:27 ]
>>613
% Prolog でハッシュといえば述語のこと。

t613(Key,Data) :- 'KeyAndData'(Key,Data).

615 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 12:35:12 ]
pc12.2ch.net/test/read.cgi/tech/1247438792/812
# 続けて申し訳ありません
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
#
# 引数に度(degree)をとるsin_degree関数を作成しなさい。
# math.hで宣言されているsin関数を使用せずに自作すること。

616 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 12:52:14 ]
>>615
% Prolog

sin_degree(_角度,X) :-
  R is (_角度 / 180) * 3.14159,
  sin_degree(1,20,R,1.0,0.0,X).

sin_degree(M,N,_,_,X,X) :- M > N,!.
sin_degree(M,N,R,K,Y,X) :-
  sin_degree(M,R,1,U),
  Y2 is Y + U * K,
  K2 is K * (-1),
  M2 is M + 2,
  sin_degree(M2,N,R,K2,Y2,X).

sin_degree(0,R,X,X) :- !.
sin_degree(N,R,Y,X) :-
  Y2 is (Y * R) / N,
  N2 is N - 1,
  sin_degree(N2,R,Y2,X).






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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