[表示 : 全て 最新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/

80 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 07:46:51 ]
>>79 実行例
?- push(3,[],L1),push(4,L1,L2),not(empty(L2)),pop(X,L2,L3),write(L3),nl.
[4]
L1 = [3],
L2 = [3,4],
X = 3,
L3 = [4]
yes
?-

81 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 07:50:01 ]
>>80 失礼、まちがえました。実行していなかったので・・・
?- push(3,[],L1),push(4,L1,L2),not(empty(L2)),pop(X,L2,L3),write(L3),nl.
[3]
L1 = [3],
L2 = [3,4],
X = 4,
L3 = [3]
yes
?-

82 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 07:51:47 ]
>>81 まだ間違えがあった!!
?- push(3,[],L1),push(4,L1,L2),not(empty(L2)),pop(X,L2,L3),write(L3),nl.
[3]
L1 = [3],
L2 = [4,3],
X = 4,
L3 = [3]
yes
?-

83 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:17:05 ]
// javascript(JScript) + WSH で >>78。WSHは、Echoだけですが。
function puts(x){WScript.Echo(x);}
function Stack(){}
Stack.prototype = {
    node: undefined,
    push: function(x){
        this.node = {'next': this.node, 'value':x};
        return this;
    },
    pop: function(x){
        var value = undefined;
        if(this.node){
            value = this.node.value;
            this.node = this.node.next;
        }
        return value;
    },
    empty: function(){return !this.node},
    show: function(){
        var a = [];
        for (var node=this.node; node; node=node.next){a.push(node.value);}
        puts('[' + a.join(',') + ']');
    }
}
function main(){
    var stack = new Stack();
    stack.push(3).push(1).push(4).push(1).push(5).push(9).push(2);
    stack.show();
    while(!stack.empty()){puts('POP :' + stack.pop()); stack.show();}
}
main();// 動作テスト

84 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 06:57:11 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/588
【 課題 】車、新幹線、飛行機の3つの交通手段を考える。
距離と、所要時間の最大限度(許容最長時間)を指定したとき、許容最長時間内に
目的地に到着可能で、かつ、費用が一番安い交通手段を調べて表示しなさい。
ただし、距離(km)と許容最長時間(h) は浮動小数点数としてキーボードから与える。
許容最長時間内に到着できる手段がない場合は、「不可能です」と表示する。
それぞれの時速、料金、利用規定は
車 : 60km/h、20 円/km、
新幹線 : 200km/h、50 円/km、距離が50km以上のときに利用可能
飛行機 : 1000km/h、35 円/km、距離が400km以上のときに利用可能 待機・乗降を合わせ
て1 時間にかかる
とする。

85 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 08:00:20 ]
>>84
% Prolog (1/2)
:- op(250,xf,km).
:- op(250,xf,h).
:- op(250,xf,円).

交通手段(車).
交通手段(新幹線).
交通手段(飛行機).
時速(車,60 km / h).
時速(新幹線,200 km / h).
時速(飛行機,1000 km / h).
料金(車,20 円 / km).
料金(新幹線,50 円 / km).
料金(飛行機,35 円 / km).
利用規定(新幹線,_距離 km) :- _距離 >= 50.
利用規定(飛行機,_距離 km) :- _距離 >= 400.
利用規定(車,_距離 km) :- _距離 >= 0.
付加的な所要時間(飛行機,待機・乗降の合計,1 h).
付加的な所要時間(車,なし,0 h).
付加的な所要時間(新幹線,なし,0 h).

86 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 08:02:22 ]
% Prolog (2/2)
許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_距離 km,_許容
最長時間 h,_交通手段) :-
findall([_費用,_交通手段],(交通手段(_交通手段),目的地に到達時間(_交通手段,_
距離 km,_許容最長時間 h,_費用)),_候補リスト),
min(_候補リスト,[_費用,_交通手段]),!.

許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_,_,'不可能です
').

目的地に到達時間(_交通手段,_距離 km,_許容最長時間 h,_費用) :-
利用規定(_交通手段,_距離 km),
時速(_交通手段,_時速 km / h),
料金(_交通手段,_料金 円 / km),
付加的な所要時間(_交通手段,_,_付加的な所要時間 h),
_到達時間 is (_距離 / _時速) + _付加的な所要時間,
_到達時間 =< _許容最長時間,
_費用 is _料金 * _距離.


87 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 18:33:54 ]
>>86 全面的に書き換え % Prolog (2/2)

許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_距離 km,_許容
最長時間 h,_交通手段) :-
 findall([_費用,_交通手段],
  ( 交通手段(_交通手段),
   許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h),
   料金(_交通手段,_料金 円 / km),
   _費用 is _料金 * _距離),_候補リスト),
 min(_候補リスト,[_費用,_交通手段]),!. 

許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_,_,'不可能です
').

許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h) :-
 利用規定(_交通手段,_距離 km),
 時速(_交通手段,_時速 km / h),
 付加的な所要時間(_交通手段,_,_付加的な所要時間 h),
 _到達時間 is (_距離 / _時速) + _付加的な所要時間,
 _到達時間 =< _許容最長時間.

88 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 05:57:59 ]
pc12.2ch.net/test/read.cgi/tech/1242655611/792
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): 1~100の任意のN個の整数値を一次元配列に読み込み、そ
の合計値と平均値を求め、
               80~100,70~79,60~69,59以下の個数をそれぞれ出力する
プログラムを作りなさい。
               (1)入力データ数(Nは10以上とする)
               (2)入力データ値(配列より読み出し、同じ値は使わな
い)
               (3)入力データの合計値、平均値
               (4)入力データについて各ランクの個数

               (1)~(3)まではできたのですが、(4)がわかりません。。

               kansai2channeler.hp.infoseek.co.jp/cgi-bin/
joyful/img/9352.txt
               ↑これの続きにお願いします!



89 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:03:21 ]
>>88
% Prolog (1/3)
問題C792 :-
問題C792(_合計,_平均,_ランクリスト),
集計項目の表示(_合計,_平均,_ランクリスト).

問題C792(_合計,_平均,_ランクリスト) :-
入力データ数の設定(_入力データ数),
整数を読み込む(_入力データ数,[],_入力データ値リスト),
入力データの集計(_入力データ値リスト,_入力データ数,[0,0,0,0],_ランクリ
スト,0,_合計,_平均).

集計項目の表示(_合計,_平均,_ランクリスト) :-
write_formatted('合計: %t\n平均: %t\n',[_合計,_平均]),
list_length(_ランクリスト,_ランクの数),
for(1,N,_ランクの数),
ランク(_,N,_ランク表示),
list_nth(N,_ランクリスト,_ランク集計値),
write_formatted('%t: %t\n',[_ランク表示,_ランク集計値]),
N=_ランクの数.

ランク(N,1,'80~100') :- N>=80,N=<100.
ランク(N,2,'70~79') :- N>=70,N=<79.
ランク(N,3,'60~69') :- N>=60,N=<69.
ランク(N,4,'59以下') :- N<=59.


90 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:07:53 ]
>>88
% Prolog (2/3)
入力データの集計([],_入力データ数,_ランクL,_ランクL,_合計,_合計,_平均) :-
_平均 is _合計 / _入力データ数,!.
入力データの集計([N|R],_入力データ数,_ランクL1,_ランクL,_合計_1,_合計,_平均) :-
データランク(N,_位置,_),
位置要素に加算(_位置,1,_ランクL1,_ランクL2),
入力データの集計(R,_入力データ数,_ランクL2,_ランクL,_合計2,_合計,_平均) :-

位置要素に加算(1,N,[A|R],[B|R]) :- B is A+N,!.
位置要素に加算(P,N,[A|R1],[A|R2]) :- P2 is P-1,位置要素に加算(P2,N,R1,R2).

入力データ数を読み込む(_入力データ数) :-
write('入力データ数を設定してください(ピリオドを付加): '),
read(_入力データ数),
integer(_入力データ数),
_入力データ数>=10,!.
入力データ数の読み込み(_入力データ数) :-
write('正しい入力データ数が得られませんでした!\n10以上の整数を指定してくださ
い\n'),
入力データ数の読み込み(_入力データ数).

91 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:14:19 ]
>>88
% Prolog (1/4) 読みにくかったので書き直します。 >>89,>>90 はキャンセル
問題C792 :-
  問題C792(_合計,_平均,_データランクリスト),
  集計項目の表示(_合計,_平均,_データランクリスト).

問題C792(_合計,_平均,_データランクリスト) :-
  入力データ数の設定(_入力データ数),
  整数を読み込む(_入力データ数,[],_入力データ値リスト),
  入力データの集計(_入力データ値リスト,_入力データ数,[0,0,0,0],_データランクリ
スト,0,_合計,_平均).

集計項目の表示(_合計,_平均,_データランクリスト) :-
  write_formatted('合計: %t\n平均: %t\n',[_合計,_平均]),
  list_length(_データランクリスト,_ランクの数),
  for(1,N,_ランク数),
  データランク(_,N,_ランク表示),
  list_nth(N,_データランクリスト,_ランク集計値),
  write_formatted('%t: %t\n',[_ランク表示,_ランク集計値]),
  N=_ランクの数.

データランク(N,1,'80~100') :- N>=80,N=<100.
データランク(N,2,'70~79') :- N>=70,N=<79.
データランク(N,3,'60~69') :- N>=60,N=<69.
データランク(N,4,'59以下') :- N<=59.


92 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:15:43 ]
>>88
% Prolog (2/4)
入力データの集計([],_入力データ数,_ランクL,_ランクL,_合計,_合計,_平均) :-
  _平均 is _合計 / _入力データ数,!.
入力データの集計([N|R],_入力データ数,_ランクL1,_ランクL,_合計_1,_合計,_平均) :-
  データランク(N,_位置,_),
  位置要素に加算(_位置,1,_ランクL1,_ランクL2),
  入力データの集計(R,_入力データ数,_ランクL2,_ランクL,_合計2,_合計,_平均) :-

位置要素に加算(1,N,[A|R],[B|R]) :- B is A+N,!.
位置要素に加算(P,N,[A|R1],[A|R2]) :- P2 is P-1,位置要素に加算(P2,N,R1,R2).

入力データ数を読み込む(_入力データ数) :-
  write('入力データ数を設定してください(ピリオドを付加): '),
  read(_入力データ数),
  integer(_入力データ数),
  _入力データ数>=10,!.
入力データ数の読み込み(_入力データ数) :-
  write('正しい入力データ数が得られませんでした!\n10以上の整数を指定してくださ
い\n'),
  入力データ数の読み込み(_入力データ数).

93 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:22:50 ]
>>92
そのまま続けると入力規制に引っ掛かりますよ!


94 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 06:41:20 ]
% Prolog (3/4)
整数を読み込む(0,L,[]) :- !.
整数を読み込む(P,L,[N|R]) :-
  write('整数を入れてください(ピリオドを付加): '),
  read(N),
  整数入力検査(N,L),
  P2 is P-1,
  整数を読み込む(P2,[N|L],R).
整数を読み込む(P,L,X) :- 整数を読み込む(P,L,X).

95 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 07:03:43 ]
pc12.2ch.net/test/read.cgi/tech/1242655611/741
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):1〜256文字の文字列Sと単語Wを入力し、文字列Sの最初の単語がWであるときは文字列Sの先頭に*を付けたものを出力し、そうでないときはSをそのまま出力するプログラムを作成しなさい。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:6月10日 8:00
[5] その他の制限:2つの単語が等しいときは1を、等しくないときは0を返す関数int compare(char *, char *)を作成して用いること。
         入力する文字列に2つ以上の連続したスペースはないとする。
         入力する文字列の最初と最後はスペースでないとする。



96 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 07:16:37 ]
pc12.2ch.net/test/read.cgi/tech/1242655611/725
苗字・名前・年齢・身長・体重を入力し、
その個人データを氏名・年齢・身長・体重・BMIの値とコメントを出力する。

# BMI計算式とコメント
式:BMI=体重(kg)/身長(cm)/身長(cm)*10000
BMI=18.5 以下、やせてます
BMI=18.5 超え 25.0 未満、普通です
BMI=25.0 以上、レッツエクササイズ!


97 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 07:17:06 ]
>>88
% Prolog (4/4)
整数入力検査(N,L) :-
  integer(N),
  N >= 0,
  N =< 100,
  not(member(N,L)),!.
整数入力検査(N,L) :-
  not(integer(N)),
  write('整数ではありません! 再入力が必要です。\n'),
  !,fail.
整数入力検査(N,L) :-
  integer(N),
  not((N >= 0,N =< 100)),
  write('整数範囲が正しくありません! 再入力が必要です。\n'),
  !,fail.
整数入力検査(N,L) :-
  integer(N),
  N >= 0,N =< 100,
  member(N,L),
  write('既出の整数です! 再入力が必要です。\n'),
  !,fail.

98 名前:デフォルトの名無しさん [2009/06/05(金) 09:22:23 ]
>>96
nojiriko.asia/prolog/bmidata.html




99 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:11:59 ]
pc12.2ch.net/test/read.cgi/tech/1242655611/809

<問題>>
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9353.txt

突然骨のある問題が。

100 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 17:56:46 ]
>>99
% Prolog (1/2)
可能経路数(_桝,_開始点_X,_開始点_Y,_経路の数) :-
  findall(1,駒の動き(_開始点_X,_開始点_Y,_),L),
  length(L,_経路の数).

駒の動き(_桝,_開始点_X,_開始点_Y,_経路) :-
  駒の動き(_桝,_開始点_X,_開始点_Y,[[_開始点_X,_開始点_Y]],_経路).

駒の動き(_桝,X,Y,L,_経路) :-
  移動可能点(_桝,X,Y,X2,Y2),
  not(member([X2,Y2],L)),
  駒の動き(_桝,X2,Y2,[[X2,Y2]|L],_経路).
駒の動き(_桝,X,Y,L,_経路) :-
  _桝2 is _桝 * _桝,
  list_length(L,_桝2),
  reverse(L,_経路).

101 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 17:57:51 ]
>>99
% Prolog (2/2)
変位(2,1).
変位(1,2).
変位(-1,2).
変位(-2,1).
変位(-2,-1).
変位(-1,-2).
変位(1,-2).
変位(2,-1).

移動可能点(_桝,I,J,X,Y) :-
  変位(U,W),
  X is I+U,
  Y is J+W,
  X > 0,
  X =< _桝,
  Y > 0,
  Y =< _桝.

102 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 23:38:49 ]
#-*- coding: utf-8 -*-
# python2.6で>99。といいつつ出題を無視してジェネレータで遊んでみた。schemeなら継続を使うところなんだろうね。
class solver:
    delta = ((1,2),(1,-2),(-1,2),(-1,-2),(2,1),(-2,1),(2,-1),(-2,-1))
    def __init__(self, n):
        self.n, self.field = n, [[0] * n for i in range(n)]
    def generator(self, x=0, y=0, m=1):
        if 0 <= x < self.n and 0 <= y < self.n and self.field[y][x] == 0:
            self.field[y][x] = m
            if m == self.n * self.n: yield tuple(self.field)
            else:
                for dx,dy in self.delta:
                    for field in self.generator(x+dx, y+dy, m+1):
                        yield field
            self.field[y][x] = 0
if __name__ == '__main__':
    import re, sys
    # 解を表示
    g = solver(5).generator();
    def display(f): print'\n'.join(' '.join(map(lambda x:'%2d'%x ,L)) for L in f)+'\n'
    while True:
        print u'数字入力で次のN件表示 / qで終了'
        line = sys.stdin.readline()
        if len(line) > 0 and line[0].lower() == 'q': break
        if re.match(r'^\d+$', line):
            try: map(lambda x: display(g.next()), range(int(line)))
            except: break

103 名前:100 mailto:sage [2009/06/06(土) 05:32:54 ]
すみません。一箇所間違っていた。
可能経路数(_桝,_開始点_X,_開始点_Y,_経路の数) :-
 findall(1,駒の動き(_桝,_開始点_X,_開始点_Y,_),L),
 length(L,_経路の数).

findall/3の中の 駒の動き/4 の第一引数 _桝 が>>100では落ちていて、
駒の動き/3 になってしまっていた。

104 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 11:32:48 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/547

[1] 授業単元: プログラミング初歩
[2] 問題文(含コード&リンク):(文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順
に小文字で並べた文字列を返すプログラムを作りなさい。)
[3] 環境
 [3.1] OS: (WindowsXP)
 [3.2] バージョン: (Ruby 1.8.6 )
 [3.3] 言語: (Ruby
[4] 期限: ([2009年06月01日21:00まで]
[5] その他の制限: 配列などの初歩的な概念まで


105 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:16:32 ]
import Data.Char (toLower)
import Data.List (sortBy)
import Data.Function (on)
import Data.Map (fromListWith, toList)

t104 :: String -> String
t104 = map fst . sortBy ((flip compare) `on` snd) . toList . fromListWith (+) . (flip zip (repeat 1)) . map toLower

106 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:43:57 ]
% Prolog >>105とは対照的なプログラム
t104(Atom,AtomX) :-
  findall([0,N],for(97,N,122),L),
  to_lower(Atom,Atom2),
  atom_codes(Atom2,L1),
  t104_2(L1,L,L2),
  sort(L2,L3),
  t104_3(L3,[],L4),
  atom_codes(AtomX,L4),!.

t104_2([],X,X).
t104_2([A|R1],L,X) :-
  t104_3(A,L,L1),
  t104_2(R1,L1,X).

t104_3(97,[[S,N]|R],[[S1,N]|R]) :-
  S1 is S+1.
t104_3(N,[U|R1],[U|R2]) :-
  N > 97,
  M is N-1,
  t104_3(M,R1,R2).

t104_4([],X,X).
t104_4([[0,_]|R1],Y,X) :-
  t104_4(R1,Y,X).
t104_4([[C,N]|R1],Y,X) :-
  C > 0,
  t104_4(R1,[N|Y],X).

107 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:35:27 ]
>>106
せっかく t104_2 から t104_3 が同一プログラムパターンできているのだから、
t104_4 も同一パターンに徹するべき。

t104_4([],[]).
t104_4([[0,_]|R1],X) :-
  t104_4(R1,X).
t104_4([[C,N]|R1],[N|R2]) :-
  C > 0,
  t104_4(R1,R2).

その代わり、
t104(Atom,AtomX) :-
  findall([0,N],for(97,N,122),L),
  to_lower(Atom,Atom2),
  atom_codes(Atom2,L1),
  t104_2(L1,L,L2),
  sort(L2,L3),
  reverse(L3,L4),
  t104_3(L4,L5),
  atom_codes(AtomX,L5),!.

とする。多分、reverse/2 を使いたくなかったのだろうけれど。


108 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 04:59:14 ]
pc12.2ch.net/test/read.cgi/tech/1242655611/590
[1] 授業単元:Cプログラミング
[2] 問題文(含コード&リンク):ポインタ配列
char *month[ ] = { "None", "January", "February", "March", "April", "May", "June
", "July",
"August", "September", "October", "November", "December" };
を用いて1〜12の数値を入力してJanuary〜Decemberを返す関数GetMonthを作成せよ.



109 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 05:07:09 ]
% Prolog (問題やさし過ぎた! Prologチュートリアルと思ってください)
month(['None','January','February','March','April','May','June','July',
'August','September','October','November','December']).

'GetMonth'(_数値,_月名) :-
  month(_月名ならび),
  M is _数値 + 1,  /* どうしても'None'から始まるのだとすると */
  list_nth(_数値,_月名ならび,_月名).

% 組込みになっていると思いますが list_nth/3 の定義は、
list_nth(1,[X|_],X).
list_nth(N,[_|R],X) :- integer(N),N > 1,M is N-1,list_nth(M,R,X).

110 名前:109 mailto:sage [2009/06/08(月) 05:41:15 ]
% 間違い。
'GetMonth'(_数値,_月名) :-
  month(_月名ならび),
  M is _数値 + 1,  /* どうしても'None'から始まるのだとすると */
  list_nth(_数値,_月名ならび,_月名).


'GetMonth'(_数値,_月名) :-
  month(_月名ならび),
  M is _数値 + 1,  /* どうしても'None'から始まるのだとすると */
  list_nth(M,_月名ならび,_月名).

が正しい。お粗末!

111 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 05:52:17 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/640
【 課題 】
指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップするソフトを作成すること。

尚、バックアップファイルには以下の機能を持つようにすること。

・ 対象ファイルや除外ファイルを指定できるような
仕組みを持つこと。
・ バックアップ経過のログを作成すること。
ログにはバックアップ処理の実行時間を出力すること。

また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して
機能の実装を行うこと。


作業に余裕のある人は以下の機能を追加すること。

・バックアップしたファイルを圧縮する仕組みの追加。
・プログラムが常駐する仕組みの追加。


112 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 06:06:01 ]
pc12.2ch.net/test/read.cgi/tech/1197620454/385
問題文:
1、10個の文字を1つずつ入力し、それらを入力した順に
  並べて表示
2、10個の文字を1つずつ入力し、それらを入力した順と逆順に
  並べて表示
3、5文字以上の長さの文字列を入力し、4番目の文字と5番目の文字を入れ替えて表示
4、10個の1桁の整数を入力し、それらを大きい順に並べて表示
5、10個の1桁の整数を入力し、その中から最も大きい3個を入力した順に表示
6、1桁の整数の入力を、同じ数が3回入力されるまで繰り返す
7、1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す

113 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:23:27 ]
>>112 (5、この問題だけしか通用しないアルゴリズム?)
t112_5(L,X) :-
t112_5(L,[0,0,0],X).

t112_5([],L,L).
t112_5([A|R],L1,L) :-
top3(A,L1,L2),
t112_5(R,L2,L).

top3(N,[A,B,C],[A,B,N]) :-
A >= B,A >= C,B >= C,N > C.
top3(N,[A,B,C],[A,C,N]) :-
A >= B,A >= C,C >= B,N > B.
top3(N,[A,B,C],[B,C,N]) :-
B >= A,B >= C,C >= A,N > A.
top3(N,[A,B,C],[A,B,N]) :-
B >= A,B >= C,A >= C,N > C.
top3(N,[A,B,C],[B,C,N]) :-
C >= A,C >= B,B >= A,N > A.
top3(N,[A,B,C],[A,C,N]) :-
C >= A,C >= B,A >= B,N > B.
top3(_,L,L).

114 名前:113 mailto:sage [2009/06/08(月) 21:03:51 ]
>>112 ちょっと読み難いので書き直し。私は力技でタイプしてしまいましたが
top3/3 をどれだけ素早く質問から(?- ...)生成できるかということのようです。

t112_5(L,X) :-
  t112_5(L,[0,0,0],X).

t112_5([],L,L).
t112_5([A|R],L1,L) :-
top3(A,L1,L2),
  t112_5(R,L2,L).

top3(N,[A,B,C],[A,B,N]) :-
  A >= B,A >= C,B >= C,N > C.
top3(N,[A,B,C],[A,C,N]) :-
  A >= B,A >= C,C >= B,N > B.
top3(N,[A,B,C],[B,C,N]) :-
  B >= A,B >= C,C >= A,N > A.
top3(N,[A,B,C],[A,B,N]) :-
  B >= A,B >= C,A >= C,N > C.
top3(N,[A,B,C],[B,C,N]) :-
  C >= A,C >= B,B >= A,N > A.
top3(N,[A,B,C],[A,C,N]) :-
  C >= A,C >= B,A >= B,N > B.
top3(_,L,L).

115 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:21:24 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/9
マッチロジックを用い、次に示すようなプログラムを作りなさい

1)顧客情報が入った旧マスタファイル(M)とトランザクションファイル(T)から新マスタファイル
(N)を作成する

2)各ファイルのレコードは以下
社員コード 社員名 電話番号
数値4桁  文字18桁 文字12桁

3)Tには同一の社員レコードが複数ある

4)いずれのファイルも社員コードの昇順になっている

5)Mに存在する社員レコードがTにない場合は、MのレコードをNに追加し、Mに存在する社員レコードが
Tにある場合はTのレコードをNに追加する
(Tに同一の社員コードが複数存在する場合は1番下のレコードを追加)
Mに存在しない社員コードがTにある場合はTのレコードをNに追加


116 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:22:42 ]
つづき、
処理手順
1)M、Tともにデータがある、MとTを比較
 @M<Tのとき
  →Mを出力
 AM=Tのとき
  →Tを出力B
 BT同士で比較
  同じコードのデータが複数ある→1番下のデータを出力
 CMを読み込む
 DM>Tのとき
  →Tを出力B
2)Mにのみデータがある
  Mを出力
3)Tにのみデータがある
  Tを出力B
4)両方のファイルがなくなれば終了


117 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 12:12:08 ]
>>115 COBOL向き問題
% Prolog(1/2) オンメモリ版
t115(M,T) :-
  g115(M,L1),
  g115(T,L2),
  b(L1,L2,L3),
  p115(M,L3).

b([],[],[]) :- !.
b([A|R1],[],[A|R3]) :- !,b(R1,[],R3).
b([],[B|R2],[B|R3]) :- !,b([],R2,R3).
b([[A|B]|R1],[[C|D]|R2],[[A|B]|R3]):-A@<C,!,b(R1,[[C|D]|R2],R3).
b([[A|B]|R1],[[C|D]|R2],[[D|D]|R3]):-A@>C,!,b([[A|B]|R1],R2,R3).
b(L1,L2,[[B|D]|R3]) :- b_2(L2,[[B|D]|R2]),b(L1,R2,R3).

b_2([A],[A]) :- !.
b_2([[A|B],[C|D]|R],[[A|B],[C|D]|R]]) :- A @< C.
b_2([[A|B],[C|D]|R],X) :- A = C,b_2([[C|D]|R],X).

118 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 12:13:21 ]
% Prolog(2/2)

g115(File,X) :-
  open(File,read,Input),
  findall(W,(repeat,get_line(Input,U),(U=end_of_file,!,fail;cut115(U,W)),X),
  close(Input).

p115(File,L) :-
  open(File,write,Output),
  ( member(U,L),
   concat_atom(U,X),
   write_formatted(Output,'%t\n',[X]),
   fail;
   close(Output)
  ).

cut115(A,[A1,A2]) :- sub_atom(A,0,4,R,A1),subatom(A,4,R,_,A2).

% Library Utility
get_line(Stream,X) :-
  findall(C,(repeat,get_char(C),(X='\n',!,fail;true)),X).
  concat_atom(L,X).

concat_atom([A],A).
concat_atom([A|R],X) :- concat_atom(R,Y),atom_concat(A,Y,X).



119 名前:117 mailto:sage [2009/06/09(火) 12:20:20 ]
>>118 間違いがありました。訂正します。
get_line(Stream,X) :-
  findall(C,(repeat,get_char(C),(X='\n',!,fail;true)),X).
  concat_atom(L,X).

get_line(Stream,X) :-
  findall(C,(repeat,get_char(Stream,C),(C='\n',!,fail;true)),X).
  concat_atom(L,X).
が正しい。
findall/3の中に2箇所誤りがありました。

120 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 13:32:07 ]
>>112 6、
% Prolog

t112_6(X) :- get_integer(N),t112_6(N,[N],X).

t112_6(N,L,N) :- count(N,L,3).
t112_6(N,L,X) :- get_integer(M),t112_6(M,[M|L],X).

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

get_integer(N) :- repeat,write('整数(0-9).改行 ? '),read(N),N>=0,N=<9,!.

121 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 13:52:34 ]
>>112 7、
% Prolog

t112_7 :- get_integer(N),t112_7(N,[N]).

t112_7(N,L) :- length(L,10).
t112_7(N,L) :- member(N,L),get_integer(M),t112_6(M,L).
t112_7(N,L) :- not(member(N,L)),get_integer(M),t112_7(M,[N|L]).

get_integer(N) :- repeat,write('整数(0-9).改行 ? '),read(N),N>=0,N=<9,!.

122 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 16:09:43 ]
>>74
% Prolog
nojiriko.asia/prolog/t74.html

123 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:40:10 ]
<<問題>>
pc12.2ch.net/test/read.cgi/tech/1244449887/64
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9394.txt

124 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:45:27 ]
>>123
% Prolog
nojiriko.asia/prolog/t123.html

125 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 05:01:30 ]
pc12.2ch.net/test/read.cgi/tech/1197620454/355

課題:三つの整数を入力し、三辺がそれらの長さであるような三角形が
作れる時に「OK」、作れないときに「NG」を出力する。

126 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 05:06:37 ]
>>125
nojiriko.asia/prolog/t125.html

127 名前:124 mailto:sage [2009/06/10(水) 05:45:42 ]
ttp://nojiriko.asia/prolog/t123.html

<BODY><PRE>
が落ちていたため改行して表示されませんでした。
訂正しました。


128 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 06:58:11 ]
<<課題>> これもC/C++の宿題から
pc12.2ch.net/test/read.cgi/tech/1244449887/122
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9408.txt



129 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 07:19:16 ]
>>128
% Prolog
% t128_1 はパス

t128_2(L,X) :- append([_|L1],[T],L),append(L1,[T,T],X).

t128_3(L,[A,A|L1]) :- append([A|L1],[_],L).

130 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 07:35:49 ]
課題はリンクを張っただけだと、そちらのスレが
過去スレログに回ってしまうと簡単には見られなくなるな。
やはり、少なくともポイントは<<課題>>の後に書かないと。

131 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 12:21:33 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/529
[1] 授業単元:Ruby
[2] 問題文 ファイル分割

下記は、hoge.csvを均等に4分割して tmp/ 以下に書き込むプログラムである。

ruby split.rb hoge.csv tmp/ 4

出力例
tmp/1out.csv
tmp/2out.csv
tmp/3out.csv
tmp/4out.csv

132 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 12:31:50 ]
>>131
% Prolog
nojiriko.asia/prolog/t131.html


133 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:09:06 ]
<<課題>> C/C++
[1] 授業単元:c言語
[2] 問題文:
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9418.txt
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9419.txt
課題1-3 で作成したvoid fCountHindo(FILE*) に対して、英小文字を大文字として数える void fCountHindoIgnoreCase(FILE *)を作りなさい。


134 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:11:39 ]
>>133
% Prolog
nojiriko.asia/prolog/t133.html

あまり、課題に拘らず汎用的に作ってしまった。あしからず。


135 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:57:19 ]
いい問題みつけた。
[1] 授業単元:C言語演習課題
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt
問題
年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。

1752年10月以前、及び10000年1月以降はエラーを返す。

出力形式は以下のとおり
・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。
・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。
・6行目の表示が必要ない場合は表示しない。

うるう年判定は以下のとおり
・年が4で割り切れる年はうるう年。
・年が100で割り切れる年はうるう年でない。
・年が400で割り切れる年はうるう年である。

[出力例]
年月日を入力:2009/07

月 火 水 木 金 土 日
29 30 01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 01 02


136 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 03:29:11 ]
<<課題>> Ruby
[1] 授業単元: Ruby演習 [2] 問題文、kansai2channeler.hp.infoseek.co.jp/cgi-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のようなものがありません。そこで、空白とタブと改行(正規表現で定義するなら「/\s+/」)で区切られた文字列をハッシュに変換するメソッドstr2hashを定義してください。

p str2hash("bule 青 white 白\nred赤");
#=> {"bule"=>"青", "white"=>"白", "red"=>"赤"}


137 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 05:06:33 ]
>>135 まだ解答ではありません。基準日から順に曜日を調べるユーティリティ
% Prolog(1/2)
前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :-
一つ違い(_前日の年,_年),
曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :-
うるう年(_年),
曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :-
not(うるう年(_年)),
曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :-
一つ違い(_前月,月),
member(_前月,[4,6,9,11]),
曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :-
一つ違い(_前月,_月),
member(_前月,[1,3,5,7,8,10,12]),
曜日連鎖(_前日の曜日,_曜日).

138 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 05:08:53 ]
すみません。書き直しです。
% Prolog (1/2)
前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :-
  一つ違い(_前日の年,_年),
  曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :-
  うるう年(_年),
  曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :-
  not(うるう年(_年)),
  曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :-
  一つ違い(_前月,月),
  member(_前月,[4,6,9,11]),
  曜日連鎖(_前日の曜日,_曜日).
前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :-
  一つ違い(_前月,_月),
  member(_前月,[1,3,5,7,8,10,12]),
  曜日連鎖(_前日の曜日,_曜日).



139 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 05:10:20 ]
% Prolog(2/2)
一つ違い(M,N) :-
  integer(M),!,
  N is M + 1.
一つ違い(M,N) :-
  integer(N),!,
  M is N + 1.

うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- not(0 is _年 mod 4),fail.

曜日連鎖(月曜,火曜).
曜日連鎖(火曜,水曜).
曜日連鎖(水曜,木曜).
曜日連鎖(木曜,金曜).
曜日連鎖(金曜,土曜).
曜日連鎖(土曜,日曜).
曜日連鎖(日曜,月曜).

140 名前:139 mailto:sage [2009/06/11(木) 05:13:26 ]
訂正
一つ違い(M,N) :-
  integer(M),!,
  N is M + 1.
一つ違い(M,N) :-
  integer(N),!,
  M is N - 1.

141 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 05:50:17 ]
>>140 の 一つ違い という述語ですが、これは>>135の 前日・今日 に
「双方向性」を与えるたのトリックです。
一般に関数評価述語 is が条件に現れると双方向性は失われてしまいます。
?- var(A),5 is A + 2. がエラーになってしまうからです。
それを回避するというか、誤魔化しているのですね。


142 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 06:03:37 ]
前日・今日の最後の節がコピペできていませんでした。

前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :-
  一つ違い(_前日,_日),
  曜日連鎖(_前日の曜日,_曜日).

が一番最後に来ますね。

143 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 07:18:14 ]
>>136 (4)だけです
% Prolog (正規表現との競争ということかな 少し負けるが・・)
% nojiriko.asia/prolog/t136.html
:- op(700,xfx,(=>)).
t136(Atom,X) :- 英語色日本語色ペアリストの作成(Atom,X).

英語色日本語色ペアリストの作成(Atom,X) :-
  atom_chars(Atom,Chars),
  文字ならびから英語色日本語色ペアリストの作成(Chars,X),!.

文字ならびから英語色日本語色ペアリストの作成([],[]).
文字ならびから英語色日本語色ペアリストの作成(L,[_英語色=>_日本語色|R]) :-
  一語切り出す(L,L2,R1),
  一語切り出す(R1,L3,R2),
  atom_chars(_英語色色,L2),
  atom_chars(_日本語色色,L3),
  文字ならびから英語色日本語色ペアリストの作成(R2,R).

一語切り出す([],[],[]).
一語切り出す(['\t'|R1],[],R1).
一語切り出す([' '|R1],[],R1).
一語切り出す(['\n'|R1],[],R).
一語切り出す([A|R1],[A|R2],R) :-
  一語切り出す(R1,R2,R).


144 名前:143 mailto:sage [2009/06/11(木) 07:25:29 ]
>>143
色色とあるのは色の間違いです。

  atom_chars(_英語色色,L2),
  atom_chars(_日本語色色,L3),
=>
  atom_chars(_英語色,L2),
  atom_chars(_日本語色,L3),


145 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:23:42 ]
<<問題>>
pc12.2ch.net/test/read.cgi/tech/1244449887/206
[1] プログラミング
[2] 入力した数値を4で割った余りを求めるプログラムを作れ。(switch)を用いて。


146 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:25:02 ]
>>145
% Prolog
'4で割ったあまり'(0,0).
'4で割ったあまり'(1,1).
'4で割ったあまり'(2,2).
'4で割ったあまり'(3,3).
'4で割ったあまり'(N,X) :- M is N-4,'4で割ったあまり'(M,X).

147 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:32:29 ]
>>145
このプログラムを
?- member(N,[11,33,47,51]),'4で割ったあまり'(N,X).

のように使うと不具合が生じる。どんなことになるか?
>>146 を適切なプログラムに書き換えなさい。

148 名前:143 mailto:sage [2009/06/11(木) 21:42:17 ]
Prologでペアリストとは[[a,1],[c,3], ... [y,26]]のような形式かな。
>>143では _=>_ の形式にしたからペアではないかも知れない。
Rubyに合わせてみたのだが。
ここでは、その方が分かり易いかと思ってペアリストという名称を
借用したが、普段は「対のならび」という言葉を使うところ。



149 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:45:40 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/675
【 課題 】二つの文字列str1 とstr2 を入力して、str1 とstr2 から交互に一文字ずつ順番にとりだして、交
互にならべた文字列をつくれ。長い方の文字列の後の部分はそのままくっついた形になる。
String,StringBuffer クラスのメソッドを使え。

150 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:59:47 ]
% Prolog
交互にならべた文字列(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  交互にならべた文字列_1(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

交互にならべた文字列_1([],[],[]) :- !.
交互にならべた文字列_1(L,[],L) :- !.
交互にならべた文字列_1([],L,L) :- !.
交互にならべた文字列_1([A|R1],[B|R2],[A,B|R]) :-
  交互にならべた文字列_1(R2,R1,R).

?- 交互にならべた文字列(abcde,opq,X).
X = aobpcqde;
no
?-

151 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:13:06 ]
<<課題>> C
pc12.2ch.net/test/read.cgi/tech/1244449887/209
1行に一つづつ表示するプログラムを作成せよ。
空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、
ピリオド(,)は表示する単語に含めないこと。

(実行例)
・入力
  This is a pen.

・出力
  This
is
a
pen


152 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:20:50 ]
>>151
% Prolog (1/2)
文字列から切り出した単語の行表示(_文字列) :-
  文字列から単語の切り出し(_文字列,_単語ならび),
  wrln(_単語ならび).

文字列から単語の切り出し(_文字列,_単語ならび) :-
  atom_chars(_文字列,_文字ならび),
  文字ならびを区切り文字により分割する(_文字ならび,L),
  単語ならびに変換(,_単語ならび).

文字ならびを区切り文字により分割する([A|R1],R2) :-
  区切り文字(A),
  文字ならびを区切り文字により分割する(R1,R2),!.
文字ならびを区切り文字により分割する(_文字ならび,[L1|R]) :-
  append(L1,[A|L2],_文字ならび),
  区切り文字(A),
  文字ならびを区切り文字により分割する(L2,R),!.
文字ならびを区切り文字により分割する(_,[]) :- !.

153 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:21:52 ]
>>151
% Prolog (2/2)
区切り文字(' ').
区切り文字('\n').
区切り文字('.').
区切り文字(',').

単語ならびに変換([]) :- !.
単語ならびに変換([L|R1],[_単語|R2]) :-
  concat_atom(L,_単語),
  単語ならびに変換(R1,2).

wrln([]) :- !.
wrln([A|R]) :-
  write_formatted('%t\n',[A]),
  wrln(R).

154 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:09:25 ]
>>147
'4で割ったあまり'(0,0).
'4で割ったあまり'(1,1).
'4で割ったあまり'(2,2).
'4で割ったあまり'(3,3).
'4で割ったあまり'(N,X) :- N > 3,M is N-4,'4で割ったあまり'(M,X).


155 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:47:13 ]
>>154
's(s(s(s(0))))で割ったあまり'(0,0).
's(s(s(s(0))))で割ったあまり'(s(0),s(0)).
's(s(s(s(0))))で割ったあまり'(s(s(0)),s(s(0))).
's(s(s(s(0))))で割ったあまり'(s(s(s(0))),s(s(s(0)))).
's(s(s(s(0))))で割ったあまり'(s(s(s(s(S)))),X) :- 's(s(s(s(0))))で割ったあまり'(S,X).

以下でもいいのだが。
's(s(s(s(0))))で割ったあまり'(s(s(s(s(S)))),X) :- 's(s(s(s(0))))で割ったあまり'(S,X).
's(s(s(s(0))))で割ったあまり'(X,X) :- not(X=s(s(s(s(_))))).

最後の否定がちょっとややこしい。

156 名前:デフォルトの名無しさん [2009/06/12(金) 10:54:16 ]
>>151
LEXを使えば超カンタン!

これで終り


%{
#include <stdio.h>
%}

%option noyywrap

%%

[A-Za-z\']* {printf("%s\n",yytext);}
.|\n

%%

main()
{
yylex();
}


157 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 22:07:26 ]
<<課題>> C/C++
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9442.txt


158 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 22:10:33 ]
>>157
% Prolog
nojiriko.asia/prolog/t157.html



159 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 09:42:06 ]
>>135
% Prolog 一応書き上げました。使えるユーティリティを含みますが出来は悪い。
nojiriko.asia/prolog/t135.html

160 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 09:47:14 ]
>>74
% Prolog これは忘れてました。
nojiriko.asia/prolog/t74.html

161 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:39:20 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/701
# 【課題】あるコンテナ・ヤードにおけるコンテナの処理状 況は次のとおりであった。
# (1)コンテナの入場率平均値:5.0個/時間
# (2)コンテナの捌き率平均値:4.7個/時間
# (3)ゲート数窓口数:1
# このコンテナ・ヤードのゲートにおける滞貨状況
# を計算機シミュレーションにより調べ、考察を加え
# なさい。なお、滞貨状況の考慮時間は100時間と
# し、昼夜を問わず同様なコンテナの動きであるとす
# る。
#【形態】コマンドプロンプト
#【提出期限】6月26日
#【 Ver  】1.6.0_07
#【補足】入場率は指数分布、捌き率は標準偏差の3倍の範囲
# を考慮する正規分布に従うものとする。
# 変わった課題ですがよろしくお願いします。


162 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 04:33:08 ]
>>161
# >>701
# ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/702.zip
#
# >捌き率は標準偏差の3倍の範囲を考慮する正規分布に従うものとする。
# ここだけ意味分からなかったから、自分でGateModel#getDepartureInterval()を適当に書き換えて。

163 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 04:55:01 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/324
# [1] 授業単元: プログラミング
# [2] 問題文
# 問5.1に示す表を表示するプログラムを作成せよ。
# ただし氏名はポインタ配列を用いて参照するようにし、年齢、初任給は配列に入れる。
#
# 氏名は次のようにポインタ配列に初期値として入れる。
# char *namae[]={"高専 卒男","大学 学男","大学 修治"};
#
# 年齢、初任給は二次元配列salary[3][2]を宣言してそこに読み込む。方法としては次の2通りがある。
# (1)キーボードから読み込む
# (2)配列の初期設定で行う
# Salary[][2]={{20,215000},
# {22,235000},
# {24,255000}};
#
# 表はこれです
# a.pic.to/11fgne
# 氏名 ,年齢,初任給
# 高専 卒男,20,215000
# 大学 学男,22,235000
# 大学 修治,24,255000


164 名前:デフォルトの名無しさん [2009/06/14(日) 05:00:21 ]
>>163
高専 卒男 さんは20才の時初任給を貰いその額は215000でした。
という意味に解釈せざるを得ない変な表だ。

165 名前:デフォルトの名無しさん [2009/06/14(日) 05:48:29 ]
>>163
% Prolog (カンマを含む整数表示にはなっていない)

namae(['高専 卒男','大学 学男','大学 修治']).
'Salary'([[20,215000],[22,235000],[255000]]).

'問5.1に示す表を表示する'(2) :-
  namae(L1),
  'Salary'(L2),
  length(namae,Len),
  write_formatted('%20s,%8s,%8s\n',[名前,年齢,初任給]),
  for(1,N,Len),
  list_nth(N,L1,_名前),
  list_nth(N,L2,[_年齢,_初任給]),
  write_formatted('%20s,%8d,%8d\n',[_名前,_年齢,_初任給]),
  N=Len,
  write('\n\na.pic.to/11fgne のような美しい表を作るにはポストスクリプト
命令述語を使う必要がありますね\n').

166 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 07:13:12 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/663
#【 課題 】3桁の数値データが複数入ったファイルをバブルソートを用いて
#      昇順に整列、新しいファイルに格納。データの件数は50件まで
#【 形態 】1. Javaアプリケーション(main()で開始)
#【 GUI  】制限なし
#【 期限 】6月11日 
#【 Ver  】1.6.0_13
#【 用語 】
#【 補足 】例外処理として、コマンドライン引数が間違っている場合、
#      読み込みファイルがオープンできない、書き込みファイルも
#      オープンできない、読み込みにファイルがない場合をお願いします。


167 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 07:24:21 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/276
#[1] 授業単元:プログラミング演習
#[2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9445.txt
#               ほとんど英文です。訳そうとしたんですが自分でも意味がわからなくなったんでそのままにしました。すいません。

168 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 04:04:07 ]
# <<課題>
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 : 都市数は外部から入力するものとする)
# (注意 : プログラムを動かすとき決して大きな都市数を与えてはならない)






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

170 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 06:12:20 ]
>>166
% Prolog
nojiriko.asia/prolog/t166.html

171 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:18:42 ]
>>167
% Prolog
nojiriko.asia/prolog/t167.html

172 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:00:47 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/
[1] 授業単元:For文
[2] 問題文:整数1〜10までの累計(1+2+3・・・・9+10=55)
 [3.1] OS: XP
 [3.2] Turbo C++
 [3.3] C++

簡単だと思いますがアホなんでわかりません。

173 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:01:53 ]
>>172
% Prolog
整数1〜10までの累計(X) :-
  sum(0,1,10,X).

sum(_空リストの時の値,[],_空リストの時の値). /* _空リストの時の値は 0 か 0.0 */
sum(_空リストの時の値,[A|R1],X) :-
  sum(_空リストの時の値,R,Y),
  X is A + Y.

174 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:19:30 ]
>>172
pc12.2ch.net/test/read.cgi/tech/1244449887/408
です

175 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:45:03 ]
>>173 普通は、
sum([],0).
sum([A|R],X) :- sum(R,Y),X is A + Y.
で十分。
リストの中に浮動小数点数が一つでもあれば、X は浮動小数点。一つもなく、
整数リストの時は整数解となります。
>>173は実務的には演算はすべて浮動小数点であり、整数の合計はほとんど
使うことがないため、
sum([],0.0).
sum([A|R],X) :- sum(R,Y),X is A+X.
と定義してしまいます。逆にこの問題のように、整数の合計を求める場合は
N is trancate(X) のような評価を被せなくてはならず不便です。それを回避
しようとしているのが>>173の第一引数の指定ということになります。
しかし、上記の理由から型指定としては曖昧で好ましいものではありません。

176 名前:175 mailto:sage [2009/06/15(月) 19:59:05 ]
N is trancate(X) ではなく N is truncate(X) ですね。

177 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:41:47 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/405
[1] 授業単元:プログラミング実習I
[2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9459.txt
typedef struct node *Tree;
typedef struct node{
int data;
Tree left_subtree;
Tree right_subtree;
} Node;
という風に定義された構造体を木の節点として
ポインタでつなげることによって表すことができる。
この様に表された2分木の根節点へのポインタが引数
として与えられた時、その2分木の高さ(すなわち、
根節点から葉節点までの枝の本数の最大値)を
調べて返すCの関数
    int height(Tree t);
を定義せよ。ただし、簡単さのため、ここでは、
height(NULL)=-1として関数定義を行え。

HINT.
2分木の高さに関する
2分木の高さ=max{(2分木の左部分木の高さ),
(2分木の右部分木の高さ)}+1
という漸化式に着目すれば簡単。

178 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:42:46 ]
>>177
% Prolog
木の高さ([],-1).
木の高さ(_根,_高さ) :-
枝(_根,_左,_右),
木の高さ(_左,_左の高さ),
木の高さ(_右,_右の高さ),
max([_左の高さ,_右の高さ],_高さの二),
_高さ is _高さの二 + 1.



179 名前:177 mailto:sage [2009/06/15(月) 20:51:49 ]
まちがえた。枝ではなくて、木でした。
% Prolog
木の高さ([],-1).
木の高さ(_根,_高さ) :-
  木(_根,_左枝,_右枝),
  木の高さ(_左枝,_左枝の高さ),
  木の高さ(_右枝,_右枝の高さ),
  max([_左枝の高さ,_右枝の高さ],_高さの二),
  _高さ is _高さの二 + 1.

180 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 02:51:49 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/446
#[1] 授業単元:プログラミング
#[2] 問題文(含コード&リンク):
# キーボードから入力された1行(空白で区切られた正整数並びの文字列)を項に分解して,i番目の項の整数値を配列要素d[i-1]に累算しながら格納するプログラムをつくりなさい。
# ただし,配列dの要素数は10として宣言し,10項目より多い入力の場合は11項目以降を棄却しなさい。
# 1行の入力には関数fgetsを用いなさい。
# fgetsは改行文字も取り込む点に注意して,入力の終了は「改行のみの入力」で判定しなさい。


181 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 03:01:29 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/413
#[1] インタラクティブコミュニケーション
#[2] ttp://www.ncc-1701.jp/kakei/InteractiveComm/Class5/InteractiveComm_5.htmlに書いている演習
# 最後の<<演習>>が課題です。
#[3] 環境
# [3.1] OS: Windows
# [3.2] コンパイラ名とバージョン: Windows Visual Studio 2005
# [3.3] 言語: C
#[4] 期限: 今日
#[5] その他の制限: 六曜は順番通り巡るとする。

182 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 06:19:04 ]
>>167
% Prolog (完全日本語版)
nojiriko.asia/prolog/t167_n.html

183 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 08:57:46 ]
>>143

// 0, 1, 2, 3, 4, 5, 6
//火曜,水曜,木曜,金曜,土曜,日曜,月曜
//友引,先負,仏滅,大安,赤口,先勝
#include<stdio.h>
int main(){
int i,n,c=0;
printf("n=");scanf("%d",&n);
for(i=0;i<=n;i++)
if(i%7==5 && i%6!=2)
c++;
printf("%d\n",c);
return 0;
}

184 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 09:12:06 ]
>>181
% Prolog
nojiriko.asia/prolog/t181.html

185 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 09:20:22 ]
ひどい宣伝だな

186 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 09:51:46 ]
>>168 >>169
完全列挙法 順次生成・比較法 というのがわからない。
「最短経路の本 レナのふしぎな数学の旅」 p253以下を読み直してみます。

187 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 10:23:45 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/458
#[1] 授業単元:プログラミング
#[2] 問題文(含コード&リンク):
# n*n行列A、Bをそれぞれキーボード から入力し、積を求めろ。
# 行列の大きさnもキーボードから入力せよ。多次元配列を使ってください。

188 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 10:26:32 ]
>>187
% Prolog (1/2)
行列の積(L1,L2,X) :-
  行列の転置(L,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 .



189 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 10:28:02 ]
>>187
% Prolog (2/2)
行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :-
  行列の転置(R1,R2,R3) .

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

190 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 15:29:48 ]
>>180
main = getLine >>= return . scanl1 (+) . map (read :: String -> Int) . take 10 . words >>= \t -> if null t then return () else print t >> main

>>187
import Data.List (transpose)

type Matrix = [[Int]]

fold2l :: (a -> b -> c -> a) -> a -> [b] -> [c] -> a
fold2l f a [] _ = a
fold2l f a _ [] = a
fold2l f a (x:xs) (y:ys) = fold2l f (f a x y) xs ys

mult :: Matrix -> Matrix -> Matrix
mult xss yss = mult' xss $ transpose yss
where
mult' :: Matrix -> Matrix -> Matrix
mult' [] _ = []
mult' (xs:xss) yss = map (\ys -> fold2l (\s x y -> s + x*y) 0 xs ys) yss : mult' xss yss

191 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 18:29:42 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/481
# [1] 授業単元:ソフトウェア演習C
# [2] 問題文:
# 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、
# この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ
#
# 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で小さい単語の
みがあり、その右の部分木にはより大きい単語のみがあるように保持される。
# 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発してそのノー
ドに格納されている単語と新しい単語を比較する。
# 二つが一致したら、それで良い。
# 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、そうでな
ければ右の子供が調べられる。
# 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、また
実際にはその子供のないところがそれを置く場所である。
# このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を定義せよ
。この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。
# 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、
あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと出会う

# 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、親ノー
ドに埋め込まれる。
# この関数を利用し、以下のテキストをコマンド実行時の引数として与えられたファイル
を入力して二分探索木を生成し、単語と頻度のリストを表示するプログラムを作成せよ。

#
# 文章:
# University was founded in April 1998 at Iwate,
# which is situated in the northeastern part of Japan. University consists of
# four faculties Software and Information Science, Nursing, Social Welfare,
# and policy Studies, and additionally other educational supporut centers.

192 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 19:49:14 ]
>>191
% Prolog
nojiriko.asia/prolog/t191.html

193 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 21:45:48 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/482
#[1] 授業単元:プログラミング基礎
#[2] 問題文
#
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9473.txt
# for文やif文を使用して下図のように出力せよ
#
# ★   ★
#  ★ ★
#   ★
#  ★ ★
# ★   ★
#


194 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 21:49:07 ]
>>193
% Prolog
nojiriko.asia/prolog/t193.html

195 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 21:50:36 ]
>>193
% Prolog
193 :-
t193_1([0,0,0,0,1],[1,0,0,0,0]).

t193_1(L1,L2) :-
L1=[1|_],
★を表示(L1,L2),!.
t193_1(L1,L2) :-
★を表示(L1,L2),
append([A],R1,L1),
append(R1,[A],L3),
append(L4,[B],L2),
t_193_1(L3,[B|L4]).

★を表示([],[]) :- nl.
★を表示([A|R1],[B|R2]) :-
or(A,B,1),
write(★),
★を表示(R1,R2).
★を表示([A|R1],[B|R2]) :-
or(A,B,0),
write(' '),
★を表示(R1,R2).

196 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 21:54:22 ]
すみません。再表示です。
t193 :-
  t193_1([0,0,0,0,1],[1,0,0,0,0]).

t193_1(L1,L2) :-
  L1=[1|_],
  ★を表示(L1,L2),!.
t193_1(L1,L2) :-
  ★を表示(L1,L2),
  append([A],R1,L1),
  append(R1,[A],L3),
  append(L4,[B],L2),
  t_193_1(L3,[B|L4]).

★を表示([],[]) :- nl.
★を表示([A|R1],[B|R2]) :-
  or(A,B,1),
  write(★),
  ★を表示(R1,R2).
★を表示([A|R1],[B|R2]) :-
  or(A,B,0),
  write(' '),
  ★を表示(R1,R2).

197 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 03:32:33 ]
>>196
% Prolog (ちょっとだけ変更)
t193 :-
  t193_1([' ',' ',' ',' ',★],[★,' ',' ',' ',' ']).

t193_1(L1,L2) :-
  L1=[★|_],
  ★を表示(L1,L2),!.
t193_1(L1,L2) :-
  ★を表示(L1,L2),
  append([A],R1,L1),
  append(R1,[A],L3),
  append(L4,[B],L2),
  t_193_1(L3,[B|L4]).

★を表示([],[]) :- nl.
★を表示([' '|R1],[' '|R2]) :-
  !,
  write(' '),
  ★を表示(R1,R2).
★を表示([_|R1],[_|R2]) :-
  write(★),
  ★を表示(R1,R2).

198 名前:197 mailto:sage [2009/06/17(水) 03:42:45 ]
% 全角スペースがうまく表示できてない・・・

193 :-
  t193_1([' ',' ',' ',' ',★],[★,' ',' ',' ',' ']).

t193_1(L1,L2) :-
  L1=[★|_],
  ★を表示(L1,L2),!.
t193_1(L1,L2) :-
  ★を表示(L1,L2),
  append([A],R1,L1),
  append(R1,[A],L3),
  append(L4,[B],L2),
  t_193_1(L3,[B|L4]).

★を表示([],[]) :- nl.
★を表示([' '|R1],[' '|R2]) :-
  !,
  write(' '),
  ★を表示(R1,R2).
★を表示([_|R1],[_|R2]) :-
  write(★),
  ★を表示(R1,R2).



199 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 04:09:41 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/505
#[1] 授業単元: C言語
#[2] 問題文
# (1)
# 文字列を受け取る関数(charポインタを使用)
# その文字列の一番最後の文字を消去する関数を作る。
# (2)
# 文字列を受け取る関数(charポインタ使用)
# その文字列の一番最初の文字を消去する関数を作る。
# (3)'文字列を入力し、ある文字を入力。その文字列の中にその入力した文字がいく
つあるかを数える関数。
# 例 文字列 asdfgvbfdcaa 文字aと入力したら 3となる
# その関数は二つのパラメータをもち、一つ目は文字列へのポインタ、二つ目は数えた文
字の数である。

200 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 04:11:28 ]
>>199
% Prolog
% (1)
'その文字列の一番最後の文字を消去する'(_文字列,_一番最後の文字を消去された文字列
) :-
  sub_atom(_文字列,0,Len,1,_一番最後の文字を消去された文字列).

% (2)
'文字列の一番最初の文字を消去する'(_文字列,_一番最初の文字を消去された文字列) :-

  sub_atom(_文字列,1,_,0,_一番最初の文字を消去された文字列).

% (3)
文字列中である文字の出現回数(_文字,_文字列,_出現回数) :-
  findall(_,sub_atom(_文字列,_,1,_,_文字),L),
  length(L,_出現回数).

201 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 06:19:02 ]
pc12.2ch.net/test/read.cgi/tech/1136994325/925
# 123456789の順に数字を並べて,数字の間に+,−を補うことで式を作り, その値が100になる# 組み合わせをすべて求め,その式を出力するプログラムを作成しなさい.
# お願いします


202 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 07:47:20 ]
>>201
% Prolog
t201 :-
  findall(Q,t201(Q),L),
  member(A,L),
  write(A),
  nl;
  true.

t201(Q) :-
  符号を含むならびの生成([1,2,3,4,5,6,7,8,9],L),
  atom_chars(S,L),
  atom_to_term(S,Q,_),
  100 is Q.

符号を含むならびの生成([A],[A]).
符号を含むならびの生成([A|R1],[A|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'+'|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'-'|R2]) :-
  符号を含むならびの生成(R1,R2).

203 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 08:28:48 ]
% 間違いがありました。訂正します。
% atom_chars/2 の第二引数リストの要素はcharしか許されないので
t201 :-
  findall(Q,t201(Q),L),
  member(A,L),
  write(A),
  nl;
  true.

t201(Q) :-
  符号を含むならびの生成(['1','2','3','4','5','6','7','8','9'],L),
  atom_chars(S,L),
  atom_to_term(S,Q,_),
  100 is Q.

符号を含むならびの生成([A],[A]).
符号を含むならびの生成([A|R1],[A|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'+'|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'-'|R2]) :-
  符号を含むならびの生成(R1,R2).

204 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 08:41:07 ]
% もう一ヶ所訂正。fail が落ちていた。
t201 :-
  findall(Q,t201(Q),L),
  member(A,L),
  write_formatted('%t\n',[A]),
  fail.
t201.

t201(Q) :-
  符号を含むならびの生成(['1','2','3','4','5','6','7','8','9'],L),
  atom_chars(S,L),
  atom_to_term(S,Q,_),
  100 is Q.

符号を含むならびの生成([A],[A]).
符号を含むならびの生成([A|R1],[A|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'+'|R2]) :-
  符号を含むならびの生成(R1,R2).
符号を含むならびの生成([A|R1],[A,'-'|R2]) :-
  符号を含むならびの生成(R1,R2).

205 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 08:47:44 ]
>>200 ですが、
これではPrologが誇るスーパー組込み述語 sub_atom/5 の
リファレンスの意味しかないので、sub_atom/5を使わない版を
後で示します。
それからアトムに対して文字列という言葉を使っていることに、
違和感を覚える方がおられると思いますが、私は"文字列"は
絶対といっていいくらい使いません。私の書き込みで文字列と
言うときは文字列アトムのことだと思ってください。

206 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 09:07:55 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/514
#[1]授業単元:プログラミング演習1
#
#[2]問題文:画面より入力した成績データをファイルに登録する。
# 画面より入力する項目は以下のとおり。
# ・生徒コード、数字6桁、数字であること。
# ・氏名、文字列20文字、1字以上、20字以内
# ・国語(点数)、数字3桁、数字であること、0<=点数<=100
# ・算数(点数)、国語と同じ
# ・社会(点数)、国語、算数と同じ
#
#
# 生徒コードに999999が入力されたら終了する。

207 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 10:55:36 ]
>>206
% Prolog
nojiriko.asia/prolog/t206.html

208 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 16:53:31 ]
>>206 一部書き直しました。
% Prolog
nojiriko.asia/prolog/t206.html



209 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 17:09:49 ]
>>206
-- Haskell
ttp://ja.pastebin.ca/1463106

210 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 18:05:15 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/550
#
# (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい
#
# p wday["sunday"] #=> "日曜日"
# p wday["monday"] #=> "月曜日"
# p wday["saturday"] #=> "土曜日"
#
# (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい
#
# (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ
い。
# 「sunday」は日曜日のことです。
# 「monday」は月曜日のことです。
# …
#
# (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行
# (正規表現で定義するなら「/\s+/」)で区切られた文字列をハッシュに変換するメ
ソッド
# str2hashを定義してください。
#
# p str2hash("bule 青 white 白\nred赤");
# #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"}

211 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 18:10:18 ]
>>210
% Prolog (Prologにハッシュはないよw したがって・・)
% (1)
wday(sunday,日曜日).
wday(monday,月曜日).
wday(saturday,土曜日).

% (2)
wdayの節数(_節数) :- 節数(wday(_,_),_節数).

節数(_節形式,_節数) :- findall(_,_節形式,L),length(L,_節数).

% (3)
'(3)' :-
  wday(A,B),
  write_formatted('「%t」は%tのことです。\n',[A,B]),
  fail;
  true.

% (4)
str2hash(S,_述語名) :-
  split(S,['\n'],L),
  member(A,L),
  split(A,['\t',' '],L1),
  P =.. [_述語名|L1],
  assertz(P),
  fail;
  true.

212 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 20:13:52 ]
>>210
-- Haskell
ttp://ja.pastebin.ca/1463260

213 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 21:26:01 ]
VB6をやっているのですが、
「ストアド関数」というものが、
いまいちどういう役割を担っているものなのかわかりません。
MSDNを見たりウェブで調べたりはしたのですが…

宜しければ、どなたかお願いします。


214 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 04:16:40 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/580
#[1] 授業単元: プログラミング演習
#[2] 問題文: 人の名前(ローマ字)を検索(部分一致)することができるプログラムを作成せよ。

215 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 04:29:48 ]
>>214
% Prolog (最初に組込述語から)
t214(_人の名前,_検索文字列の変位,_その長さ,_残った文字列長さ,_検索文字列) :-
  sub_atom(_人の名前,_検索文字列の変位,_その長さ,_残った文字列長さ,_検索文字列).

?- t214('Hitomaro Kakinomoto',A,B,C,'kino').
A = 11,
B = 4,
C = 4;
no
?- /* >>200 参照 */

216 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 05:37:47 ]
>>214
% Prolog >>215 をより使いやすくするため sChars/6 を定義する。

sChars(A,B,C,D,E,F) :- sub_atom(A,B,C,D,E),C > 0,atom_chars(E,F).

% これでkから始まりoで終わる部分文字列の検索などがやり易くなる。

?- sChars('Hitomaro Kakinomoto',B,C,D,E,F),append([k|_],[o],F).
B = 11,
C = 4,
D = 4,
E = kino,
F = [k,i,n,o],
_ = [i,n];
B = 11,
C = 6,
D = 2,
E = kinomo,
F = [k,i,n,o,m,o],
_ = [i,n,o,m];
B = 11,
C = 8,
D = 0,
E = kinomoto,
F = [k,i,n,o,m,o,t,o],
_ = [i,n,o,m,o,t];
no.
?-

217 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 06:02:02 ]
>>216
% Prolog より一般的にsCharsという述語の中に検索条件を書き込めないであろうか?
% sChars/7を定義する。_検索条件項の中でEかFを使用しなければならない。

sChars(_検索条件項,A,B,C,D,E,F) :- sChars(A,B,C,D,E,F),call(_検索条件項).

% >>216 に較べてこちらの方が優れているかは疑問だ。

218 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 06:10:49 ]
>>217
% Prolog 例えば正規表現(に限らないが)を処理するには、

sChars(_正規表現パターン,A,B,C,D,E,F) :- sChars(A,B,C,D,E,F), ... 正規表現パターンの解決副目標(_正規表現パターン), ...
sChars(_検索条件項,A,B,C,D,E,F) :- sChars(A,B,C,D,E,F),call(_検索条件項).

% のように上に定義を加えていけばよい。



219 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 06:38:52 ]
pc12.2ch.net/test/read.cgi/tech/1200175247/560
#[1] 授業単元: C
#[2] 問題文(含コード&リンク):アルファベットの小文字を大文字に変換するプログラムを作成せよ
# ヒント: 'a'〜'z'は連続した文字コードが割り当てられている。'A'〜'Z'も連続した文字コードが割り当てられている。すなわち、'a'の文字コード
#      にある定数を足す(または引く)と'A'になり、'b'にその定数を足す(または引く)と'B'になる。この定数さえ求められれば、簡単に計算できることがわかる。
#      定数は、'a'や'A'を使えば計算できる。

220 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 07:01:41 ]
>>219
% Prolog 敢えて、出題の題意通りやってみる。

英小文字から大文字へのコード変換(_英小文字,_英大文字) :-
  char_code(a,_aの文字コード),
  char_code('A',_Aの文字コード),
  _変位 is _aの文字コード - _Aの文字コード,
  char_code(_英小文字,_英小文字の文字コード),
  _英大文字の文字コード is _英小文字の文字コード - _変位,
  char_code(_英大文字,_英大文字の文字コード).


221 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 07:13:10 ]
>>220
% 双方向性を持たせよう。少し無理をする。

英小文字大文字変換(_英小文字,_英大文字) :-
  char_code(a,_aの文字コード),length(L1,_aの文字コード),
  char_code('A',_Aの文字コード),length(L2,_Aの文字コード),
  append(L2,R,L1),
  char_code(_英小文字,_英小文字の文字コード),length(L3,_英小文字の文字コード),
  append(R2,R,L3),length(R2,_英大文字の文字コード),
  char_code(_英大文字,_英大文字の文字コード).

222 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 07:29:55 ]
>>221
すみません。これだとやっぱりだめだ。
char_code/2を使う以上は、変数の有無だけは検査しないといけないのかな。
ちょっと考えます・・・

文字連鎖('A','B').
文字連鎖('B','C').
...
文字連鎖('Z','A').
...
文字連鎖(a,b).
文字連鎖(b,c).
・・・
文字連鎖(z,a).

を定義しないと無理かな。

223 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 07:40:21 ]
>>222
% この定義があればなんとかなるか。

英小文字([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).

英大文字(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R
','S','T','U','V','W','X','Y','Z']).

224 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 08:06:43 ]
>>222
% 実は、

英小文字大文字変換(_英小文字,_英大文字) :-
  英大文字ならび(LL),append(L1,[_英大文字|_],LL),
  英小文字ならび(SL),append(L2,[_英小文字|_],SL),
  length(L1,Len),
  length(L2,Len).

英大文字ならび(L) :- findall(C,(for(65,N,90),char_code(C,N)),L).

英小文字ならび(L) :- findall(C,(for(97,N,122),char_code(C,N)),L).

% で済むようです。まあ、ペアで定義すればいいだけですが。


225 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 09:33:49 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/548
# [1] 授業単元: プログラミング論
# [2] 問題文(含コード&リンク): C言語で三目並べをするプログラムの作成
# C言語で三目並べ(いわゆる○×)をするプログラムを作成する。
#
# # 条件
# ・コンピュータの手はランダムに決定するものとする(空いているところに打つ)
# ・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する
# ・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック
# ・他にも必要に応じて関数を宣言すること
#
# ヒント集
# ・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。
# ・char stone[3][3]={"-","○","×"};などと宣言しておくと便利?
# ・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引
き分け
# ・ループの考え方は2通りできる
#  1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak
# 2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な  ら後手
# ・三目並んだかのチェックは工夫のしどころ
#  ・手盤の人の石だけチェックする
#  ・打ったところの縦横は必ずチェック、斜めはどうする?
# ・作っていく順
#  ・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示
#  ・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番

226 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 09:39:35 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/554
# [1] 授業単元: c言語演習
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9478.txt

227 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 09:41:34 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/551
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# cos(x)とx軸で囲まれる領域において、xがa〜bの区間の面積を台形積分で求めるプログラムを作成しなさい。
# なお、aとbは引数として与えるようにすること。

228 名前:デフォルトの名無しさん [2009/06/18(木) 14:56:57 ]
>>227
できますた
これでいいですか?

(defun s (a b)
(let ((ya (cos a)) (yb (cos b)))
(/ (* (- b a) (+ ya yb)) 2)))




229 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 16:46:28 ]
>>227
% Prolog
'cos(x)とx軸で囲まれる領域において、xがa〜bの区間の面積を台形積分で求める'(_開始
X座標,_終了X座標,X) :-
  分割数(_分割数),
  _開始X座標2 is _開始X座標,
  _終了X座標2 is _終了X座標,
  刻み幅(_分割数,_開始X座標2,_終了X座標2,_刻み幅),
  Y座標ならびを得る(_分割数,_分割数,_開始X座標2,_終了X座標2,_Y座標ならび),
  台形の総面積(_Y座標ならび,_刻み幅,X).

分割数(30).

台形の総面積([A,B],_刻み幅,X) :-
  X is (A+B) * _刻み幅 / 2,!.
台形の総面積([A,B|R],_刻み幅,X) :-
  Z is (A+B) * _刻み幅 / 2,
  台形の総面積([B|R],_刻み幅,Y),
  X is Z + Y.

Y座標ならびを得る(_分割数,_分割数,_開始X座標,_終了X座標,[A]) :-
  A is cos(_終了X座標),!.
Y座標ならびを得る(N,_分割数,_開始X座標,_終了X座標,[A|R]) :-
  A is cos(((_終了X座標-_開始X座標) * N / _分割数 + _開始X座標)),
  Y座標ならびを得る(M,_分割数,_開始X座標,_終了X座標,R).

刻み幅(_分割数,_開始X座標,_終了X座標,_刻み幅) :-
  _刻み幅 is (_終了X座標-_開始X座標) / _分割数.

230 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 17:24:52 ]
>>226
% Prolog
gcd(M,N,N) :-
0 is M mod N,!.
gcd(M,N,X) :-
Mod is M mod N,
gcd(N,Mod,X).

gcd(M,N,O,X) :-
gcd(M,N,Y),
gcd(Y,O,X).

231 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 17:26:54 ]
>>226 書き直し
% Prolog
gcd(M,N,N) :-
  0 is M mod N,!.
gcd(M,N,X) :-
  Mod is M mod N,
  gcd(N,Mod,X).

gcd(M,N,O,X) :-
  gcd(M,N,Y),
  gcd(Y,O,X).


232 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 17:46:05 ]
>>228
ニュートン・コーツ とか
区分求積法 でググれ

233 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 18:28:43 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/592
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):入力した文字の種類を表示するプログラムを作成せよ。ただし、表示は次に従うとする
# 入力キーA〜Z 表示メッセージ 英大文字です
# 入力キーa〜z 表示メッセージ  英小文字です
# 入力キー0〜9 表示メッセージ  数字です
# 上記以外    表示メッセージ  その他のキャラクターです

234 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 18:32:23 ]
>>233
% Prolog
入力した文字の種類を表示するプログラム(_文字,_文字の種類) :-
  文字の範疇(_文字の範疇,_文字),
  表示は次に従うとする(_文字の範疇,_,_表示メッセージ),
  write(_表示メッセージ).
 
表示は次に従うとする(入力キーA〜Z,表示メッセージ,英大文字です).
表示は次に従うとする(入力キーa〜z,表示メッセージ,英小文字です).
表示は次に従うとする(入力キー0〜9,表示メッセージ,数字です).
表示は次に従うとする(上記以外,表示メッセージ,その他のキャラクターです).

文字の範疇(入力キーA〜Z,_文字) :-
  member(_文字,['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〜z,_文字) :-
  member(_文字,[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]).
文字の範疇(入力キー0〜9,_文字) :-
  member(_文字,['0','1','2','3','4','5','6','7','8','9']).
文字の範疇(上記以外,_文字) :-
  not(member(_文字,['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〜z,_文字) :-
  member(_文字,[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]).
文字の範疇(入力キー0〜9,_文字) :-
  member(_文字,['0','1','2','3','4','5','6','7','8','9']).
文字の範疇(上記以外,_文字) :-
  not(member(_文字,['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'])),
  not(member(_文字,[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])),
  not(member(_文字,['0','1','2','3','4','5','6','7','8','9'])).

235 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 18:40:39 ]
>>233 訂正
% Prolog
入力した文字の種類を表示するプログラム(_文字) :-
  文字の範疇(_文字の範疇,_文字),

% 2引数ではなく、1引数の述語です。削り忘れてました。
% なんて冗長な馬鹿なプログラムだと思われるでしょうが、渡された
% 仕様を可能な限りそのまま利用して、何も考えずにプログラムすると
% こんな事になるという例です。

入力した文字の種類を表示するプログラム(_文字,_文字の種類) :-
  表示は次に従うとする(_文字の範疇,_,_表示メッセージ),
  文字の範疇(_文字の範疇,_文字),
  write(_表示メッセージ).

% 順序をひっくり返してもちゃんと動作します。開発順序としては
% この述語を作ってから、2行目と3行目を入れ替えました。


236 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 20:51:57 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/615
# [1] 授業単元: C初心者コース
# [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する
# プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error
# [3] 環境
# [3.1]linux
# [3.2] gcc
# [3.3]C
# [4]6月19日
# [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです

237 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 20:55:20 ]
>>236
% Prolog
評価値(_点数,'A+') :- _点数>=90,_点数=<100.
評価値(_点数,'A') :- _点数>=80,_点数=<89.
評価値(_点数,'B') :- _点数>=70,_点数=<79.
評価値(_点数,'C') :- _点数>=60,_点数=<69.
評価値(_点数,'F') :- _点数>=0,_点数=<59.
評価値(_,error).

238 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 23:44:11 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/737
#【 課題 】適当な文字列を入力して、暗号化するプログラムを作る。
# 暗号キーは2桁で、暗号文は奇数番目と偶数番目の文字列を、
# 暗号キーの値だけ交互にずらして作成する。
# 使用する文字種は「!」から「z」までの90個とする(0x21~0x7A)。
# またを超えたら!に戻すこと。



239 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 23:46:10 ]
>>238
% Prolog
nojiriko.asia/prolog/t238.html

240 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 07:51:19 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/650
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、
# 次の例に示すように行番号と*を表示するプログラムを作成せよ。
# なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。
# また、0や負の数が入力された場合はプログラムが終了するようにせよ。

241 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 07:58:05 ]
>>240
% Prolog
% 述語 同一要素ならび/3 は事実上の組込述語ですね
t240(N) :-
  for(N,M,1),t240_1(M),N=1.

t240_1(N) :-
  同一要素ならび(*,L,N),
  concat_atom([N|L],S),
  write_formatted('%t\n',[S]).

同一要素ならび(_要素,List,Length) :-
  length(List,Length),
  同一要素ならび(_要素,List) .

同一要素ならび(_,[]).
同一要素ならび(A,[A|R]) :-
  同一要素ならび(A,R).

242 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:42:10 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/674
# [1] 授業単元:プログラム
# [2] 4*3行列Aと 3*5行列B の各要素をキーボードから入力し、
# C = A*B を計算し、表示するプログラムを作成せよ。

243 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:43:51 ]
>>242
% Prolog 少し前に一度あった。
nojiriko.asia/prolog/t242.html

244 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:47:02 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/669
# 内容:
# [1] 授業単元: プログラミング論
# [2] 問題文(含コード&リンク):
# 1からnまでの整数値の和を再帰的に求めるプログラムを作成する
# [実行結果の例]
# 1からnまでの整数値の和を計算します
# nの値を入力してください:100
# 1から100までの整数値の和は5050です

245 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 04:31:12 ]
>>149 >>150
% Prolog (下請け述語を改変)
% pc12.2ch.net/test/read.cgi/tech/1235561034/289 参照

交互にならべた文字列(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  交互にならべた文字列_1(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

交互にならべた文字列_1([],L,L) :- !.
交互にならべた文字列_1([A|R1],L2,[A|R]) :-
  交互にならべた文字列_1(L2,R1,R)..

?- 交互にならべた文字列(abcde,opq,X).
X = aobpcqde;
no
?-


246 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 04:58:24 ]
>>246
もっと一般化したら・・

二つの文字列を交互に併合する(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  順併合(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

順併合([],L,L) :- !.
順併合([A|R1],L2,[A|R]) :-
  順併合(L2,R1,R).

247 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 05:37:07 ]
>>246
順併合というソートと誤解されるかな。

二つの文字列を交互に併合する(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  交互併合(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

交互併合([],L,L) :- !.
交互併合([A|R1],L2,[A|R]) :-
  交互併合(L2,R1,R).

248 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 08:33:46 ]
ということは、
>>238 >>239 文字コードによる暗号化/3 も以下がよい。

文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :-
  integer(_鍵整数),
  _鍵整数>=10
  _鍵整数=<99,
  atom_codes(_元の文字列,Codes),
  _奇数番目の鍵 is _鍵整数 // 10,
  _偶数番目の鍵 is _鍵整数 mod 10,
  文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes),
  atom_codes(_暗号文字列,_暗号Codes).

文字コードによる暗号化(_,_,[],[]) :- !.
文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :-
  一文字の暗号化(_鍵1,A,B),
  文字コードによる暗号化(_鍵2,_鍵1,R1,R2).

一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :-
  _文字コード+_変位 =< 122,!,
  _暗号化された文字コード is _文字コード+_変位.
一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :-
  _文字コード+_変位 >122,!,
  _暗号化された文字コード is _文字コード+_変位-90.



249 名前:248 mailto:sage [2009/06/20(土) 08:47:22 ]
ごめんなさい。>>238 を更新してしまった。
これでは以前との比較ができない。もう一度復元しますから、少し待って。

250 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 09:01:05 ]
>>249 >>239 の話でした。元々はこうなっていたはずです。

文字コードによる暗号化(_,_,[],[]).
文字コードによる暗号化(_奇数番目の鍵,_,[A],[C]) :-
  一文字の暗号化(_奇数番目の鍵,A,C).  
文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,[A,B|R1],[C,D|R2]) :-
  一文字の暗号化(_奇数番目の鍵,A,C),
  一文字の暗号化(_偶数番目の鍵,B,D),
  文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,R1,R2).

251 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 19:19:22 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/750# 【 課題 】
# String a ="@test あいう@aaaおえてtest.com/と";
# aから@から始まるアルファベットとURLを取り除く処理
# System.out.println(a);
#
# 出力結果
# あいうおえてと
#
# aから@から始まるアルファベットとURLを取り除く処理はどのように書けばいいのでし
ょうか?


252 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 19:44:01 ]
>>251
% Prolog
t251(_文字列,_取り除いた文字列) :-
  atom_chars(_文字列,Chars),
  t251_1(Chars,L),
  atom_chars(_取り除いた文字列,L).

t251_1([],[]) :- !.
t251_1([@|R1],R2) :-
  t251_2(R1,R2),!.
t251_1([h,t,t,p,:,/,/|R1],R2) :-
  t251_2(R1,R2),!.
t251_1([A|R1],[A|R2]) :-
  t251_1(R1,R2).

t251_2([],[]) :- !.
t251_2([A|R1],R2) :-
  A @>=' ',
  A @=< z,!,
  t251_2(R1,R2).
t251_2(L,R2) :-
  t251_1(L,R2).


253 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 04:51:24 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/708
# 入力件数nをキーボードより入力し、n人分のテストデータを入力する。
# その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。
# ただし、平均点は実数型とし小数点第2位まで出力する。
# 平均点以外の変数は整数型とする。
#
# 問A棒グラフ出力プログラム
# 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。
# 大きい値の方の棒グラフが上に来るようにすること。
# (値として0〜50までしか入力されないものとする)

254 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 05:43:15 ]
>>253 問A棒グラフ出力プログラム
% Prolog

t253_2(A,B) :-
  t253_2_make_list(50,A,B,L),
  t253_2_print(L).

t253_2_make_list(0,_,_,[]).
t253_2_make_list(N,A,B,[[X1,X2]|R]) :-
  ( N > A,X1=' ';N =< A,X1='*'),
  ( N > B,X2=' ';N =< B,X2='*'),
  N2 is N - 1,
  t253_2_make_list(N2,A,B,R).

t253_2_print([],[]).
t253_2_print([F|R1],[B|R2]) :-
  write_formatted(' %t %t\n',F),
  t253_2_print(R1,R2).

255 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 05:47:01 ]
>>254 間違えた。t253_2_printを直すの忘れてた。
% Prolog

t253_2(A,B) :-
  t253_2_make_list(50,A,B,L),
  t253_2_print(L).

t253_2_make_list(0,_,_,[]).
t253_2_make_list(N,A,B,[[X1,X2]|R]) :-
  ( N > A,X1=' ';N =< A,X1='*'),
  ( N > B,X2=' ';N =< B,X2='*'),
  N2 is N - 1,
  t253_2_make_list(N2,A,B,R).

t253_2_print([]).
t253_2_print([L|R]) :-
  write_formatted(' %t %t\n',L),
  t253_2_print(R).

256 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 06:25:06 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/742
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):年r%の複利でy円を借り、n年後に一括返済する場合の返済額を計算するプログラムを作成せよ
#               ただしr%の複利でn年借りた場合の利率を計算する部分を関数として作成すること。
# 表示結果の例
#     利率(r):7.5
#     金額(y):1000000
# 期間(n):2
# 返済金額は1155625
# ヒント:返済金額はy(1+r/100)のn乗円である。r%の複利でn年間の利率(1+r/100)のn乗を計算する関数
#     float interest(float r, int n)を作る。そしてmain()からinterest()を呼び出し、返された値にyを掛けて返済額を求める。

257 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 12:51:45 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/748
#【 課題 】rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/712.txt
#【 形態 】Javaアプリケーション(main()で開始)
# rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/716.txt
上記仕様は意味不明のところがあり、
入力ファイルを以下のように変更しましょう。

売上明細ファイル
1)支店コード(数値3byte)
2)販売日(yyyymmdd)
3)販売先コード(数値6byte)
4)売上金額(数値8byte)

支店名ファイル
1)支店コード(数値3byte)
2)支店名(文字10byte)

販売先名ファイル
1)販売先コード(数値6byte)
2)販売先名(文字30byte)

258 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 15:00:09 ]
>>251 >>252 URLのチェックの認識部分を修正
% Prolog
t251(_文字列,_取り除いた文字列) :-
  atom_chars(_文字列,Chars),
  t251_1(Chars,L),
  atom_chars(_取り除いた文字列,L).

t251_1([],[]) :- !.
t251_1([' '|R1],R2) :-
  t251_1(R1,R2),!.
t251_1([@|R1],R2) :-
  t251_2(R1,R2),!.
t251_1(L,R2) :-
  url_check(L,R1),
  t251_2(R1,R2),!.
t251_1([A|R1],[A|R2]) :-
  t251_1(R1,R2).

url_check([h,t,t,p,:,/,/|R],R) :- !.
url_ckeck([h,t,t,p,s,:,/,/,|R],R) :- !.
url_check([f,t,p,:,/,/|R],R) :- !.
url_check([f,i,l,e,:,/,/|R],R) :- !.

t251_2([],[]) :- !.
t251_2([A|R1],R2) :-
  A @>' ',
  A @=< z,!,
  t251_2(R1,R2).
t251_2(L,R2) :-
  t251_1(L,R2).



259 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 19:17:19 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/765
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 診断プログラムを作ろう
# 「計算ドリル」。質問文全てを一つの文字列配列に格納し、その順番に表示しましょう
。正解するたびに、
# tokuten を増やすことで、最後に「あなたは 5 問正解です」みたいな結果を表示させ
ることが出来ます。
# char questions[6][100]={
# “12×(3+4)=”, “(1+1÷9)×9=”,
# “(29‐5)÷(17‐11)=”, “2の10乗=”,
# “(3×9+44÷2)のルート=”, “8の階乗=”};
# ソースプログラム、変数の意味、工夫した点を書きなさい


260 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 19:21:42 ]
>>259
% Prolog
計算ドリル :-
  write('五問出題します。すぐに答えてください\n'),
  質問(L1),
  正解(L2),
  計算ドリル(L1,L2,0,X),
  write_formatted('%t問正解です\n',[X]).

計算ドリル([],_,N,N) :- !.
計算ドリル([A|R1],[B|R2],N,X) :-
  write(A),
  get_line(S),
  atom_to_term(S,B),
  M is N + 1,
  計算ドリル([A|R1],[B|R2],M,X),!.
計算ドリル([_|R1],[_|R2],N,X) :-
  計算ドリル(R1,R2,N,X).

質問(['12×(3+4)=',
'(1+1÷9)×9=',
'(29‐5)÷(17‐11)=',
'2の10乗=',
'(3×9+44÷2)のルート=',
'8の階乗=']).

正解([84,10,4,1024,7,40320]).

261 名前:260 mailto:sage [2009/06/21(日) 20:08:59 ]
% 正解かどうかを示すタイミングは
計算ドリル([],_,N,N) :- !.
計算ドリル([A|R1],[B|R2],N,X) :-
  write(A),
  get_line(S),
  atom_to_term(S,B),
  write('正解です!\n'),
  M is N + 1,
  計算ドリル([A|R1],[B|R2],M,X),!.
計算ドリル([_|R1],[B|R2],N,X) :-
  write('残念でした!! 正解は%tですね\n',[B]),
  計算ドリル(R1,R2,N,X).

262 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 20:37:25 ]
% 一般的には以下のような定義にします。これだと不正解の時にもSを表示できます。
計算ドリル([],_,N,N) :- !.
計算ドリル([A|R1],[B|R2],N,X) :-
  write(A),
  get_line(S),
  正誤の判定(S,B,N,N2),
  計算ドリル(R1,R2,N2,X).

正誤の判定(S,B,N,N2) :-
  atom_to_term(S,B1),
  B1 = B,
  write('正解です!\n'),N2 is N + 1,!.
正誤の判定(S,B,N,N) :-
  atom_to_term(S,B1),
integer(B1),
not(B1=B),
write_formatted('残念でした!! 正解は%tですね\n',[B]),!.
正誤の判定(S,B,N,N) :-
  atom_to_term(S,B1),
  not(integer(B1)),
  write_formatted('入力に形式的な誤りがあったようです\nあなたは%tと入力しました\n',[S]).

263 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:02:23 ]
>>256
% Prolog

interest(R,N,X) :-
  X is (1+R/100)^N.

返済額(Y,R,N,,X) :-
  interrest(R,N,Z),
X is Y * Z.

264 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 04:34:04 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/580
# 【質問テンプレ】
# [1] 授業単元: プログラミング演習
# [2] 問題文: 人の名前(ローマ字)を検索(部分一致)することができるプログラム
を作成せよ。


265 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 14:46:14 ]
>>264
% Prolog こういう処理のためのユーティリティ sub_atom/10 を提案する。
nojiriko.asia/prolog/t264_u.html

266 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 17:23:44 ]
pc12.2ch.net/test/read.cgi/tech/1153585095/878
#エラトステネスの篩
#(コードは煩雑そうに見えるが、速度が圧倒的に速い。
# 大きな数までの素数表が必要な場合に必要な方法。)
% 宿題には見えないんだが・・

267 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 17:27:40 ]
>>266
% Prolog

素数生成(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).

268 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:55:11 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/842
# [1] C言語
# [2]1〜5の数字の組み合わせをを2次元配列index[][]に格納し、表示しなさい。




269 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:59:07 ]
>>268
% Prolog
t268(X) :- 組合せ([1,2,3,4,5],2,X).

組合せ(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) .

270 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 23:01:19 ]
>>268
% Prolog
t268(X) :- 組合せ([1,2,3,4,5],2,X).

組合せ(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) .

271 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 23:05:33 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/837
# キーボードから入力した数値の段数を持つ逆ピラミッドを表示するプログラム。
#
# 例えば3と入力した時、
#
# *****
# ***
# *
#
# となるようなプログラムです。
# どうか早急にお願いします。

272 名前:デフォルトの名無しさん [2009/06/22(月) 23:08:00 ]
>>271
問題が面白くないっす
やる気起きないっす


273 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 23:17:35 ]
% Prolog
:- op(250,xfx,対).

t271(N,1 対 M) :-
  for(N,N2,1),
  N3 is (N2 - 1) * (M - 1) + 1,
  for(1,N4,N3),write(*),N3=N4,
  N=N2.

274 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 04:33:24 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/851
# あいうえお
# /*かきくけこ*/
# さしす/*せそ
# なにぬ*/ねの
#
# というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。
# お願いいたします。

275 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 05:03:46 ]
>>274
% Prolog
t274(_文字数,_改行数,_コメント数) :-
  get_chars('test.txt',Chars),
  length(Chars,_文字数),
  改行数を数える(Chars,_改行数),
  コメント数を数える(Chars,_コメント).

改行数を数える(Chars,_改行数) :-
  findall(_,append(_,['\n'|_],Chars),L),
  length(L,_改行数).

コメント文字数を数える(Chars,_コメント文字数) :-
  append(_,['/','*'|L2],Chars),
  append(_コメント文字候補,['*','/'|_],L2),
  not(append(_,['/','*'|_],_コメント文字候補)),
  改行を取り除く(_コメント文字候補,_改行を取り除いたコメント文字候補),
  length(_改行を取り除いたコメント文字候補,_コメント文字数).

改行を取り除く([],[]).
改行を取り除く(['\n'|R1],R2) :-
  改行を取り除く(R1,R2),!.
改行を取り除く([A|R1],[A|R2]) :-
  not(A='\n'),
  改行を取り除く(R1,R2).

276 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 05:11:18 ]
>>274 >>275
% Prolog (訂正) コメント数 ではなく コメント文字数 です。
t274(_文字数,_改行数,_コメント文字数) :-
  get_chars('test.txt',Chars),
  length(Chars,_文字数),
  改行数を数える(Chars,_改行数),
  コメント文字数を数える(Chars,_コメント文字数).

改行数を数える(Chars,_改行数) :-
  findall(_,append(_,['\n'|_],Chars),L),
  length(L,_改行数).

コメント文字数を数える(Chars,_コメント文字数) :-
  append(_,['/','*'|L2],Chars),
  append(_コメント文字候補,['*','/'|_],L2),
  not(append(_,['/','*'|_],_コメント文字候補)),
  改行を取り除く(_コメント文字候補,_改行を取り除いたコメント文字候補),
  length(_改行を取り除いたコメント文字候補,_コメント文字数).

改行を取り除く([],[]).
改行を取り除く(['\n'|R1],R2) :-
  改行を取り除く(R1,R2),!.
改行を取り除く([A|R1],[A|R2]) :-
  not(A='\n'),
  改行を取り除く(R1,R2).

277 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 05:19:10 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/861
# 以下のように出力されるプログラムを作成せよ
# 年齢を入力してください
# 16
# 生まれた年を入力してください
# 1986
# 好きな数字を入力してください
# 7
# あなたは1986年生まれの16才で、7が好きですね

278 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 05:30:30 ]
>>277
% Prolog
t277 :-
  質問文(L),
  findall(U,(member(A,L),write(A),nl,get_line(U)),VL),
  write_formatted('あなたは%t年生まれの%才で、%tが好きですね\n',VL).

質問文([年齢を入力してください,生まれた年を入力してください,好きな数字を入力してください]).




279 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 05:41:29 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/879
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9519.txt

280 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 07:00:07 ]
>>279
% Prolog
t279(M,N,StartX,StartY,_壁衝突回数,_ポケットX,_ポケットY) :-
  t279(M,N,StartX,StartY,1,1,0,_壁衝突回数,_ポケットX,_ポケットY),!.

t279(M,N,X,Y,_,_,Count,Count,X,Y) :-
  member([X,Y],[[M,0],[0,N],[N,0],[M,N]]),!.
t279(M,N,X1,Y1,VX,VY,Count1,Count,X,Y) :-
  member(X1,[0,M]),
  VX1 is (-1) * VX,
  Count2 is Count1 + 1,
  X2 is X1 + VX1,
  Y2 is Y1 + VY,
  t279(M,N,X2,Y2,VX1,VY,Count2,Count,X,Y).
t279(M,N,X1,0,VX,VY,Count1,Count,X,Y) :-
  member(Y1,[0,N]),
  VY1 is (-1) * VY,
  Count2 is Count + 1,
  X2 is X1 + VX,
  Y2 is Y1 + VY1,
  t279(M,N,X2,Y2,VX,VY1,Count2,Count,X,Y).
t279(M,N,X1,Y1,VX,VY,Count1,Count,X,Y) :-
  X2 is X1 + VX,
  Y2 is Y1 + VY,
  t279(M,N,X2,Y2,VX,VY,Count1,Count2,X,Y).


281 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 07:26:37 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/849
# [1]授業単元:プログラミング演習課題3
# [2]問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9516.txt
# ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で
# ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。
# ソートの順序は降順とし、10行毎に見出しを入れる。
#
# 成績ファイル:
# コード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁)
#
# 構造体の定義:
# struct seito {
# char cd[7];
# char simei[21];
# int kokugo;
# int sansu;
# int rika;
# int syakai;
# };
#
# ソート項目は、コード、氏名、国語、算数、理科、社会が選択できるようにする。


282 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 15:12:50 ]
>>281
% Prolog
nojiriko.asia/prolog/t281.html

283 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 15:20:30 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/890
# [1] 授業単元:数理物理
# [2] 問題文(含コード&リンク):www.mns.kyutech.ac.jp/~kamada/suuributuri/
sub8.html
#   の課題3のプログラムで解くところまで
# 課題(3)
#
# 次の力が働いているときの、運動方程式を解く。
#
# F = -x - v ^ 3 + 1 + cos(t)
#
# 初期条件:t=0の時、x(0)=1.0、速度v(0)=‐0.5
# として解き、0<t<10までをgnuplot(など)で、プロットせよ。
#
# ヒント:
# 6章の減衰振動のプログラム(C言語)
# www.mns.kyutech.ac.jp/~kamada/keisan6/

284 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 20:03:38 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/905
# [1]c++
# [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。

# また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。
# ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ
る。
#  --- (2)配列nの内容 ---
#
# 100000000
# 010000000
# 001000000
# 000100000
# 000010000
# 000001000
# 000000100
# 000000010
# 000000001


285 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 20:27:54 ]
>>284
% Prolog
t284_1 :-
  findall(L,(for(1,M,10),findall(1,for(1,N,10),L)),LX),
  member(U,LX),
  concat_atom(U,A),
  write_formatted('%t\n',[A]),
  fail;
  true.

t284_2 :-
  findall(L,(for(1,M,10),findall(B,(for(1,N,10),
        (N=M,B=1;not(N=M),B=0))),LX),
  member(U,LX),
  concat_atom(U,A),
  write_formatted('%t\n',[A]),
  fail;
  true.


286 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 04:35:26 ]
>>284
% Prolog for/3を使いたくない場合。表示は省略。
t284_2(X) :- length(L,10),findall(L,一つだけ1で他は全部零(L),X).
一つだけ壱で他は全部零(L) :- append(L1,[1|R],L),零ならび(L1),零ならび(R).
零ならび([]).
零ならび([0|R]) :- 零ならび(R).


287 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 04:52:46 ]
>>284 一ヶ所間違えた。
% Prolog for/3を使いたくない場合。表示は省略。
t284_2(X) :- length(L,10),findall(L,ひとつだけ壱で他は全部零(L),X).
ひとつだけ壱で他は全部零(L) :- append(L1,[1|R],L),零ならび(L1),零ならび(R).
零ならび([]).
零ならび([0|R]) :- 零ならび(R).

288 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 08:30:30 ]
>>287
forループがlengthの中に閉じ込められているんだね。

これぞ宣言型プログラミング!




289 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 12:04:36 ]
>>257
% Prolog
nojiriko.asia/prolog/t257.html

290 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 19:14:07 ]
pc12.2ch.net/test/read.cgi/tech/1244449887/953
# [1] 授業単元: ピラミッドアート
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9534.txt
課題「ピラミッドアート」

数値を一つ入力し、その個数分の'*'を1辺とする
@ダイヤ型、A八角形、B星型 などを描画する

実行画面例@ダイヤ型
数字(2〜9)を入力してください:3
*
***
*****
***
*

実行画面例A八角形
数字(2〜9)を入力してください:2
**
****
****
**

実行画面例B星型
数字(2〜9)を入力してください:7
* * *
* * *
***
*******
***
* * *
* * *

291 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 19:16:01 ]
>>290
空白がうまく表示できなかった。
ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9534.txt
で確認してください。

292 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 20:15:45 ]
>>290
% Prolog
nojiriko.asia/prolog/t290.html

293 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 16:58:48 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/75
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):
# キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ
# 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。
# 表示結果の例
# 正の整数:6
# 1******
# 2 *****
# 3  ****
# 4   ***
# 5    **
# 6 *


294 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 17:14:14 ]
>>293
% Prolog 最後6の表示が間違ってるが。

t293(N) :-
  length(L,N),
  append(L1,L2,L),
  not(L2=[]),
  all(L1,' '),
  all(L2,'*'),
  length(L1,N),
  N2 is N + 1,
  concat_atom(L,S),
  write_formatted('%t %t\n',[N2,S]),
  fail;
  true.

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

295 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 17:16:07 ]
>>294
  all(L1,' '), はスペース2個だと思ってください。

296 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:11:51 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/83
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 自分の名前の英字名のASCIIコードを順番に表示するプログラムを作りなさい。

297 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:13:37 ]
>>296
% Prolog

t296(Name) :-
  sub_atom(Name,S,1,R,A),
  not(A=' '),
  char_code(A,C),
  N is S+1,
  write_formatted('%2d: %t\n',[N,C]),
  fail;
  true.

298 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:41:30 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/85
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9554.txt



299 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:17:51 ]
>>298
% Prolog

phon(_フォネティックコードファイル,_文字列) :-
  assertz_フォネティックコード(_フォネティックコードファイル),
  sub_atom(_文字列,_,1,_,A),
  フォネティックコード(A,B),
  write_formatted('%t ',[B]),
  fail;
  true.

assertz_フォネティックコード(_フォネティックコードファイル) :-
  abolish(フォネティックコード/2),
  get_lines(_フォネティックコード,Lines),
  member(Line,Lines),
  split(Line,[','],[A,B]),
  assertz((フォネティックコード(A,B) :- !)),
  fail;
  assertz((フォネティックコード(A,A))).

300 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:32:49 ]
>>298
-- Haskell

import IO
import Data.Char (isAlpha, toLower)
import Data.Maybe (fromJust)

main = do
fname <- getLine
h <- openFile fname ReadMode
phon <- readPhon h
str <- getLine
putStrLn $ t298 phon str
hClose h

readPhon :: Handle -> IO [(Char,String)]
readPhon h = hGetContents h >>= return . map parse . lines
where
parse :: String -> (Char,String)
parse (c:',':p) = (c,p)

t298 :: [(Char,String)] -> String -> String
t298 phon [] = []
t298 phon (x:xs) | isAlpha x = (fromJust $ lookup (toLower x) phon) ++ ' ' : t298 phon xs
| otherwise = x : t298 phon xs

301 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:49:43 ]
>>299 違ったみたい。どこが違ってたか捜してみて下さい。
% Prolog

phon(_フォネティックコードファイル,_文字列) :-
  assertz_フォネティックコード(_フォネティックコードファイル),
  atom_chars(_文字列,Chars),
  phon_1(Chars,XL),
  phon_2(XL).

phon_1([],[]) :- !.
phon_1([A,B|R1],[C,' '|R2]) :-
  フォネティックコード(A,C),
  フォネティックコード(B,_),
  phon_1([B|R1],R2).
phon_1([A,B|R1],[C,' '|R2]) :-
  フォネティックコード(A,C),
  not(フォネティックコード(B,_)),
  phon_1([B|R1],R2).
phon_1([A,B|R1],[A,' '|R2]) :-
  not(フォネティックコード(A,_)),
  フォネティックコード(B,_),
  phon_1([B|R1],R2).
phon_1([A,B|R1],[A|R2]) :-
  not(フォネティックコード(A,_)),
  not(フォネティックコード(B,_)),
  phon_1([B|R1],R2).

phon_2([]).
phon_2([A|R]) :-
  write(A),
  phon_2(R).


302 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:56:51 ]
>>301 さらに訂正。
phon_1([],[]) :- !. の後に、
phon_1([A],[C]) :-
  フォネティックコード(A,C),!.
phon_1([A],[A]) :-
  not(フォネティックコード(A,_)),!.

の2節を追加してください。
nojiriko.asia/prolog/t298.html
に書き直しておきます。

303 名前:299 mailto:sage [2009/06/26(金) 20:35:21 ]
なぜこうまでも全編の書き直しを余儀なくされたかというと、
123abc の場合の 123 Alfa ... 3とAlfaの間のスペースを入れることが
難しかったと言うことです。sub_atomで次の文字をこっそり見てしまえば
いいだけの事なのですが、潔しとせずと言うところでしょうか。

304 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 20:44:07 ]
>>303
前後関係を検査しやすいパターンで記述するので正解じゃないか。
ご苦労様ですw


305 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:04:55 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/46
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):入力した数を2の何乗より大きいかを求めるプログラム。

306 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:15:19 ]
>>305
% Prolog

t305(N,X) :-
for(1,M,N),
2 ^ M > N,
X is M - 1.

307 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:29:32 ]
>>305
-- Haskell

import Data.List (find)
main = do
n <- getLine
let Just m = find ((read n <=) . (2^)) [1..] in print (m-1)

308 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 14:57:43 ]
「いろんな言語で宿題スレ」の中で
pc12.2ch.net/test/read.cgi/tech/1242876647/168
pc12.2ch.net/test/read.cgi/tech/1242876647/225
といったProlog向き問題が未回答となっています。
どなたか、よろしくお願いします。



309 名前:308 mailto:sage [2009/06/28(日) 14:59:04 ]
「Prologでまったり」スレに書き込んだつもりでした。失礼しました。

310 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 04:55:03 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/162
# [1] 授業単元:数値計算
# [2] 問題文(含コード&リンク):の連立1次方程式の解をガウスの消去法用いて解くプログラムを作成しなさい。
#    (この行列を使用してください
#      {{10,-9,0,0,0,0,0,0},
#   {-9,17,-8,0,0,0,0,0},
#   {0,-8,17,-9,0,0,0,0},
# {0,0-9,13,-4,0,0,0},
# {0,0,0,-4,12,-8,0,0},
# {0,0,0,0,-8,10,-2,0},
#   {0,0,0,0,0,-2,2,7}})



311 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 11:08:26 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/856
# 【 課題 】百ます計算プログラムの作成
# 足す数、足される数は実行毎にランダムな順番にする。
# スタートボタンを押すと同時に問題が表示され、答えをキー入力しおわるとストップボタンを押す。
# 終了までの時間と、正解数を表示する。

百ます計算ってなんですか? ゲームに参加した人が行、列の先頭から
数字を得て百桝計算し終わるまでの時間でも競うのですか?

312 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 13:29:06 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/184
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):
#   kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9583.txt


313 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 13:30:41 ]
>>312
% Prolog
t312(StackIn,StackOut) :-
  new_stack(StackIn,NewStack),
  get_chars(Chars),
  t312_1(Chars,NewStack,StackOut,_).

t312_1([],X,X,true).
t312_1([A|R1],Stack1,Stack2,Return) :-
  stack(A,Stack1,Stack3,Return1),
  t312_2(Return1),
  t312_1(R1,Stack3,Stack2,Return).

t312_2(true) :- !.
t312_2(C) :- write(C).

new_stack(Var,[]) :- var(Var),!.
new_stack([],[]) :- !.
new_stack(Stack,Stack).

stack_1('/',[A|R2],R2,A) :- !.
stack_1(C,Stack1,[C|Stack1],true).

314 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 13:45:08 ]
>>313 まちがえた。stackという述語のところ。stack/4 stack_1/4
と出てきますが、stack_op/4にします。
% Prolog

t312(StackIn,StackOut) :-
  new_stack(StackIn,NewStack),
  get_chars(Chars),
  t312_1(Chars,NewStack,StackOut,_).

t312_1([],X,X,true).
t312_1([A|R1],Stack1,Stack2,Return) :-
  stack_op(A,Stack1,Stack3,Return1),
  t312_2(Return1),
  t312_1(R1,Stack3,Stack2,Return).

t312_2(true) :- !.
t312_2(C) :- write(C).

new_stack(Var,[]) :- var(Var),!.
new_stack([],[]) :- !.
new_stack(Stack,Stack).

stack_op('/',[A|R2],R2,A) :- !.
stack_op(C,Stack1,[C|Stack1],true).

315 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 03:45:34 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/222
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt

316 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 10:02:40 ]
>>315
% Prolog
nojiriko.asia/prolog/t315.html

317 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 10:50:45 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/234
# [1] 授業単元:確率論
# [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9602.txt


318 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 14:50:16 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/243
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9605.txt



319 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 17:28:19 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/244
# 〔1〕授業単元:C言語
# 〔2〕問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt


320 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 04:08:33 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/273
# 1] 授業単元: 数理計画法
# [2] 問題文(含コード&リンク): シンプレックス法のプログラムを作成せよ。
# [3] 環境
#  [3.1] OS: Windows
#  [3.3] 言語: C
# [4] 期限: 2009年7月1日
# [5] その他の制限: プログラムの授業で習うことはすべてやりました。
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9612.txt
# のようなプログラムをつくたんですがこの先が悩んでいます。どなたかお願いします。

321 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 04:10:11 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/275
# [1] 授業単元:C言語の基礎
# [2] 問題文:年(西暦)、月、日を入力し、入力した、日時の曜日及び、経過した日数を表示したプログラムを作成せよ。

322 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 16:45:23 ]
>>321
% Prolog
nojiriko.asia/prolog/t321.html

323 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 22:46:07 ]
>>318
% Prolog
nojiriko.asia/prolog/t318.html

324 名前:323 mailto:sage [2009/07/02(木) 05:34:22 ]
>>318
すみません。間違いが多かったので大幅に書き換えてupしました。
nojiriko.asia/prolog/t318.html

325 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 05:47:42 ]
>>319 @
% Prolog
swap(A,B,L,LX) :-
append(L1,[A|L2],[B|L3],L),
append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
append(L1,[B|L2],[A|L3],L),
append(L1,[A|L2],[B|L3],LX),!.

326 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 08:49:55 ]
>>319 A
% Prolog

t319_2(X) :-
  findall(U,(for(1,N,52),t319_2_1(N,U)),X).

t319_2_1(N,U) :-
  M is N mod 13,
  t319_2_2(M,U).

t319_2_2(1,'A') :- !.
t319_2_2(10,'T') :- !.
t319_2_2(11,'J') :- !.
t319_2_2(12,'Q') :- !.
t319_2_2(0,'K') :- !.
t319_2_2(N,N).

327 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 09:03:32 ]
>>319 B
% Prolog

t319_3(X) :-
  findall(U,(for(1,N,52),t319_3_1(N,U)),X).

t319_3_1(N,U) :-
  M is N mod 13,
  M2 is (N - 1) // 13,
  t319_2_2(M,U1),
  t319_2_3(M2,U2),
  atom_concat(U1,U2,U).

t319_2_3(0,s).
t319_2_3(1,h).
t319_2_3(2,d).
t319_2_3(3,c).

% どこでswapを使うのかわからない!
% これからカードを「切る」課題でも出てくるのだろうか。

328 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 09:21:08 ]
>>319
% せっかくだからN回切るのをやってみよう。
% Prolog

t319_cut(N,L) :-
  t319_3(L1),
  t319_cut(N,L1,L).

t319_cut(0,L,L) :- !.
t319_cut(N,L,X) :-
  M1 is (random mod 52) + 1,
  M2 is (random mod 52) + 1,
  swap_nth(M1,M2,L,L1),
  N2 is N - 1,
  t319_cut(N2,L1,X).

swap_nth(M,N,L1,L2) :-
  list_nth(M,L1,A),
  list_nth(N,L1,B),
  swap(A,B,L1,L2).



329 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 09:55:49 ]
>>319
失礼しました。問題文を読み落としていました。
すべて最初に「切る」ことが指定されていました。
最初に切ってしまうなら、swap_nthではなく、swapでも処理できます。

t319_xx(X) :-
  findall(N,for(1,N,52),L),
  t319_cut(100,L,L1),
   ... ,
のような進行になります。

330 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 10:54:28 ]
>>319
% Prolog
nojiriko.asia/prolog/t319.html

331 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 07:12:07 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/472
# [1] 授業単元:C言語実習
# [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin
/joyful/img/9658.txt
# {5,21,4,14,12},
# {25,20,15,3,7},
# {24,11,6,1,13},
# {16,2,17,19,8},
# {23,18,22,9,10}
#
# の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな
るように)
# 結果を出力
#
# 結果は
#
# 5 21 4 14 12
# 25 20 15 3 7
# 24 11 6 1 13
# 16 2 17 19 8
# 23 18 22 9 10
#
# のような形で出力

332 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 07:32:08 ]
>>331
% Prolog

t331(_行列1,_行列2) :-
  各行を整列する(_行列1,_行列3),
  各列を整列する(_行列3,_行列2),
  member(L,_行列2),
  concat_atom(L,' ',S),
  write_formatted('%t\n',[S]),
  fail;
  true.

各行を整列する([],[]) :- !.
各行を整列する([_行|R1],[_整列された行|R2]) :-
  sort(_行,_整列された行),
  各行を整列する(R1,R2).

各列を整列する(_行列1,_行列2) :-
  行列の転置(_行列2,_行列3),
  各行を整列する(_行列3,_行列4),
  行列の転置(_行列4,_行列2).


333 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 15:49:25 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/511
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):試験の点数10人分をキーボードから入力し、以下の内容を出力するプログラムを作成せよ。
# 平均点、標準偏差、得点の高い順の点数リスト(出来れば、バブルソート以外のアルゴリズムでお願いします。)

334 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 16:21:10 ]
>>333
% Prolog (1/2)

t333(_点数ならび,_平均点,_標準偏差,_点数順ならび) :-
  算術平均(_点数ならび,_平均点),
  標準偏差(_点数ならび,_標準偏差),
  quicksort(_点数ならび,_点数順ならび).

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

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

標準偏差([],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).

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


335 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 16:22:29 ]
>>333
% Prolog (2/2)

quicksort([],[]) :- !.
quicksort([X|Xs],Ys) :-
  partition(Xs,X,Littles,Gigs),
  quicksort(Littles,Ls),
  quicksort(Bigs,Bs),
  append(Ls,[X|Bs],Ys).

partition([],Y,[],[]) :- !.
partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs).


336 名前:335 mailto:sage [2009/07/03(金) 16:56:05 ]
>>333
点数の高い順だと、
partition([],Y,[],[]) :- !.
partition([X|Xs],Y,[X|Ls],Bs) :- X @>= Y,partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :- X @< Y,partition(Xs,Y,Ls,Bs).
ですね。

337 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 17:15:43 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/423
# [1] 授業単元: 情報処理
# [2] 問題文(含コード&リンク):
#   
#  2つの正整数 m とn とを引数として受け取り、m と n の最大公約数を戻
# り値として返す関数gcd()を作成する。この関数を用いることにより、キー
# ボードから入力した3つの正整数 a, b, c の最大公約数を求めるプログラム
# を書け。
#
# 注意: 最大公約数を計算するには次のような「ユークリッドの互除法」を
# 用いるとよい。
#
# 「ユークリッドの互除法」
#  2つの正の整数 m、n(m>n)の最大公約数を求めるには、m を n で割っ
# て余り r1 を求め、次に n を r1 で割って余り r2 を求め、・・・、この
# ように大きい方を小さい方で割って余りを求め、最後に割り切れたときの除
# 数が求める最大公約数である。
#
# 例)440/380=1余り60 
#   380/60=6余り20  
#   60/20=3 余りなし
#  したがって、440と380の最大公約数は20 

338 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 17:19:24 ]
>>337
% Prolog

最大公約数をユークリッドの互除法で求める(M,N,N) :-
  0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
  Mod is M mod N,
  最大公約数をユークリッドの互除法で求める(N,Mod,X).



339 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 19:18:20 ]
>>310
% Prolog
nojiriko.asia/prolog/t310.html

340 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:37:32 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/534
# [1] 授業単元:情報処理
# [2] 問題文(含コード&リンク):
# 例えば下図に示すように,通行可能なマス目に'0'が,
# 障害物があって通行不能なマス目に'+'が記されている盤がある.
# 盤の左上をスタート地点,右下をゴール地点として,経路を表示する
# プログラムを作りなさい.
# 盤の例
# 0 0 + 0 +
# + 0 0 0 +
# 0 + + 0 0
# 0 0 + 0 0
# + 0 0 0 0
#
# 例えばこのようなアルゴリズムが考えられる.
#
# 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に,
# そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する.
# 2) 1を繰り返してゴールに達したらその旨を表示する.
# ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する.
#
# 入力形式は、
#
# %> ./a.out 00+0+ +000+ 0++00 00+00 +0000
#
# とする.


341 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:41:34 ]
>>340
% Prolog
nojiriko.asia/prolog/t340.html

342 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 03:47:01 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/536
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): 乱数を使って配列に値を代入するようにせよ。サイズを変化させて時間を計測してみせよ。
# サイズが十倍になると計算結果は何倍になるか?

343 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 03:59:15 ]
>>342
% Prolog
t342(X,Y,Z) :-
  findsum(U1,(for(1,N1,100),U1 is random // 100),X),
  findsum(U2,(for(1,N2,1000),U2 is random // 100),Y),
  Z is Y / X.

findsum(_選択項,_項,_合計値) :-
  findall(_選択項,_項,_値ならび),
  sum(_値ならび,_合計値),!.

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


344 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 04:06:59 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/538
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9667.txt

345 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 04:24:42 ]
>>344 課題1
% Prolog
space(_文字列,_スペースを挿入された文字列) :-
  atom_chars(_文字列,Chars),
  concat_atom(Chars,' ',_スペースを挿入された文字列).

concat_atom([],_,'') :- !.
concat_atom([A],_,A) :- !.
concat_atom([A|R],S,X) :-
  concat_atom(R,S,Y),
  atom_concat(A,S,B),
  atom_concat(B,Y,X).

346 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 04:36:04 ]
>>344 課題2
% Prolog

inpro([],[],0) :- !.
inpro([A|R1],[B|R2],X) :-
  inpro(R1,R2,Y),
  X is A * B + Y.


347 名前:343 mailto:sage [2009/07/04(土) 05:07:58 ]
>>342 間違ってたので直します
% Prolog

t342(X,Y,Z) :-
  findsum(U1,(for(1,N1,100),U1 is random mod 100),X),
  findsum(U2,(for(1,N2,1000),U2 is random mod 100),Y),
  Z is Y / X.

findsum(_選択項,_項,_合計値) :-
  findall(_選択項,_項,_値ならび),
  sum(_値ならび,_合計値),!.

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


348 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:16:30 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/547
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,非負の整数値を読み込んで,その数を逆順に表示するプログラムを作成せよ。
# なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること。
#
# 非負の整数を入力してください: 1963
# 1963 を逆から読むと3691 です.



349 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:32:40 ]
>348
% Prolog

t348 :-
  整数の入力(N),
  number_chars(N,L),
  reverse(L,L1),
  number_chars(N2,L1),
  write_formatted('逆に表示すると %t\n',[N2]).>348

整数の入力(N) :-
  write('非負の整数を入力してください(入力後ピリオドと改行) : '),
  read(N),
  integer(N),
  N >= 0,!.
整数の入力(N) :-
  write('入力されたのは非負の整数ではありませんでした\n'),
  整数の入力(N).

350 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:36:51 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/552
# [1] 授業単元:情報処理
# [2] 問題文(含コード&リンク):
# (1)
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9670.txt
# (2)
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9671.txt

351 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:40:36 ]
>>350 (2)
% Prolog

:- op(450,xfx,分の).

分数の積(A 分の B,C 分の D,X 分の Y) :-
  X is A * C,
  Y is B * D.

352 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:03:29 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/559
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):url.txtに書き込まれている"ttp://〜をhttp://〜に書き換えresult.txtに出力せよ

353 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:13:37 ]
>>352
# python2.x
fin = file('url.txt')
fout = file('result.txt','w')
for line in fin.readlines():
fout.write(line.replace('ttp://','http://'))
fout.close()
fin.close()


354 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 06:17:58 ]
>>352
% Prolog

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars).

t352([],[]) :- !.
t352(['h','t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
  t352(R1,R2),!.
t352(['t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
  t352(R1,R2),!.
t352([A|R1],[A|R2]) :-
  t352(R1,R2).

355 名前:354 mailto:sage [2009/07/04(土) 06:20:33 ]
>>352
% Prolog
>>352
また間違い。訂正,Chars -> Chars2 のところがある。

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars2).


356 名前:354 mailto:sage [2009/07/04(土) 06:55:43 ]
>>352
% Prolog ' は要らなかった。

t352 :-
  get_chars('url.txt',Chars),
  t352(Chars,Chars2),
  put_chars('result.txt',Chars2).

t352([],[]) :- !.
t352([h,t,t,p,:,/,/|R1],[h,t,t,p,:,/,/|R2]) :-
  t352(R1,R2),!.
t352([t,t,p,:,/,/|R1],[h,t,t,p,:,/,/|R2]) :-
  t352(R1,R2),!.
t352([A|R1],[A|R2]) :-
  t352(R1,R2).

357 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:30:39 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/586
# [1] 授業単元:C+
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9676.txt

358 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:33:18 ]
>>357
% Prolog
% 1.
% sum1toN(n)と呼び出すと(nは正の整数)、戻り値として 1 から n までの
% 和が返ってくる関数sum1toNを作成せよ。(関数の部分のみ書くこと。)

sum1toN(1,1) :- !.
sum1toN(N,X) :- M is N - 1,sum1toN(M,Y),X is N + Y.




359 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:35:53 ]
>>357
% Prolog
% 2.
% 円の半径をキーボードから入力し、円周の長さと面積を求めて表示する プログラムを次のように作成した。
% 円周の長さと面積を求める部分は関数 circleを使用している。この関数を書け。
% 円周率は#defineで定義している PAI を使ってよい。

% #include <stdio.h>
% #define PAI 3.14159
% 関数circleのプロトタイプ宣言 (省略)
% int main(void ){
% double r, enshu, menseki;
% printf("半径を入力 >>");
% scanf("%lf", &r);
% circle(r, &enshu, &menseki);
% printf("円周 = %f 面積 = %f\n"
% , enshu, menseki);
% return 0;
% }
%
% │ │
% │    関数 circle │
% │ │

pi(3.14159).

circle(_半径,_円周,_面積) :-
  pi(PI),
  _円周 is 2 * _半径 * PI,
  _面積 is _半径 ^ 2 * PI.

360 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:49:25 ]
>>357
% Prolog
% 3.
% 大きさ8のint型配列aに初期値として
% 1 2 3 4 5 6 7 8
% を設定する。これを
% 0 0 1 2 3 4 5 6
% のように要素を右に2つシフトして a[0],a[1]には 0 を入れ、
% その後配列の各要素を
% a[0]=0
% a[1]=0
% <略>
% a[7]=6
%
% のように表示するプログラムを書け。
t357_3 :-
  右にシフト(2,[1,2,3,4,5,6,7,8],_シフトされたならび),
  表示(1,_シフトされたならび).

表示(_,[]) :- !.
表示(N,[A|R]) :-
  M is N - 1,
  write('a[%t]=%t',[M,C]),
  N2 is N + 1,
  表示(N2,R).

右にシフト(0,X,X) :- !.
右にシフト(N,L,X) :-
  append(Y,[_],[0|L]),
  M is N - 1,
  右にシフト(M,Y,X).

361 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 08:53:20 ]
>>357
% Prolog
% 4.
% 文字列(最大80文字)をキーボードから読み込み、
% その文字列中で文字コードが最大の文字とその文字コードを
%
%   文字コード最大はY <89>
%
% (Yが最大の文字、89がその文字コードを意味する。)
% のように表示するプログラムを次のように作成した。空欄を埋めてプログラム
% を完成せよ。

最大の文字コード(_文字列,_最大の文字コード) :-
  atom_codes(_文字列,[C|R]),
  最大の文字コード(R,C,_最大の文字コード).

最大の文字コード([],X,X) :- !.
最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-
  C > _現在の最大コード,
  最大の文字コード(R,C,_最大の文字コード),!.
最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-
  C =< _現在の最大コード,
  最大の文字コード(R,_現在の最大コード,_最大の文字コード),!.

362 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:12:40 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/606
# [1] 授業単元:C
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9680.txt
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9678.txt

363 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:14:39 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/607
# 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で
考えてください.
#   (住所録,商品の在庫,図書,ワールドカップの勝敗....)
#  以下の要件を示します.
#
# 1. ファイルからデータを読み込む機能をつけること.
# 2. データは4つ以上の項目を保持させること.
#  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上)
# 3. 並び替えの機能をつけること.また並び替える項目が指定できること.
# 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ
せることができること.
#  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま
る 等)
# 5. データは半角英数字(英語やローマ字)で扱ってよい
# 6. データの追加ができること.
# 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に
合致したデータを削除できること.
# 8. 追加・削除した結果をファイルに保存できること.

364 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 04:45:28 ]
>>362
% Prolog
nojiriko.asia/prolog/t362.html

365 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:48:47 ]
場違いか心配ですが・・・。
質問です

?- search(a, f, Path).
Path = [f, d, e,c, b, a] ;
Path = [f, d, b, a]

arc(b,c).
arc(b,d).
arc(c,e).
arc(e,d).
arc(d,f).
arc(e,b).

あるノードから、あるノードまでが到達可能かどうかを調べ経路も表示するプログラムを
作りたいのですがどうすれば良いのでしょうか?memberを使えば良いと言われたのですが
よくわかりません・・・。

366 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 06:37:37 ]
>>365
一番基本的なものは以下のようなものでしょう。

到達可能(A,B,Log) :-
到達可能(A,B,[A],Log).

到達可能(A,B,L1,Log) :-
  arc(A,B),
  \+ member(B,L1),
  append(L1,[B],Log).
到達可能(A,B,L1,L) :-
  arc(A,C),
  \+ member(C,L1),
  append(L1,[C],L2),
  到達可能(C,B,L2,L).

367 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 06:47:50 ]
>>365
一般に以下の方を使うのではないかと思います。

到達可能(A,B,Log) :-
  到達可能(A,B,[A],_逆順Log),
  reverse(_逆順Log,Log).

到達可能(A,B,L1,[B|L1]) :-
  arc(A,B),
  \+ member(B,L1).
到達可能(A,B,L1,L) :-
  arc(A,C),
  \+ member(C,L1),
  到達可能(C,B,[C|L1],L).

368 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 09:15:54 ]
>>363
% Prolog
nojiriko.asia/prolog/t363.html



369 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 14:49:42 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/673
# [1] 授業単元: 構造体
# [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bi
n/joyful/img/9688.txt

370 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:26:42 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/660
# [1] 授業単元:情報
# [2] 問題文(含コード&リンク):
# パソコン甲子園 2008 予選問題 問7 ふしぎな虫
# www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf

371 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:28:07 ]
>>370
% Prolog
nojiriko.asia/prolog/t370.html

372 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:51:59 ]
>>369
# 次の各プログラムを作成
#
# 1.線分の長さを求める
#  -両端点の座標値(浮動小数点)を入力
#  -線分の長さを計算、表示
#
# 2.三角形の面積を求める
#  -3頂点の座標軸(浮動小数点)を入力
#  -面積を計算、表示
#
# 2では1つの点を原点に移動させてあとはS=1/2|ad-bc|でお願いします
#
# 補足でこれがありました
# ◆ 平方根を求める関数
#
# double型の関数 sqrt() を使います.仮引数もdouble型です.
#
# 例えばdouble型の変数 len の平方根を求める場合には,次のように呼び出
# します.
#
# sqrt(len)# 関数sqrt()を使用するソースプログラムをコンパイルするときには,
#
# gcc -lm ***.c
#
# のように,コンパイルオプション「-lm」が必要です.
#
#
#
# ・main関数の座標値読み込み部分を省略したものは以下の通りです

373 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:54:54 ]
>>369 (1)
% Prolog
線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :-
  _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2).

374 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 18:13:01 ]
>>369 (2)
% Prolog

三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :-
  一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33),
  _三角形の面積 is abs(X22 * Y33 - Y22 * X33) / 2.

一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :-
  X22 is X2 - X1,
  Y22 is Y2 - Y1,
  X33 is X3 - X1,
  Y33 is Y3 - X1.


375 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 18:21:05 ]
>>374 訂正
一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :-
  X22 is X2 - X1,
  Y22 is Y2 - Y1,
  X33 is X3 - X1,
  Y33 is Y3 - Y1.

376 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 00:47:46 ]
>>366-367さん
回答ありがとうございます。しかし
arc(a,b).
arc(b,c).
arc(b,d).
arc(c,e).
arc(e,d).
arc(d,f).
arc(d,e).

member(X,[X|_]).
member(X,[_|T]) :-
member(X,T).



seach(A,B,Log) :-
search(A,B,[A],_逆順Log),
reverse(_逆順Log,Log).

seach(A,B,L1,[B|L1]) :-
arc(A,B),
\+ member(B,L1).
search(A,B,L1,L) :-
arc(A,C),
\+ member(C,L1),
search(C,B,[C|L1],L).
と作って| ?- search(a, f, Path).
と聞くとnoと出てしまいます・・・。
あと_逆順Logは普通にSとかに置き換えてもいいのですか?

377 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 03:30:34 ]
>>376
seach と search とありますが,seach/4の定義はsearch/4だと思いますが、
単なる誤植でしょうか。

?- listing(search).
で正しく定義ができているか確認してください。

もしできていないなら、
\+member(B,L1) と \+member(C,L1) を not(member(B,L1)) not(member(C,L1))
に置き換えてみてください。
それから_逆順Log は S でも問題ありません。なぜ最後にreverseするのか
わからない人が多いと思ったのでこの変数名を使いました。

378 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 06:57:09 ]
>>350 (1)
% Prolog
:- op(300,fx,i).

複素数の割り算(A + iB,C + iD,X + iY) :-
X is (A * C + B * D) / ( C ^ 2 + D ^ 2),
Y is (B * C - A * D) / ( C ^ 2 + D ^ 2).




379 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 07:59:46 ]
>>350 (1) 書き直し
% Prolog
:- op(300,fx,i).

複素数の割り算(A+iB,C+iD,X+iY) :-
  X is (A * C + B * D) / ( C ^ 2 + D ^ 2),
  Y is (B * C - A * D) / ( C ^ 2 + D ^ 2).

380 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:08:47 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/725
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): 整数 nissu をキー入力して、
# 1 月1 日から数えて nissu 日目が何月何日かを表示
# したい。

381 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:14:42 ]
>>380
% Prolog
t380 :- get_line(Line),atom_to_term(Line,Nissu,_),
  'N日後は'(0,Nissu,2009/1/1,_年/_月/_日),
  write_formatted('%t月%t日\n',[_月,_日]).

'N日後は'(N,N,_年/_月/_日,_年/_月/_日).
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
M2 is M + 1,
'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).
前日・今日(_前日の年 / 12 / 31,_年 / 1 / 1) :- 一つ違い(_前日の年,_年),!.
前日・今日(_年 / 2 / 29,_年 / 3 / 1) :- うるう年(_年),!.
前日・今日(_年 / 2 / 28,_年 / 3 / 1) :- \+(うるう年(_年)),!.
前日・今日(_年 / _前月 / 30,_年 / _月 / 1) :- 一つ違い(_前月,_月),member(_前月,[4,6,9,11]),!.
前日・今日(_年 / _前月 / 31,_年 / _月 / 1) :- 一つ違い(_前月,_月),member(_前月,[1,3,5,7,8,10,12]),!.
前日・今日(_年 / _月 / _前日,_年 / _月 / _日) :- 一つ違い(_前日,_日),!.

うるう年(_年) :- 0 is _年 mod 400,! .
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- \+(0 is _年 mod 4),fail.

一つ違い(M,N) :- integer(M),!,N is M + 1 .
一つ違い(M,N) :- integer(N),!,M is N - 1 .

382 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:18:05 ]
>>381 ちょっと読みづらかったか。

'N日後は'(N,N,_年/_月/_日,_年/_月/_日).
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
  前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
  M2 is M + 1,
  'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).

383 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:21:40 ]
>>381 もう一度訂正。バックトラックしてくると具合の悪いことになる。

'N日後は'(N,N,_年/_月/_日,_年/_月/_日) :- !.
'N日後は'(M,N,_年_1/_月_1/_日_1,_年/_月/_日) :-
  前日・今日(_年_1/_月_1/_日_1,_年_2/_月_2/_日_2),
  M2 is M + 1,
  'N日後は'(M2,N,_年_2/_月_2/_日_2,_年/_月/_日).


384 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 15:03:39 ]
# pc12.2ch.net/test/read.cgi/tech/1232627790/904
# ・課題の内容
# TCP/IPプロトコルを用い、通信するプログラムを作成せよ。
# ・条件
# キーボードから文字列を1行入力し、それを送信するプログラム(tcp_snd1)と、
# それを受信するプログラム(tpc_rec1)の2つを作成せよ。
# tcp_snd1では、送信先の計算機の名前をプログラムの引数で指定できるようにせよ。
# tcp_rec1では、コネクションの要求あったら、コネクションを張り、
# 要求した計算機のIPアドレスを表示せよ。
# メッセージを受信するたびに、通信回数を[]で括って表示し、
# その後にメッセージを表示せよ。
# 空行が入力されたら、tcp_snd1もtcp_rec1の双方が終了するようにせよ。
# ポートとして、9000を利用せよ。

385 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 16:08:17 ]
>>384
% Prolog
nojiriko.asia/prolog/t384.html

386 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:29:44 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/732
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字
を大文字にするプログラムを作成せよ。
#
# 実行例 文字列入力 :AbCdEfG123
#     変換文字列 :aBcDeFg123


387 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:49:22 ]
>>386
% Prolog

t386 :-
  get_line(Line),
  atom_chars(Line,Chars),
  大文字小文字変換(Chars,Chars2),
  atom_chars(Line2,Chars2),
  write_formatted('%t\n',[Line2]).

大文字小文字変換([],[]) :- !.
大文字小文字変換([A|R1],[B|R2]) :-
  A @>= 'A',
  A @=< 'Z',!,
  to_lower(A,B),
  大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[B|R2]) :-
  A @>= a,
  A @=< z,!,
  to_upper(A,B),
  大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[A|R2]) :-
  大文字小文字変換(R1,R2).



388 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:08:35 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/733
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、これを数字(0→9)、
# 大文字(A→Z)、
# 小文字(a→z)の順に並べ替えるプログラムを作成せよ。
# ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を
# 使うと簡単だろう。
# 文字列長はstrlen命令を使うとよい。みたいです。



389 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:11:42 ]
>>388
% Prolog

t388 :-
  get_line(Line),
  atom_chars(Line,Chars),
  バブルソート(Chars,_整列した文字ならび),
  atom_chars(Line2,_整列した文字ならび),
  write_formatted('%t\n',[Line2]).

バブルソート(L,X) :-
  整順が崩れるまで(L,L2),
  バブルソート(L2,X),!.
バブルソート(L,L).

整順が崩れるまで([A],[A]) :- !,fail.
整順が崩れるまで([A,B|R1],[A|R2]) :-
  A @=< B,
  整順が崩れるまで([B|R1],R2).
整順が崩れるまで([A,B|R1],[B,A|R1]) :-
  A @> B.

390 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:28:46 ]
>>377さん
誤植でした;;
無事出来ました
ちなみに述語がmemberだけで出来ると
聞いたのですが出来るのでしょうか?
出来るとしたらどんな感じに
なるのでしょうか?

391 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 20:35:12 ]
>>390
member/2だけではうまくいかなかった。

member(A,B,L,[A,B]) :- member((A,B),L).
member(A,B,L,[A|R1]) :- member((A,C),L),member(C,B,L,R1).

?- member(a,f,[(a,b),(b,c),(b,d),(c,e),(e,d),(d,f),(d,e)],S).

ならうまくいくかな。

392 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 23:30:00 ]
>>391さん
ヒントとしては
?- \+(member(a, [b,c])).
yes
となり
rev2(L, R) :-
rev2(L, [], R).
rev2([], R, R).
rev2([H|T], L, R) :-
rev2(T, [H|L], R).
みたいに
rev1([], []).
rev1([H|T], R) :-
rev1(T, R1),
append(R1, [H], R).
appendを使わないようにしようって事です
どうなんでしょうか?

393 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:01:54 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/762
# [1] 授業単元: 情報処理\u2160
# [2] 問題文: 乗算合同法で整数乱数を生成.。
# 区間(0.1)の一様にして、1以上、ある特定の整数の乱数を生成する。

394 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:06:06 ]
>>393
% Prolog

乗算合同法による乱数発生(_初期値,Y,X) :-
  乗算合同法(16087,_初期値,65535,Y,X).

乗算合同法(A,N,_法,N,X) :-
  X is N / _法.
乗算合同法(A,N,_法,Y,X) :-
  乗算合同法演算(A,N,_法,M),
  乗算合同法(A,M,_法,Y,X).

乗算合同法演算(A,N,_法,M) :-
  M is (A * N) mod _法.

395 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 04:11:39 ]
>>392
>>367 がそれに当たるつもりなのですが。
ただLogが逆順に生成されますね。

396 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 06:38:43 ]
>>395さん
成る程、丁寧にありがとうございました

397 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 07:57:55 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/764
# [1] 授業単元:プログラミング入門
# [2] 問題文(含コード&リンク):
# 問3:1週間の売り上げ一覧を表示するプログラムを作成せよ。
#    実行例  野菜の1週間の売り上げた合計数量と合計金額
#                             合計  合計
#         種類 単価 月 火 水 木 金 土 日 数量  金額
#         レタス 150 50 55 60 65 70 75 80 455  68250
#         トマト  50 20 25 30 35 40 45 50 245  12250
#         もやし  20 10 15 20 25 30 35 40 175  3500
#         ナスビ  40 5  10 15 20 25 30 35 140  5600

398 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 11:24:22 ]
>>397
% Prolog
nojiriko.asia/prolog/t397.html



399 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 12:51:07 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/757
# 【質問テンプレ】
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、
# 同じように表示しなさい。
#  【test.dat】
#   ** ** **
#   ** ** **
#   ** ** **

400 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:00:02 ]
>>399
% Prolog
t399 :-
  二次元構造の読み込み('test.dat',_二次元構造),
  member(A,_二次元構造),
  concat_atom(L,' ',S),
  write_formatted('%t\n',[S]),
  fail;
  true.

二次元構造の読み込み(File,_二次元構造) :-
  open(File,Input),
  findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail;
                   split(X,[' '],L))),_二次元構造),
  close(Input),!.

401 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:04:19 ]
>>399 訂正。
% Prolog
t399 :-
  二次元構造の読み込み('test.dat',_二次元構造),
  member(L,_二次元構造),
  concat_atom(L,' ',S),
  write_formatted('%t\n',[S]),
  fail;
  true.

二次元構造の読み込み(File,_二次元構造) :-
  open(File,Input),
  findall(L,(repeat,get_line(Input,X),(X=end_of_file,!,fail;
                   split(X,[' '],L))),_二次元構造),
  close(Input),!.

402 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 13:46:35 ]
>>399 もうひとつ違っていた。
  open(File,read,Input), ですね。

403 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:00:09 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/786
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9706.txt
# [3] 環境
# 問題1
# テキストファイルからバイナリファイルの作成
# テキストファイルの内容は {14,17,18,21,23,25,31}と
# {10, 12, 15, 16, 19, 27, 28}の二つ。
# これが書かれているテキストファイルをバイナリファイルにする。
#
# 問題2
# 1で作ったバイナリファイルをあわせて
# {10, 12, 14, 15, 16 17, 18, 19 21, 23, 25 27, 28, 31} の
# バイナリファイルの作成

404 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:16:21 ]
>>403 問題1
% Prolog

t403_1(TextFile1,TextFile2,BinaryFile1,BinaryFile2) :-
t403_1_1(TextFile1,BinaryFile1),
t403_1_1(TextFile2,BinaryFile2).

t403_1_1(TextFile1,BinaryFile1) :-
open(TextFile1,read,Input),
open(BinaryFile1,write,Output,[type(binary)]),
get_line(Input,Line),
split(Line,['{',',','}'],L),
t403_1_2(Output,L),
close(Input),
close(Output).

t403_1_2(Output,L) :-
member(N,L),
put_byte(Output,N),
fail.
t403_1_2(_,_).


405 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 19:18:55 ]
>>403 問題1 書き直し
% Prolog

t403_1(TextFile1,TextFile2,BinaryFile1,BinaryFile2) :-
  t403_1_1(TextFile1,BinaryFile1),
  t403_1_1(TextFile2,BinaryFile2).

t403_1_1(TextFile1,BinaryFile1) :-
  open(TextFile1,read,Input),
  open(BinaryFile1,write,Output,[type(binary)]),
  get_line(Input,Line),
  split(Line,['{',',','}'],L),
  t403_1_2(Output,L),
  close(Input),
  close(Output).

t403_1_2(Output,L) :-
  member(N,L),
  put_byte(Output,N),
  fail.
t403_1_2(_,_).

406 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 20:42:25 ]
>>403
IO ばかりで正直あまり Haskell では書く気がしないな…

import System.IO
import Control.Exception (bracket)
import qualified Data.ByteString as B

t403_1 :: String -> IO ()
t403_1 fname = do
b <- bracket (openFile fname ReadMode) hClose parse
bracket (openFile fname WriteMode) hClose (flip B.hPut b)
where
parse :: Handle -> IO B.ByteString
parse h = hGetLine h >>= \s -> return $ B.pack $ read ("["++s++"]")

t403_2 :: String -> String -> String -> IO ()
t403_2 fname1 fname2 fname3 = do
b1 <- bracket (openFile fname1 ReadMode) hClose B.hGetContents
b2 <- bracket (openFile fname2 ReadMode) hClose B.hGetContents
bracket (openFile fname3 WriteMode) hClose (flip B.hPut (B.sort (B.concat [b1,b2])))

main = t403_1 "input1" >> t403_1 "input2" >> t403_2 "input1" "input2" "output"

407 名前:デフォルトの名無しさん [2009/07/09(木) 04:03:35 ]
pc12.2ch.net/test/read.cgi/tech/1232627790/921
# 正の数を入力し、入力した整数の1と
# その数を除く約数の和を求めて表示するプログラムを作成しなさい。
# 15の約数は、1,3,5,15なので、1と15を除く約数の和は8となる。
#
# お願いします。

408 名前:デフォルトの名無しさん [2009/07/09(木) 04:07:49 ]
>>407
% Prolog

t407(N,X) :- N1 is N-1,t407(N1,N,X).

t407(1,_,0) :- !.
t407(N1,N,X) :- 0 is N mod N1,!,N2 is N1-1,t407(N2,N,Y),X is N+Y.
t407(N1,N,X) :- N2 is N1-1,t407(N2,N,X).



409 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 07:15:43 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/797
# [1] C言語を使って計算を簡略化する:
# [2] XY平面上の3点P1(x1,y1)P2(x2,y2)P3(x3,y3)の座標を順に入力した時、
# 3点が同一直線上にあるかどうかを調べて
#   結果を表示するプログラムを作成せよ。

410 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 07:28:11 ]
>>409
% Prolog

'3点が同一直線上にある'((X1,Y1),(X2,Y2),(X3,Y3)) :-
  U is (X3-X1) * (Y2-Y1),
  U is (X2-X1) * (Y3-Y1).

411 名前:デフォルトの名無しさん [2009/07/09(木) 09:11:18 ]
>>407
(defun s (n)
(do ((x 2 (1+ x)) (sum 0))
((>= x n) sum)
(if (= 0 (mod n x))
(setf sum (+ sum x)))))


412 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:52:46 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/822
# 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて
# 処理するプログラムを作る。
#
# (1)科目別の最高点、最低点を表示する。
# (2)各学生の3教科の平均点を表示する。
# (3)各教科の平均点を表示する。
#
# ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。

413 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:32:25 ]
>>412
-- Haskell
import Data.List (transpose)

main = do
conn <- getContents
let grades = map (map read . words) $ lines conn :: [[Int]]
-- (1)
print $ map maximum $ transpose grades
print $ map minimum $ transpose grades
-- (2)
let sums = map sum $ grades
print sums
-- (3)
print $ map ((/ 3) . fromIntegral) sums

414 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:36:57 ]
>>412
% Prolog
% テーマ findallを使った集約処理

t412(_各科目の最高点,_各科目の最低点,_各学生の3教科の平均点,_各科目の平均点) :-
  findall([A,B,C],(repeat,read(A),(A=end_of_file,!,fail;read(B),read(C))),Y),
  findall(AVG,(member(L,Y),findavg(A,member(A,L),AVG)),_各学生の3教科の平均点),
  行列の転置(Y,Y2),
  findall((Max,Min),(member(L1,Y2),max(L1,Max),min(L1,Min)),_各科目の最高点と最低点),
  findall(AVG3,(member(L3,Y2),findavg(A,member(A,L3),AVG3)),_各科目の平均点).

415 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:42:53 ]
>>414 訂正
% Prolog
% テーマ findallを使った集約処理

t412(_各科目の最高点と最低点,_各学生の3教科の平均点,_各科目の平均点) :-
  findall([A,B,C],(repeat,read(A),(A=end_of_file,!,fail;read(B),read(C))),Y),
  findall(AVG,(member(L,Y),findavg(A,member(A,L),AVG)),_各学生の3教科の平均点),
  行列の転置(Y,Y2),
  findall((Max,Min),(member(L1,Y2),max(L1,Max),min(L1,Min)),_各科目の最高点と最低点),
  findall(AVG3,(member(L3,Y2),findavg(A,member(A,L3),AVG3)),_各科目の平均点).


416 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 21:48:12 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/826
# [1] 授業単元: 宿題
# [2] 問題文(含コード&リンク): 整数を入力し、奇数か偶数かを判断するプログラム

417 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 21:58:45 ]
>>416
% Prolog

t416 :-
  read(N),
  奇数・偶数判定(N,X),
  write_formatted('入力されたのは%tです\n',[X]).

奇数・偶数判定(N,奇数) :- 1 is N mod 2.
奇数・偶数判定(N,偶数) :- 0 is N mod 2.



418 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 22:03:10 ]
>>417
% 仕様の中に「整数」を入力し、とありますからinteger/1で検査する必要は
% ありそうですね。

t416 :-
  read(N),
  integer(N),
  奇数・偶数判定(N,X),
  write_formatted('入力されたのは%tです\n',[X]),!.
t416 :- write('正しい整数が得られませんでした\n').

奇数・偶数判定(N,奇数) :- 1 is N mod 2.
奇数・偶数判定(N,偶数) :- 0 is N mod 2.




419 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:09:03 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題 I
# コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ.
# コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること.
# 課題 II
# コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ.
# コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること.

# また,コマンド引数に整数以外が与えられた場合にも,標準エラー出力にエラー分を表示させること.

420 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:33:50 ]
>>419
% Prolog

t419_1 :- user_parameters(L),split(L,[','],L1),length(L1,2),write_formatted('%t %t\n',L1),!.
t419_1 :- tell(user_error),write(引数エラー),told.
t419_2 :-
  user_parameters(L),
  split(L,[','],L1),
  length(L1,Len),
  引数長さ検査(Len),
  引数のすべてが整数(L1),
  sum(L1,Sum),
  write_formatted('引数に与えられた整数の合計は%tです\n',[Sum]).

引数の長さ検査(Len) :- Len > 0,!.
引数の長さ検査(Len) :- Len < 1,tell(user_error),write('引数がありません\n'),told,!,fail.

引数のすべてが整数([]) :- !.
引数のすべてが整数([N|R]) :- integer(N),引数のすべてが整数(R).
引数のすべてが整数([A|R]) :- tell(user_error),write('引数に整数でない%tがあります\n',[A]),told,!,fail.

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

421 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:42:18 ]
pc12.2ch.net/test/read.cgi/tech/1245853701/878
# [1] 授業単元:プログラミング言語
# [2] 問題文(含コード&リンク):
# char型配列xに格納された文字列を一文字ごとに空白を開けて逆順に出力する関数
# reverse_array(char[])を以下のように出力されるよう作成せよ。
#
# 処理前:Tokyo
# 関数reverse_array()を呼び出しました
# 処理後:"o y k o T"

422 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 03:49:35 ]
>>421
% Prolog

t421(_文字ならび,_一文字ごとに空白を開けた逆順ならび) :-
  t421(_文字ならび,[],_一文字ごとに空白を開けた逆順ならび).

t421([A],X,[A|X]) :- !.
t421([A|R1],L,X) :- t421(R1,[A,' '|R1],X).

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