いろんな言語で宿題スレ

このエントリーをはてなブックマークに追加
1a36 ◆K0BqlCB3.k
他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。
なお、宿題スレが存在する言語についてはその言語のスレで解答してください。

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

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

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

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

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

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

C#,C#の宿題片付けます。
http://pc12.2ch.net/test/read.cgi/tech/1197620454/
2デフォルトの名無しさん:2009/05/21(木) 23:47:48
>>1=カス
3デフォルトの名無しさん:2009/05/22(金) 03:44:26
% 宿題: http://pc12.2ch.net/test/read.cgi/tech/1153585095/38
% 言語: Prolog (IF/Prolog)
% 述語: modulus38/0, modulus38/3, get_integers/1

modulus38 :-
 write('数字列を入力してください:'),
 get_integers(L),
 modulus38(L,[],X),
 write_formatted('残った数字は: %t です\n',[X]).

modulus38([X],[],X).
modulus38([_],Y,X) :-
 modulus38(Y,[],X).
modulus38([A,B|R1],Y,X) :-
 C is (A+B) mod 10,
 modulus38([B|R1],[C|Y],X).

get_integers(L) :-
 findall(U,(repeat,get_code(C),(C==10,!,fail;U is C-48)),L).
4Prolog工作員:2009/05/22(金) 06:04:24
>>3
さすがProlog、元スレの解答が豚を食ったPythonに見えてくるw
しかしこの解答、宣言的ではあるがやってはいけないことをしている。
短いコードにしようとした結果、素人だと誰も理解できない。
Prologのもっとも豊かな特徴は、この言語を知らない人が読んでも、
書いてあることが何となく分かるということ。そういう意味でこのコードは
致命的だ。modulus38/3のところは、modulus38/2とmodulus38_1/2として、
modulus38([X],X).
modulus38(L,X) :- modulus38_1(L,L2),modulus38(L2,X).
modulus38_1([_],[]).
modulus38_1([A,B|R1],[C|R2]) :- C is (A+B) mod 10,modulus38_1([B|R1],R2).

もちろん、トップレベルの中のmodulus38/3は
modulus38 :- ... , modulus38(L,X), ....

となる。
53:2009/05/22(金) 10:53:10
仕様に忠実でなかったので訂正します。
「10個の数字を入力する」が反映されていませんでした。
findallの中にfor/3を書くと10個に達しないうちに改行がきた場合など
に不都合が生じます。それでfindall/3の使用を断念。
get_integers(L) :- get_code(C),get_integers(10,C,L),!.
get_integers(1,C,[C1]) :- toint(C,C1).
get_integers(N,C,[C1|R]) :- toint(C,C1),get_code(C2),M is N-1,get_integers(M,C2,
R).
get_integers(N,C,L) :- get_code(C2),get_integers(N,C2,L).
toint(C,X) :- C>=48,C=<57,X is C-48.

やれやれ、面倒なこととなりました。
6Prolog工作員:2009/05/22(金) 15:29:31
>>5
それもおかしい。
get_integers(L) :- findall(N,(for(1,_,10),get_integer(N)),L).
get_integer(N) :- get_code(C),C >= 48, C =< 57,N is C-48.
get_integer(N) :- get_integer(N).

でよいはず。
7Prolog工作員:2009/05/22(金) 15:35:55
ああ、だめだ! 訂正。
get_integer(N) :- get_code(C),C >= 48,C =< 57,N is C-48,!.
get_integer(N) :- get_integer(N).
でした。
大変失礼しました。
8デフォルトの名無しさん:2009/05/22(金) 15:58:39
「10個の数字を入力する」のもっとも自然な表現は、
get_integersの引数を増やして、そこに整数の個数を取ります

get_integers(N,L) :- findall(A,(for(1,_,N),get_integer(A)),L).
get_integer(A) :- get_code(C),C >= 48,C =< 57,A is C-48,!.
get_integer(A) :- get_integer(A).
9デフォルトの名無しさん:2009/05/22(金) 18:29:19
program EX38 ! やー ふぉー ふぉーとらんらんらん♪
 implicit none
 integer, parameter :: Nmax = 10
 integer :: A(1:Nmax), n
 
 print *, "数字列を入力してください。"; read "(99I1)", A
 do n = Nmax, 2, -1
  print "(A,99(I1,1X))", repeat(" ", Nmax-n), A(1:n)
  A(1:n-1) = mod(A(1:n-1) + A(2:n), 10)
 end do
 print "(A,I1,A)", "残った数字は", A(1), "です。"
end program EX38
10a36 ◆K0BqlCB3.k :2009/05/23(土) 03:50:22
http://pc12.2ch.net/test/read.cgi/tech/1153585095/38

【 課題 】キーボードから10個の数字を入力する。
      隣同士の足し算をし、以下の例のように1の位の数字を次の行に出力し、
      最後に残った数字を出力する。

      (例)
      数字を入力してください。
      2359318473

      2 3 5 9 3 1 8 4 7 3
       5 8 4 2 4 9 2 1 0
       3 2 6 6 3 1 3 1 (以下略

      最後に残った数字は 2 です。
11a36 ◆K0BqlCB3.k :2009/05/23(土) 03:51:35
module Main(main) where

import Data.Char
import Control.Monad
import Data.List

main = do { str <- getLine
; let xss = fun38 . map digitToInt $ str
; display xss
; putStr "last = "
; putChar . intToDigit . head . last $ xss
}

fun38 [] = []
fun38 xs = xs : fun38 (zipWith (\a b -> (a + b) `mod` 10) xs (tail xs))

display = zipWithM ((putStrLn .) . (. (intersperse ' ' . map intToDigit)) . (++) . flip replicate ' ') [0..]
12a36 ◆K0BqlCB3.k :2009/05/23(土) 03:55:37
言語名書き忘れた。
Haskellね。
13デフォルトの名無しさん:2009/05/26(火) 18:15:27
>>11
ほ、ほー。さすが Haskell すっきりと短いね。
どうも次の言語が続かないようだから、今度は
http://pc12.2ch.net/test/read.cgi/tech/1153585095/789
でいこう。上のお題に一部集計を付加するだけ。
14デフォルトの名無しさん:2009/05/27(水) 00:02:33
>>10>>13の違いが分からない。

python 2.6 で

>10 (のつもり)
import sys
print u'数字を入力してください。'
a = map(int, list(sys.stdin.readline().rstrip()))
indent = 0
while(True):
    print ' ' * indent + ' '.join(map(str,a))
    if len(a) == 1:
        break
    b = []
    for i in range(0, len(a)-1):
        b.append(int(a[i] + a[i+1]) % 10)
    a = b
    indent += 1
print u'最後に残った数字は %d です。' % a[0]
15デフォルトの名無しさん:2009/05/27(水) 00:23:09
>>14
ごめん。
http://pc12.2ch.net/test/read.cgi/tech/1153585095/790
の方だった。どう化けるかだけのことだが。
16デフォルトの名無しさん:2009/05/27(水) 06:12:35
Linuxのシェルプログラミング

XXXディレクトリに存在するファイル名をすべて小文字のファイル名に変更
ただし、変更後のファイル名がすでに存在する場合は「error!」と画面に出力し、
ファイル名を変更しないようにする

というプログラミングを作ってください
for文やtr,mvを使うことはわかるんですが・・・
どうかよろしくお願いします。
17デフォルトの名無しさん:2009/05/27(水) 06:15:21
すいません、急を要するのでageさせていただきます。
18デフォルトの名無しさん:2009/05/27(水) 09:50:32
>>17
シェル名を書かないのは宗教上の理由からですか?

ていうかこのスレの趣旨に合わないんでUNIX板のエスパーくだ質スレにでもどうぞ
19デフォルトの名無しさん:2009/05/28(木) 01:28:49
;;;scheme勉強中。>10 を書いてみた。入力文字列の長さはチェックしてないです。
;;;gaucheとDrScheme で動作確認。(read)で得た数値を、number のリストにするのがなんかめんどくさかった。
;;;もっと簡単な方法あるのかな?
(define (print-result lis)
    (define (get-next-list lis)
        (if (= 1 (length lis))
            '()
            (cons (modulo (+ (car lis) (cadr lis)) 10)
                (get-next-list (cdr lis)))))
    (define (list->line lis)
        (if (= 1 (length lis))
        (number->string (car lis))
        (string-append
            (number->string (car lis))
            " "
            (list->line (cdr lis)))))
    (let loop ((lis lis) (indent 0))
        (display (make-string indent))
        (display (list->line lis))
        (display "\n")
        (if (= 1 (length lis))
            (car lis)
            (loop (get-next-list lis) (+ indent 1)))))
(display "数字を入力してください。\n")
(define src-list
    (map string->number
        (map string
            (string->list
                (number->string (read))))))
(display (format "最後に残った数字は ~A です。"
            (print-result src-list)))
20デフォルトの名無しさん:2009/05/28(木) 03:46:28
(1)
int lg;
int n=65536;
int i;
int main() {
lg=0;
i=n;
loop:
if (i>1) {
lg=lg+1;
i=i/2;
goto loop;
}
return 0
}

(2)
int i;
int sum=10;
int main() {
for (i=0;i<10;i++)
sum=sum+i;
return 0;
}

上の2つのプログラムをアセンブリ言語に翻訳せよという課題があるのですがわかる方教えてもらえませんか?
コンパイラによって異なると言われたのですが翻訳例として↓
2120:2009/05/28(木) 03:47:39
1: int i;
2: int j;
3:
4: int main()
5: {
6: i=1;
7: j=0;
8:
9: loop_begin:
10: if (i>100)
11: goto loop_end;
12: j=j+i;
13: i=i+1;
14: goto loop_begin;
15:
16: loop_end:



2220:2009/05/28(木) 03:48:32
.data
#int i
.globl i
i: .word 0
#int j
.globl j
j: .word 0
#main()
.text
.globl main
main:

# i=1
li $s0, 1
la $t0, i
sw $s0, 0($t0)
# j=0
la $t0, j
sw $zero, 0($t0)

# loop_begin
loop_begin:
# if(i>100) goto loop_end
la $t0, i
lw $s0, 0($t0)
li $s1, 100
sgt $t0, $s0, $s1
bnez $t0, loop_end

のように翻訳できるとのことです
23デフォルトの名無しさん:2009/05/28(木) 05:45:32
>>20
LISPマシンではLispがPrologマシンではPrologがアセンブラだよ。
Lispに変換するのでよいのかな?
24デフォルトの名無しさん:2009/05/28(木) 06:17:26
>>20
#!/bin/sh
gcc -S hoge1.c
gcc -S hoge2.c
25デフォルトの名無しさん:2009/05/28(木) 06:19:15
>>23 INTER LISPか。マニュアルは持ってるけど機械がないw
2620:2009/05/28(木) 23:07:54
>>23
はい。お願いしたいです
2723:2009/05/29(金) 09:06:50
>>26
INTER LISP 只今、勉強中w
28デフォルトの名無しさん:2009/05/29(金) 16:10:18
http://pc12.2ch.net/test/read.cgi/tech/1242655611/23
[1] 授業単元: 社会情報入門
[2] 問題文(含コード&リンク):
次の無限等比級数の和を、各項を順に加算していくことにより求めるプログラムを書け。
1+(1/3)+(1/9)+(1/27)+.....
ただし、0.00001以下となる項を加えた時点で加算を終了することとする。 
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: 2009年5月22日12:50まで
[5] その他の制限:なし
29デフォルトの名無しさん:2009/05/29(金) 16:12:14
% 悪い解答をひとつ
% 言語: IF/Prolog
f(X) :- f(1,1,X).
f(N,S,X) :- N > 100000,X is S / N,!.
f(N,S,X) :- M is N * 3,S2 is S + M,f(M,S2,X).
30デフォルトの名無しさん:2009/05/29(金) 20:00:59
;; scheme
;; 分数が組み込みで使えるって、素敵やん?

(define ans
  (let loop ((x 1)(total 0))
    (let ((total (+ total x)))
      (if (<= x 0.00001)
          total
          (loop (* x 1/3) total)))))
(display ans)
(newline)
(display (exact->inexact ans))
31デフォルトの名無しさん:2009/05/29(金) 20:06:15
;; scheme
;;なんか無駄なことやってた。やり直し。

(define ans
  (let loop ((x 1))
      (if (<= x 0.00001)
        x
        (+ x (loop (* x 1/3))))))
(display ans)
(newline)
(display (exact->inexact ans))
32デフォルトの名無しさん:2009/05/29(金) 22:42:51
scheme と同じ発想で

import Data.Ratio

f :: Rational -> Rational
f x | x < 0.00001 = x
| otherwise = x + f (x/3)

main = print $ fromRational $ f 1
33デフォルトの名無しさん:2009/05/29(金) 23:16:00
>>29
答えが違ってるので0点
34デフォルトの名無しさん:2009/05/30(土) 01:37:00
# python2.6 で >10 と >15 まとめて。
import sys
from itertools import count
def job(handler, lst):
    while True:
        handler.callback(lst)
        if len(lst) == 1: break
        lst = map(lambda x:(x[0]+x[1]) % 10, zip(lst, lst[1:]))
    handler.finish(lst)
class Handler1:
    def __init__(self):
        self.indent = ''
    def callback(self, lst):
        print self.indent + ' '.join(map(str, lst))
        self.indent += ' '
    def finish(self, lst):
        print u'最後に残った数字は %d です。' % lst[0]
class Handler2:
    def __init__(self):
        self.buffer = [0] * 10
    def callback(self, lst):
        for i in lst:
            self.buffer[i] += 1
    def finish(self, lst):
        total = reduce(lambda a,b:a+b, self.buffer)
        print u'%d個' % total
        for i,v in zip(count(), self.buffer):
            print u'%d: %d回 %d%%' % (i, v, v*100.0/total)
print u'数字を入力してください。'
lst = map(int, list(sys.stdin.readline().rstrip()))
job(Handler1(), lst)
job(Handler2(), lst)
35デフォルトの名無しさん:2009/05/30(土) 03:32:13
>>28
% 言語: Prolog
f(S) :- f(1.0,1,S).
f(P,_,P) :- P < 0.00001,!.
f(P,N,S) :- M is N * 3,P2 is 1 / M,f(P2,M,S2),S is S2 + P.
36a36 ◆K0BqlCB3.k :2009/05/30(土) 03:42:13
>>32
Rationalな割り算は%じゃないかな。

俺はこんな感じで。

-- Haskell

import Data.Ratio

main = print $ fromRational $ sum $ takeWhile ((>0.00001) . fromRational) $ iterate (\n -> n * (1%3)) 1
37a36 ◆K0BqlCB3.k :2009/05/30(土) 03:47:42
いろいろ無駄があったから修正

import Data.Ratio

main = print $ fromRational $ sum $ takeWhile (>(1%100000)) $ iterate ((1%3)*) 1
38デフォルトの名無しさん:2009/05/30(土) 04:20:51
>>15
% Prologの苦手とする処理ですね。長くなったので表示部分は省略します。
% 言語: IF/Prolog
modulus38([X],X,CL,CL).
modulus38(L,X,CL1,CL) :-
 modulus38_1(L,L2,CL1,CL2),
 modulus38(L2,X,CL2,CL).
modulus38_1([_],[],CL,CL).
modulus38_1([A,B|R1],[C|R2],CL1,CL) :-
 C is (A+B) mod 10,
 n番目に1を加算(C,CL1,CL2),
 modulus38_1([B|R1],R2,CL2,CL).
n番目に1を加算(N,L,X) :-
 append(L1,[B|R],L),
 M is N-1,
 length(L1,M),
 B2 is B+1,
 append(L1,[B2|R],X).
sum_list([],0).
sum_list([N|R],X) :- sum_list(R,Y),X is Y + N.
39デフォルトの名無しさん:2009/05/30(土) 04:52:49
>>38
集計リストは連想配列的に[0:N0,1:N1,2:N2, ... ,9:N9] で持つこともある。
そうすると、n番目に1を加算/3ではなくて、
nに1を加算(N,L,X) :-
 append(L1,[N:Ns1|R],L),
 Ns2 is Ns1+1,
 append(L1,[N:Ns2|R],X).
となる。
40デフォルトの名無しさん:2009/05/30(土) 06:50:45
>>37
少々癪だが、Haskell短くていいなぁ。
41デフォルトの名無しさん:2009/05/30(土) 06:56:23
# Prolog向きの見つけたw
http://pc12.2ch.net/test/read.cgi/tech/1136788500/1
1 :BASIC:2006/01/09(月) 15:35:00
N人分のデータ(氏名、体重、身長、年齢)がDATA文で入力されているプログラムが
ある。これを用いて次のプログラムをBASICで作成しなさい
身長が160CM以上で170cm未満の人の名前を表示する
42デフォルトの名無しさん:2009/05/30(土) 08:41:13
# Prolog流の表示は普通はインタプリタによる論理変数の解決表示ですから
# 言語: Prolog
データ(山下,65,177,23).
データ(尾崎,64,168,60).
データ(飯島,72,173,29).
データ(吉田,69,166,44).

foo(_氏名) :- データ(_氏名,_,_身長,_),_身長>=160,_身長<170.

#どうしても強制表示したい場合は、
foo :- foo(_氏名),write(_氏名),nl,fail;true.
43デフォルトの名無しさん:2009/05/30(土) 09:05:03
# こんなのも可能かな。op定義に汎用性はないけど。
# 言語: Prolog
:- op(800,xfx,は).
:- op(750,xfx,が).
:- op(700,xfx,の).
:- op(650,xfx,で).
:- op(600,xf,以上).
:- op(600,xf,未満).
:- op(500,xf,cm).

データ(山下,65,177,23).
データ(尾崎,64,168,60).
データ(飯島,72,173,29).
データ(吉田,69,166,44).

身長 が N_1 cm 以上 で N_2 cm 未満 の 人 の 名前 は _氏名 :-
 データ(_氏名,_,_身長,_),
 _身長 >= N_1,
 _身長 < N_2.

# 「身長が160cm以上で170cm未満の人の名前は_氏名」を形態素解析して、
# Term = [身長,が,160,cm,以上,で,170,cm,未満,の,人,の,名前,は,_氏名]
# が得られるなら、結構おもしろい事がやれるでしょうけれど。
44デフォルトの名無しさん:2009/05/30(土) 10:43:38
>>36
(%)は整数比からRatioを構築する演算
(/)はRatio同士の割り算
だから、たとえば1%3のことを1/3と書いても大丈夫
45デフォルトの名無しさん:2009/05/30(土) 11:10:37
# python2.6 で >>41

columns = (u'氏名', u'体重', u'身長', u'年齢')
data =(
    (u'山下',65,177,23),
    (u'尾崎',64,168,60),
    (u'飯島',72,173,29),
    (u'吉田',69,166,44))
for dat in data:
    dic = dict(zip(columns,dat))
    if 160 <= dic[u'身長'] < 170:
        print dic[u'氏名']

# 無理やりワンライナー
print ' '.join(map(lambda dic:dic[u'氏名'], filter(lambda dic:160 <= dic[u'身長'] < 170, map(lambda d:dict(zip(columns,d)), data))))
46デフォルトの名無しさん:2009/05/30(土) 13:38:53
>>43
これは、

?- 身長 が 160 cm 以上 で 170 cm 未満 の 人 の 名前 は _誰.

というように使うのですか?
47197:2009/05/30(土) 13:59:28
>>46
そうですね。「名前 は _誰.」 は少し不自然なので

?- 身長 が 160 cm 以上 で 170 cm 未満 の 人 の 名前 は X.

X = 尾崎;
X = 吉田;
no
で十分でしょう。

"が","で","の","は" が関数になっていますから、

名前 が _名前 の 人 の 体重 は _体重 :- データ(_名前,_体重,_,_).

のような定義が何も考えずにできます。
ここまで単純だと節の自動生成をする述語定義もすぐできます。
48197:2009/05/30(土) 14:03:27
名前の197は「Prologでまったり Part4」スレに書き込んだ時の残り滓でした。
無視してください。
49デフォルトの名無しさん:2009/05/30(土) 15:44:59
インタラクティブなプログラムのコーディングで勝負しようぜ
50デフォルトの名無しさん:2009/05/30(土) 16:02:19
インタラクティブな環境だとわかりますが、
インタラクティブなプログラムだとイメージできません。
申し訳ないが、少し説明してください。
51デフォルトの名無しさん:2009/05/30(土) 16:29:22
>>50
たとえば任意の文字列を一文字ずつ順番に0.5〜2秒のランダムな間隔でCUI表示するプログラム。
52デフォルトの名無しさん:2009/05/30(土) 19:38:00
>>33
ぱっと見あってそうだが…
"〜加えた時点で加算を終了" のところが違うかも
でもこれってみんな違うよねw

-----
F# で>>28
let rec f n s =
    if n < 0.00001
    then s + n
    else f (n / 3.) (s + n);;

f 1. 0. |> printfn "%f";;
53デフォルトの名無しさん:2009/05/30(土) 19:45:41
>>52
>>35 の第二節が
f(P,_,P) :- P < 0.00001,!. であるか
f(P,_,0.0) :- P < 0.00001,!. であるかということかな。
54デフォルトの名無しさん:2009/05/30(土) 20:03:07
>>53
ごめん…Prologは名前を知ってる程度でその違いまではわかんない
というか>>29は分かるけど>>35は理解できなかった
できれば解説キボン…

-----
F# で>>41
let data =
    [("山下", 65, 177, 23);
     ("尾崎", 64, 168, 60);
     ("飯島", 72, 173, 29);
     ("吉田", 69, 166, 44)];;

List.iter (fun (n, _, t, _) -> if t >= 160 && t < 170 then printfn "%s" n) data;;
55デフォルトの名無しさん:2009/05/30(土) 20:18:28
>>53
今わかったw

>f(P,_,P) :- P < 0.00001,!. であるか
>f(P,_,0.0) :- P < 0.00001,!. であるかということかな。
そうです
で、問題に合う(0.00001以下の項を加えた時点で加算終了)のは前者のほうですね
56デフォルトの名無しさん:2009/05/30(土) 20:32:23
>>29もそこ合ってますね…何が違うんだろ
57デフォルトの名無しさん:2009/05/30(土) 20:33:50
>>54
fは3引数でその第一引数に 1/1->1/3->1/9->1/27 ... 逆数分数の遷移が
第二引数に 1->3->9->27 と次の逆数計算の分母からきます。
第三引数はその逆数計算の累計が計算されるところですが、論理変数のままで、
実値がここに入って次の呼び出しに渡されるというようなことはありません。
再帰が終了して漸く計算が始まるように見えます。それが第三節の最後の
f(P2,M,S2), の後にある S is S2 + P です。
f(P,_,P) :- P < 0.00001,!. だと分数が0.00001より小さくなったときその最小分数を起点に
再帰的に逆数分数が加算されて解を求めるという宣言であり、
f(P,_,0.0) :- P < 0.0001,!. は0.00001より小さくなった時の逆数分数は加算せずに
再帰的に逆数分数が加算されて解が求まるという宣言です。
第三節で次の逆数分数を先読み的に計算してしまっている点に注意してください。
58デフォルトの名無しさん:2009/05/30(土) 20:53:31
>>57
詳しい解説ありがとうございます
第三引数の扱いがイマイチ分からなかったので助かります
59デフォルトの名無しさん:2009/05/31(日) 00:07:45
>>56
>29は終了条件の判定で分母しかみてないのでは?
60デフォルトの名無しさん:2009/05/31(日) 01:54:55
>>59
普通
sigma = a + a(1/r) + a(1/r) + ... + a(1/r^n) (問題では 1/r^n < 0.00001 で、ここで加算終了)
なんだけど、
>>29
sigma = (a + ar + ar^2 + ... + ar^n) / r^n
って解いてる。つまり、最後に足した項が普通のほうの初項
だから、
1/r^n < 0.00001 ⇔ r^n > 100000 が終了条件でおk

まぁ、そのへんが「悪い回答」なんだろうw
61デフォルトの名無しさん:2009/05/31(日) 05:56:38
>>46
やっぱり膠着語の方が便利だねw
62デフォルトの名無しさん:2009/05/31(日) 14:35:45
<<問題>> この問題は他の言語の宿題スレの問題ではありません。
「論理少女1」つじ要作 というマンガの中に出てくる問題です。
できるだけ、問題文に忠実な表現になるようにこの問題を解いてください。
<<問題は3問ありますが、手始めに第一問>>

ちょうど一万円札・千円札・百円玉・十円玉があるわ。今からこのお金を・・・
髪の中、胸のポケット、スカートのポケット、靴の中に・・・それぞれ一つずつ隠します

ヒントをもとにどこに何を隠したかを当てていくのよ では第一問 ヒントは、
・ 一万円札は髪の中
・ 千円札は十円玉より上の位置
・ スカートには胸の10倍のお金が入っている
それでは、全てのお金の位置は?
63デフォルトの名無しさん:2009/05/31(日) 15:00:35
>>62
著作権の問題が心配だが・・・
64Haskellで:2009/05/31(日) 16:20:18
import Data.List
import Control.Monad

data Position = Shoe | Skirt | Chest | Hair
  deriving (Show, Eq, Ord)

solve :: [String]
solve = do
  -- ちょうど一万円札・千円札・百円玉・十円玉があるわ。今からこのお金を・・・
  let money = [10000, 1000, 100, 10]
  -- 髪の中、胸のポケット、スカートのポケット、靴の中に・・・それぞれ一つずつ隠します
  (position, content) <- mappings money [Hair, Chest, Skirt, Shoe]
  -- 一万円札は髪の中
  guard $ position 10000 == Hair
  -- 千円札は十円玉より上の位置
  guard $ position 1000 > position 10
  -- スカートには胸の10倍のお金が入っている
  guard $ content Skirt == 10 * content Chest
  -- それでは、全てのお金の位置は?
  let disp n = show (position n) ++ "(" ++ show n ++ ")"
  return $ unwords $ map disp money

main = putStr $ unlines solve

mappings :: (Eq a, Eq b) => [a] -> [b] -> [(a -> b, b -> a)]
mappings xs ys = do
  ys' <- permutations ys
  return (make xs ys', make ys' xs)
  where
    make from to = \value -> case lookup value (zip from to) of
      Just r -> r
      Nothing -> error "lookup failed"
65デフォルトの名無しさん:2009/05/31(日) 19:04:09
>62-64

スレ違い

> 他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。
66a36 ◆K0BqlCB3.k :2009/05/31(日) 20:09:23
>>65
まぁ、スレの目的と外れすぎているというわけでもないから、多少の柔軟性は考えるよ。

>>62から出題された宿題ということで。
67デフォルトの名無しさん:2009/05/31(日) 22:30:17
# では、python2.6 で >62。 posは、indexが小さいほど体の上の方であるとします。
money = {u'一万円札':10000,u'千円札':1000,u'百円玉':100,u'十円玉':10}
pos = [u'髪の中',u'胸のポケット',u'スカートのポケット',u'靴の中']
m2p = dict(zip(money.keys(),pos))
def hint1(m2p):
    u"""一万円札は髪の中"""
    return m2p[u'一万円札'] == u'髪の中'
def hint2(m2p):
    u"""千円札は十円玉より上の位置"""
    return pos.index(m2p[u'千円札']) < pos.index(m2p[u'十円玉'])
def hint3(m2p):
    u"""スカートには胸の10倍のお金が入っている"""
    p2m = dict((v.split(u'の')[0],k) for k,v in m2p.items())
    return money[p2m[u'スカート']] == money[p2m[u'胸']] * 10
def solve(m2p, m2p_keys):
    solve_list = []
    if len(m2p_keys) > 1:
        k1 = m2p_keys[0]
        for k2 in m2p_keys:
            m2p[k1], m2p[k2] = m2p[k2], m2p[k1]
            solve_list += solve(m2p, m2p_keys[1:])
            m2p[k1], m2p[k2] = m2p[k2], m2p[k1]
    elif hint1(m2p) and hint2(m2p) and hint3(m2p):
        solve_list.append(m2p.copy())
    return solve_list
if __name__ == '__main__':
    lst = solve(m2p, m2p.keys())
    if not lst: print u'解なし'; exit()
    print u'解を%d個見つけました' % len(lst)
    for d in lst:
        print "\n"+"\n".join(u'%sに%s'%(p, m)for m,p in d.items())
68デフォルトの名無しさん:2009/06/01(月) 00:25:16
# >67の solve 以下を書き直し。
# こっちだと、>67の 4行目 m2p = ... の部分は要らなくなります。
# 結果はどちらも同じです。

def solv():
    def permutation(lst):
        if not lst:
            yield []
            return
        for i in range(0, len(lst)):
            for x in permutation(lst[:i] + lst[i+1:]):
                yield x + [lst[i]]
    is_match = lambda m2p:hint1(m2p) and hint2(m2p) and hint3(m2p)
    return filter(is_match, map(lambda m:dict(zip(m,pos)), permutation(money.keys())))
if __name__ == '__main__':
    lst = solv()
    if not lst: print u'解なし'; exit()
    print u'解を%d個見つけました' % len(lst)
    for d in lst:
        print '\n'+'\n'.join(u'%sに%s'%(p, m)for m,p in d.items())
69デフォルトの名無しさん:2009/06/01(月) 13:01:53
>>62
% Prolog (残り半分があります)
:- op(800,xfx,は).
:- op(650,xfx,の).
:- op(250,xf,円).

隠した物([一万円札,千円札,百円玉,十円玉]).

隠した場所([髪の中,胸のポケット,スカートのポケット,靴の中]).

髪の中 は 胸のポケット の 直ぐ上にある.
胸のポケット は スカートのポケット の 直ぐ上にある.
スカートのポケット は 靴の中 の 直ぐ上にある.

A は B の 上にある :- A は B の 直ぐ上にある.
A は B の 上にある :- A は C の 直ぐ上にある,C は B の 上にある.

お金(一万円札,10000 円).
お金(千円札,1000 円).
お金(百円玉,100 円).
お金(十円玉,10 円).

ヒント(1,髪の中,一万円札).
ヒント(2,_千円札の場所,千円札,_十円玉の場所,十円玉) :- _千円札の場所 は _十円玉の場所 の 上にある.
ヒント(3,スカートのポケット,_物1,胸のポケット,_物2) :- お金(_物1,_円1 円),お金(_物2,_円2 円),_円_1 is _円2 * 10.
70デフォルトの名無しさん:2009/06/01(月) 13:07:03
% 続きです。この他に順列/3の定義が必要ですが。
全てのお金の位置は?(_解) :-
解候補の作成(_解),
member([_場所1,_物1],_解),
ヒント(1,_場所1,_物1),
member([_場所2,_物2],_解),
member([_場所3,_物3],_解),
ヒント(2,_場所2,_物2,_場所3,_物3),
member([_場所4,_物4],_解),
member([_場所5,_物5],_解),
ヒント(3,_場所4,_物4,_場所5,_物5).

解候補の生成(_解) :-
隠した物(_隠した物リスト),
隠した場所(_隠した場所リスト),
length(_隠した物リスト,_要素数),
順列(_隠した物リスト,_要素数,_物候補),
解候補の生成(_隠した場所リスト,_物候補,_解).

解候補の生成([],_,[]).
解候補の生成([A|R1],[B|R2],[[A,B]|R]) :-
解候補の生成(R1,R2,R).
71デフォルトの名無しさん:2009/06/01(月) 18:13:36
>>69 誤りがあった。
... :- お金(_物1,_円1 円),お金(_物2,_円2 円),_円_1 is _円2 * 10.

_円_1 という所は _円1 ですね。
72デフォルトの名無しさん:2009/06/01(月) 18:23:59
% こういうのもある。マンガの表現から遠い気がして採用しなかったが、
% こちらの方が引数がすっきりして分かり易いかもしれない。
ヒント(1,_解).
  member([髪の中,一万円札],_解).
ヒント(2,_解) :-
  member([_千円札の場所,千円札],_解),
  member([_十円玉場所,十円玉],_解),
  _千円札の場所 は _十円玉の場所 の 上にある.
ヒント(3,_解) :-
  member([スカートのポケット,_物1],_解),
  member([胸のポケット,_物2],_解),
  お金(_物1,_円1 円),
  お金(_物2,_円2 円),
  _円1 is _円2 * 10.

全てのお金の位置は?(_解) :-
  解候補の作成(_解),
  ヒント(1,_解),
  ヒント(2,_解),
  ヒント(3,_解).
73デフォルトの名無しさん:2009/06/01(月) 18:30:09
% *** user: '順列' / 3 ***
'順列'(Y,0,[]).
'順列'(Y,N,[A|X]) :-
  del(Z = Y - A),
  M is N - 1,
  '順列'(Z,M,X) .
% *** user: del / 1 ***
del(X = [A|X] - A).
del([B|Y] = [B|X] - A) :-
  del(Y = X - A) .
74デフォルトの名無しさん:2009/06/02(火) 19:23:00
<<問題2>>「論理少女1」つじ要作 というマンガの中に出てくる問題です。
4箇所の隠し場所と4つのアイテム(お金)は>>62と同じですが、
隠す場所は一度ご破算にします。以下のヒントを読んで、
できるだけ問題文に忠実な表現になるようにプログラミングしてください。
1) 髪の中かスカートのポケットのどちらか一万円札が入っている
2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍
3) 百円玉は千円札より上の位置にある
4) 靴の中のお金は髪の中のお金の100倍
そして、1)..4)のうちどれかが嘘。
それでは、
靴の中のお金は?
75python2.6で>74:2009/06/02(火) 23:20:11
money = {u'一万円札':10000,u'千円札':1000,u'百円玉':100,u'十円玉':10}
pos = [u'髪の中',u'胸のポケット',u'スカートのポケット',u'靴の中']
class assumption:
    def __init__(self, m2p):
        self.m2p, self.p2m = m2p, dict((v,k) for k,v in m2p.items())
class condition:
    hint = {
        (1):lambda a:a.m2p[u'一万円札'] in (u'髪の中', u'スカートのポケット'),
        (2):lambda a:money[a.p2m[u'胸のポケット']] == money[a.p2m[u'スカートのポケット']] * 10,
        (3):lambda a:pos.index(a.m2p[u'百円玉']) < pos.index(a.m2p[u'千円札']),
        (4):lambda a:money[a.p2m[u'靴の中']] == money[a.p2m[u'髪の中']] * 100,
    }
    @classmethod
    def match(cls, a):
        return 3 == len(filter(lambda h:h(a), cls.hint.itervalues()))
def solv():
    def permutation(lst):
        if not lst:
            yield []
            return
        for i in range(0, len(lst)):
            for x in permutation(lst[:i] + lst[i+1:]):
                yield x + [lst[i]]
    return filter(condition.match, map(lambda m:assumption(dict(zip(m, pos))),
                                      permutation(money.keys())))
if __name__ == '__main__':
    lst = solv()
    if not lst: print u'解なし'; exit()
    print u'条件を満たす組み合わせは%d通りありました。' % len(lst)
    print u'靴の中には%sが入っています。' % u'か'.join(set(map(lambda a:a.p2m[u'靴の中'], lst)))
7675:2009/06/02(火) 23:22:51
もはや「問題文に忠実な表現」とかよく分からなくなっているw
そして1レスに詰め込むのも限界にきている。
77デフォルトの名無しさん:2009/06/03(水) 00:53:48
>>64のsolveを差し替えで

solve :: [String]
solve = nub $ do
  -- ちょうど一万円札・千円札・百円玉・十円玉があるわ。今からこのお金を・・・
  let money = [10000, 1000, 100, 10]
  -- 髪の中、胸のポケット、スカートのポケット、靴の中に・・・それぞれ一つずつ隠します
  (position, content) <- mappings money [Hair, Chest, Skirt, Shoe]
  -- 1) 髪の中かスカートのポケットのどちらか一万円札が入っている
  let h1 = content Hair == 10000 || content Skirt == 10000
  -- 2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍
  let h2 = content Chest == 10 * content Skirt
  -- 3) 百円玉は千円札より上の位置にある
  let h3 = position 100 > position 1000
  -- 4) 靴の中のお金は髪の中のお金の100倍
  let h4 = content Shoe == 100 * content Hair
  -- そして、1)..4)のうちどれかが嘘。
  guard $ length (filter not [h1, h2, h3, h4]) == 1
  -- それでは、靴の中のお金は?
  return $ show $ content Shoe
78デフォルトの名無しさん:2009/06/03(水) 07:34:14
http://pc12.2ch.net/test/read.cgi/tech/1242655611/645
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):1方向線上リストを使って、スタックを実現せよ。ただ
し、各記憶要素xは整数値をとるもの
とする。 要素xをプッシュするpush(int x)、ポップしてその値を返すpop()、スタック

空かどうかを判断し真偽値を返すempty()、ならびに現在のスタック内容全体を表示するs
how()を用意する。
79デフォルトの名無しさん:2009/06/03(水) 07:35:44
>>78
% Prolog
push(X,L,[X|L]).
pop(X,[X|L],L).
empty([]).
show(L) :- write(L).
80デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/04(木) 06:57:11
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/05(金) 05:57:59
http://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)がわかりません。。

               http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/
joyful/img/9352.txt
               ↑これの続きにお願いします!
89デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/05(金) 06:22:50
>>92
そのまま続けると入力規制に引っ掛かりますよ!
94デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/05(金) 07:03:43
http://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デフォルトの名無しさん:2009/06/05(金) 07:16:37
http://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デフォルトの名無しさん: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
99デフォルトの名無しさん:2009/06/05(金) 16:11:59
100デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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
103100:2009/06/06(土) 05:32:54
すみません。一箇所間違っていた。
可能経路数(_桝,_開始点_X,_開始点_Y,_経路の数) :-
 findall(1,駒の動き(_桝,_開始点_X,_開始点_Y,_),L),
 length(L,_経路の数).

findall/3の中の 駒の動き/4 の第一引数 _桝 が>>100では落ちていて、
駒の動き/3 になってしまっていた。
104デフォルトの名無しさん:2009/06/07(日) 11:32:48
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/08(月) 04:59:14
http://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デフォルトの名無しさん: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).
110109:2009/06/08(月) 05:41:15
% 間違い。
'GetMonth'(_数値,_月名) :-
  month(_月名ならび),
  M is _数値 + 1,  /* どうしても'None'から始まるのだとすると */
  list_nth(_数値,_月名ならび,_月名).


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

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

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

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

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


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

・バックアップしたファイルを圧縮する仕組みの追加。
・プログラムが常駐する仕組みの追加。
112デフォルトの名無しさん:2009/06/08(月) 06:06:01
http://pc12.2ch.net/test/read.cgi/tech/1197620454/385
問題文:
1、10個の文字を1つずつ入力し、それらを入力した順に
  並べて表示
2、10個の文字を1つずつ入力し、それらを入力した順と逆順に
  並べて表示
3、5文字以上の長さの文字列を入力し、4番目の文字と5番目の文字を入れ替えて表示
4、10個の1桁の整数を入力し、それらを大きい順に並べて表示
5、10個の1桁の整数を入力し、その中から最も大きい3個を入力した順に表示
6、1桁の整数の入力を、同じ数が3回入力されるまで繰り返す
7、1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す
113デフォルトの名無しさん: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).
114113: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デフォルトの名無しさん:2009/06/08(月) 21:21:24
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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).
119117: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/09(火) 16:09:43
123デフォルトの名無しさん:2009/06/09(火) 20:40:10
124デフォルトの名無しさん:2009/06/09(火) 20:45:27
125デフォルトの名無しさん:2009/06/10(水) 05:01:30
http://pc12.2ch.net/test/read.cgi/tech/1197620454/355

課題:三つの整数を入力し、三辺がそれらの長さであるような三角形が
作れる時に「OK」、作れないときに「NG」を出力する。
126デフォルトの名無しさん:2009/06/10(水) 05:06:37
127124:2009/06/10(水) 05:45:42
ttp://nojiriko.asia/prolog/t123.html

<BODY><PRE>
が落ちていたため改行して表示されませんでした。
訂正しました。
128デフォルトの名無しさん:2009/06/10(水) 06:58:11
129デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/10(水) 07:35:49
課題はリンクを張っただけだと、そちらのスレが
過去スレログに回ってしまうと簡単には見られなくなるな。
やはり、少なくともポイントは<<課題>>の後に書かないと。
131デフォルトの名無しさん:2009/06/10(水) 12:21:33
http://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デフォルトの名無しさん:2009/06/10(水) 12:31:50
133デフォルトの名無しさん:2009/06/10(水) 17:09:06
<<課題>> C/C++
[1] 授業単元:c言語
[2] 問題文:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9418.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9419.txt
課題1-3 で作成したvoid fCountHindo(FILE*) に対して、英小文字を大文字として数える void fCountHindoIgnoreCase(FILE *)を作りなさい。
134デフォルトの名無しさん:2009/06/10(水) 17:11:39
>>133
% Prolog
http://nojiriko.asia/prolog/t133.html

あまり、課題に拘らず汎用的に作ってしまった。あしからず。
135デフォルトの名無しさん:2009/06/10(水) 19:57:19
いい問題みつけた。
[1] 授業単元:C言語演習課題
http://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デフォルトの名無しさん:2009/06/11(木) 03:29:11
<<課題>> Ruby
[1] 授業単元: Ruby演習 [2] 問題文、http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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.

曜日連鎖(月曜,火曜).
曜日連鎖(火曜,水曜).
曜日連鎖(水曜,木曜).
曜日連鎖(木曜,金曜).
曜日連鎖(金曜,土曜).
曜日連鎖(土曜,日曜).
曜日連鎖(日曜,月曜).
140139:2009/06/11(木) 05:13:26
訂正
一つ違い(M,N) :-
  integer(M),!,
  N is M + 1.
一つ違い(M,N) :-
  integer(N),!,
  M is N - 1.
141デフォルトの名無しさん:2009/06/11(木) 05:50:17
>>140 の 一つ違い という述語ですが、これは>>135の 前日・今日 に
「双方向性」を与えるたのトリックです。
一般に関数評価述語 is が条件に現れると双方向性は失われてしまいます。
?- var(A),5 is A + 2. がエラーになってしまうからです。
それを回避するというか、誤魔化しているのですね。
142デフォルトの名無しさん:2009/06/11(木) 06:03:37
前日・今日の最後の節がコピペできていませんでした。

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

が一番最後に来ますね。
143デフォルトの名無しさん:2009/06/11(木) 07:18:14
>>136 (4)だけです
% Prolog (正規表現との競争ということかな 少し負けるが・・)
% http://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).
144143:2009/06/11(木) 07:25:29
>>143
色色とあるのは色の間違いです。

  atom_chars(_英語色色,L2),
  atom_chars(_日本語色色,L3),
=>
  atom_chars(_英語色,L2),
  atom_chars(_日本語色,L3),
145デフォルトの名無しさん:2009/06/11(木) 21:23:42
<<問題>>
http://pc12.2ch.net/test/read.cgi/tech/1244449887/206
[1] プログラミング
[2] 入力した数値を4で割った余りを求めるプログラムを作れ。(switch)を用いて。
146デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/11(木) 21:32:29
>>145
このプログラムを
?- member(N,[11,33,47,51]),'4で割ったあまり'(N,X).

のように使うと不具合が生じる。どんなことになるか?
>>146 を適切なプログラムに書き換えなさい。
148143:2009/06/11(木) 21:42:17
Prologでペアリストとは[[a,1],[c,3], ... [y,26]]のような形式かな。
>>143では _=>_ の形式にしたからペアではないかも知れない。
Rubyに合わせてみたのだが。
ここでは、その方が分かり易いかと思ってペアリストという名称を
借用したが、普段は「対のならび」という言葉を使うところ。
149デフォルトの名無しさん:2009/06/11(木) 21:45:40
http://pc12.2ch.net/test/read.cgi/tech/1232627790/675
【 課題 】二つの文字列str1 とstr2 を入力して、str1 とstr2 から交互に一文字ずつ順番にとりだして、交
互にならべた文字列をつくれ。長い方の文字列の後の部分はそのままくっついた形になる。
String,StringBuffer クラスのメソッドを使え。
150デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/11(木) 23:13:06
<<課題>> C
http://pc12.2ch.net/test/read.cgi/tech/1244449887/209
1行に一つづつ表示するプログラムを作成せよ。
空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、
ピリオド(,)は表示する単語に含めないこと。

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

・出力
  This
is
a
pen
152デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/12(金) 22:07:26
<<課題>> C/C++
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9442.txt
158デフォルトの名無しさん:2009/06/12(金) 22:10:33
159デフォルトの名無しさん:2009/06/13(土) 09:42:06
>>135
% Prolog 一応書き上げました。使えるユーティリティを含みますが出来は悪い。
http://nojiriko.asia/prolog/t135.html
160デフォルトの名無しさん:2009/06/13(土) 09:47:14
>>74
% Prolog これは忘れてました。
http://nojiriko.asia/prolog/t74.html
161デフォルトの名無しさん:2009/06/13(土) 12:39:20
http://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デフォルトの名無しさん:2009/06/14(日) 04:33:08
>>161
# >>701
# ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/702.zip
#
# >捌き率は標準偏差の3倍の範囲を考慮する正規分布に従うものとする。
# ここだけ意味分からなかったから、自分でGateModel#getDepartureInterval()を適当に書き換えて。
163デフォルトの名無しさん:2009/06/14(日) 04:55:01
http://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}};
#
# 表はこれです
# http://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\nhttp://a.pic.to/11fgne のような美しい表を作るにはポストスクリプト
命令述語を使う必要がありますね\n').
166デフォルトの名無しさん:2009/06/14(日) 07:13:12
http://pc12.2ch.net/test/read.cgi/tech/1232627790/663
#【 課題 】3桁の数値データが複数入ったファイルをバブルソートを用いて
#      昇順に整列、新しいファイルに格納。データの件数は50件まで
#【 形態 】1. Javaアプリケーション(main()で開始)
#【 GUI  】制限なし
#【 期限 】6月11日 
#【 Ver  】1.6.0_13
#【 用語 】
#【 補足 】例外処理として、コマンドライン引数が間違っている場合、
#      読み込みファイルがオープンできない、書き込みファイルも
#      オープンできない、読み込みにファイルがない場合をお願いします。
167デフォルトの名無しさん:2009/06/14(日) 07:24:21
http://pc12.2ch.net/test/read.cgi/tech/1244449887/276
#[1] 授業単元:プログラミング演習
#[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9445.txt
#               ほとんど英文です。訳そうとしたんですが自分でも意味がわからなくなったんでそのままにしました。すいません。
168デフォルトの名無しさん:2009/06/15(月) 04:04:07
# <<課題>
http://pc12.2ch.net/test/read.cgi/tech/1244449887/364
# [1] 授業単元: プログラミング実験
# [2] 問題文(含コード&リンク): 
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9455.txt
#【課題1】
#
# 完全列挙法(力ずく法)を用いて巡回セールスマン問題(TSP) を解くプログラムを作成せよ。
# (※1 : 適当に出発点を設定し、そこから出発するすべての閉路を求めその中で最短のものを選択、出力する)
# (※2 : 都市数は外部から入力するものとする)
# (注意 : プログラムを動かすとき決して大きな都市数を与えてはならない)


169デフォルトの名無しさん:2009/06/15(月) 04:05:58
# >>168 続き
#【課題2】
#
# 順次生成・比較法により、閉路を順次生成し、これまでの最短経路長をもった閉路と閉路長を比較することによってTPSを解くプログラムを作成せよ。
# (※1 : 適当に出発点を定め、そこを出発点とする閉路をひとつ生成し、それをとりあえず最短閉路とする)
# (※2 : 新たに経色を生成し、その閉路長をその時点での最短閉路長と比較し、短い方を最短閉路とする)
# (※3 : 上記のことを全ての閉路について繰り返し、最短閉路を求める)
170デフォルトの名無しさん:2009/06/15(月) 06:12:20
171デフォルトの名無しさん:2009/06/15(月) 08:18:42
172デフォルトの名無しさん:2009/06/15(月) 19:00:47
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/15(月) 19:19:30
175デフォルトの名無しさん: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の第一引数の指定ということになります。
しかし、上記の理由から型指定としては曖昧で好ましいものではありません。
176175:2009/06/15(月) 19:59:05
N is trancate(X) ではなく N is truncate(X) ですね。
177デフォルトの名無しさん:2009/06/15(月) 20:41:47
http://pc12.2ch.net/test/read.cgi/tech/1244449887/405
[1] 授業単元:プログラミング実習I
[2] 問題文(含コード&リンク):http://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デフォルトの名無しさん:2009/06/15(月) 20:42:46
>>177
% Prolog
木の高さ([],-1).
木の高さ(_根,_高さ) :-
枝(_根,_左,_右),
木の高さ(_左,_左の高さ),
木の高さ(_右,_右の高さ),
max([_左の高さ,_右の高さ],_高さの二),
_高さ is _高さの二 + 1.
179177:2009/06/15(月) 20:51:49
まちがえた。枝ではなくて、木でした。
% Prolog
木の高さ([],-1).
木の高さ(_根,_高さ) :-
  木(_根,_左枝,_右枝),
  木の高さ(_左枝,_左枝の高さ),
  木の高さ(_右枝,_右枝の高さ),
  max([_左枝の高さ,_右枝の高さ],_高さの二),
  _高さ is _高さの二 + 1.
180デフォルトの名無しさん:2009/06/16(火) 02:51:49
http://pc12.2ch.net/test/read.cgi/tech/1244449887/446
#[1] 授業単元:プログラミング
#[2] 問題文(含コード&リンク):
# キーボードから入力された1行(空白で区切られた正整数並びの文字列)を項に分解して,i番目の項の整数値を配列要素d[i-1]に累算しながら格納するプログラムをつくりなさい。
# ただし,配列dの要素数は10として宣言し,10項目より多い入力の場合は11項目以降を棄却しなさい。
# 1行の入力には関数fgetsを用いなさい。
# fgetsは改行文字も取り込む点に注意して,入力の終了は「改行のみの入力」で判定しなさい。
181デフォルトの名無しさん:2009/06/16(火) 03:01:29
http://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デフォルトの名無しさん:2009/06/16(火) 06:19:04
>>167
% Prolog (完全日本語版)
http://nojiriko.asia/prolog/t167_n.html
183デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/16(火) 09:12:06
185デフォルトの名無しさん:2009/06/16(火) 09:20:22
ひどい宣伝だな
186デフォルトの名無しさん:2009/06/16(火) 09:51:46
>>168 >>169
完全列挙法 順次生成・比較法 というのがわからない。
「最短経路の本 レナのふしぎな数学の旅」 p253以下を読み直してみます。
187デフォルトの名無しさん:2009/06/16(火) 10:23:45
http://pc12.2ch.net/test/read.cgi/tech/1244449887/458
#[1] 授業単元:プログラミング
#[2] 問題文(含コード&リンク):
# n*n行列A、Bをそれぞれキーボード から入力し、積を求めろ。
# 行列の大きさnもキーボードから入力せよ。多次元配列を使ってください。
188デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/16(火) 18:29:42
http://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デフォルトの名無しさん:2009/06/16(火) 19:49:14
193デフォルトの名無しさん:2009/06/16(火) 21:45:48
http://pc12.2ch.net/test/read.cgi/tech/1244449887/482
#[1] 授業単元:プログラミング基礎
#[2] 問題文
#
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9473.txt
# for文やif文を使用して下図のように出力せよ
#
# ★   ★
#  ★ ★
#   ★
#  ★ ★
# ★   ★
#
194デフォルトの名無しさん:2009/06/16(火) 21:49:07
195デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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).
198197: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デフォルトの名無しさん:2009/06/17(水) 04:09:41
http://pc12.2ch.net/test/read.cgi/tech/1244449887/505
#[1] 授業単元: C言語
#[2] 問題文
# (1)
# 文字列を受け取る関数(charポインタを使用)
# その文字列の一番最後の文字を消去する関数を作る。
# (2)
# 文字列を受け取る関数(charポインタ使用)
# その文字列の一番最初の文字を消去する関数を作る。
# (3)'文字列を入力し、ある文字を入力。その文字列の中にその入力した文字がいく
つあるかを数える関数。
# 例 文字列 asdfgvbfdcaa 文字aと入力したら 3となる
# その関数は二つのパラメータをもち、一つ目は文字列へのポインタ、二つ目は数えた文
字の数である。
200デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/17(水) 06:19:02
http://pc12.2ch.net/test/read.cgi/tech/1136994325/925
# 123456789の順に数字を並べて,数字の間に+,−を補うことで式を作り, その値が100になる# 組み合わせをすべて求め,その式を出力するプログラムを作成しなさい.
# お願いします
202デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/17(水) 08:47:44
>>200 ですが、
これではPrologが誇るスーパー組込み述語 sub_atom/5 の
リファレンスの意味しかないので、sub_atom/5を使わない版を
後で示します。
それからアトムに対して文字列という言葉を使っていることに、
違和感を覚える方がおられると思いますが、私は"文字列"は
絶対といっていいくらい使いません。私の書き込みで文字列と
言うときは文字列アトムのことだと思ってください。
206デフォルトの名無しさん:2009/06/17(水) 09:07:55
http://pc12.2ch.net/test/read.cgi/tech/1244449887/514
#[1]授業単元:プログラミング演習1
#
#[2]問題文:画面より入力した成績データをファイルに登録する。
# 画面より入力する項目は以下のとおり。
# ・生徒コード、数字6桁、数字であること。
# ・氏名、文字列20文字、1字以上、20字以内
# ・国語(点数)、数字3桁、数字であること、0<=点数<=100
# ・算数(点数)、国語と同じ
# ・社会(点数)、国語、算数と同じ
#
#
# 生徒コードに999999が入力されたら終了する。
207デフォルトの名無しさん:2009/06/17(水) 10:55:36
208デフォルトの名無しさん:2009/06/17(水) 16:53:31
>>206 一部書き直しました。
% Prolog
http://nojiriko.asia/prolog/t206.html
209デフォルトの名無しさん:2009/06/17(水) 17:09:49
210デフォルトの名無しさん:2009/06/17(水) 18:05:15
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/17(水) 20:13:52
213デフォルトの名無しさん:2009/06/17(水) 21:26:01
VB6をやっているのですが、
「ストアド関数」というものが、
いまいちどういう役割を担っているものなのかわかりません。
MSDNを見たりウェブで調べたりはしたのですが…

宜しければ、どなたかお願いします。
214デフォルトの名無しさん:2009/06/18(木) 04:16:40
http://pc12.2ch.net/test/read.cgi/tech/1200175247/580
#[1] 授業単元: プログラミング演習
#[2] 問題文: 人の名前(ローマ字)を検索(部分一致)することができるプログラムを作成せよ。
215デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 06:38:52
http://pc12.2ch.net/test/read.cgi/tech/1200175247/560
#[1] 授業単元: C
#[2] 問題文(含コード&リンク):アルファベットの小文字を大文字に変換するプログラムを作成せよ
# ヒント: 'a'〜'z'は連続した文字コードが割り当てられている。'A'〜'Z'も連続した文字コードが割り当てられている。すなわち、'a'の文字コード
#      にある定数を足す(または引く)と'A'になり、'b'にその定数を足す(または引く)と'B'になる。この定数さえ求められれば、簡単に計算できることがわかる。
#      定数は、'a'や'A'を使えば計算できる。
220デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 07:29:55
>>221
すみません。これだとやっぱりだめだ。
char_code/2を使う以上は、変数の有無だけは検査しないといけないのかな。
ちょっと考えます・・・

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

を定義しないと無理かな。
223デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 09:33:49
http://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デフォルトの名無しさん:2009/06/18(木) 09:39:35
http://pc12.2ch.net/test/read.cgi/tech/1244449887/554
# [1] 授業単元: c言語演習
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9478.txt
227デフォルトの名無しさん:2009/06/18(木) 09:41:34
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 17:46:05
>>228
ニュートン・コーツ とか
区分求積法 でググれ
233デフォルトの名無しさん:2009/06/18(木) 18:28:43
http://pc12.2ch.net/test/read.cgi/tech/1244449887/592
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):入力した文字の種類を表示するプログラムを作成せよ。ただし、表示は次に従うとする
# 入力キーA〜Z 表示メッセージ 英大文字です
# 入力キーa〜z 表示メッセージ  英小文字です
# 入力キー0〜9 表示メッセージ  数字です
# 上記以外    表示メッセージ  その他のキャラクターです
234デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 18:40:39
>>233 訂正
% Prolog
入力した文字の種類を表示するプログラム(_文字) :-
  文字の範疇(_文字の範疇,_文字),

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

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

% 順序をひっくり返してもちゃんと動作します。開発順序としては
% この述語を作ってから、2行目と3行目を入れ替えました。
236デフォルトの名無しさん:2009/06/18(木) 20:51:57
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/18(木) 23:44:11
http://pc12.2ch.net/test/read.cgi/tech/1232627790/737
#【 課題 】適当な文字列を入力して、暗号化するプログラムを作る。
# 暗号キーは2桁で、暗号文は奇数番目と偶数番目の文字列を、
# 暗号キーの値だけ交互にずらして作成する。
# 使用する文字種は「!」から「z」までの90個とする(0x21~0x7A)。
# またを超えたら!に戻すこと。
239デフォルトの名無しさん:2009/06/18(木) 23:46:10
240デフォルトの名無しさん:2009/06/19(金) 07:51:19
http://pc12.2ch.net/test/read.cgi/tech/1244449887/650
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、
# 次の例に示すように行番号と*を表示するプログラムを作成せよ。
# なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。
# また、0や負の数が入力された場合はプログラムが終了するようにせよ。
241デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/19(金) 14:42:10
http://pc12.2ch.net/test/read.cgi/tech/1244449887/674
# [1] 授業単元:プログラム
# [2] 4*3行列Aと 3*5行列B の各要素をキーボードから入力し、
# C = A*B を計算し、表示するプログラムを作成せよ。
243デフォルトの名無しさん:2009/06/19(金) 14:43:51
>>242
% Prolog 少し前に一度あった。
http://nojiriko.asia/prolog/t242.html
244デフォルトの名無しさん:2009/06/19(金) 14:47:02
http://pc12.2ch.net/test/read.cgi/tech/1244449887/669
# 内容:
# [1] 授業単元: プログラミング論
# [2] 問題文(含コード&リンク):
# 1からnまでの整数値の和を再帰的に求めるプログラムを作成する
# [実行結果の例]
# 1からnまでの整数値の和を計算します
# nの値を入力してください:100
# 1から100までの整数値の和は5050です
245デフォルトの名無しさん:2009/06/20(土) 04:31:12
>>149 >>150
% Prolog (下請け述語を改変)
% http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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.
249248:2009/06/20(土) 08:47:22
ごめんなさい。>>238 を更新してしまった。
これでは以前との比較ができない。もう一度復元しますから、少し待って。
250デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/20(土) 19:19:22
http://pc12.2ch.net/test/read.cgi/tech/1232627790/750# 【 課題 】
# String a ="@test あいう@aaaおえてhttp://test.com/と";
# aから@から始まるアルファベットとURLを取り除く処理
# System.out.println(a);
#
# 出力結果
# あいうおえてと
#
# aから@から始まるアルファベットとURLを取り除く処理はどのように書けばいいのでし
ょうか?
252デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/21(日) 04:51:24
http://pc12.2ch.net/test/read.cgi/tech/1244449887/708
# 入力件数nをキーボードより入力し、n人分のテストデータを入力する。
# その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。
# ただし、平均点は実数型とし小数点第2位まで出力する。
# 平均点以外の変数は整数型とする。
#
# 問A棒グラフ出力プログラム
# 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。
# 大きい値の方の棒グラフが上に来るようにすること。
# (値として0〜50までしか入力されないものとする)
254デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/21(日) 06:25:06
http://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デフォルトの名無しさん:2009/06/21(日) 12:51:45
http://pc12.2ch.net/test/read.cgi/tech/1232627790/748
#【 課題 】http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/712.txt
#【 形態 】Javaアプリケーション(main()で開始)
# http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/21(日) 19:17:19
http://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デフォルトの名無しさん: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]).
261260: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/22(月) 04:34:04
http://pc12.2ch.net/test/read.cgi/tech/1244449887/580
# 【質問テンプレ】
# [1] 授業単元: プログラミング演習
# [2] 問題文: 人の名前(ローマ字)を検索(部分一致)することができるプログラム
を作成せよ。
265デフォルトの名無しさん:2009/06/22(月) 14:46:14
>>264
% Prolog こういう処理のためのユーティリティ sub_atom/10 を提案する。
http://nojiriko.asia/prolog/t264_u.html
266デフォルトの名無しさん:2009/06/22(月) 17:23:44
http://pc12.2ch.net/test/read.cgi/tech/1153585095/878
#エラトステネスの篩
#(コードは煩雑そうに見えるが、速度が圧倒的に速い。
# 大きな数までの素数表が必要な場合に必要な方法。)
% 宿題には見えないんだが・・
267デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/22(月) 22:55:11
http://pc12.2ch.net/test/read.cgi/tech/1244449887/842
# [1] C言語
# [2]1〜5の数字の組み合わせをを2次元配列index[][]に格納し、表示しなさい。
269デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/22(月) 23:05:33
http://pc12.2ch.net/test/read.cgi/tech/1244449887/837
# キーボードから入力した数値の段数を持つ逆ピラミッドを表示するプログラム。
#
# 例えば3と入力した時、
#
# *****
# ***
# *
#
# となるようなプログラムです。
# どうか早急にお願いします。
272デフォルトの名無しさん:2009/06/22(月) 23:08:00
>>271
問題が面白くないっす
やる気起きないっす
273デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/23(火) 04:33:24
http://pc12.2ch.net/test/read.cgi/tech/1244449887/851
# あいうえお
# /*かきくけこ*/
# さしす/*せそ
# なにぬ*/ねの
#
# というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。
# お願いいたします。
275デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/23(火) 05:19:10
http://pc12.2ch.net/test/read.cgi/tech/1244449887/861
# 以下のように出力されるプログラムを作成せよ
# 年齢を入力してください
# 16
# 生まれた年を入力してください
# 1986
# 好きな数字を入力してください
# 7
# あなたは1986年生まれの16才で、7が好きですね
278デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/23(火) 05:41:29
http://pc12.2ch.net/test/read.cgi/tech/1244449887/879
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9519.txt
280デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/23(火) 07:26:37
http://pc12.2ch.net/test/read.cgi/tech/1244449887/849
# [1]授業単元:プログラミング演習課題3
# [2]問題文:http://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デフォルトの名無しさん:2009/06/23(火) 15:12:50
283デフォルトの名無しさん:2009/06/23(火) 15:20:30
http://pc12.2ch.net/test/read.cgi/tech/1244449887/890
# [1] 授業単元:数理物理
# [2] 問題文(含コード&リンク):http://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言語)
# http://www.mns.kyutech.ac.jp/~kamada/keisan6/
284デフォルトの名無しさん:2009/06/23(火) 20:03:38
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/24(水) 08:30:30
>>287
forループがlengthの中に閉じ込められているんだね。

これぞ宣言型プログラミング!
289デフォルトの名無しさん:2009/06/24(水) 12:04:36
290デフォルトの名無しさん:2009/06/24(水) 19:14:07
http://pc12.2ch.net/test/read.cgi/tech/1244449887/953
# [1] 授業単元: ピラミッドアート
# [2] 問題文(含コード&リンク): http://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デフォルトの名無しさん:2009/06/24(水) 19:16:01
>>290
空白がうまく表示できなかった。
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9534.txt
で確認してください。
292デフォルトの名無しさん:2009/06/24(水) 20:15:45
293デフォルトの名無しさん:2009/06/26(金) 16:58:48
http://pc12.2ch.net/test/read.cgi/tech/1245853701/75
# [1] 授業単元: C
# [2] 問題文(含コード&リンク):
# キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ
# 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。
# 表示結果の例
# 正の整数:6
# 1******
# 2 *****
# 3  ****
# 4   ***
# 5    **
# 6 *
294デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/26(金) 17:16:07
>>294
  all(L1,' '), はスペース2個だと思ってください。
296デフォルトの名無しさん:2009/06/26(金) 18:11:51
http://pc12.2ch.net/test/read.cgi/tech/1245853701/83
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 自分の名前の英字名のASCIIコードを順番に表示するプログラムを作りなさい。
297デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/26(金) 18:41:30
http://pc12.2ch.net/test/read.cgi/tech/1245853701/85
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9554.txt
299デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/26(金) 19:56:51
>>301 さらに訂正。
phon_1([],[]) :- !. の後に、
phon_1([A],[C]) :-
  フォネティックコード(A,C),!.
phon_1([A],[A]) :-
  not(フォネティックコード(A,_)),!.

の2節を追加してください。
http://nojiriko.asia/prolog/t298.html
に書き直しておきます。
303299:2009/06/26(金) 20:35:21
なぜこうまでも全編の書き直しを余儀なくされたかというと、
123abc の場合の 123 Alfa ... 3とAlfaの間のスペースを入れることが
難しかったと言うことです。sub_atomで次の文字をこっそり見てしまえば
いいだけの事なのですが、潔しとせずと言うところでしょうか。
304デフォルトの名無しさん:2009/06/26(金) 20:44:07
>>303
前後関係を検査しやすいパターンで記述するので正解じゃないか。
ご苦労様ですw
305デフォルトの名無しさん:2009/06/26(金) 22:04:55
http://pc12.2ch.net/test/read.cgi/tech/1245853701/46
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):入力した数を2の何乗より大きいかを求めるプログラム。
306デフォルトの名無しさん:2009/06/26(金) 22:15:19
>>305
% Prolog

t305(N,X) :-
for(1,M,N),
2 ^ M > N,
X is M - 1.
307デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/28(日) 14:57:43
「いろんな言語で宿題スレ」の中で
http://pc12.2ch.net/test/read.cgi/tech/1242876647/168
http://pc12.2ch.net/test/read.cgi/tech/1242876647/225
といったProlog向き問題が未回答となっています。
どなたか、よろしくお願いします。
309308:2009/06/28(日) 14:59:04
「Prologでまったり」スレに書き込んだつもりでした。失礼しました。
310デフォルトの名無しさん:2009/06/29(月) 04:55:03
http://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デフォルトの名無しさん:2009/06/29(月) 11:08:26
http://pc12.2ch.net/test/read.cgi/tech/1232627790/856
# 【 課題 】百ます計算プログラムの作成
# 足す数、足される数は実行毎にランダムな順番にする。
# スタートボタンを押すと同時に問題が表示され、答えをキー入力しおわるとストップボタンを押す。
# 終了までの時間と、正解数を表示する。

百ます計算ってなんですか? ゲームに参加した人が行、列の先頭から
数字を得て百桝計算し終わるまでの時間でも競うのですか?
312デフォルトの名無しさん:2009/06/29(月) 13:29:06
http://pc12.2ch.net/test/read.cgi/tech/1245853701/184
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):
#   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9583.txt
313デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/06/30(火) 03:45:34
http://pc12.2ch.net/test/read.cgi/tech/1245853701/222
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt
316デフォルトの名無しさん:2009/06/30(火) 10:02:40
317デフォルトの名無しさん:2009/06/30(火) 10:50:45
318デフォルトの名無しさん:2009/06/30(火) 14:50:16
http://pc12.2ch.net/test/read.cgi/tech/1245853701/243
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9605.txt
319デフォルトの名無しさん:2009/06/30(火) 17:28:19
320デフォルトの名無しさん:2009/07/01(水) 04:08:33
http://pc12.2ch.net/test/read.cgi/tech/1245853701/273
# 1] 授業単元: 数理計画法
# [2] 問題文(含コード&リンク): シンプレックス法のプログラムを作成せよ。
# [3] 環境
#  [3.1] OS: Windows
#  [3.3] 言語: C
# [4] 期限: 2009年7月1日
# [5] その他の制限: プログラムの授業で習うことはすべてやりました。
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9612.txt
# のようなプログラムをつくたんですがこの先が悩んでいます。どなたかお願いします。
321デフォルトの名無しさん:2009/07/01(水) 04:10:11
http://pc12.2ch.net/test/read.cgi/tech/1245853701/275
# [1] 授業単元:C言語の基礎
# [2] 問題文:年(西暦)、月、日を入力し、入力した、日時の曜日及び、経過した日数を表示したプログラムを作成せよ。
322デフォルトの名無しさん:2009/07/01(水) 16:45:23
323デフォルトの名無しさん:2009/07/01(水) 22:46:07
324323:2009/07/02(木) 05:34:22
>>318
すみません。間違いが多かったので大幅に書き換えてupしました。
http://nojiriko.asia/prolog/t318.html
325デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/02(木) 10:54:28
331デフォルトの名無しさん:2009/07/03(金) 07:12:07
http://pc12.2ch.net/test/read.cgi/tech/1245853701/472
# [1] 授業単元:C言語実習
# [2] 問題文(含コード&リンク):http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/03(金) 15:49:25
http://pc12.2ch.net/test/read.cgi/tech/1245853701/511
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):試験の点数10人分をキーボードから入力し、以下の内容を出力するプログラムを作成せよ。
# 平均点、標準偏差、得点の高い順の点数リスト(出来れば、バブルソート以外のアルゴリズムでお願いします。)
334デフォルトの名無しさん: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デフォルトの名無しさん: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).
336335: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デフォルトの名無しさん:2009/07/03(金) 17:15:43
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/03(金) 19:18:20
340デフォルトの名無しさん:2009/07/03(金) 20:37:32
http://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デフォルトの名無しさん:2009/07/03(金) 20:41:34
342デフォルトの名無しさん:2009/07/04(土) 03:47:01
http://pc12.2ch.net/test/read.cgi/tech/1245853701/536
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): 乱数を使って配列に値を代入するようにせよ。サイズを変化させて時間を計測してみせよ。
# サイズが十倍になると計算結果は何倍になるか?
343デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/04(土) 04:06:59
http://pc12.2ch.net/test/read.cgi/tech/1245853701/538
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9667.txt
345デフォルトの名無しさん: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デフォルトの名無しさん: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.
347343: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デフォルトの名無しさん:2009/07/04(土) 05:16:30
http://pc12.2ch.net/test/read.cgi/tech/1245853701/547
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,非負の整数値を読み込んで,その数を逆順に表示するプログラムを作成せよ。
# なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること。
#
# 非負の整数を入力してください: 1963
# 1963 を逆から読むと3691 です.
349デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/04(土) 05:36:51
351デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/04(土) 06:03:29
http://pc12.2ch.net/test/read.cgi/tech/1245853701/559
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):url.txtに書き込まれている"ttp://〜をhttp://〜に書き換えresult.txtに出力せよ
353デフォルトの名無しさん: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デフォルトの名無しさん: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).
355354: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).
356354: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デフォルトの名無しさん:2009/07/04(土) 08:30:39
358デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/04(土) 17:12:40
363デフォルトの名無しさん:2009/07/04(土) 17:14:39
http://pc12.2ch.net/test/read.cgi/tech/1245853701/607
# 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で
考えてください.
#   (住所録,商品の在庫,図書,ワールドカップの勝敗....)
#  以下の要件を示します.
#
# 1. ファイルからデータを読み込む機能をつけること.
# 2. データは4つ以上の項目を保持させること.
#  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上)
# 3. 並び替えの機能をつけること.また並び替える項目が指定できること.
# 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ
せることができること.
#  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま
る 等)
# 5. データは半角英数字(英語やローマ字)で扱ってよい
# 6. データの追加ができること.
# 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に
合致したデータを削除できること.
# 8. 追加・削除した結果をファイルに保存できること.
364デフォルトの名無しさん:2009/07/05(日) 04:45:28
365デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/06(月) 09:15:54
369デフォルトの名無しさん:2009/07/06(月) 14:49:42
http://pc12.2ch.net/test/read.cgi/tech/1245853701/673
# [1] 授業単元: 構造体
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bi
n/joyful/img/9688.txt
370デフォルトの名無しさん:2009/07/06(月) 16:26:42
http://pc12.2ch.net/test/read.cgi/tech/1245853701/660
# [1] 授業単元:情報
# [2] 問題文(含コード&リンク):
# パソコン甲子園 2008 予選問題 問7 ふしぎな虫
# http://www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf
371デフォルトの名無しさん:2009/07/06(月) 16:28:07
372デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/06(月) 16:54:54
>>369 (1)
% Prolog
線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :-
  _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2).
374デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/07(火) 14:08:47
http://pc12.2ch.net/test/read.cgi/tech/1245853701/725
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): 整数 nissu をキー入力して、
# 1 月1 日から数えて nissu 日目が何月何日かを表示
# したい。
381デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/07(火) 15:03:39
# http://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デフォルトの名無しさん:2009/07/07(火) 16:08:17
386デフォルトの名無しさん:2009/07/07(火) 17:29:44
http://pc12.2ch.net/test/read.cgi/tech/1245853701/732
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字
を大文字にするプログラムを作成せよ。
#
# 実行例 文字列入力 :AbCdEfG123
#     変換文字列 :aBcDeFg123
387デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/07(火) 18:08:35
http://pc12.2ch.net/test/read.cgi/tech/1245853701/733
# [1] 授業単元: プログラミングC
# [2] 問題文(含コード&リンク):
# キーボードから半角英数で文字列を入力し、これを数字(0→9)、
# 大文字(A→Z)、
# 小文字(a→z)の順に並べ替えるプログラムを作成せよ。
# ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を
# 使うと簡単だろう。
# 文字列長はstrlen命令を使うとよい。みたいです。
389デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/07(火) 18:28:46
>>377さん
誤植でした;;
無事出来ました
ちなみに述語がmemberだけで出来ると
聞いたのですが出来るのでしょうか?
出来るとしたらどんな感じに
なるのでしょうか?
391デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/08(水) 04:01:54
http://pc12.2ch.net/test/read.cgi/tech/1245853701/762
# [1] 授業単元: 情報処理\u2160
# [2] 問題文: 乗算合同法で整数乱数を生成.。
# 区間(0.1)の一様にして、1以上、ある特定の整数の乱数を生成する。
394デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/08(水) 04:11:39
>>392
>>367 がそれに当たるつもりなのですが。
ただLogが逆順に生成されますね。
396デフォルトの名無しさん:2009/07/08(水) 06:38:43
>>395さん
成る程、丁寧にありがとうございました
397デフォルトの名無しさん:2009/07/08(水) 07:57:55
http://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デフォルトの名無しさん:2009/07/08(水) 11:24:22
399デフォルトの名無しさん:2009/07/08(水) 12:51:07
http://pc12.2ch.net/test/read.cgi/tech/1245853701/757
# 【質問テンプレ】
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、
# 同じように表示しなさい。
#  【test.dat】
#   ** ** **
#   ** ** **
#   ** ** **
400デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/08(水) 13:46:35
>>399 もうひとつ違っていた。
  open(File,read,Input), ですね。
403デフォルトの名無しさん:2009/07/08(水) 19:00:09
http://pc12.2ch.net/test/read.cgi/tech/1245853701/786
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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
http://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デフォルトの名無しさん:2009/07/09(木) 07:15:43
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/09(木) 18:52:46
http://pc12.2ch.net/test/read.cgi/tech/1245853701/822
# 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて
# 処理するプログラムを作る。
#
# (1)科目別の最高点、最低点を表示する。
# (2)各学生の3教科の平均点を表示する。
# (3)各教科の平均点を表示する。
#
# ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。
413デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/09(木) 21:48:12
http://pc12.2ch.net/test/read.cgi/tech/1245853701/826
# [1] 授業単元: 宿題
# [2] 問題文(含コード&リンク): 整数を入力し、奇数か偶数かを判断するプログラム
417デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/10(金) 03:09:03
http://pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題 I
# コマンド引数に自分の姓と名を与え,そのまま表示するプログラムを作成せよ.
# コマンド引数の数が少なかったり多かった場合は,標準エラー出力にエラー分を表示させること.
# 課題 II
# コマンド引数に任意の個数の整数を与え,その和を表示するプログラムを作成せよ.
# コマンド引数の数が少なかった場合は,標準エラー出力にエラー分を表示させること.

# また,コマンド引数に整数以外が与えられた場合にも,標準エラー出力にエラー分を表示させること.
420デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/10(金) 03:42:18
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/10(金) 07:47:05
http://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デフォルトの名無しさん:2009/07/10(金) 07:51:05
>>423 (バッチ処理版)
% Prolog
http://nojiriko.asia/prolog/t423.html
425デフォルトの名無しさん:2009/07/10(金) 11:40:09
http://pc12.2ch.net/test/read.cgi/tech/1245853701/825
# 〔1〕授業単元:C言語
# 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9718.txt
# 課題V
# n から m までの整数の和を求めるプログラムを作成せよ.(n ≦ m)
# 再帰呼び出しを行う関数 sum を作成して問題を解くこと.
# 関数 sum は,引数を n, m とし,n から m までの和を返すもとのとする.
426デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/11(土) 03:58:23
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/11(土) 17:14:27
http://pc12.2ch.net/test/read.cgi/tech/1245853701/916
# 【質問テンプレ】
# [1] 授業単元:情報基礎B
# [2] 問題文(含コード&リンク):(1) 平均、標準偏差
# (2) 得点の高い順の点数のリスト
435デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/11(土) 19:20:14
http://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デフォルトの名無しさん:2009/07/11(土) 20:54:33
x^y は加減乗算ではないよ。
439デフォルトの名無しさん:2009/07/11(土) 21:09:05
4 = (4 + 8) / (3 * 1)
440デフォルトの名無しさん:2009/07/12(日) 04:14:13
http://pc12.2ch.net/test/read.cgi/tech/1245853701/929
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに
# 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。
# 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。
#
# 出力例:俺は、カレーが大好きだ。
#
# データファイルは以下を使用すること。
# 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン
# その人 政治家 ネズミ  の12個
# 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン
# お金  の10個
# 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい
# に全力を尽くす を新しいものに交換した ?なにそれ美味いの?
# について深く考えた を捨てた に塩をふりかけた の11個
441デフォルトの名無しさん: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デフォルトの名無しさん: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.
443440: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.
444443:2009/07/12(日) 06:12:58
>>440 ではなくて >>442 の訂正でした。
445デフォルトの名無しさん:2009/07/12(日) 06:20:53
>>440
% Prolog ここに書き直しました。
http://nojiriko.asia/prolog/t440.html
446デフォルトの名無しさん:2009/07/12(日) 10:36:30
447デフォルトの名無しさん:2009/07/12(日) 13:52:15
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/12(日) 15:56:25
http://pc12.2ch.net/test/read.cgi/tech/1245853701/946
# 【質問テンプレ】
# [1] 授業単元 C言語
# [2] 問題文(含コード&リンク):
# 二つのバイナリファイルの中身を比較して等しいか、等しくないかを
# 比較して結果を返す関数を作る
450デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/12(日) 18:03:48
http://pc12.2ch.net/test/read.cgi/tech/1245853701/424
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9644.txtにある
# 50コのデータを利用して
# 最大値と最小値を取り出すプログラムを以下の1,2の関数を用いて2つ作れ
# 1 return文を用いたケース
# 2 グローバル変数を用いたケース
# http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/12(日) 18:36:57
>>452 また間違い。
整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
  get_chars(_ファイル,Chars),
  concat_atom(Chars,Atom),
  split(Atom,['\n',' '],[A|L]),
  ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).
454デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/12(日) 21:08:36
http://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デフォルトの名無しさん:2009/07/12(日) 21:14:39
>>455
% Prolog
% ここでは定義された単位節の一引数だけソートして差し替えると問題としてみよう。
http://nojiriko.asia/prolog/t455.html
457デフォルトの名無しさん:2009/07/12(日) 23:05:14
http://pc12.2ch.net/test/read.cgi/tech/1245853701/957
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 100個の乱数を発生させ最大値、最小値、平均を求める
# また最大値、最小値それぞれ何番目にあるか答えよ
458デフォルトの名無しさん:2009/07/12(日) 23:31:59
459デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/13(月) 05:00:41
http://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デフォルトの名無しさん:2009/07/13(月) 05:16:24
>>460
% Prolog
% http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/13(月) 05:43:49
>>463
コピペの際に誤って改行してしまいましたが、Prologでは

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

のように文字列のなかで改行すると構文エラーとなります。
465デフォルトの名無しさん:2009/07/13(月) 09:32:01
http://pc12.2ch.net/test/read.cgi/tech/1245853701/949
# 【質問テンプレ】
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# http://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デフォルトの名無しさん:2009/07/13(月) 13:25:57
468デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/13(月) 17:49:03
http://pc12.2ch.net/test/read.cgi/tech/1200175247/550
# [1] 授業単元: Ruby演習 [2] 問題文、http://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デフォルトの名無しさん:2009/07/14(火) 16:41:33
http://pc12.2ch.net/test/read.cgi/tech/1232627790/958
# 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】7/14 am6:00
# 【 Ver  】Eclipse Version: 3.4.2
# 【 補足 】
# あいう
# かきく
# さしす
# 上記のようなテキストファイルを読み込み、
# あかさ
# いきし
# うくす
# のように別のテキストファイルに書き出す感じです。
471デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/14(火) 17:08:27
>>470 書き直し
% Prolog http://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デフォルトの名無しさん:2009/07/14(火) 17:31:04
http://pc12.2ch.net/test/read.cgi/tech/1136994325/954
# pascal pcpad
# 1個の自然数nを適当決めて、nチームが参加する
# リーグ戦の全試合を表示するプログラムを書きなさい。
474デフォルトの名無しさん:2009/07/14(火) 17:33:35
>>473
% Prolog http://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デフォルトの名無しさん:2009/07/15(水) 04:06:15
http://pc12.2ch.net/test/read.cgi/tech/1247438792/103
# 【質問テンプレ】
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/15(水) 07:09:47
>>476 まちがえた!
% Prolog http://nojiriko.asia/prolog/t475.html

曜日を表す値(0,日曜).
曜日を表す値(1,月曜).
曜日を表す値(2,火曜).
曜日を表す値(3,水曜).
曜日を表す値(4,木曜).
曜日を表す値(5,金曜).
曜日を表す値(6,土曜).
478デフォルトの名無しさん:2009/07/15(水) 10:54:19
http://pc12.2ch.net/test/read.cgi/tech/1247438792/107
# [1] 授業単元: デジタル信号処理
# [2] 問題文(含コード&リンク): 2つのテキストファイル(double型)を読み込み、
# 畳み込み和を計算し、別のファイルに出力せよ。
479デフォルトの名無しさん:2009/07/15(水) 11:02:01
>>478
% Prolog http://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デフォルトの名無しさん:2009/07/15(水) 18:41:51
OSでSoundBlaster16のリセットをしたいのだが、どうもなかなかリセットが上手くいかない。
できればアセンブラのサンプルコード欲しいのだが誰か頼む

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

・ここにもサンプルコードがあるけど、どうも何をやっているのか良く分からない・・
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/16(木) 17:29:23
>>469
% Prolog これは遊びです。フラットな単位節でなくこのような形式で定義する積極的な理由は見つかりません。
http://prolog.asia/prolog/t469.html
484483:2009/07/16(木) 17:31:06
>>483 間違えました。
http://nojiriko.asia/prolog/t469.html

でした。
485デフォルトの名無しさん:2009/07/16(木) 17:39:20
>>475
% Prolog (1)-(4) まで全て定義おわりました。
http://nojiriko.asia/prolog/t475.html
486デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/17(金) 02:52:13
http://pc12.2ch.net/test/read.cgi/tech/1247438792/157
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# http://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デフォルトの名無しさん:2009/07/17(金) 02:53:14
http://pc12.2ch.net/test/read.cgi/tech/1247438792/160
# [1]プログラミング
# [2] 課題
# 言語: C もしくは C++ 言語
#
# (1)以下のプログラムを作成しなさい(数当てゲーム)
#
# *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を
# 待つ。
# 変数aを定義して、10までの乱数を発生させて変数aに代入する。
# キーボードからの入力があれば、先に発生させた乱数と一致しているならば
# 「あたり!!」と表示する。
# 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を
# 表示する)
489デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/17(金) 07:27:53
491デフォルトの名無しさん:2009/07/17(金) 10:30:13
>>486
ハノイの塔の課題をその仕様通り自然に定義していったらどうなるか?
興味がありますが、私が何か書き込めるまでにはもう少し時間が必要なので、
最小サンプルで確認することによって、ディスクの大小順序問題を
スキップしてしまっている最もよく知られたアルゴリズムによる
プログラム例を http://nojiriko.asia/prolog/hanoi.html に示します。

問題を直感的に理解するには
「Prologプログラミング入門」安部憲広著 共立出版刊 の29頁 図3.3
がよいと思います。
492デフォルトの名無しさん:2009/07/17(金) 12:40:40
http://pc12.2ch.net/test/read.cgi/tech/1232627790/970
# 配列に関する基本問題
# フィールド int型の配列numberのみ
# コンストラクタ 引数で与えられたScannerから整数を順次読み取る、
# 最初に読み取った整数を配列サイズとみなし、int型の配列を生成し
# numberで参照する
# その後整数を読み取ってnumber[0],number[1]、・・・・と順に代入していき、
# 配列サイズ分だけ読み取る
# number中の全要素,最大値、最小値を表示
493デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/17(金) 14:33:32
http://pc12.2ch.net/test/read.cgi/tech/1153585095/900
# 3つの自然数の合計が10になるような組み合わせを
# すべて列挙するプログラムを書け
# 1+1+8と1+8+1のように並び順が異なるだけのものは
# 同一と考え、重複して出力しないようにすることが望ましい
495デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/17(金) 14:59:38
http://pc12.2ch.net/test/read.cgi/tech/1153585095/902
# 個数Nが与えられたとき
# N個の自然数の合計が10になるような組み合わせをすべて列挙する
# プログラムを書け
497デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/17(金) 22:53:38
http://pc12.2ch.net/test/read.cgi/tech/1247438792/175
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
#
# 下に示すように,キーボードから二つの文字列を読み込み,どちらの文字列が
# 何文字長いか
# を表示するプログラムを作成せよ.なお,二つの文字列が同じ長さならば,
# 「二つの文字列は同じ長さです.」と表示させること.
#
# 文字列A : Good
# 文字列B : Morning
# 文字列B の方が3 文字長いです.
503デフォルトの名無しさん:2009/07/17(金) 22:55:55
>>502
% Prolog http://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,文字長いです。],_診断).
504503:2009/07/17(金) 23:01:55
>>503 訂正

  名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
->
  名前付き文字列長の診断(文字列A,A,文字列B,B,_診断),
505503:2009/07/17(金) 23:32:27
http://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デフォルトの名無しさん:2009/07/17(金) 23:35:14
>>505
% Prolog http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/18(土) 00:21:54
http://pc12.2ch.net/test/read.cgi/tech/1153585095/904
# [課題]
# ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を
# 取り除く
# ・一度に取ることのできるマッチ棒は1から3本
# ・山を空にしたプレーヤが勝ち
# 人間2人でこのゲームを行なうプログラムを作成せよ.
#
# プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと,
# 勝負がついたかどうかのチェックを行なうこと。
# また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの
# 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような
# プログラムにすること。
510デフォルトの名無しさん:2009/07/18(土) 00:24:37
511デフォルトの名無しさん:2009/07/18(土) 00:42:42
>>491さん
暇になったらお願いします
512493: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デフォルトの名無しさん:2009/07/18(土) 17:34:59
これまでの Prolog による回答の索引を作りました。

http://nojiriko.asia/prolog/index.html
514デフォルトの名無しさん:2009/07/18(土) 18:08:40
Prologで盛り上がっているのは、あんた一人だけだよ
515デフォルトの名無しさん:2009/07/18(土) 18:11:20
prolog恐ろしす・・・
516デフォルトの名無しさん:2009/07/18(土) 19:08:20
http://pc12.2ch.net/test/read.cgi/tech/1247438792/196
# [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に
# スタックに一時的に格納するプログラムを作成する
# このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり
# ポップしたりする過程が分かるプログラムを作成する。
# なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる
#
# [プログラムの例]
# 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり
# ポップしたりするたびにデータベースに格納された全データを表示する。
517デフォルトの名無しさん:2009/07/19(日) 05:02:52
>>516
% Prolog http://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デフォルトの名無しさん:2009/07/19(日) 06:25:56
>>514
チュートリアルの題材を求めるのが狙いなので、他の言語の人の
書き込みを待たずに進めてしまってちょっと申し訳けない。
Prologの場合は、低水準のコードにサイト上でなかなか出会えないと
いうことがあって、そこが初心者にとって辛いところです。
そこらあたりの欠落を些かでも埋められればと書き込んでいます。
繰り返し、いろんな表記法で、できれば螺旋状に発展していければ
おもしろいと思うのですが、間違いの訂正に数レスとられることが
多くて、1000スレまでの間では貧弱なものにしかなりそうもない。
それにしても、「C/C++の宿題片付けます 12*代目」の方々には感謝です。
519デフォルトの名無しさん:2009/07/19(日) 13:34:31
http://pc12.2ch.net/test/read.cgi/tech/1247438792/213
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# 下に示すように,キーボードから文字列を読み込み,その文字列が
# 回文(前から読んでも後ろから読んでも同じ)かどうかを判定するプログラムを
# 作成せよ.なお,入力する文字列は半角の英数字および記号のみと仮定してよい.
#
# 文字列を入力してください: abcba
# 回文です.
520デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/21(火) 12:23:09
http://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
http://pc12.2ch.net/test/read.cgi/tech/1247438792/291
# [1] 授業単元:コンピュータリテラシー
# [2] 問題文(含コード&リンク):問題文と参考は以下です
#   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt
# ・試験の過程を記録
# 1,番号、得点を入力したあと平均点を計算
# 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする)
# 3,番号、得点、平均との差を出力
# 以上のプログラムを作成
525デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/21(火) 12:57:44
http://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個以上の場合は,何もせず適切なメッセージを出力して終了するものとする
# 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt
528デフォルトの名無しさん:2009/07/21(火) 14:47:09
>>523
% Prolog

二分木の総節数([],0).
二分木の総節数(_節,_節の大きさ) :-
  節(_節,_左枝,_右枝),
  二分木の総節数(_左枝,_左枝の大きさ),
  二分木の総節数(_右枝,_右枝の大きさ),
  _節の大きさ is _左枝の大きさ + _右枝の大きさ + 1.
529デフォルトの名無しさん:2009/07/21(火) 15:36:10
530デフォルトの名無しさん:2009/07/21(火) 16:53:46
531デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/22(水) 07:32:01
http://pc12.2ch.net/test/read.cgi/tech/1247438792/303
# [1] 授業単元:
# インタラクティブッコミュニケーション
# [2] 問題文(含コード&リンク):
# 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、
# main()内のprintf()で結果を出力するプログラムを作成せよ。
# 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは
# 負の値が入力されるまで繰り返されるものとする。
#
# http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/InteractiveComm_10.html
# の一番下の演習。
# 最終的にはこの形に
# http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/exercise10.gif
536デフォルトの名無しさん:2009/07/22(水) 07:59:46
>>535
% Prolog 題意とは違いますが為替レートはリアルタイムに取得しています。
http://nojiriko.asia/prolog/t535.html
537デフォルトの名無しさん:2009/07/22(水) 11:29:25
http://pc12.2ch.net/test/read.cgi/tech/1247438792/300
# [1] 授業単元:プログラミング基礎
# [2] 繰り返しをwhileもしくはdo\uff5ewhile文を使って作成しなさい。
#
# 任意の数字を入力し、その数字分まで1つずつ加算して表示する。
# 入力した数字までいったら逆に1になるまで表示する。
#
# 例
# 8
#
# *
# **
# ***
# ****
# *****
# ******
# *******
# ********
# *******
# ******
# *****
# ****
# ***
# **
# *
538デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/22(水) 12:41:10
http://pc12.2ch.net/test/read.cgi/tech/1247438792/297
# [1] 授業単元: 数値解析プログラミング
# [2] 問題文(含コード&リンク): ∫\u20801/1+xx の積分を
# 方形公式、台形公式、シンプソン公式を用いて数値計算するプログラムを作成せよ
541デフォルトの名無しさん: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.
542541:2009/07/22(水) 14:42:49
>>541 訂正 X が x になっていた。
f(X,Y) :- Y is 1 / (1 + X ^ 2).
543デフォルトの名無しさん:2009/07/23(木) 07:01:58
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/23(木) 09:08:46
http://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デフォルトの名無しさん:2009/07/23(木) 16:00:08
548デフォルトの名無しさん:2009/07/23(木) 17:06:20
http://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デフォルトの名無しさん:2009/07/23(木) 18:38:58
なんかこのスレ
コードばっかで良スレっぽいな
551デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/23(木) 21:22:33
>>543
% Prolog 条件式(Prologの場合,節の選択)なしで切り上げ、思いつきません!

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

四捨五入(_浮動小数点数,_四捨五入された整数) :-
_四捨五入された整数 is truncate(0.5 + float_integer_part(_浮動少数点数)).
554デフォルトの名無しさん:2009/07/23(木) 22:04:05
http://pc12.2ch.net/test/read.cgi/tech/1247438792/457
# [1] 授業単元 C++
#
# [2] 問題文(含コード&リンク)
# テキストファイルの中のタブコードをそれぞれ、空白N個に置き換えて、
# 新たなファイルに書き出しなさい。ただし、N≧0とする。
# コマンドパラメーター:入力ファイル名、出力ファイル名、N
#
# <解答例>
# Hello( )Bye←入力ファイル
# N=3の場合
# Hello( )Bye←出力ファイル
555デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/24(金) 08:19:20
http://pc12.2ch.net/test/read.cgi/tech/1153585095/910
# コンピュータと人間か対戦する形で実行する3目並べのプログラムを作成せよ
#
# *先攻、後攻はゲーム毎に乱数で決定する
# *人間が手を打った場合、コマを置ける場所かどうかのチェックを行うこと
# *勝ち負けの判定を行うこと
# *コンピュータ側の手はランダムでも良いが、可能な範囲で工夫してみよ
561デフォルトの名無しさん:2009/07/24(金) 16:59:03
http://pc12.2ch.net/test/read.cgi/tech/1247438792/473
# [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだデータ文字列を、
# データベースに格納する前にキューに一時的に格納するプログラムを
# 作成する。このとき、データをまとめたデータ文字列を一つずつ、キューへ
# エンキューしたり、デキューしたりする過程が分かるプログラムを作成する。
# なお、キューを実現するライブラリは、キューのための別のヘッダにまとめる。
# [そのほか]
# ・入力ストリームから読み込んだデータ文字列を、キューにエンキューしたり、
# デキューしたりするたびにデータベースに格納された全データを表示する。
# ・構造体オブジェクトは動的な記憶域に生成する。
# ・生徒の名前、試験の点数を構造体オブジェクトに格納することとする。
# ・関数の処理にコメントをつけて、キューをどのように実現しているか、
# そのプログラムの処理内容が分かるようにする。
# [このプログラムの流れ]
# (1)ファイルやキーボードなどの入力ストリームから
# データをデータ文字列として読み込む
# (2)このデータ文字列をキューに一時的に蓄える
# (3)キューからデータ文字列を取り出す
# (4)このデータ文字列からそれぞれデータを取り出して
# 文字列や数値データに変換する
# (5)変換したデータをデータベース(構造体の配列など)に格納してまとめて管理する

# (6)このデータベースからデータを参照し、ディスプレイに出力する
562デフォルトの名無しさん:2009/07/24(金) 17:50:28
>>561
% Prolog
% 仕様通りだと面白くないので、要素を読み込む毎にキューに追加、
% 改行が来るとキューからすべて読み出すように変更した。
http://nojiriko.asia/prolog/t561.html
563デフォルトの名無しさん:2009/07/25(土) 04:17:39
>>562
すみません。二ヶ所、述語名の付け違いがありました。
書き直しました。
564デフォルトの名無しさん:2009/07/26(日) 11:25:17
http://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デフォルトの名無しさん:2009/07/26(日) 13:48:46
>>564
ちょっと長くなったので codepad で
Parsec はすばらしい

Haskell
http://codepad.org/0JybDotF
566デフォルトの名無しさん:2009/07/26(日) 14:23:08
(quote exp)
567デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/27(月) 20:03:33
http://pc12.2ch.net/test/read.cgi/tech/1247438792/574
# [1] 授業単元:プログラミング序論演習
# [2] 問題文(含コード&リンク): CUI上で動くメーラーを作れ
570デフォルトの名無しさん:2009/07/27(月) 20:08:29
http://pc12.2ch.net/test/read.cgi/tech/1247438792/559
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# http://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デフォルトの名無しさん:2009/07/27(月) 20:12:00
http://pc12.2ch.net/test/read.cgi/tech/1248012902/53
# 【 課題 】
# 以下のURLから正規表現を用いてキーワードの部分のみ抽出する
# プログラムを作成せよ。
#
# http://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デフォルトの名無しさん:2009/07/27(月) 22:08:42
http://pc12.2ch.net/test/read.cgi/tech/1200175247/580
# [1] 授業単元: 論理学
# [2] 問題文: 整数からなる配列を受け取り、その最大値を除いた配列を
# 出力するメソッドを定義せよ。
# ただし、配列の長さが3未満のときはnilを出力する。
573デフォルトの名無しさん: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デフォルトの名無しさん: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 = "http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/28(火) 04:54:25
http://pc12.2ch.net/test/read.cgi/tech/1247438792/604
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク): http://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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/28(火) 06:15:55
>>571
% Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を
% 使ってみる。
% sub_atom/10の定義はhttp://prolog.asia/prolog/t264_u.html 参照。

t571(URL,_キーワード) :-
sub_atom(URL,_,_,_,_,'?q=',G,_,_,_),
sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!.
580579:2009/07/28(火) 06:32:16
>>571 >>579 sub_atom/10のリンクを間違えました。再掲。
% Prolog は正規表現をサポートしないのでここでは汎用検索述語sub_atom/10を
% 使ってみる。
% sub_atom/10の定義はhttp://nojiriko.asia/prolog/t264_u.html 参照。

t571(URL,_キーワード) :-
  sub_atom(URL,_,_,_,_,'?q=',G,_,_,_),
  sub_atom(G,_,_,_,_キーワード,'&',_,_,_,_),!.
581デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/30(木) 04:41:04
http://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デフォルトの名無しさん:2009/07/30(木) 04:43:43
http://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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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
588585:2009/07/30(木) 12:54:13
>>584 >>585 訂正
  get_lines(File2,L1),
  get_lines(File2,L2),
とありますが、上の行は get_lines(File1,L1), です。
589デフォルトの名無しさん:2009/07/31(金) 07:42:41
http://pc12.2ch.net/test/read.cgi/tech/1247438792/688
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):本文が長すぎて書き込めないので下に
# 分けて書き込みます
http://pc12.2ch.net/test/read.cgi/tech/1247438792/689
http://pc12.2ch.net/test/read.cgi/tech/1247438792/690
http://pc12.2ch.net/test/read.cgi/tech/1247438792/691
590デフォルトの名無しさん:2009/07/31(金) 07:46:16
http://pc12.2ch.net/test/read.cgi/tech/1247438792/704
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# http://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デフォルトの名無しさん:2009/07/31(金) 08:29:12
http://pc12.2ch.net/test/read.cgi/tech/1248012902/76
# 【 課題 】タートルグラフィックスを描写するプログラムを作成する。
#       http://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つだけでいいみたいです。
#        よろしくお願いします。
http://nojiriko.asia/jpeg/IMG_0001.jpg
592デフォルトの名無しさん:2009/07/31(金) 17:29:53
>>589
% Prolog (第1ステップ)
http://nojiriko.asia/prolog/t589.html
593デフォルトの名無しさん:2009/07/31(金) 21:02:07
594デフォルトの名無しさん:2009/07/31(金) 22:59:25
http://pc12.2ch.net/test/read.cgi/tech/1247636661/364
# 質問です。
#
# 入退室の時間を自分で打ち込んで、それをデータとして貯めるというシステムを作り
たいんですが、こういうシステムを
# 作る場合はPHPとMySQLで作れるんでしょうか。よろしくお願いします。
#
595デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/07/31(金) 23:58:20
>>594 >>595 >>596
不適切なところが少々ありました。訂正はこれらで。
http://nojiriko.asia/prolog/t594.html
598デフォルトの名無しさん:2009/08/02(日) 09:56:28
http://pc12.2ch.net/test/read.cgi/tech/1247438792/743
# [1] 授業単元:プログラミング基礎
# [2] 問題文(含コード&リンク):
# 2つの整数をキーボードから入力し、それらの最大公約数を表示する
# プログラムを作成せよ。
# 最大公約数と、2つの数字を割り切る最大の整数のことである。
# 例えば12と18の最大公約数は6,24と48の最大公約数は24である。
599デフォルトの名無しさん: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デフォルトの名無しさん:2009/08/02(日) 12:05:02
>>598
-- Haskell では Prelude に gcd が含まれている
import Control.Monad (replicateM)
main = replicateM 2 readLn >>= print . foldl1 gcd
601599:2009/08/02(日) 15:07:41
>>598 >>599
間違っていました。
途中、'最大公約数'/5 という述語が副目標として登場しますが、
これは、'appendを使って最大公約数を求める'/5 の間違えです。
http://nojiriko.asia/prolog/t598.html の方を見て下さい。
602デフォルトの名無しさん:2009/08/02(日) 18:47:48
http://pc12.2ch.net/test/read.cgi/tech/1153585095/918
# 所謂覆面算で
# 英字一文字が一桁の数字(0-9)で表されるとき
# one
# + nine
# + twenty
# + fifty
# = eighty
# となる組み合わせを検索してください
# 各行の先頭の文字は0以外です
603デフォルトの名無しさん:2009/08/02(日) 18:50:25
604デフォルトの名無しさん:2009/08/02(日) 20:28:36
http://pc12.2ch.net/test/read.cgi/tech/1247438792/759
# [1] 授業単元:工学実験
# [2] 問題文(含コード&リンク):
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9870.txt
#
# 課題内容: 組クラスを作成しなさい。組クラスは教員と学生からなる。
# 教員は1人で学生は最大40人とする。学籍番号で検索する機能をつけること。
# 学生には名前、住所、学籍番号(文字列型)という属性があり、教員には
# 名前、住所、教員番号(文字列型)という属性があるとする。
# 教員と学生の共通部分をまとめたクラスを定義し、それを継承する形で
# 教員クラスと学生クラスを定義せよ。
# それぞれの属性にはgetter、setter、表示関数を定義せよ。
# 継承した教員クラスで、名前を表示する関数では、「○○教授」、「○○助教授」
# などのように役職名を添えて表示する関数として、上書き定義せよ。
# これらの機能が正しく動作することを確認するmain関数(適当なサンプル)も
# あわせて作ること。
605デフォルトの名無しさん:2009/08/03(月) 06:36:08
606デフォルトの名無しさん:2009/08/03(月) 07:11:34
http://pc12.2ch.net/test/read.cgi/tech/1247438792/776
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 以下の機能を持った関数を含むプログラムを作成せよ.
# 1.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いて作成せよ.
# 2.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いないで作成せよ.
607デフォルトの名無しさん: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.
608607: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デフォルトの名無しさん:2009/08/03(月) 18:40:06
http://pc12.2ch.net/test/read.cgi/tech/1247438792/786
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):台形公式により関数y=x^2とx軸によって
# 挟まれる部分のx=0〜x=8までの範囲の面積を求めよ。
# 分割は4で計算せよ。
610デフォルトの名無しさん:2009/08/03(月) 18:47:56
611デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/08/04(火) 08:59:20
http://pc12.2ch.net/test/read.cgi/tech/1247438792/794
# 【質問テンプレ】
# [1] 授業単元:アルゴリズムとデータ構造
# [2] 問題文(含コード&リンク):ハッシュ(チェイン法)を使ってkeyを検索し、
# 該当するものがあればそのdataを表示する。
# (実際には検索してkeyとdataを返すまでです)
# 詳しくはこちらで http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9879.txt
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9881.txt
614デフォルトの名無しさん:2009/08/04(火) 09:02:27
>>613
% Prolog でハッシュといえば述語のこと。

t613(Key,Data) :- 'KeyAndData'(Key,Data).
615デフォルトの名無しさん:2009/08/05(水) 12:35:12
http://pc12.2ch.net/test/read.cgi/tech/1247438792/812
# 続けて申し訳ありません
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
#
# 引数に度(degree)をとるsin_degree関数を作成しなさい。
# math.hで宣言されているsin関数を使用せずに自作すること。
616デフォルトの名無しさん: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).
617デフォルトの名無しさん:2009/08/05(水) 14:55:21
http://pc12.2ch.net/test/read.cgi/tech/1247438792/811
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 入力として与えられた文字列のアナグラム(anagram)を出力するプログラムanagram.c
# を作成せよ。
#
# % ./a.out
# String: abc
# abc acb bac bca cab cba
# %
#
# 入力する文字数が増えると計算時間はどのように変化していくかを考えよ。プログラ
ムの実行時間は、「time」コマンドを使用して計測せよ。timeコマンドの結果のうち、ユ
ーザ時間がプログラムの実行時間になります。
#
# % time ./a.out
# String: abc
# abc acb bac bca cab cba
#
# real 0m0.002s
# user 0m0.000s
# sys 0m0.001s
618デフォルトの名無しさん:2009/08/05(水) 18:25:04
>>617
% Prolog
root# time prolog -query 't617(abc)'
real  0m0.111s
user  0m0.072s
sys   0m0.040s

root# time prolog -query 't617(abcdef)'
real  0m0.116s
user  0m0.072s
sys   0m0.044s

root# time prolog -query 't617(abcdefghi)'
real  0m3.298s
user  0m2.880s
sys   0m0.416s
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t617(Atom) :-
  anagram(Atom,Anagram),
  halt,!.

anagram(Atom,Anagram) :-
  atom_chars(Atom,Chars),
  length(Chars,Len),
  findall(S,(順列(Chars,Len,L),concat_atom(L,S)),X),
  concat_atom(X,' ',Anagram).
619デフォルトの名無しさん:2009/08/05(水) 18:25:35
>>617
-- Haskell
import System.IO (hFlush, stdout)
import Data.List (permutations, intercalate, sort)

main = putStr "String: " >> hFlush stdout >> getLine >>= putStrLn . intercalate " " . sort . permutations
620デフォルトの名無しさん:2009/08/06(木) 08:42:23
http://pc12.2ch.net/test/read.cgi/tech/1247438792/853
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):データファイルからグラフの情報を読み、
# 隣接リストでグラフを記憶する。隣接リストから隣接行列と頂点の次数を表示させる問題。
# 問題の詳細、必要なファイルはzipに入れました。
# <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9884.zip" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9884.zip</a>
# 問題1
# データファイルからグラフ情報を読み込み,
# 隣接リストでグラフを記憶せよ。
# その隣接リストを参照して,隣接行列と各頂点
# の次数を表示するプログラムを作れ。ただし,
# 同一の辺は重複して定義されていないものと仮定してよい。(list_1.c)
# また、同一の辺が重複して定義されているとき,2回目以降の定義を
# 無視するように改善せよ。(list_2.c)
# データは
# http://nojiriko.asia/data/graph016_1.data
# http://nojiriko.asia/data/graph016_2.data
# http://nojiriko.asia/jpeg/rinsetsu_list.jpg にコピーさせてもらいました。
621デフォルトの名無しさん:2009/08/06(木) 10:48:31
>>620
% Prolog 題意に沿って書いてみた。

620(X) :-
  get_split_lines('graph016_1.data',[','],[_|R]),
  append(L,[_],R),
  findall(A,member([A,_],L),L1),
  findall(B,member([_,B],L),L2),
  append(L1,L2,L3),
  sort(L3,L4),
  findall([U,_次数,G],(member(U,L4),隣接行列(U,V,L1,L2,G),length(G,_次数)),X).

隣接行列(U,L,_行列) :-
  findall([U,V],隣接(U,V,L1,L2),_行列).

隣接(A,B,[A|L1],[B|L2]).
隣接(A,B,[B|L1],[A|L2]).
隣接(A,B,[_|L1],[_|L2]) :-
  隣接(A,B,L1,L2).
622デフォルトの名無しさん:2009/08/10(月) 11:32:04
http://pc12.2ch.net/test/read.cgi/tech/1247438792/894
# [1] 授業単元:
# [2] 問題文:
# 入園料は次のように定められている。ソースコードに続けて完成させなさい
# 1、5歳以下は無料
# 2、15歳以下は100円
# 3、15歳以上の場合、男性は200円、女性は150円
#
# #include<stdio.h>
#
# #define MALE 1
# #define FEMALE 2
#
# int price( int age, int s);
#
# int main(){
623デフォルトの名無しさん:2009/08/10(月) 11:38:40
http://pc12.ch.net/test/read.cgi/tech/1247438792/871
# #define _CRT_SECURE_NO_DEPRECATE 1 /* VisualC++2005 での警告抑制 */
# #pragma warning ( disable: 4996 )
# #include <stdio.h>
# ////////////////////////////////////////////////////////////////////////
# //
# // 月と日を入力させて、その星座を表示するプログラムを作成すること
# //
# // void main(void)
# {
# int month;
# int day;
#
# printf("誕生日を入力してください\n");
# printf("月:");
# // scanf()
# printf("日:");
# // scanf()
# // 月日より星座を判定して、表示
# // あなたの星座は、XX座です
# }
624デフォルトの名無しさん:2009/08/10(月) 13:25:26
http://ime.nu/pc12.ch.net/test/read.cgi/tech/1247438792/887
# [1] 授業単元:ic論
# [2] 問題文
# キーボードから入力した二つの単語を辞書的順序に表示するプログラムを作れ。
# 条件は
# ・関数の呼び出しを使う(main関数とstrcomp関数を使う)
# ・ポインタを使う
# ・配列を使う
#
# ・例は
# 「2つの単語を入力してください。
#  red,green
#
#
# 辞書順序で並び替えるとgreen、redの順になります。」
625デフォルトの名無しさん:2009/08/12(水) 09:02:15
>>624
% Prolog quick_sortの中でsub_atom/5で分類する例
http://nojiriko.asia/prolog/t624.html
626デフォルトの名無しさん:2009/08/12(水) 11:00:29
>>623
% Prolog

星座判定(_月,_日,_星座) :-
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 >= _月下限,
_日 >= _日下限,
_月 =< _月上限,
_日 =< _日上限.

星座(牡牛座,4/21-5/21).
星座(双子座,5/22-6/21).
星座(蟹座,6/22-7/22).
星座(獅子座,7/23-8/22).
星座(乙女座,8/23-9/23).
星座(天秤座,9/24-10/23).
星座(蠍座,10/24-11/22).
星座(射手座,11/23-12/21).
星座(山羊座,12/22-12/31).
星座(山羊座,1/1-1/20).
星座(水瓶座,1/21-2/18).
星座(魚座,2/19-3/20).
627626:2009/08/12(水) 11:03:38
>>626
大間違い。書き直します。
628627:2009/08/12(水) 11:22:21
>>627
% Prolog 訂正 旅先で、全角スペースが入らないのでちょっと見にくい。
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月下限,
_月 = _月上限,
_日 >= _日下限,
_日 =< _日上限,!.
星座判定(_月,_日,_星座) :-
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月下限,
_日 >= _日下限,!.
星座判定(_月,_日,_星座) :-
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月上限,
_日 =< _日上限,!.
629デフォルトの名無しさん:2009/08/12(水) 14:51:02
>>627
% コピペでなんとかなった。

星座判定(_月,_日,_星座) :-
  星座(_星座,_月下限/_日下限-_月上限/_日上限),  星座(_星座,_月下限/_日下限-_月上限/_日上限),
  _月 = _月下限,
  _月 = _月上限,
  _日 >= _日下限,
  _日 =< _日上限,!.
星座判定(_月,_日,_星座) :-
  星座(_星座,_月下限/_日下限-_月上限/_日上限),
  _月 = _月下限,
  _日 >= _日下限,!.
星座判定(_月,_日,_星座) :-
  星座(_星座,_月下限/_日下限-_月上限/_日上限),
  _月 = _月上限,
  _日 =< _日上限,!.

星座(牡牛座,4/21-5/21).
星座(双子座,5/22-6/21).
星座(蟹座,6/22-7/22).
星座(獅子座,7/23-8/22).
星座(乙女座,8/23-9/23).
星座(天秤座,9/24-10/23).
星座(蠍座,10/24-11/22).
星座(射手座,11/23-12/21).
星座(山羊座,12/22-12/31).
星座(山羊座,1/1-1/20).
星座(水瓶座,1/21-2/18).
星座(魚座,2/19-3/20).
630デフォルトの名無しさん:2009/08/13(木) 16:02:10
http://pc12.2ch.net/test/read.cgi/tech/1247438792/956
# [1] 授業単元: C言語課題
# [2] 問題文(含コード&リンク):
#
# 入力した値を n とし、階乗の逆数の和
# 1 + 1/1! + 1/2! + 1/3! + ...... + 1/n! と、
# ネピア数(M_E)との比を計算し、小数点以下第 6 位
# まで求めて表示しなさい。繰り返しは for 文を使わず
# while 文か do-while 文を利用して作成すること。
#
631デフォルトの名無しさん:2009/08/13(木) 16:53:23
http://pc12.2ch.net/test/read.cgi/tech/1247438792/964
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9898.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9898.txt</a>
# 課題:
# 文字数・単語数・行数を数えるプログラム
# 内容:
# 指定されたファイルに含まれる、
# ・行数
# ・文字数
# ・文字毎の出現回数
# ・単語数
# ・単語毎の出現回数
# を判定し、ディスプレイ表示させる。
#
# 単語については、1単語をどのように判定するかの定義付けをし、
# その定義に従って単語を取り出す。
# 指定ファイル: http://nojiriko.asia/data/You_Raise_Me_Up.txt にコピーさせてもらいました。
632デフォルトの名無しさん:2009/08/13(木) 20:54:51
633デフォルトの名無しさん:2009/08/15(土) 17:07:21
634デフォルトの名無しさん:2009/08/19(水) 07:23:08
http://pc12.2ch.net/test/read.cgi/tech/1250204272/42
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):問題の基準に従い、
# 任意のローカルフォルダに置いた、指定したwords.txtの指定行から
# 指定した行数の英単語を読み込み、
# マージソートをして表示するプログラムを作成せよ。
# 同じようにヒープソートや基数ソートのプログラムも作成せよ。
# 問題の定義は<a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9906.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9906.txt</a>
# 指定されたwords.txtは
# http://nojiriko.asia/data/words.txt にコピーさせていただきました。
635デフォルトの名無しさん:2009/08/19(水) 07:37:14
>>634
辞書順の定義が変だなぁ。"aaa" < "az" が普通だろう。
636デフォルトの名無しさん:2009/08/19(水) 11:02:51
637デフォルトの名無しさん:2009/08/21(金) 04:13:26
http://pc12.2ch.net/test/read.cgi/tech/1250204272/57
# [1] 授業単元:C言語プログラミング
# [2] 問題文(含コード&リンク):10×10マスの碁盤の内から、scanf命令で
# 入力した2値をx,y座標として、
# その座標部分を塗りつぶし四角"■"で表示しなさい。
# それ以外は"□"でマス表示するものとします。
# 両者とも0から9までが入力されるものとします(エラー判定不要)。
# 入力時の問い合わせメッセージは自由に表示させて下さい。
638デフォルトの名無しさん:2009/08/21(金) 07:42:39
>>637
% Prolog
t637 :-
findall(L,(for(1,N,10),length(10,L),all('□',L)),_盤面),
着手(X,Y),
現在の盤面(_盤面,X,Y,_着手された盤面).
t637.

着手(X,Y) :-
get_line(Line),
split(Line,[' ',','],[X_0,Y_0]),
X is X_0 + 1,
Y is Y_0 + 1,!.

現在の盤面(_盤面,X,Y,_着手された盤面) :-
行列の置換(Y,X,'■',_盤面,_着手された盤面),
盤面表示(_着手された盤面).
現在の盤面(_盤面,X,Y,_着手された盤面) :-
行列の置換(Y,X,'■',_盤面,_着手された盤面_1),
着手(X2,Y2),
現在の盤面(_着手された盤面_1,X2,Y2,_着手された盤面).

盤面表示(_盤面) :-
reverse(_盤面,_原点位置を左下に修正した盤面),
盤面表示の二(_原点位置を左下に修正した盤面),!.

盤面表示の二([]) :- !.
盤面表示の二([L|R]) :-
concat_atom(L,_表示升列アトム),
write_formatted('%t\n',[_表示升列アトム]),
盤面表示の二(R).
639デフォルトの名無しさん:2009/08/21(金) 07:46:28
>>637
% Prolog 表示し直し
t637 :-
  findall(L,(for(1,N,10),length(10,L),all('□',L)),_盤面),
  着手(X,Y),
  現在の盤面(_盤面,X,Y,_着手された盤面).
t637.

着手(X,Y) :-
  get_line(Line),
  split(Line,[' ',','],[X_0,Y_0]),
  X is X_0 + 1,
  Y is Y_0 + 1,!.

現在の盤面(_盤面,X,Y,_着手された盤面) :-
  行列の置換(Y,X,'■',_盤面,_着手された盤面),
  盤面表示(_着手された盤面).
現在の盤面(_盤面,X,Y,_着手された盤面) :-
  行列の置換(Y,X,'■',_盤面,_着手された盤面_1),
  着手(X2,Y2),
  現在の盤面(_着手された盤面_1,X2,Y2,_着手された盤面).

盤面表示(_盤面) :-
  reverse(_盤面,_原点位置を左下に修正した盤面),
  盤面表示の二(_原点位置を左下に修正した盤面),!.

盤面表示の二([]) :- !.
盤面表示の二([L|R]) :-
  concat_atom(L,_表示升列アトム),
  write_formatted('%t\n',[_表示升列アトム]),
  盤面表示の二(R).
640デフォルトの名無しさん:2009/08/21(金) 11:23:23
>>637 >>639
まちがえた。
t637(_着手された盤面) :-
  findall(L,(for(1,N,10),length(10,L),all('□',L)),_盤面),
  着手(X,Y),
  現在の盤面(_盤面,X,Y,_着手された盤面).
t637(_).

にしないと第二手から以降がつづかない。
641デフォルトの名無しさん:2009/08/27(木) 04:29:42
http://pc12.2ch.net/test/read.cgi/tech/1250204272/83
# [1] 授業単元:プログラミング
# [2] 問題文: 2が一番小さい素数,3が2番目に小さい・・・i番目に小さい素数を
# 返す関数nthprime(i)を作り、
# 再帰呼び出しを利用した形で書け。この関数を用いて、1〜100番目の素数までを
# 表示させよ
642デフォルトの名無しさん:2009/08/27(木) 04:31:21
http://pc12.2ch.net/test/read.cgi/tech/1250204272/82
# [1] 授業単元:プログラミング
# [2] 問題文 クワインマクラスキー法をC言語で実現
643デフォルトの名無しさん:2009/08/27(木) 04:38:38
http://pc12.2ch.net/test/read.cgi/tech/1247636661/950
# 表A
# 開始日    終了日
# --------------------
# 2009/9/1  2009/9/2
# 2009/9/2  2009/9/5
# 2009/9/2  2009/9/3
#
# 表B
# 基準日 9/1 9/2 9/3 9/4 9/5
# 開始日  1  3  3  3  3
# 終了日  0  1  2  2  3
#
# 表Aの開始日と終了日をカウントして、基準日に該当する件数を書き出したいのですが

# 関数はVLOOKUPを使えばいいのでしょうか?
# 件数は累計を表示したいのですが、どの関数を使えばいいのでしょうか?
644デフォルトの名無しさん:2009/08/27(木) 09:29:04
645デフォルトの名無しさん:2009/08/27(木) 09:53:06
646デフォルトの名無しさん:2009/08/27(木) 12:17:57
http://pc12.2ch.net/test/read.cgi/tech/1250204272/89
# [1] 授業単元:プログラミング演習
# [2] 問題文:構造体triangeleはメンバとして、
# 各頂点の座標を表す構造体pointのp1,p2,p3を持つ。
# また関数show_triangleはtriangleの内容を表示する。
# 乱数を利用してtriangleのインスタンスを1つ作成し、
# 関数show_trianglwを利用して、その内容を表示せよ。
647デフォルトの名無しさん:2009/08/27(木) 15:34:11
648デフォルトの名無しさん:2009/08/28(金) 04:03:55
http://pc12.2ch.net/test/read.cgi/tech/1250204272/96
# 入力した単語(英語・日本語)について,
# 会話を想定し何らかの応答を表示するプログラム(人工知能プログラム)を作成せよ.
# 想定会話シーンとして,その名称をプログラム実行時の冒頭に表示せよ.
# 応答する単語数の制限は特には設けない.
649デフォルトの名無しさん:2009/08/29(土) 05:33:45
Prologによる回答を保存している nojiriko.asia サイトのサーバが
落雷事故で昨夜故障しました。復旧は9月2日になると思います。
650名無しさん@そうだ選挙に行こう:2009/08/30(日) 05:15:03
http://pc12.2ch.net/test/read.cgi/tech/1250204272/127
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
# ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9914.txt
# 問.
# 外径、内径、高さの値を入力して、中空円筒の体積を計算するプログラムを
# C言語で作成する。
#
# (仕様) 外径:入力データ、倍精度型実数、変数名r1
# 内径:入力データ、倍精度型実数、変数名r2
# 高さ:入力データ、倍精度型実数、変数名h
# 中空円筒の体積:出力データ、倍精度型実数、変数名V
#
# ちなみに、体積はV=円周率×高さ×(外径の2乗-内径の2乗)です
651名無しさん@そうだ選挙に行こう:2009/08/30(日) 05:19:22
>>650
% Prolog

円周率(3.14159).

中空円筒の体積(_高さ,_外径,_内径,_中空円筒の体積) :-
  円周率(_円周率),
  _中空円筒の体積 is _円周率 * _高さ * (_外径 ^ 2 - _内径 ^ 2).
652デフォルトの名無しさん:2009/09/02(水) 05:28:21
nojiriko.asia サイトの復旧が週末まで遅れそうなので一時的に
prolog.asia/html/ サイトにhtmlファイルをコピーしてあります。
http://prolog.asia/html/prolog/index.html が索引です。
今週中は一部 jpeg、textファイルを除きこのサイトで参照できます。
653デフォルトの名無しさん:2009/09/02(水) 06:00:16
http://pc12.2ch.net/test/read.cgi/tech/1248012902/157
# 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/787.txt
# 行列や固有値を扱う数値計算の課題です。
#
# 逆反復法(逆べき乗法)とLU分解を用いて、固有値問題を解く。
# 与える行列Aはn*n行列で、4*4や5*5でも、自由に数値を定めて良い。
# 1)一番小さい固有値に対応する固有ベクトルsVを求める。
# 2)二番目に小さい固有値に対応する固有ベクトルVを求める。
# double [] gauss(double[][] A , double[] b)
# のような形を作り、
# LU分解のメソッドを逆べき乗法のメソッドでコールするようにする。
# (あらかじめAをLU分解しておき、連立一次方程式を解いて反復するため)
# 解はdouble[]の形のベクトルで、for文の中でSystem.out.printを回して出力。
# ここまでが最低ライン。可能ならば
# ベクトル集合V=(v1,v2,....vn)において、
# Vi < 0 のときは-1のラベルを、
# Vi >=0 のときは 1のラベルをつける。
654デフォルトの名無しさん:2009/09/03(木) 07:28:35
http://pc12.2ch.net/test/read.cgi/tech/1250204272/176
# [1]講座名:やさしいC言語
# [2]
# (1) 「ようこそC言語へ」という文字列を表示し改行するコード
# printf関数を使う。
# (2)「 ようこそC言語へ」と表示し改行してから「C言語をはじめましょう」
# と表示し改行するコード。ただしprintfは一回しか使ってはならない。
% Prologでまったりスレに誤爆してしまって、遅くなりました。
655デフォルトの名無しさん:2009/09/03(木) 07:30:44
>>654
% Prolog

654(1) :- write_formatted('%t\n',[ようこそC言語へ]).

654(2) :- write_formatted('%t\n%t\n',[ようこそC言語へ,'C言語をはじめましょう']).
656デフォルトの名無しさん:2009/09/03(木) 08:53:42
http://pc12.2ch.net/test/read.cgi/tech/1250204272/188
# [1] 授業単元:C言語入門
# [2] 問題文(含コード&リンク):
#   入力した任意の小数5つを降順にソートし出力する
# [3] 環境
#  [3.1] OS: Windows
#  [3.2] コンパイラ名とバージョン: VC
#  [3.3] 言語: C
# [4] 期限: 本日中
# [5] その他の制限:初心者用講座 配列を用いる
657デフォルトの名無しさん:2009/09/03(木) 09:37:50
658デフォルトの名無しさん:2009/09/03(木) 19:29:52
>>656
-- Haskell

import Data.List (sort)
main = lines `fmap` getContents >>= print . reverse . sort . map (read :: String -> Double) . take 5
659デフォルトの名無しさん:2009/09/05(土) 03:33:08
nojiriko.asia サイトが復旧したので、これからは再びこちらに保護します。
t650.html t654.html t656.html index.html はそれぞれ
http://nojiriko.asia/prolog/t650.html
http://nojiriko.asia/prolog/t654.html
http://nojiriko.asia/prolog/t656.html
http://nojiriko.asia/prolog/index.html
になります。
660デフォルトの名無しさん:2009/09/08(火) 00:45:17
http://pc12.2ch.net/test/read.cgi/tech/1250204272/236
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
# 任意の数xの例で説明すると(x-1)!+1 がもしxで割り切れるならばxは素数であると
# 言え、割り切れないならばxは、素数ではないと言える。
# このような素数を判別することができる定理をウィルソンの定理と呼ぶ。
#
# 入力した値の階乗を求めるプログラム(4桁まで対応)を改良して、ウィルソン
# の定理による素数判定を実装せよ。
# <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/
9928.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyf
ul/img/9928.txt</a>
#
# 素数ならば素数です。素数でないならば素数ではありません。と表示しなさい。
661デフォルトの名無しさん:2009/09/08(火) 00:59:52
>>660
% Prolog

ウィルソンの定理による素数判定(X,素数です) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  0 is (Z + 1) // X,!.
ウィルソンの定理による素数判定(X,素数ではありません) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  not(0 is (Z + 1) // X),!.

階乗保存計算(0,1) :- !.
階乗保存計算(1,1) :- !.
階乗保存計算(N,X) :-
  N2 is N - 1,
  階乗保存計算(N2,Y),
  X is N * Y,
  asserta((階乗保存計算(N,X) :- !)).
662デフォルトの名無しさん:2009/09/08(火) 03:13:40
>>661
多倍長整数演算が必須だね。K-Prologとか。それでどのくらいまで
だせるかな?
663デフォルトの名無しさん:2009/09/08(火) 04:22:53
>>660
-- Haskell

fact :: Integer -> Integer
fact n = foldl1 (*) [1..n]

isPrime :: Integer -> Bool
isPrime x = (fact (x-1) + 1) `mod` x == 0

main = print $ filter isPrime [2..30]
664661:2009/09/08(火) 05:13:52
% Prolog 間違えがありました。 >>663が来なければきっと気がつかなかった。

ウィルソンの定理による素数判定(X,素数です) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  0 is (Z + 1) mod X,!.
ウィルソンの定理による素数判定(X,素数ではありません) :-
  X > 0,
  Y is X - 1,
  階乗保存計算(Y,Z),
  not(0 is (Z + 1) mod X),!.

階乗保存計算(0,1) :- !.
階乗保存計算(1,1) :- !.
階乗保存計算(N,X) :-
  N2 is N - 1,
  階乗保存計算(N2,Y),
  X is N * Y,
  asserta((階乗保存計算(N,X) :- !)).
665デフォルトの名無しさん:2009/09/08(火) 05:21:26
http://pc12.2ch.net/test/read.cgi/tech/1248012902/196
# 【 課題 】
# 1.
# キーボードから次々に非負整数の入力を受け付け、
# それらの中での正の最小値を表示するプログラムを作成せよ。
# データ入力の終わりは負の整数の入力とする。
# 2.
# キーボードから次々に非負整数の入力を受け付け、
# それらの中での(正の)偶数、奇数、ゼロが
# それぞれ何個ずつであったのかを*の数で表示するプログラムを作成せよ。
# データ入力の終わりは負の整数の入力とする。
666デフォルトの名無しさん:2009/09/08(火) 06:17:07
>>665
% Prolog 課題 1.

t665(1) :-
  最初の非負整数を得る(N),
  正の最小値を表示する(N,N).

最初の非負整数を得る(N) :- repeat,get_line(X),atom_to_term(X,N,_),N >= 0,!.

正の最小値を表示する(N,_現在までの最小値) :- N < 0,!,write_formatted('最小値 = %t\n',[_現在までの最小値]).
正の最小値を表示する(N,_現在までの最小値) :-
  N < _現在までの最小値,
  整数を得る(M),
  正の最小値を表示する(M,N).
正の最小値を表示する(N,_現在までの最小値) :-
  N >= _現在までの最小値,
  整数を得る(M),
  正の最小値を表示する(M,_現在までの最小値).

整数を得る(N) :-
  repeat,
  get_line(X),
  atom_to_term(X,N,_),
  integer(N),!.
667デフォルトの名無しさん:2009/09/08(火) 06:35:50
t665(2) :-
  最初の非負整数を得る(N),
  偶数、奇数、ゼロがそれぞれ何個あったか(N,0,0,0).

偶数、奇数、ゼロがそれぞれ何個あったか(N,_偶数の個数,_奇数の個数,_0の個数) :-
  N < 0,!,
write_formatted('偶数 %t個,奇数 %t個,ゼロ %t個\n',[_偶数の個数,_奇数の個数,_
0の個数]).
偶数、奇数、ゼロがそれぞれ何個あったか(0,_偶数の個数,_奇数の個数,_0の個数) :-
  整数を得る(M),
  _新しい0の個数 is _0の個数 + 1,
  偶数、奇数、ゼロがそれぞれ何個あったか(M,_偶数の個数,_奇数の個数,_新しい0の
個数),!.
偶数、奇数、ゼロがそれぞれ何個あったか(N,_偶数の個数,_奇数の個数,_0の個数) :-
  0 is N mod 2,
  整数を得る(M),
  _新しい偶数の個数 is _偶数の個数 + 1,
  偶数、奇数、ゼロがそれぞれ何個あったか(M,_新しい偶数の個数,_奇数の個数,_0の
個数),!.
偶数、奇数、ゼロがそれぞれ何個あったか(N,_偶数の個数,_奇数の個数,_0の個数) :-
  1 is N mod 2,
  整数を得る(M),
  _新しい奇数の個数 is _奇数の個数 + 1,
  偶数、奇数、ゼロがそれぞれ何個あったか(M,_偶数の個数,_新しい奇数の個数,_0の
個数),!.
668デフォルトの名無しさん:2009/09/08(火) 13:24:12
>>665
-- Haskell

import Control.Monad.Writer

t665 :: WriterT [Int] IO ()
t665 = do
n <- liftIO readLn
when (n >= 0) $ tell [n] >> t665

main = do
ns <- execWriterT t665
-- 1
print $ maximum ns

-- 2
putStr "even: " >> putStr (count even ns) >> putStrLn ""
putStr "odd : " >> putStr (count odd ns) >> putStrLn ""
putStr "zero: " >> putStr (count (== 0) ns) >> putStrLn ""
where
count p xs = replicate (length $ filter p xs) '*'
669デフォルトの名無しさん:2009/09/08(火) 18:03:18
http://pc12.2ch.net/test/read.cgi/tech/1250204272/295
# [1] 授業単元:画像処理
# [2] 問題文(含コード&リンク):画像を読み込んで1次・2次微分を行い、
#   エッジ抽出処理を行うプログラムを作りなさい。
670おじいちゃんへ:2009/09/08(火) 22:00:40
おじいちゃん、三四郎がいいソフトだっていうのは前々から分かっているだから
チョコレート嫌いとかいつまでも言ってないで。
671デフォルトの名無しさん:2009/09/11(金) 19:02:36
http://pc12.2ch.net/test/read.cgi/tech/1250204272/335
# 1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク): <a href="http://ime.nu/kansai2channeler.hp.inf
oseek.co.jp/cgi-bin/joyful/img/9935.txt" target="_blank">http://kansai2channele
r.hp.infoseek.co.jp/cgi-bin/joyful/img/9935.txt</a>
# 問題文
#
# 以下のプログラムを作成せよ。
# プログラムを実行すると、「文字列を入力してください」と表示されるので、文字列
# strを入力する。次に「どの文字を削除しますか?」と表示されるので、削除したい文字
# cを入力する。すると文字列strから文字cを削除した文字列を表示し、「削除した
# 文字は?文字です」と出力する。
672デフォルトの名無しさん:2009/09/11(金) 19:31:32
>>671
% Prolog

t671 :-
  write('文字列を入力してください : '),
  get_line(Str),
  write('どの文字を削除しますか? : '),
  get_char(C),
  atom_chars(Str,Chars),
  ならびから削除する(C,Chars,_削除されたChars),
  atom_chars(_削除されたStr,_削除されたChars),
  write_formatted('削除された文字列は: %t\n',[_削除されたStr]),
  write_formatted('削除した文字は %t 文字です\n',[C]),!.

ならびから削除(_,[],[]) :- !.
ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび)
 :-
  ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!.
ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび])
 :-
  ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!.
673デフォルトの名無しさん:2009/09/12(土) 06:28:44
ならびから削除する(C,Chars,_削除されたChars),
は、
ならびから削除(C,Chars,_削除されたChars),
だね。
674デフォルトの名無しさん:2009/09/13(日) 04:27:32
http://pc12.2ch.net/test/read.cgi/tech/1250204272/381
# [1] 授業単元: 情報工学:数理I
# [2] 問題文(含コード&リンク): ガウス行列を既約ガウス行列に変形する関数を定義せよ
675デフォルトの名無しさん:2009/09/13(日) 04:42:39
676デフォルトの名無しさん:2009/09/13(日) 19:13:15
http://pc12.2ch.net/test/read.cgi/tech/1250204272/390
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9936.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9936.txt</a>
#
# 課題:
# 「単語」とはどういうものかと定義し、その定義に従って指定されたファイルから
# 単語を取り出し、表示させる。また、単語の個数も表示させる。
#
# 制約:
# ファイルオープン・クローズを使う。
# 関数化を行う。
# 指定ファイル(ファイル名:sample.txt):
# You Raise Me Up by Secret Garden
677デフォルトの名無しさん:2009/09/13(日) 19:16:17
http://pc12.2ch.net/test/read.cgi/tech/1250204272/392
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9937.txt
#
# 1以上の正の整数の値をキーボードから入力し、1からNまでの和を求める
# プログラムをC言語で作成する。
# それと、キーボードから100を入力すると答えはいくらなるか。
678デフォルトの名無しさん:2009/09/14(月) 04:56:52
>>677
% Prolog
677 :-
get_integer('\n整数を入力してください :',N >= 1,N),
t677_1(1,N,0,X),
write_formatted('1から%tまでの和は : %t です\n',[N,N]).

t677_1(M,N,S,S) :- M > N,!.
t677_1(M,N,Y,X) :-
M2 is M + 1,
Y2 is Y + M,
t677_1(M2,N,Y2,X).

get_integer(Prompt,_条件,N) :-
repeat,
write(Prompt),
get_line(Line),
atom_to_term(Line,N,_),
get_integer_2(N),
_条件,!.

get_integer_2(N) :-
integer(N),!.
get_integer_2(N) :-
write(整数ではありません),fail.
679デフォルトの名無しさん:2009/09/14(月) 04:59:05
>>677 表示し直し
% Prolog
t677 :-
  get_integer('\n整数を入力してください :',N >= 1,N),
  t677_1(1,N,0,X),
  write_formatted('1から%tまでの和は : %t です\n',[N,N]).

t677_1(M,N,S,S) :- M > N,!.
t677_1(M,N,Y,X) :-
  M2 is M + 1,
  Y2 is Y + M,
  t677_1(M2,N,Y2,X).

get_integer(Prompt,_条件,N) :-
  repeat,
  write(Prompt),
  get_line(Line),
  atom_to_term(Line,N,_),
  get_integer_2(N),
  _条件,!.

get_integer_2(N) :-
  integer(N),!.
get_integer_2(N) :-
  write(整数ではありません),fail.
680デフォルトの名無しさん:2009/09/15(火) 03:03:14
http://pc12.2ch.net/test/read.cgi/tech/1250204272/412
# [1] 授業単元:C言語・基礎応用
# [2] 問題文(含コード&リンク):
# <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9940.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9940.txt</a>

# //プロトタイプの宣言//
# void DataSave(void);
# void DataLoad(void);
#
# //グローバル変数の宣言//
# g_aData[20] = {1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4};
#
# グローバル変数に格納された配列の数字列を読み込んで
# ランレングス符号化を行い、バイナリデータとして
# 圧縮・解凍するプログラムを作成せよ。
681デフォルトの名無しさん:2009/09/15(火) 03:32:27
>>680
% Prolog
ランレングス符号化圧縮(L1,[A,Len|R]) :-
  先頭から同一要素(L1,[A|R1],R2),
  length([A|R1],Len),
  ランレングス符号化圧縮(R2,R).

ランレングス符号化解凍([],[]) :- !.
ランレングス符号化解凍([A,Len|R1],L) :-
  ランレングス符号化解凍の二(L,Len,A,R2),
  ランレングス符号化解凍(R1,R2).

先頭から同一要素([],[],[]) :- !.
先頭から同一要素([A,A|R],[A|R2],R3)
 :-
  先頭から同一要素([A|R],R2,R3),!.
先頭から同一要素([A|R],[A],R)
 :-
  not([A|_]=R),!.

ランレングス符号化解凍の二([A|R],1,A,R) :- !.
ランレングス符号化解凍の二([A|R1],M,A,R) :-
  M1 is M - 1,
  ランレングス符号化解凍の二(R1,M1,A,R).
682デフォルトの名無しさん:2009/09/15(火) 04:07:24
http://pc12.2ch.net/test/read.cgi/tech/1251609039/309
#
# 同じ長さの直線で疑似的に円を描きたい場合、どのような計算式がありますでしょうか?
#
683デフォルトの名無しさん:2009/09/15(火) 19:26:43
>>682
% Prolog
同じ長さの直線で擬似的に円を描きたい場合の計算(_,_角度,_,[]) :- _角度 > 3.14159,!.
同じ長さの直線で擬似的に円を描きたい場合の計算(_半径,_角度,_変位,[[X1,Y1,X2,Y2]|R]) :-
  _角度2 is _角度 + _変位,
  X1 is _半径 * cos(_角度),
  Y1 is _半径 * sin(_角度),
  X2 is _半径 * cos(_角度2),
  Y2 is _半径 * sin(_角度2),
  同じ長さの直線で擬似的に円を描きたい場合の計算(_半径,_角度2,_変位,R).
684デフォルトの名無しさん:2009/09/16(水) 03:01:40
http://pc12.2ch.net/test/read.cgi/tech/1250204272/416
# 【質問テンプレ】
# [1] 二次元配列
# [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9944.txt
# 二次元配列 奇数偶数 魔方陣
# 入力した数字の法人に対して1〜11までの値をある法則通りに格納し、
# 縦横斜めどのれつの合計値もすべて同じになる奇数魔方陣を作成する。
# ただし以下のことを法則とする。
# 奇数魔方陣の作り方
# 初期値(1)は真ん中の列の最上位置に格納すること。
# 数値は1ずつ加算する。加算ごとに右上に格納する
# 右側へはみ出した場合、はみ出した行の最左端セルへいく
# 上にはみ出した場合、はみ出した同列の最下位セルにいく
# 格納するセルがすでに埋まっていた場合ははみ出したセルの一つしたに格納する
# 下側にはみだしたらはみ出した列の最上位セルへいく
# ・偶数魔方陣も作成すること (法則はネットに書いてあるのでいいっぽいです。対角線上のやつ?)
# ・12以上の数字が入力された場合は再入力を求める。
685デフォルトの名無しさん:2009/09/16(水) 15:36:45
686デフォルトの名無しさん:2009/09/17(木) 12:07:23
687デフォルトの名無しさん:2009/09/18(金) 03:16:12
http://pc12.2ch.net/test/read.cgi/tech/1250204272/420
# [1] 授業単元:プログラミング基礎
# [2] 問題文(含コード&リンク):
# 車のナンバーや電車の切符の裏などにある4桁の数字。その数字を四則演算し10にす
るというクイズを解くプログラムをお願いします。
# 1 2 3 4 と言う4つの数字であれば、すべて足せば10になりますし
# 2 3 5 7 は{(3+7)/2+5}で10になります。
#
# 数字の順番は変えてもOK(上のように2357を3725と並び替えている)
# 二つの数字をくっつけて1つにしてもOK(0 0 1 2を20-10)
#
# 数字を4つ入力し、全パターンを出力するプログラムをお願いします。
688デフォルトの名無しさん:2009/09/18(金) 04:30:44
>>687
% Prolog
t687(L,_式) :-
  順列(L,4,L1),
  t687_1(L1,_式,10).

t687_1([A],A,A).
t687_1([A,B|R1],_式,X) :-
  C is 10 * A + B,
  t687_1(R1,_式_2,Y),
  t687_2(C,_関数,Y,X),
  _式 =.. [_関数,C,_式_2].
t687_1([A|R1],_式,X) :-
  t687_1(R1,_式_2,Y),
  t687_2(A,_関数,Y,X),
  _式 =.. [_関数,A,_式_2].

t687_2(A,+,B,X) :-
  X is A + B.
t687_2(A,-,B,X) :-
  X is A - B.
t687_2(A,*,B,X) :-
  X is A * B.
t687_2(A,//,B,X) :-
  0 is A mod B,
  X is A // B.
689デフォルトの名無しさん:2009/09/18(金) 04:51:55
>>688 t687_1の第二節。
t687_1([A,B|R1],_式,X) :-
でR1が[]になった時の選択節がないなぁ。武骨に、
687_1([A,B],[C],X) :-
  C is 10 * A + B.
687_1([A,B|R1],_式,X) :-
  \+(R1=[]),
  C is 10 * A + B,
  t687_1(R1,_式_2,Y),
  t687_2(C,_関数,Y,X),
  _式 =.. [_関数,C,_式_2].

としなくてはならないか。
690デフォルトの名無しさん:2009/09/18(金) 07:08:40
ごめん。

687_1([A,B],C,X) :- C is 10 * A + B.

だ。無駄にひとつレスを使ってしまった。
691デフォルトの名無しさん:2009/09/19(土) 07:31:04
http://pc12.2ch.net/test/read.cgi/tech/1250204272/432
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9948.txt
#
# 以下のプログラムを作成せよ
# ファイル data.txt を探し、そこに人の名前(空欄は含まない)と生年月日
# を追記していくプログラムを作成せよ。一人のデータが入力されたら次の人の
# データも連続して入力できるように工夫せよ。
# 形式は以下のようにする。
# taro 1985 06 23
# Jiro 1983 07 31
# 課題達成条件は
# 半角の名前と生年月日(三つの数字)が各人に対して記録できる
# 一人分のデータが一行で記録されている
# 一回の実行で、複数のデータを連続して入力できる。毎回続けて入力するか
# 尋ねるか、または、はじめに入力する人数を聞くか、もしくは別の方法でもよい。
# 実行を繰り返すたびに、生年月日の登録人数は増えていく(データは追記されていく)
692デフォルトの名無しさん:2009/09/19(土) 09:00:51
>>691
% Prolog (入力検査なし版)
t691 :-
  write('何組の名前と生年月日を入力しますか? : '),
  get_line(Line1),
  atom_to_term(Line1,_組,_),
  open('data.txt',append,Outstream),
  for(1,N,_組),
  write('%t\n%t のように\n',['taro 1985 06 23','Jiro 1983 07 31']),
  write('名前(半角)と生年月日(三つの数字)を空白で区切り入力してください: '),
  get_line(Line2),
  write_formatted(Outstream,'%t\n',[Line2]),
  N = _組,
  close(Outstream).
693デフォルトの名無しさん:2009/09/20(日) 05:21:12
http://pc12.2ch.net/test/read.cgi/tech/1250204272/436
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9949.txt
# 1. double x[3],y[3](成分はscanf)の内積を求めるプログラム
# 2. 数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示するプログラム
# 3. 「正数を入力してください」と表示し、入力した数字nが素数かどうかを判断するプログラム
694デフォルトの名無しさん:2009/09/20(日) 07:46:59
>>693
% Prolog

内積([],[],0).
内積([A|R1],[B|R2],X) :-
  内積(R1,R2,Y),
  C is A * B,
  X is Y + C.

'数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示する'(Max,X) :-
  findsum(Y,(for(1,N,Max),Y is 2 ^ N)),X).

素数かどうか判断する :-
  write('正数を入力してください : '),
  repeat,
  get_line(Line),
  atom_to_term(Line,N,_),
  integer(N),
  N > 0,
  素数である(N),!.

素数である(N) :-
  N2 is N // 2,
  for(2,M,N2),
  0 is N mod M,
  !,
  fail.
素数である(_).
695デフォルトの名無しさん:2009/09/20(日) 10:38:11
http://pc12.2ch.net/test/read.cgi/tech/1250204272/443
# [1] 授業単元:統計プログラミング
# [2] 問題文(含コード&リンク):
# 1.適当な方程式 y = a x + b を定め、n 個の x に対してランダムな誤差を持つ y のサンプルデータを生成するプログラムを作成せよ。
#  出力形式は、例えば改行で区切られた1行ごとにスペース区切りで x, y の値を標
準出力に書き出す。
#  ランダムな誤差に関しては、適当な範囲内の乱数を単純に各々の値に適用すればよ
い。
#  (本来は正規分布に従った乱数を用いる方が望ましい)
# 2.前問で作成したプログラムの出力から、最小二乗法により、逆に a, b を求めるプログラムを作成し、
#  求めた値に関して、前問のプログラムで設定した a, b に対する考察をせよ。
# 3.以上を二次方程式(y = a x^2 + b x + c)に対して繰り返し、a, b, c に関して考察せよ。
696デフォルトの名無しさん:2009/09/20(日) 16:31:09
http://pc12.2ch.net/test/read.cgi/tech/1248012902/231
# 【 形態 】Javaアプリケーション(main()で開始)
# 【 課題 】以下のようなサーバプログラムCountServer.javaとクライアントプログラム
# CountClient.javaを作成してください。
#
# [条件]
# ・サーバは、クライアントから文字列を受信し、その文字数をカウントして
#  結果をクライアントに返す。
# ・クライアントプログラムを実行時に、コマンドラインから、サーバホスト名
#  java CountClient サーバホスト名 "文字列"
# ・クライアントは、サーバからの結果を受け取り、画面に表示する。
# ・サーバは、ポート番号 4321 で接続要求を受け付けるようにする。
#
# サーバプログラムの実行
# >java CountServer
#
# クライアントプログラムの実行と実行結果
# >java CountClient host1 "Java Programming"
# 16
697デフォルトの名無しさん:2009/09/21(月) 03:15:13
http://pc12.2ch.net/test/read.cgi/tech/1250204272/444
# [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):比較:文字列2つ入力後、先頭から5文字を
#   比較した結果を表示しなさい
698デフォルトの名無しさん:2009/09/21(月) 04:45:34
>>697
% Prolog

t697(Atom1,Atom2,_診断ならび) :-
  sub_atom(Atom1,0,5,_,Atom1_1),
  sub_atom(Atom2,0,5,_,Atom2_1),
  findall([_診断項目,_診断結果],t697_診断(_診断項目,Atom1_1,Atom2_1,_診断結果
),_診断ならび).

t697_診断(一致,Atom1,Atom2,一致) :- Atom1 = Atom2.
t697_診断(一致,Atom1,Atom2,不一致) :- Atom1 \= Atom2.
t697_診断(大小比較,Atom1,Atom2,Op) :- compare(Op,Atom1,Atom2).

strncmp(Atom1,Atom2,N,Op) :-
  sub_atom(Atom1,0,N,_,Atom1_1),
  sub_atom(Atom2,0,N,_,Atom2_1),
  compare(Op,Atom1_1,Atom2_1).
699デフォルトの名無しさん:2009/09/21(月) 11:58:40
700デフォルトの名無しさん:2009/09/21(月) 13:30:40
701デフォルトの名無しさん:2009/09/21(月) 15:50:07
http://pc12.2ch.net/test/read.cgi/tech/1250204272/452
# [1] 授業単元:アルゴリズム c++
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9950.zip
# STLのベクタークラスを改良したクラスを実装する課題。
# 【意訳】Chainというクラスを作りなさい。Chainクラスは[2 7 -1 43]のように
#     色々なデータタイプの配列です。
# (上記はintの場合)
# STLのVectorに似たクラスをつくるのがこのプロジェクトの目的です。
# 以下の操作とそれに追随するアウトプットが行えるようにするのがゴールです。
# chain<int> a, b; // Two empty chains are created
# cout << a.length() << endl; // yields 0
# cin >> a; // User types [2 3 7]
# cout << a; // Output is [2 3 7]
# cin >> b; // User types [8 4 2 1]
# cout << a+b << endl; // Output is [2 3 7 8 4 2 1]
# cout << a+5 << endl; //Output is [2 3 7 5]
# a+=6; // a is now [2 3 7 6]
# cout << a[1] << endl; //Should printout 3
# chain<int> c(3*a); // c is initialized to
# // [2 3 7 6 2 3 7 6 2 3 7 6]
702デフォルトの名無しさん:2009/09/22(火) 06:36:49
http://pc12.2ch.net/test/read.cgi/tech/1136788500/374
# 問3. M個のデータのうち、その2番目の小さいデータと同じデータの個数を
#    求めるアルゴリズムの流れ図を示せ。
703デフォルトの名無しさん:2009/09/22(火) 06:43:15
>>702
% Prolog

t702(L,_データ,_個数) :-
n番目に小さいデータと同じデータの個数(L,2,_データ,_個数).

n番目に小さいデータと同じデータの個数(L,N番目,_データ,_個数) :-
quicksort(L,L1),
M is N番目 - 1,
length(L3,M),
append(L3,[_データ|R],L1),
findsum(1,member(_データ,[_データ|R]),_個数).

% *** user: findsum / 3 ***
findsum(_選択項,_項,_合計値) :-
findall(_選択項,_項,_値ならび),
加算(_値ならび,_合計値),!.

% *** user: '整数加算' / 2 ***
加算([],0).
加算([N|R],X) :-
加算(R,Y),
X is Y + N.
704デフォルトの名無しさん:2009/09/22(火) 06:49:27
>>702 つづき
% Prolog この場合はsortされた解は同一要素を複数個含み得る。

% *** user: quicksort / 2 ***
quicksort([X|Xs],Ys) :-
partition(Xs,X,Littles,Bigs),
quicksort(Littles,Ls),
quicksort(Bigs,Bs),
append(Ls,[X|Bs],Ys) .
quicksort([],[]).

% *** user: partition / 4 ***
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).
partition([],Y,[],[]).
705デフォルトの名無しさん:2009/09/22(火) 11:16:29
http://pc12.2ch.net/test/read.cgi/tech/1250204272/483
# [1] 授業単元:C++ STLの使い方
# [2] 問題文(含コード&リンク):
# http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9954.txt
# STLのvectorとlistを使い、以下の文章操作を行いなさい。
# (Hint:list<char>, vector<list<char> >の様に使用する)
#
# a) 文章中の一行の文字をlistに挿入し、そしてそのlistはvectorの各インデック
#   スに挿入されるものとする。
# b) listとvectorのそれぞれの中にあるデータを出力できる。
# c) 2つの行番号を入力し、その行を繋げる関数を作成しなさい。
# (line:1, line:2, result: 1と2の連結、line2は空となりresultはline1になる)
# d) 行番号を入力すると、その行の逆順序のものが出力される関数を作成しなさい。
# e) 文字列を与えると、その文字列の含まれるすべての行番号を出力する関数を
#   作成しなさい。
706デフォルトの名無しさん:2009/09/23(水) 23:20:55
>>702
import Data.Map (elemAt, fromListWith)

t702 :: Ord a => [a] -> Int
t702 = snd . elemAt 1 . fromListWith (+) . (`zip` repeat 1)
707デフォルトの名無しさん:2009/09/24(木) 17:07:59
UML関係の過去問の答えがわからないから、教えてくれ

問)配置図に置けるコンポーネントの利用方法として適切なものを選択しなさい。
1.実行ファイルの呼び出しの関係を表現する。
2.C++のソースファイルの#include(依存)の関係を表現する。
3.開発環境におけるファイル構成を表現する。
4.実行環境におけるデバイスを表現する
5.実行環境に置けるプロセッサーを表現する。
708デフォルトの名無しさん:2009/09/25(金) 05:09:12
http://pc12.2ch.net/test/read.cgi/tech/1200175247/613
# <a href="../test/read.cgi/mnewsplus/1251516247/l50">最新50</a>
# のhrefの部分と最新50の部分をぬきだすのてどうするの?
% 宿題ではなさそうだけど、>>707 をageて上げたいので採用
709デフォルトの名無しさん:2009/09/25(金) 07:53:08
>>708
% Prolog

t708(_行,_href部,_表示) :-
  split(_行,['href='],[_,S1|_]),
  split(S1,['>','<'],[_href部,_表示|_]).
710デフォルトの名無しさん:2009/09/25(金) 11:41:35
てか意図的に別な方法を採用しようとしない限り単に正規表現のレベルだな
711デフォルトの名無しさん:2009/09/25(金) 12:25:07
>>710
こういう手抜きではダメですか。HTMLやXMLの構文解析をきっちりやるべし
ということかな?
712デフォルトの名無しさん:2009/09/29(火) 11:56:28
713デフォルトの名無しさん:2009/09/29(火) 18:40:59
http://pc12.2ch.net/test/read.cgi/tech/1136788500/402
# 覆面算
# ルール1
# 文字はそれぞれの桁の文字を表す
# ルール2
# 異なる文字は異なる数字を表し、同じ文字は同じ数字を表す
# ルール3
# 左端の数字は0ではない
# ルール4
# (パズルとしては)答えが一つとなる
714デフォルトの名無しさん:2009/09/30(水) 05:08:29
http://pc12.2ch.net/test/read.cgi/tech/1250204272/567
# すみません。
#
# c言語がまだ初心者すぎてわからないのでどうかお願いします!
#
# ■プログラム1:
#
# りんごが30個中、腐っていたりんごが10個あったとき、
# 腐っていないりんごを3人で分けると、
# 一人当たりのりんごの個数は何個になるか、計算し、
# "一人あたりのりんごの個数"と"残ったりんごの個数"を
# 出力するプログラム。
715デフォルトの名無しさん:2009/09/30(水) 05:32:47
>>714
% Prolog

t714_プログラム1 :-
  一人当たりのりんごの個数(_apple_for_one),
  残ったりんごの個数(_rest),
  write_formatted('一人当たりのりんごの個数は %t個\n残りは %t個です\n',[_apple_for_one,_rest]).

りんご(30).
腐ったりんご(10).
人数(3).

腐っていないりんごの個数(_not_bad_apple) :-
  りんご(_apple),
  腐ったりんご(_bad_apple),
  _not_bad_apple is _apple - _bad_apple.
 
一人当たりのりんごの個数(_apple_for_one) :-
  腐っていないりんごの個数(_not_bad_apple),
  人数(_persons),
  _apple_for_one is _not_bad_apple // _persons.

残ったりんごの個数(_rest) :-
  腐っていないりんごの個数(_not_bad_apple),
  人数(_persons),
  _rest is _not_bad_apple mod _persons.
716デフォルトの名無しさん:2009/09/30(水) 22:08:23
http://pc12.2ch.net/test/read.cgi/tech/1250204272/571
# [1] 授業単元:
# [2] 問題文(含コード&リンク):
# 米国への船便小包の郵便料金は以下の様に定められる。小包の重さを読み込み、その
郵便料金を計算するプログラムを作成せよ。
# 但し、重量制限は20kg(20000g)までである。
#
# 1000g以下  1800円
# 10000g以下 1000gごとに550円の割り増し
# 20000g以下 1000gごとに350円の割り増し
# (例・3000g 2900円  3001g 3450円  20000g 10250円)
717デフォルトの名無しさん:2009/09/30(水) 22:37:11
>>716
% Prolog

米国への船便小包の郵便料金(_小包の重さ,1800) :-
  _小包の重さ > 0,
  _小包の重さ =< 1000,!.

米国への船便小包の郵便料金(_小包の重さ,_郵便料金) :-
  _小包の重さ > 1000,
  _小包の重さ =< 10000,
  米国への船便小包の郵便料金(1000,_1000gまでの郵便料金),
  _郵便料金 is _1000gまでの郵便料金 + ((_小包の重さ - 1000) // 1000) * 550,!.

米国への船便小包の郵便料金(_小包の重さ,_郵便料金) :-
  _小包の重さ > 10000,
  _小包の重さ =< 20000,
  米国への船便小包の郵便料金(10000,_10000gまでの郵便料金),
  _郵便料金 is _10000gまでの郵便料金 + ((_小包の重さ - 10000) // 1000) * 350,!.
718デフォルトの名無しさん:2009/10/01(木) 06:07:42
http://pc12.2ch.net/test/read.cgi/tech/1250204272/599
# [1] 授業単元:データ解析
# [2] 問題文(含コード&リンク) :
# (zip) http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9962.zip
# (問題文のみ) http://nojiriko.asia/data/t718.txt
# [5] その他の制限:AVL木についての詳細(お借りします)↓
# http://ime.nu/lecture.ecc.u-tokyo.ac.jp/~yamaguch/pub/cp2-10/what-is-search-avl.html
719デフォルトの名無しさん:2009/10/01(木) 07:58:03
http://pc12.2ch.net/test/read.cgi/tech/1250204272/596
# [1]C言語中級
# [2]
# N-Queen問題の解答の列挙をするプログラム
# 回転/鏡映で一致する複数の解は一個のみ出力すること
# Nはコマンドラインで与える。(N>=3)
#
# N-Queen問題:N個のチェスのQueenをNxNのマス目の上に並べる
# 横、縦、斜め(一般には二方向)のマスにはほかのQueenがあっては
# ならない。
720デフォルトの名無しさん:2009/10/01(木) 10:01:05
721デフォルトの名無しさん:2009/10/01(木) 10:23:43
http://pc12.2ch.net/test/read.cgi/tech/1250204272/591
# [1] 授業単元:
# [2] 問題文(含コード&リンク):半径rの3次元の球状にランダムにn個の点を置くに
はどうしたらいいですか?
722デフォルトの名無しさん:2009/10/01(木) 17:08:18
723デフォルトの名無しさん:2009/10/02(金) 03:44:45
http://pc12.2ch.net/test/read.cgi/tech/1250204272/609
# [1] 授業単元:
# [2] 問題文(含コード&リンク):イテレーターを使ってルンゲクッタ法を解く
724デフォルトの名無しさん:2009/10/02(金) 05:52:30
725デフォルトの名無しさん:2009/10/03(土) 03:03:08
http://pc12.2ch.net/test/read.cgi/tech/1250204272/610
# [1] 授業単元:c言語
# [2] 問題文
# 課題文2
# 消費税を5%とする。 2個の物を買うときに一緒に買う場合と,
# 別々に会計をする場合と 消費税の1円未満の切り捨てにより、値段が
# 変わることがある。
# 例: 税抜き価格 30円の物と50円の物を一緒に買うと、84円だが、
# 別々に会計すると、31円+52円=83円となる。
# 2個の物の税抜き価格をそれぞれ入力して、 一緒に買う場合と、
# 別々に会計をする場合の税込み合計価格を
# 表示するプログラムを作成せよ。
726デフォルトの名無しさん:2009/10/03(土) 03:06:46
http://pc12.2ch.net/test/read.cgi/tech/1248012902/287
# 【 課題 】以下のプログラムを元に標準偏差も計算できるように変更せよ。
# 数値は実数を受け入れられるようにせよ。
# データはファイルで与え1.0 2,0 3,0 4,0 5,0 を試してみよ。
# 標準偏差は全体7カラム。小数点以下5桁で表せ。
727デフォルトの名無しさん:2009/10/03(土) 04:02:02
>>726
% Prolog
最小値・最大値・標準偏差(L,_最小値,_最大値,_標準偏差) :-
  length(L,_標本数),
  算術平均(L,_算術平均),
  L = [A|R],
  最小値・最大値・標準偏差(L,_標本数,A,_最大値,A,_最小値,_算術平均,0.0,_標準偏差),!.

最小値・最大値・標準偏差([],_標本数,_算術平均,_最小値,_最小値,_最大値,_最大値,S,_標準偏差) :-
  _標準偏差 is sqrt(S / (_標本数 - 1)),!.
最小値・最大値・標準偏差([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :-
  A < _最小値1,
  S2 is (A - _算術平均) ^ 2 + S,
  最小値・最大値・標準偏差(R,_標本数,A,_最小値,_最大値1,_最大値,_算術平均,S2,V),!.
最小値・最大値・標準偏差([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :-
  A > _最大値1,
  S2 is (A - _算術平均) ^ 2 + S,
  最小値・最大値・標準偏差(R,_標本数,_最小値1,_最小値,A,_最大値,_算術平均,S2,V),!.
最小値・最大値・標準偏差([A|R],_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S,V) :-
  S2 is (A - _算術平均) ^ 2 + S,
  最小値・最大値・標準偏差(R,_標本数,_最小値1,_最小値,_最大値1,_最大値,_算術平均,S2,V),!.
728デフォルトの名無しさん:2009/10/03(土) 04:09:57
>>727 訂正
最小値・最大値・標準偏差(L,_最小値,_最大値,_標準偏差) :-
  length(L,_標本数),
  算術平均(L,_算術平均),
  L = [A|R],
  最小値・最大値・標準偏差(L,_標本数,A,_最小値,A,_最大値,_算術平均,0.0,_標準偏差),!.

% 最後の副目標の論理変数_最小値と_最大値の順番を間違えた。
729デフォルトの名無しさん:2009/10/03(土) 04:42:57
>>725
% Prolog

'2個の物を買うときに一緒に買う場合と,別々に会計をする場合と 消費税の1円未満の切り捨てにより、値段が変わることがある。'(_商品価格1,_商品価格2,_一緒に精算した時の消費税込み価格,_個別に精算した時の消費税込み価格) :-
  _一緒に精算した時の消費税 is truncate(floor((_商品価格1+_商品価格2) * 1.05)),
  _個別に精算した時の消費税込み価格 is
    truncate(floor(_商品価格1 * 1.05)) + truncate(floor(_商品価格2 * 1.05)).
730デフォルトの名無しさん:2009/10/03(土) 04:46:52
>>729
% また間違えた。
'2個の物を買うときに一緒に買う場合と,別々に会計をする場合と 消費税の1円未満の切り捨てにより、値段が変わることがある。'(_商品価格1,_商品価格2,_一緒に精算した時の消費税込み価格,_個別に精算した時の消費税込み価格) :-
  _一緒に精算した時の消費税込み価格 is truncate(floor((_商品価格1+_商品価格2) * 1.05)),
  _個別に精算した時の消費税込み価格 is
    truncate(floor(_商品価格1 * 1.05)) + truncate(floor(_商品価格2 * 1.05)).

% "込み"が一ヶ所抜けた
731デフォルトの名無しさん:2009/10/03(土) 07:57:37
http://pc12.2ch.net/test/read.cgi/tech/1250204272/615
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# ソートされた2つの配列A[N], B[N]が与えられる。
# AとBのそれぞれの要素を足して得られる、長さN*Nの配列、すなわち
# for(int i = 0; i < N; i++)
# for(int j = 0; j < N; j++)
# C[i * N + j] = A[i] + B[j];
# のC[]をソートした配列を、
# およそN*Nに比例する時間で得るプログラムを作成せよ。
# ただし、Nは4000以下、A[], B[]の要素は絶対値が2の28乗以下の整数であるとしてよい。
732デフォルトの名無しさん:2009/10/03(土) 08:00:28
>>731
% Prolog

t731(AL,BL,L) :-
  findall(C,(member(A,AL),member(B,BL),C is A + B),L).
733デフォルトの名無しさん:2009/10/03(土) 08:06:28
>>732
これソートされてないね。
734デフォルトの名無しさん:2009/10/03(土) 08:20:44
>>733
ソート忘れてた。あとからソートするのではダメなのか。抜本的に書き直しね。
735デフォルトの名無しさん:2009/10/05(月) 01:47:27
http://pc12.2ch.net/test/read.cgi/tech/1250204272/658
# [1] C言語とアルゴリズム
# [2] 関数(非回帰)
#  キーボードから自然数を入力し1からその自然数までの
# 二乗和を求めるプログラムを作成しなさい。
# ただし二乗和を求める部分は関数(関数名をsqrsumとする)にすること。
# [実行例]
# 自然数を入力して下さい.         ←自然数の入力をうながすメッセージを表示
# 10                    ←自然数を入力してEnter
# 1から10までの自然数の二乗和は371です.  ←計算結果を表示する
736デフォルトの名無しさん:2009/10/05(月) 01:52:32
http://pc12.2ch.net/test/read.cgi/tech/1248012902/293
# 【 課題 】テキストファイルをあらかじめ作っておいて、その内容を表示しながら
# 別のファイルにコピーするプログラムを書け。
# コマンド例(file_a.txtからfile_b.txtへコピーする)
# 内容例
# 123456
# 234567
# abcdefg
737デフォルトの名無しさん:2009/10/05(月) 04:16:49
>>735
% Prolog

t735 :-
  自然数を得る(_自然数),
  '1からその自然数までの二条和'(_自然数,_二乗和),
  write_formatted('1から%tまでの自然数の二乗和は%tです.\n',[_自然数,_二乗和]).

'1からその自然数までの二乗和'(N,_二乗和) :-
  '二乗和'(1,N,0,_二乗和).

二乗和(M,N,X,X) :- M > N,!.
二乗和(M,N,Y,X) :-
  Y2 is Y + M ^ 2,
  M2 is M + 1,
  二乗和(M2,N,Y2,X).

自然数を得る(_自然数) :-
  repeat,
  write('自然数を入力してください : '),
  get_integer(_自然数),
  integer(_自然数),
  _自然数 > 0,!.
738デフォルトの名無しさん:2009/10/05(月) 04:36:14
>>736
% Prolog

テキストファイルをあらかじめ作っておいて、その内容を表示しながら別のファイルにコピーする(_入力ファイル,_出力ファイル) :-
  open(_入力ファイル,read,Input),
  open(_出力ファイル,write,Output),
  repeat,
  get_line(Input,Line),
  行を表示しながら出力(Output,Line),
  close(Output),
  close(Input),!.

行を表示しながら出力(Output,end_of_file) :- !.
行を表示しながら出力(Output,Line) :-
  write('%t\n',[Line]),
  write_formatted('%t\n',[Line]),
  fail.
739デフォルトの名無しさん:2009/10/05(月) 07:32:59
>>738
% Prolog 訂正
行を表示しながら出力(Output,end_of_file) :- !.
行を表示しながら出力(Output,Line) :-
  write('%t\n',[Line]),
  write_formatted(Output,'%t\n',[Line]),
  fail.
740デフォルトの名無しさん:2009/10/05(月) 17:26:20
http://pc12.2ch.net/test/read.cgi/tech/1250204272/674
# 599です。何度も申し訳ない。
# 問題文中のパート1と(g)で苦戦しています。
# 前述のパート2・3は自力でなんとか終えました。
#
# [1] 授業単元:データ解析
# [2] 問題文(含コード&リンク):<a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9964.zip" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9964.zip</a>
# [3] 環境
#  [3.1] OS: Windows, (Linux)
#  [3.2] コンパイラ名とバージョン: GCC, VCも可
#  [3.3] 言語:C++
# [4] 期限: 10/6
# [5] その他の制限:AVL木についての詳細(お借りします)↓
# <a href="http://ime.nu/lecture.ecc.u-tokyo.ac.jp/~yamaguch/pub/cp2-10/what-is-search-avl.html" target="_blank">http://lecture.ecc.u-tokyo.ac.jp/~yamaguch/pub/cp2-10/what-is-search-avl.html</a>
# 1.
# テンプレートを使用して、以下の事を行うAVL木を作成しなさい。
# (a)まず始めにfstreamを使いword.txtの中の単語を一つずつ空のAVL木にインサート(insert())しなさい。
# (b)各々のインサートの際におこるシングルローテーションとダブルローテーションの総合を数えないさい。
# (c)AVL木の根(root)のインターナルパス(木の全ての枝の高さを合計したもの)の長さを計算しアウトプットしなさい。
# (d)document.txtの中の単語をword.txtの中の単語と比べ、その単語とその数をアウトプットするSearch()を作成しなさい。
# (e)document.txtの中の単語と一致しない物をAVL木から取り除きなさい(Delete())。
# (f)おまけ(15点):再帰を使わずにインサートを実装しなさい。
# (g)再帰を使い与えられた木がAVL木かをテストする機能を付け加えなさい。
#  機能の定義:AVL木の場合Trueを返す。
#        パート2の二分木の場合Falseを返す。
741デフォルトの名無しさん:2009/10/05(月) 17:30:15
http://pc12.2ch.net/test/read.cgi/tech/1250204272/676
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): <a href="http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt" target="_blank">http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt</a>
# 以下のプログラムを作成せよ。
# 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。
# 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした
# 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される
# このような点数の変換プログラムを考える
# 達成条件は
# ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。
# ・ファイルからデータを読み込んだ時に、構造体にデータを入力している
# ・ファイルout.txt内では、正しく点数が変換されている。
# ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。
742デフォルトの名無しさん:2009/10/05(月) 19:54:22
743デフォルトの名無しさん:2009/10/06(火) 18:46:21
http://pc12.2ch.net/test/read.cgi/tech/1250204272/694
# [1] 授業単元:プログラミング技法
# [2] 問題文(含コード&リンク):
#   二次関数方程式 ax^2+bx+c=0 の係数a,b,cを入力し、答えを表示する関数 Quadratic を作りなさい。その関数を呼び出すmain 関数も作り、動作を確認しなさい。
# 関数型はintとする。パラメータの型は、int および double とする。
#   機能  2次方程式の解を求める(表示しない)
#       グローバル変数X1、X2に求めた答えを代入する
#   入力  a,b,c ax^2+bx+c=0 の係数
#   関数値 解の数、0なら係数 a が0、−1なら虚数解
#  aが0のとき、虚数解、重根のときはmain関数でメッセージを表示する。
# sqrt()で平方根を求める(math.hをインクルードすること)
744デフォルトの名無しさん:2009/10/06(火) 20:23:39
>>743
% Prolog

t743(0,B,C,[X]) :- !,not(B==0),X is -1 * C / B,write('Aが0です\n'),!.
t743(A,B,C,X) :-
  U is B ^ 2 - 4 * A * C,
  U < 0,
  write('虚数解です\n'),!,fail.
t743(A,B,C,[X]) :-
  findall(Y,quadratic(A,B,C,Y),[X,X]),
  write('重根です\n'),!.
t743(A,B,C,X) :-
  findall(Y,quadratic(A,B,C,Y),X),!.

quadratic(A,B,C,X) :-
  X is (-1 * B + sqrt(B ^ 2 - 4 * A * C)) / (2 * A).
quadratic(A,B,C,X) :-
  X is (-1 * B - sqrt(B ^ 2 - 4 * A * C)) / (2 * A).
745デフォルトの名無しさん:2009/10/06(火) 20:28:37
http://pc12.2ch.net/test/read.cgi/tech/1250204272/696
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9968.txt
# 1.
# a[i][j]=0 1 2
# 10 11 12
# 20 21 22
# と、x[3](成分1,5,10)の積を表示するプログラム
#
# 2.
# 3*3の単位行列と
# x[3](成分1,5,10)の積を表示するプログラム
#
# 3.
# 2次方程式の解:1次元変数c[2]を入力し、
# c[0]x^2+c[1]x+c[2]=0の二つの解(実数部と虚数部:xre[2],xim[2])を
# 表示するプログラム
746デフォルトの名無しさん:2009/10/07(水) 04:55:45
>>745
% Prolog

t745(1) :-
  行列の積([[0,1,2],[10,11,12],[20,21,22]],[[1],[5],[10]],X),
  write_formatted('行列の積は %t\n',[X]).

t745(2) :-
  単位行列(3,_単位行列),
  行列の積(_単位行列,[[1],[5],[10]],X),
  write_formatted('単位行列との積は %t\n',[X]).

% http://nojiriko.asia/prolog/t242.html
% http://nojiriko.asia/prolog/tan_i_gyouretsu.html
747デフォルトの名無しさん:2009/10/07(水) 06:51:38
VisualBasic2008ExpressEditionで、フィボナッチ数列の剰余の周期性の長さを求めるプログラムを組んだんですが、
一部正常に動作してくれない。詳しい方がいたら、修正点を教えてもらえないでしょうか。

プログラムは以下の通りなんだけど、周期の長さが80以上になるような場合だと正常に動作してくれない…
どうか修正点の指摘よろしくです。ちなみに当方完全プログラム初心者です。。

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a(1000), b(1000), c, n, x
a(1) = 1 : a(2) = 1 : n = 2
x = Val(TextBox1.Text)
Do
n = n + 1
Label1.Text = n
a(n) = a(n - 2) + a(n - 1)
Label2.Text = a(n)
b(n) = a(n) Mod x
Label3.Text = b(n)
a(n + 1) = a(n - 1) + a(n)
Label4.Text = a(n + 1)
b(n + 1) = a(n + 1) Mod x
Label5.Text = b(n + 1)
If b(n) * b(n + 1) = 1 Then
c = n - 1
Exit Do
End If
Loop
Label6.Text = c
End Sub
End Class
748デフォルトの名無しさん:2009/10/07(水) 20:09:32
http://pc12.2ch.net/test/read.cgi/tech/1235561034/532
# 問題.
# 久方のなかなる川のうかひ舟いかにちぎりてやみを待つらむ 藤原定家
#
# この短歌に現れる枕詞「久方の」は
# 「なかなる川」= 京の中なる川 = 桂川 の
# 桂から月が連想されて、その月の光に対して、
# 添えられていると考えられる。
#
# この関係を示す述語「久方のについて思い巡らし」を定義せよ。
749デフォルトの名無しさん:2009/10/07(水) 20:20:32
求む、DarkBASIC・3Dプログラマー。

学歴:高校生程度

必要な知識:三角関数の簡単な知識

求めるもの:広範な探究心
750749:2009/10/07(水) 20:30:15
給料:薄給。

労働条件:厳寒。長きにわたる完全な暗闇行。絶え間ない危険。賞与の保証無し。

備考:成功の暁には名誉と賞賛を得る。
751デフォルトの名無しさん:2009/10/07(水) 22:40:41
待遇

勤務時間:8時〜8時、完全無休、無給制

労働条件:キャノン方式
752デフォルトの名無しさん:2009/10/08(木) 06:55:37
>>748
% Prolog
http://nojiriko.asia/prolog/t748.html

>>749->>751 申し訳ないが1000レスで何レス解答できるかにも挑戦しているので
問題と解答以外は載せないでください。
753デフォルトの名無しさん:2009/10/09(金) 15:58:29
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9970.txt
# 1)Raw形式PGMファイルから,画像を読み込む関数を実装せよ.
# 2)画像データをRaw形式PGMファイルへ書き出す関数を実装せよ.
# 3)実装した読み込み,書き出し関数を用いて,任意のRaw形式PGMファイルを読み込み,別の名前のRaw形式PGMファイルとして書き出すプログラムを作成せよ.
# 作成するプログラムの要求仕様は以下の通りである.
# 実行ファイル名 任意の名前(自分で決めて良い)仮に ReadWrite とする
#
# 実行書式 ReadWrite [入力ファイル] [出力ファイル] 入力ファイル名,出力ファイル名とも省略不可
#
# ソースファイル名 実行ファイル名.c(例では ReadWrite.c となる)
# プログラムに要求される動作 [入力ファイル]で示されたPGM形式ファイルを読み込み,[出力ファイル]に示されるPGM形式ファイルに出力する.
# 備考 このプログラムのmain関数が置かれるソースファイル(ReadWrite.c)にファイル入出力関数を記述することは,
# 以下に示す「再利用性」の観点から好ましくない.すなわち,本課題では,少なくとも
# 1)ReadWrite.c(main関数を記述),2)ファイル入出力を行う関数を実装したソースファイル,の2ファイルを作成する必要がある.
# 関数プロトタイプ宣言は共通ヘッダファイルに記述しても良い.
# 解説 http://nojiriko.asia/data/t753.txt (安定させるためコピーさせていただきました)
754デフォルトの名無しさん:2009/10/09(金) 16:01:37
http://pc12.2ch.net/test/read.cgi/tech/1250204272/734
# [1] 授業単元:プログラミング実習
# [2] 問題文(含コード&リンク):
# アルファベットと数値を持つ複数のデータ(10個程度)をファイルから読み込んで
# 2分探索木を構築し,アルファベットを入力して数値を出力するプログラムを作成せよ.
755デフォルトの名無しさん:2009/10/10(土) 08:23:34
http://pc12.2ch.net/test/read.cgi/tech/1250204272/753
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク): ランダム順列の生成プログラム
# 各k=0,1・・・m-1に対してa[k]=kとおく。
# 各l=m-1,m-2,・・・1に対して0からlまでの数からランダムに1つを選び(これをl2とする)、a[l]とa[l2]を交換する。
756デフォルトの名無しさん:2009/10/10(土) 10:56:00
>>755
% Prolog
t755(_回数,M,L,X) :-
  findall(K,for(1,K,M),A),
  t755_1(_回数,M,L,A,X).

t755_1(0,M,_,X,X) :- !.
t755_1(N,M,L,Y,X) :-
  L1 is random mod L,
  L2 is M - (random mod L1),
  ならび要素の交換(Y,L1,L2,Z),
  N1 is N - 1,
  t755_1(N1,L,Z,X).

ならび要素の交換(L,_要素位置1,_要素位置2,X) :-
  list_nth(_要素位置1,L,A),
  list_nth(_要素位置2,L,B),
  ならびの位置指定による置換([[_要素位置1,A],[_要素位置2,B]],1,L,X).

ならびの位置指定による置換(_,_,[],[]) :- !.
ならびの位置指定による置換(L,N,[_|R1],[Y|R2]) :-
  member([N,Y],L),
  N2 is N + 1,
  ならびの位置指定による置換(L,N2,R1,R2),!.
ならびの位置指定による置換(L,N,[C|R1],[C|R2]) :-
  N2 is N + 1,
  ならびの位置指定による置換(L,N2,R1,R2),!.
757デフォルトの名無しさん:2009/10/11(日) 04:12:40
http://pc12.2ch.net/test/read.cgi/tech/1250204272/758
# [1] 授業単元:基礎プログラミング
# [2] 問題文(含コード&リンク):
# カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。
#
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt
#
758デフォルトの名無しさん:2009/10/11(日) 04:14:48
http://pc12.2ch.net/test/read.cgi/tech/1250204272/770
# [1] 授業単元:プログラミング演習2
# [2] 問題文(含コード&リンク):
# テキストファイルを読み込み、
# 文字コード表を利用して種類ごとに文字を分類し、それぞれをカウントするプログラムを作れ
# 分類は以下の通りとする。
# 1.半角英数
# 2.半角カナ
# 3.半角記号
# 4.全角かな
# 5.全角記号
# 6.漢字
# 以上のように分類した上で「半角英数:XX字、半角カナ:XX字・・・」というように結果をファイルに出力せよ。
# 使用する文字コード表は自由だが一般に使われているものを選択せよとのことでした。
# コード内にコメントで使用した文字コードを注釈として記載するようにとの連絡がありました。
759デフォルトの名無しさん:2009/10/11(日) 05:00:22
>>757
% Prolog

アルファベット(['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']).

カエサル暗号(_ずらし,_平文,_暗号文) :-
  アルファベット(_アルファベット),
  ならびの回転(左方向,_ずらし,_アルファベット,_アルファベットの二),
  atom_chars(_平文,Chars),
  findall(C2,(member(C1,Chars),list_nth(N,_アルファベット,C1),list_nth(N,_アルファベットの二,C2),Chars2),
  atom_chars(_暗号文,Chars2).

ならびの回転(左方向,1,[A|R],L) :-
  append(R,[A],L).
ならびの回転(左方向,N,[A|R],L) :-
  N > 1,
  append(R,[A],L1),
  N1 is N - 1,
  ならびの回転(左方向,N1,L1,L).
760デフォルトの名無しさん:2009/10/11(日) 06:25:36
>>758
% Prolog
eucコード分類(半角英数,0x30,0x39).
eucコード分類(半角英数,0x51,0x5a).
eucコード分類(半角英数,0x61,0x6a).
eucコード分類(全角数字,0xa3b0,0xa3b9).
eucコード分類(半角カナ,0x8ea1,0x8ed6).
eucコード分類(全角カナ,0xa501,0xa586).
eucコード分類(全角かな,0xa401,0xa483).
eucコード分類(全角記号,0xa101,0xa2fe).

文字コード分類(_テキスト,_分類ならび) :-
  atom_codes(_テキスト,Codes),
  文字コード分類(Codes,[],_分類ならび).
文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
  eucコード分類(_分類,_コード下限,_コード上限),
  A >= _コード下限,
  A =< _コード上限,
  文字コード分類ならびの更新(_分類,_分類ならびの一,_分類ならびの二),
  文字コード分類(R1,_分類ならびの二,_分類ならび).

文字コード分類ならびの更新([],_分類,[[_分類,1]]) :- !.
文字コード分類ならびの更新([[_分類,_頻度の一]|R],_分類,[[_分類,_頻度の二]|R]) :-
  _頻度の二 is _頻度の一 + 1,!.
文字コード分類ならびの更新([U|R1],_分類,[U|R2]) :-
  文字コード分類ならびの更新(R1,_分類,R2).
761デフォルトの名無しさん:2009/10/11(日) 06:50:45
>>760 訂正(第3節追加)
文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
  eucコード分類(_分類,_コード下限,_コード上限),
  A >= _コード下限,
  A =< _コード上限,
  文字コード分類ならびの更新(_分類,_分類ならびの一,_分類ならびの二),
  文字コード分類(R1,_分類ならびの二,_分類ならび).
文字コード分類([_|R1],_分類ならびの一,_分類ならび) :-
  文字コード分類(R1,_分類ならびの一,_分類ならび).
762デフォルトの名無しさん:2009/10/11(日) 10:04:00
>>760 もう一ヶ所間違っていた。訂正箇所にコメント
文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
  eucコード分類(_分類,_コード下限,_コード上限),
  A >= _コード下限,
  A =< _コード上限,
  文字コード分類ならびの更新(_分類ならびの一,_分類,_分類ならびの二), /* 第一引数と第二引数が逆になっている */
  文字コード分類(R1,_分類ならびの二,_分類ならび).
文字コード分類([_|R1],_分類ならびの一,_分類ならび) :-
  文字コード分類(R1,_分類ならびの一,_分類ならび).
763デフォルトの名無しさん:2009/10/11(日) 12:25:20
http://pc12.2ch.net/test/read.cgi/tech/1250204272/783
# [1] 授業単元:
# プログラミング1
# [2] 問題文(含コード&リンク):
# 2進数で00000001から11111111まで表示する。
764デフォルトの名無しさん:2009/10/11(日) 12:40:33
>>763
% Prolog

t763 :-
  '8桁の二進数をリストで表現'(L),
  write_formatted('%t%t%t%t%t%t%t%t\n',L),
  fail.
t763.

'8桁の二進数をリストで表現'([A,B,C,D,E,F,G,H]) :-
  (A=0;A=1),
  (B=0;B=1),
  (C=0;C=1),
  (D=0;D=1),
  (E=0;E=1),
  (F=0;F=1),
  (G=0;G=1),
  (H=0;H=1).
765デフォルトの名無しさん:2009/10/11(日) 13:33:50
>>763
% Prolog

t763 :-
  length(L,8),
  '0から255までの二進数表現'(L),
  write_formatted('%t%t%t%t%t%t%t%t\n',L),
  fail.
t763.

'0から255までの二進数表現'([]).
'0から255までの二進数表現'([0|R]) :-
  '0から255までの二進数表現'(R).
'0から255までの二進数表現'([1|R]) :-
  '0から255までの二進数表現'(R).
766デフォルトの名無しさん:2009/10/11(日) 20:07:15
>>764
% http://pc12.2ch.net/test/read.cgi/tech/1250204272/ スレで
% 0から255ではなくて、1から255までだという指摘があった。一番簡単な
% 変更は[0,0,0,0,0,0,0,0]を除外することのようだ。

t763 :-
  '8桁の二進数をリストで表現'(L),
  \+(L=[0,0,0,0,0,0,0,0]),
  write_formatted('%t%t%t%t%t%t%t%t\n',L),
  fail.

'8桁の二進数をリストで表現'([A,B,C,D,E,F,G,H]) :-
  (A=0;A=1),
  (B=0;B=1),
  (C=0;C=1),
  (D=0;D=1),
  (E=0;E=1),
  (F=0;F=1),
  (G=0;G=1),
  (H=0;H=1).
767デフォルトの名無しさん:2009/10/12(月) 03:49:10
http://pc12.2ch.net/test/read.cgi/tech/1250204272/823
# [1] 授業単元:c言語
# [2] 問題文
# 課題文1
# とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。
# また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。
# このとき、1ヶ月の合計通話時間を入力すると請求される料金を表示するプログラムを作成せよ。
# 課題文2
# 明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。
# ただし、2つの元号を持つ年は両方の年を表示すること。
# (例: 1989年 → 昭和64年、平成元年)
# (2つの元号を持つ年の扱いについては余裕がある人は、月、日も入れて、その日の正しい
# 元号を表示することによって元号を一つ表示するプログラムとしてもよい。)
768デフォルトの名無しさん:2009/10/12(月) 04:08:23
>>767
% Prolog
% 課題文1
とある架空の携帯電話会社の1ヶ月の通話料金(_通話時間,_通話料金) :-
  _通話料金 is 1000 + 10 * _通話時間,
  _通話料金 < 10000.
とある架空の携帯電話会社の1ヶ月の通話料金(_通話時間,10000) :-
  _通話料金_1 is 1000 + 10 * _通話時間,
  _通話料金_1 >= 10000.

% 課題文2 http://nojiriko.asia/prolog/wareki2seireki.html
769デフォルトの名無しさん:2009/10/12(月) 22:10:20
http://pc12.2ch.net/test/read.cgi/tech/1248012902/324
# どなたか教えてください。例えば、
# hoge[]={300,400,500,200,100} をソートしたときに元の配列番号の並びかえで
# {4,3,0,1,2}として別の配列に格納したいんですがどうしたらいいでしょうか。
# テンプレ使うまでもない質問だと思ったので、こんな形ですいません。
# よろしくお願いします。
770デフォルトの名無しさん:2009/10/12(月) 22:16:14
>>769
% Prolog

t769(_ならび,_索引) :-
  位置番号を明示的に付加する(_ならび,1,L3),
  sort(L3,L2),
  位置番号を切り取り索引を作る(L2,_索引).

位置番号を明示的に付加する([],_,[]).
位置番号を明示的に付加する([A|R1],N,[[A,N]|R2]) :-
  N2 is N + 1,
  位置番号を明示的に付加する(R1,N2,R2).

位置番号を切り取り索引を作る(L2,_索引) :-
  findall(A,member([_,A],L2),_索引).
771デフォルトの名無しさん:2009/10/13(火) 18:19:04
http://pc12.2ch.net/test/read.cgi/tech/1248012902/330
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】10月17日
# 【 Ver  】1.6.0_11
#
# A=
# {-7.29565,6.54738,4.07991}
# {-5.58592,7.51773,-1.78163}
# {9.22599,-3.26847,-3.03223}
# {6.25081,-8.75345,-4.31528}
#
# 行列norm ||A||1、||A||∞を求めるプログラムを作成せよ
#
#
# 参考になるかはわかりませんが、複素数ベクトル版の2-norm、∞-normを
# 求めるプログラムはこれです
# http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/803.java
772デフォルトの名無しさん:2009/10/14(水) 06:59:17
>>771
% Prolog

norm(_行列,1,X) :-
  行列の転置(_行列,_行列1),
  findmax(S,(member(L,_行列1),abs_sum(L,S)),X).
norm(_行列,inf,X) :-
  findmax(S,(member(L,_行列),abs_sum(L,S)),X).

abs_sum([],0) :- !.
abs_sum([A|R1],S) :-
  abs_sum(R1,S1),
  S is abs(A) + S1.
773デフォルトの名無しさん:2009/10/14(水) 10:59:03
http://pc12.2ch.net/test/read.cgi/tech/1250204272/907
# [1] C言語とアルゴリズム
# [2] 選択型処理
#  あるお店では会員制をとっている。会員には一般会員と特別会員があり、
# 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。
# 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。
# この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得ら
れるプログラムを作成しなさい。
# ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。
# [会員種別(1桁) 購入金額]
# ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。
# 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、
# 非会員は「非」と表しなさい。
#
# [data03.dat] http://nojiriko.asia/data/data03.dat
#
# 『実行例』
# 種別  購入金額(円)  支払い金額(円)
# 会     3200        2880    ←一般会員は1割引き
# 特     2400        1680    ←特別会員は3割引き
# 非     4800        4800    ←非会員は通常割り引かない
# 特     6500        4550
# 会     10800 9720
# 特     18200 12740
# 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き
# 会     890 801
# 会     3900        3510
# 特     6200        4340
# -----------------------------------------
# 合計    78290        65421 ←最後の行に合計を出力すること
774デフォルトの名無しさん:2009/10/14(水) 11:53:51
775デフォルトの名無しさん:2009/10/14(水) 17:17:18
http://pc12.2ch.net/test/read.cgi/tech/1250204272/911
# [1] 卒業研究
# [2] ベジュ曲線を描く
776デフォルトの名無しさん:2009/10/14(水) 22:12:10
>>775
% Prolog

ベジェ曲線(T,_刻み,_,_,_,_,_,_,_,_,[]) :- T > 1.0,!.
ベジェ曲線(T,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,[[X,Y]|R]) :-
  T2 is T + _刻み,
  X is (1-T) * (1-T) * (1-T) * X1 + 3 * (1-T) * (1-T) * T * X2
      + 3 * (1-T) * T * T * X3 + T * T * T + X4,
  Y is (1-T) * (1-T) * (1-T) * Y1 + 3 * (1-T) * (1-T) * T * Y2
      + 3 * (1-T) * T * T * Y3 + T * T * T * Y4,
  ベジェ曲線(T2,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,R).
777デフォルトの名無しさん:2009/10/15(木) 03:14:26
http://pc12.2ch.net/test/read.cgi/tech/1250204272/923
# [1] 授業単元: プログラミング
# [2] 問題文:ナップサック問題のプログラムを利用し、グラフ彩色問題に当てはめる(色は4色で)
778デフォルトの名無しさん:2009/10/15(木) 03:17:27
http://pc12.2ch.net/test/read.cgi/tech/1250204272/926
# 以前回答いただいた課題の発展課題です。よろしくお願いします。
# 以前の回答は<a href="../test/read.cgi/tech/1250204272/841" target="_blank">>>841</a>にあります。以前の問題文は<a href="../test/read.cgi/tech/1250204272/770" target="_blank">>>770</a>を参照してください。
# ただし<a href="../test/read.cgi/tech/1250204272/770" target="_blank">>>770</a>の分類には全角英数が抜けています。
# [1] 授業単元:プログラミング演習2
# [2] 問題文(含コード&リンク):
# 前回の課題の分類の結果「半角英数:XX字、半角カナ:XX字・・・」
# という結果が得られたとき、その結果のファイルを読み込み
# 各分類からその結果の比率に合わせてランダムに文字列を出力する
# プログラムを作成せよ。出力する文字数は解析に用いた文字の合計である。
# (例えば半角英数が全体の60%だった場合、出力される文字列の中にランダムに半角英数文字が60%の割合で含まれることになる)
# 分類は以下の通りとする。
# 1.半角英数
# 2.半角カナ
# 3.半角記号
# 4.全角英数
# 5.全角かな
# 6.全角記号
# 7.漢字
779デフォルトの名無しさん:2009/10/15(木) 16:56:09
>>758
% Prolog (EUC文字コード分類の訂正)

eucコード分類(半角英数,0x30,0x39).
eucコード分類(半角英数,0x51,0x5a).
eucコード分類(半角英数,0x61,0x6a).
eucコード分類(全角数字,0xa3b0,0xa3b9).
eucコード分類(半角カナ,0x8ea1,0x8ed6).
eucコード分類(全角カナ,0xa5a1,0xa5f6).
eucコード分類(全角かな,0xa4a1,0xa4f3).
eucコード分類(全角記号,0xa1a1,0xa2fe).
eucコード分類(全角漢字,0xb0a1,0xfcee).
780デフォルトの名無しさん:2009/10/16(金) 04:23:48
http://pc12.2ch.net/test/read.cgi/tech/1248012902/357
# 【課題】
# 整数値を値とする5行3列の大きさの2次元配列 a を定義し,0 から 9 までの整数乱数を代入して初期化する。
# 2次元配列 a をモニタ(標準出力)に表示する。
#
# 【形態】1. Javaアプリケーション(main()で開始)
# 【期限】10/16
# 【Ver】1.6.0_11
# 実行結果として
# $ java Kadai
# a[0,0] = 8 a[0,1] = 0 a[0,2] = 8
# a[1,0] = 9 a[1,1] = 0 a[1,2] = 3
# a[2,0] = 0 a[2,1] = 2 a[2,2] = 8
# a[3,0] = 0 a[3,1] = 6 a[3,2] = 1
# a[4,0] = 3 a[4,1] = 9 a[4,2] = 8
#
# ただし、この例の配列要素の値は整数乱数であるので、場合ごとに異なった値が代入されている。
# だそうです。まったく意味がわかりません。お願いします
781デフォルトの名無しさん:2009/10/16(金) 05:04:12
Yahoo!プログラミング言語検索ランキング(今回2009/10/16、前回2009/10/12)

《一般カテゴリ》
. 1(. 1) HTML.....    約5,030,000,000件(約5,020,000,000件)+
. 2(. 2) PHP...      約2,980,000,000件(約3,000,000,000件)--
. 3(--) BASIC..      約1,580,000,000件(....------------- )0
. 4(. 3) JAVA..      約 822,000,000件(約 832,000,000件)--
. 5(--) CGI.        約 551,000,000件(....------------- )0
. 6(--) C言語(*1).   約 399,000,000件(....------------- )0 (*1)C/C++とC#の検索件数の合計
. 7(. 4) FORTH..    約 323,000,000件(約 324,000,000件)-
. 8(. 6) PERL..     約 245,000,000件(約 245,000,000件)0
. 9(. 7) PYTHON..   約 213,000,000件(約 209,000,000件)++
10(. 8) PASCAL..   約 168,000,000件(約 168,000,000件)0
11(. 9) DELPHI.    約 128,000,000件(約 128,000,000件)0
12(11) LISP      約.  26,000,000件(約.  26,600,000件)--
13(12) FORTRAN.   約.  21,200,000件(約.  21,300,000件)-
14(13) COBOL.....   約.  16,800,000件(約.  17,100,000件)--
14(--) PROLOG    約.  13,800,000件(....------------- )0
15(14) HSP        約.  12,300,000件(約.  12,400,000件)-

《BASIC言語カテゴリ》
. 1(--) VisualBasic...  約 120,000,000件(約 121,000,000件)-
. 2(--) Hu-BASIC..  約.  15,000,000件(....------------- )0
. 3(--) QBASIC..    約   4,140,000件(約   4,160,000件)--
. 4(--) MSX-BASIC.....約   1,430,000件(....------------- )0
. 5(--) DarkBASIC .  約   1,310,000件(約   1,330,000件)--
. 6(--) CBM-BASIC. 約    944,000件(....------------- )0
. 7(--) BasicStudio   約    303,000件(約    302,000件)+
. 8(--) N88BASIC..  約    219,000件(約    218,000件)+
. 9(--) X-BASIC...   約.     40,400件(....------------- )0
10(--) 99BASIC....   約.     11,400件(約.     11,300件)+
782デフォルトの名無しさん:2009/10/16(金) 06:32:58
>>780
% Prolog
http://nojiriko.asia/prolog/t780.html

% 仕様の叙述に忠実ではないので後で書き直します。
783デフォルトの名無しさん:2009/10/16(金) 12:20:43
784デフォルトの名無しさん:2009/10/16(金) 14:25:07
http://pc12.2ch.net/test/read.cgi/tech/1248012902/361
# 【 課題 】http://ime.nu/www.dotup.org/uploda/www.dotup.org265866.txt.html
# コンビニの店員の名前とIDを管理するプログラムを作成する。
# ・データの追加と削除
# ・IDの検索
# ・IDの判断
# ・全データの表示
# ・IDのみ全表示
# ・全データの削除
# ・データが空かどうかの確認
785デフォルトの名無しさん:2009/10/16(金) 14:46:07
>>784
% Prolog

データの追加(_名前,ID) :- \+(名前とID(_名前,ID)),assertz(名前とID(_名前,ID)).
データの追加(_名前,ID) :- 名前とID(_名前,ID),assertz(保留情報(データの追加と削除(_名前,ID))).

データの削除(_名前,ID) :- retract(名前とID(_名前,ID)),!.
データの削除(_名前,ID) :- assertz(保留情報(データの削除(_名前,ID))).

'IDの検索'(ID,_名前) :- 名前とID(_名前,ID).

'IDの判断'(ID,正常) :- atom(ID),atom_to_term(ID,N),integer(N),N>=0,N=<9999,!.
'IDの判断'(ID,エラー).

全データの表示 :- listing(名前とID).
全データの削除 :- abolish(名前とID/2).

データが空かどうかの確認 :- \+(clause(名前とID(_,_),_)).
786デフォルトの名無しさん:2009/10/16(金) 17:11:53
http://pc12.2ch.net/test/read.cgi/tech/1250204272/974
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
# new と deleteを使ったプログラムの作成
#  人数、名前、点数を入力し、横棒グラフを表示するプログラムを作りなさい。
# ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。
# <実行画面>
# 人数 : 3
# 1人目の名前 : A
# 1人目の点数 : 80
# 2人目の名前 : B
# 2人目の点数 : 55
# 3人目の名前 : C
# 3人目の点数 : 95
#
# 名( 点 )| 50 100
# --------+---------+---------+
# A ( 80)|****************
# B ( 55)|***********
# C ( 95)|*******************
# 平均 77|***************
#
787デフォルトの名無しさん:2009/10/16(金) 17:42:02
>>786
% Prolog
:- op(800,xfx,人目の名前).
:- op(800,xfx,人目の点数).
1人目の名前 'A'.
1人目の点数 80.
2人目の名前 'B'.
2人目の点数 55.
3人目の名前 'C'.
3人目の点数 95.

t786 :-
  write(' 名(点)|    50    100\n--------+---------+---------+\n'),
  N 人目の名前 _名前,
  N 人目の点数 _点数,
  星表現(_点数,_星表現),
  write_formatted('%4s(%2d)|%t\n',[_名前,_点数,_星表現]),
  fail.
t786 :-
  findavg(V,_ 人目の点数 V,_平均点),
  星表現(_平均点,_星表現),
  write_formatted('平均(%2d)|%t\n',[_平均点,_星表現]).

星表現(_点数,_星表示) :-
  Y is _点数 // 5,
  length(L,Y),
  all(Y,'*'),
  concat_atom(Y,_星表示).
788デフォルトの名無しさん:2009/10/16(金) 17:49:36
>>787 (訂正)
星表現(_点数,_星表示) :-
  Y is _点数 // 5,
  length(L,Y),
  all(L,'*'), /* Y を L に変更 */
  concat_atom(Y,_星表示).
789デフォルトの名無しさん:2009/10/17(土) 02:09:52
http://pc12.2ch.net/test/read.cgi/tech/1200175247/672
# よろしくお願いします
# [1] 授業単元:関数の復習と応用
# [2] 問題文(含コード&リンク):()
# 曜日計算をします。曜日を2つ入力してください。
# 曜日1:水曜
# 曜日2:木曜
#
# 水曜 + 木曜 = 日曜
790デフォルトの名無しさん:2009/10/17(土) 02:15:45
http://pc12.2ch.net/test/read.cgi/tech/1250204272/993
# [1] 授業単元:c言語
# [2] 問題文
# 課題文1
# 文字を一文字入力して、文字コードが一個次の文字を表示するプログラムを作成せよ。
#
# 課題文2
# 文字を一文字入力して、入力文字が a-z の範囲のときのみ、次のアルファベットを表示すプログラムを作成せよ。
# ただし、zを入力した場合は a を表示し、a-z以外の文字を入力した場合は
# 入力した文字をそのまま表示すること。
# 例: aを入力 → b を出力 bを入力 → c を出力 zを入力 → a を出力
# 3を入力 → 3 を出力 $を入力 → $ を出力 Aを入力 → A を出力
#
# 課題文3
# 文字を一文字入力して、入力された文字が、英字の小文字であるか、英字の大文字であるか、
# 数字であるか、それ以外の文字であるか判別して、判別結果を表示する
# プログラムを作成せよ。
791デフォルトの名無しさん:2009/10/17(土) 02:25:04
http://pc12.2ch.net/test/read.cgi/tech/1250204272/986
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク): http://nojiriko.asia/data/9982.txt (コピーさせていただきました)
792デフォルトの名無しさん:2009/10/17(土) 02:57:11
>>789
% Prolog

t789 :-
  write('曜日を二つ入力します\n曜日1: '),
  get_line(_曜日1),
  曜日番号(_曜日1,_曜日番号1),
  write('曜日2: '),
  get_line(_曜日2),
  曜日番号(_曜日2,_曜日番号2),
  _曜日番号 is (_曜日番号1 + _曜日番号2) mod 7,
  曜日番号(_曜日,_曜日番号),
  write_formatted('%t + %t = %t\n',[_曜日1,_曜日2,_曜日]).

曜日番号(日曜,0).
曜日番号(月曜,1).
曜日番号(火曜,2).
曜日番号(水曜,3).
曜日番号(木曜,4).
曜日番号(金曜,5).
曜日番号(土曜,6).
793デフォルトの名無しさん:2009/10/17(土) 03:15:52
>>790
% Prolog

課題文1 :-
  write('一文字入力してください: '),
  get_line(_行),
  atom_codes(_行,[_文字コード|_]),
  次の文字コードを得る(_文字コード,_次の文字コード),
  char_code(_次の文字,_次の文字コード),
  write_formatted('次の文字は"%t"です\n',[_次の文字]).

次の文字コードを得る(_文字コード,_次の文字コード) :-
  _文字コード < 256,
  _次の文字コード is _文字コード + 1.
次の文字コードを得る(_文字コード,_次の文字コード) :-
  _文字コード >= 256,
  _次の文字コード is _文字コード + 2.
794デフォルトの名無しさん:2009/10/17(土) 05:13:09
>>789
% Prolog

課題文2 :-
  write('一文字入力してください: '),
  get_line(_行),
  sub_atom(_行,0,1,_,_文字),
  課題文2_文字選択(_文字,_表示する文字),
  write_formatted('課題文2の答えは"%t"です\n',[_表示する文字]).

課題文2_文字選択(_文字,_表示する文字) :-
  list_nth(N,[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],L1),
  list_nth(N,L1,_表示する文字),!.
課題文2_文字選択(_文字,_文字).
795デフォルトの名無しさん:2009/10/17(土) 05:24:35
>>790 (>>794>>789でなく>>790の解答でした)
% Prolog

課題文3 :-
  write('一文字入力してください: '),
  get_line(_行),
  atom_codes(_行,[_文字コード|_]),
  課題文3_文字種判別(_文字コード,_文字種別),
  write_formatted('"%"の文字種別は%です\n',[_文字種別]).

課題文3_文字種判別(C,英小文字) :- C>=97,C=<122,!.
課題文3_文字種判別(C,英大文字) :- C>=65,C=<90,!.
課題文3_文字種判別(C,数字) :- C>=48,C=<57,!.
課題文3_文字種判別(_,それ以外の文字).
796デフォルトの名無しさん:2009/10/17(土) 05:36:21
>>795 訂正
% Prolog

課題文3 :-
  write('一文字入力してください: '),
  get_line(_行),
  atom_codes(_行,[_文字コード|_]),
  課題文3_文字種判別(_文字コード,_文字種別),
  write_formatted('文字種別は%tです\n',[_文字種別]). /* この行を訂正 */

課題文3_文字種判別(C,英小文字) :- C>=97,C=<122,!.
課題文3_文字種判別(C,英大文字) :- C>=65,C=<90,!.
課題文3_文字種判別(C,数字) :- C>=48,C=<57,!.
課題文3_文字種判別(_,それ以外の文字).
797デフォルトの名無しさん:2009/10/17(土) 13:12:27
こんにちは。どなたかC♯でBMI計算プログラムをvisual studio 2008 もしくは2005 で作成してアップしてくださいませんか・・・?
そのプロジェクトフォルダ全部をアップお願いします。
Webアプリケーションでお願いします。
798デフォルトの名無しさん:2009/10/17(土) 22:26:40
http://pc12.2ch.net/test/read.cgi/tech/1248012902/376
# ・課題
# 与えられたベクトルファイル(c.txt)を読み込み
# 1-normの結果を表示させるプログラムを作成せよ
#
# 途中までのソースとベクトルファイルです
# http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/809.java
# http://ime.nu/kissho.xii.jp/1/src/1jyou94333.txt.html
# ( c.txt = )
# 0.9999999973
# 0.0000000023
# -0.0000000016
#
799デフォルトの名無しさん:2009/10/18(日) 05:33:54
>>798
% Prolog

t798 :- t798(1).

t798(P) :-
  float_format(_,f(22,21)),
  get_lines('c.txt',Lines),
  findall(V,(member(Line,Lines),atom_to_term(Line,V,_)),L),
  ベクトルのnorm(L,1,X),
  write_formatted('|C|=%t の時 |C|%t = %t\n',[L,P,X]).

ベクトルのnorm(L,P,X) :-
  findsum(B,(member(A,L),B is abs(A) ^ P),S),
  X is S ^ (1 / P).
800デフォルトの名無しさん:2009/10/18(日) 07:54:55
>>789
% Prolog

t789 :-
  write('曜日を二つ入力します\n曜日1: '),
  get_line(_曜日1),
  write('曜日2: '),
  get_line(_曜日2),
  曜日計算(_曜日1,_曜日2,_曜日),
  write_formatted('%t + %t = %t\n',[_曜日1,_曜日2,_曜日]).

曜日計算(_曜日1,_曜日2,_曜日) :-
  L = [日曜,月曜,火曜,水曜,木曜,金曜,土曜],
  append(L1,[_曜日2|_],L),
  append(L,L1,L2),
  曜日加算(L2,_曜日1,L2,_曜日2,_曜日).

曜日加算([_曜日1|R1],_曜日1,L2,_曜日2,_曜日) :-
  曜日加算の二([_曜日1|R1],L2,_曜日2,_曜日).
曜日加算([Y|R1],_曜日1,L2,_曜日2,_曜日) :-
  曜日加算(R1,_曜日1,L2,_曜日2,_曜日).

曜日加算の二([_曜日X|_],[_曜日2|_],_曜日2,_曜日).
曜日加算の二([_|R1],[Y|R2],_曜日2,_曜日) :-
  曜日加算の二(R1,R2,_曜日2,_曜日).
801デフォルトの名無しさん:2009/10/18(日) 07:58:21
>>800 訂正
論理変数として Y が 使われているところは _ に置換してください。
802デフォルトの名無しさん:2009/10/18(日) 17:56:45
http://pc12.2ch.net/test/read.cgi/tech/1248012902/380
# 【 課題 】
# 1・コマンドライン引数で2つの文字列を入力し、1番目に指定された文字列の中に2番目に指定された文字列が存在する場合は
# 「この文字列はあります。(○文字目)」と表示し、存在しない場合は「この文字列は存在しません」と表示しなさい。 入力文字数は、1番目の文字列は10文字以上とし、2番目の文字列は2文字以上4文字以内とする。
# また、文字列は先頭から検索し、最初に見つかった文字のインデックスを表示することとする。。
#
# 2・任意の文字列を内部で指定し、コマンドライン引数で2つの文字列を入力する。

# もし内部で指定した文字列に、1番目に指定した文字列が存在する場合は、その文字列を
# 2番目に指定した文字列と置き換えてから表示し、存在しない場合は「置き換えなし」と表示しなさい。
# 入力文字数は、1番目、2番目ともに4文字以内とする。また最初に内部指定文字列を表示し、
# 1番目の文字列が複数する場合は、すべて置き換わっていること。
#
# 3・コマンドライン引数で入力された文字列が
# 3文字以下なら、その文字列を20個文字列連結して表示
# 4文字以上なら”たくさん” を表示しなさい。
# 文字列連結の際はStringBufferクラスを使用しなさい
# for文を使用しなさい
803デフォルトの名無しさん:2009/10/18(日) 18:21:37
>>802
% Prolog 一問目

program :-
  user_parameters([Atom1,Atom2]),
  t802(Atom1,Atom2,_診断),
  write_formatted('%t\n',[_診断]).

t802(Atom1,Atom2,_診断) :-
  sub_atom(Atom1,S,_,_,Atom2),
  S2 is S + 1,
  concat_atom(['この文字列はあります。',S2,文字目],_診断),!.
t802(_,_,'この文字列は存在しません。').
804デフォルトの名無しさん:2009/10/18(日) 19:55:06
>>802
% Prolog 二問目

program :-
  user_parameters([Atom1,Atom2]),
  置換対象文字列(_置換対象文字列),
  t802文字列置換(_置換対象文字列,Atom1,Atom2,X),
  write_formatted('%t\n',[X]).

t802文字列置換(_置換対象文字列,Atom1,Atom2,置き換えなし) :-
  t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列).
t802文字列置換(_置換対象文字列,Atom1,Atom2,_置換された文字列) :-
  t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換された文字列).

t802文字列置換の二(_置換対象文字列,Atom1,Atom2,_置換対象文字列) :-
  \+(sub_atom(_置換対象文字列,S,Len,R,Atom1)).
t802文字列置換の二(_置換対象文字列,Atom1,Atom2,X) :-
  sub_atom(_置換対象文字列,S,Len,R,Atom1),
  sub_atom(_置換対象文字列,0,S,_,Atom0),
  sub_atom(_置換対象文字列,S+Len,R,_,_置換対象文字列の二),
  t802文字列置換の二(_置換対象文字列の二,Atom1,Atom2,Y),
  concat_atom([Atom0,Atom2,Y],X).

置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり).
805デフォルトの名無しさん:2009/10/18(日) 20:06:38
>>802
% Prolog 三問目

program :-
  user_parameters([Atom1]),
  sub_atom(Atom1,0,Len,_,Atom1),
  t802文字連結(Atom1,Len,X),
  write_formatted('%t\n',[X]).

t802文字列連結(Atom,Len,たくさん) :- Len >= 4.
t802文字列置換(Atom,Len,X) :-
  Len < 4,
  findall(Atom,for(1,N,20),L),
  concat_atom(L,X).
806デフォルトの名無しさん:2009/10/19(月) 07:00:03
http://pc12.2ch.net/test/read.cgi/tech/1255709298/38
# [1] 授業単元: 数値計測演習
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9989.txt
#
# 問題文
# fx = exp(x)- 3x において 区間{0,1}の根を二分法で求めよ
# ただし、収束判定条件には|b-a|εを用いて ε=10^-5
# また根の収束の様子を見るために反復ごとにc、fc の値の変化を調べよ
#
807デフォルトの名無しさん:2009/10/19(月) 13:38:34
http://pc12.2ch.net/test/read.cgi/tech/1255709298/53
# [1] 授業単元:C++
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.
jp/cgi-bin/joyful/img/9990.txt
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9991.txt
# 分数を扱う構造体を定義して,分数を2つ入力すると足し算をし,答えを出力する。
808デフォルトの名無しさん:2009/10/19(月) 14:09:38
>>807
% Prolog 
% 構造体は (/)/2

分数の加算(_分子1/_分母1,_分子2/_分母2,_分子/_分母) :-
  A is _分母1 * _分母2,
  B is _分子1 * _分母2 + _分子2 * _分母1,
  約分(B/A,_分子/_分母).

約分(B/A,_分子/_分母) :-
  最大公約数(B,A,C),
  _分子 is B // C,
  _分母 is A // C.
809デフォルトの名無しさん:2009/10/19(月) 15:45:00
http://pc12.2ch.net/test/read.cgi/tech/1255709298/55
# [1] 授業単元:プログラム言語論
# [2] 問題文(含コード&リンク):
#
# 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。
# ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。
# (*)関数devは、int型の返値を持ち、x/yを計算するものとする。
810デフォルトの名無しさん:2009/10/19(月) 16:25:47
>>809
% Prolog

:- op(700,xfx,は).

関数定義(div(X,Y),Z) :- div(X,Y,Z).

div(X,Y,Z) :-
  length(L1,X),
  length(L2,Y),
  div(L1,L2,DIV,MOD),
  length(DIV,Z).

div(_,[],_,_) :- write('0除算エラー\n'),!.
div(L1,L2,[_|D],MOD) :-
  append(L2,L3,L1),
  div(L3,L2,D,MOD).
div(L1,L2,[],L1) :- \+(append(L2,L3,L1)).
811デフォルトの名無しさん:2009/10/19(月) 17:49:42
http://pc12.2ch.net/test/read.cgi/tech/1255709298/57
# [1] 授業単元:プログラミング2演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.j
p/cgi-bin/joyful/img/9992.txt
# 複素数x+iyをR*e^iθという指数表示にするプログラムを作れ。
812デフォルトの名無しさん:2009/10/21(水) 04:29:59
http://pc12.2ch.net/test/read.cgi/tech/1255709298/160# [1] 授業単元: プログラミング言語
# [2] 問題文(含コード&リンク):
#   問1、符号無し整数xを右にnビット回転した値を返す関数
#      unsigned right(unsigned x,int n)
# {
# }
# を作成せよ
813デフォルトの名無しさん:2009/10/21(水) 04:36:42
http://pc12.2ch.net/test/read.cgi/tech/1255709298/131
# C++です。
#
#   x[0] = rand()%6;
#   x[1] = rand()%6;
#   x[2] = rand()%6;
#   y =x[0] + x[1] + x[2];
#   z[y] = z[y]+1;
#
# 変数がわかりにくくてすみません。
# xの配列に0〜5の値を保存して合計してyに入れます。
# それからzの配列(15こぶん)に入れたいのですが、うまくできません。
814デフォルトの名無しさん:2009/10/21(水) 04:40:39
http://pc12.2ch.net/test/read.cgi/tech/1248012902/408
# 【 課題 】文字列"GPIB-002.70V"から文字列"-022.70"を取り出して、
#       その文字列をDoubleオブジェクトにし、それをdouble型
#       実数値に変換して数値を表示
815デフォルトの名無しさん:2009/10/21(水) 04:59:30
http://pc12.2ch.net/test/read.cgi/tech/1248012902/402
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】10月21日AM12
# 【 Ver  】java version "1.6.0_14" 
# 【 補足 】3問です。本日1日悩みましたが、わかりませんでした。
# いかなる場合でも予期しない例外が出ないこと。
# @
# コマンドライン引数に入力された日付から現在日まで何日かを計算し、「今日まで●日」と表示しなさい。
# 現在日より入力された日付が小さい場合は「-(マイナス)」をつけて表示すること。(日付その他のチェックも行う事)

# Aコマンドライン引数に入力された年と月から、その月が何日まであるかを表示しなさい。(日付その他のチェックも行う事)
# Bコマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを
# 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事)
816デフォルトの名無しさん:2009/10/21(水) 07:06:10
>>812
% Prolog

符号無し整数を右にnビット回転(_整数,N,X) :-
  i2b(32,_整数,L1),
  ならびの回転(右方向,N,L1,L2),
  i2b(32,X,L2).

% i2b/3,ならびの回転/4 は http://nojiriko.asia/prolog/t812.html 参照
817デフォルトの名無しさん:2009/10/21(水) 07:12:47
>>816
第三引数のXは回転後の整数値で、>>812の問題でのxではありません。
xは_整数に当たります。
818デフォルトの名無しさん:2009/10/21(水) 22:55:51
http://pc12.2ch.net/test/read.cgi/tech/1255709298/181
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文:
#  キーボードから自然数を入力し1から入力した数までの自然数の中から、
# 3の倍数と3のつく数字をすべて出力するプログラムを作成しなさい。ただし、
# 3の倍数と3のつく数字を入力したときに真(非0)、それ以外の場合は偽(0)を返す関数
# (関数名は任意)を作成し、それをmain関数内から呼び出して使用すること
#
# {実行例}
# 自然数を入力して下さい.
# 100
# 1から100までで3の倍数と3のつく数字は以下の通りです.
# 3 6 9 12 13
# 15 18 21 23 24
# 27 30 31 32 33
# 34 35 36 37 38
# 39 42 43 45 48
# 51 53 54 57 60
# 63 66 69 72 73
# 75 78 81 83 84
# 87 90 93 96 99
819デフォルトの名無しさん:2009/10/22(木) 05:37:12
>>818
% Prolog

t818 :-
  write('自然数を入力してください\n'),
  get_integer(N),N > 0,
  for(1,J,N),3の倍数と3のつく数字(N),
  write_formatted('%t ',[N])),N=J,nl,!.
t818 :- nl.

3の倍数と3のつく数字(N) :- 3の倍数(N),!.
3の倍数と3のつく数字(N) :- 3のつく数字(N),!.
3の倍数(N) :- N > 0,0 is N mod 3.
3のつく数字(N) :- 3 is N mod 10.
3のつく数字(N) :- N > 10,M is N // 10,3のつく数字(M).
820デフォルトの名無しさん:2009/10/22(木) 06:23:57
821デフォルトの名無しさん:2009/10/22(木) 06:40:32
>>818
;; Common Lisp
(defun nabeatsu ()
(print "自然数を入力してください")
(setf num (read))
(let (lst)
(do ((i 1 (incf i)))
((> i num))
(if (or (zerop (mod i 3)) (> (count #\3 (princ-to-string i)) 0))
(setf lst (cons i lst))))
(format t "1から~Aまでで3の倍数と3のつく数字は以下の通りです." num)
(print (reverse lst))))
822デフォルトの名無しさん:2009/10/22(木) 07:03:07
>>813
% Prolog

t813(_切る回数,_切ったならび) :-
  length(L1,15),
  all(L1,0),
  ならびを切る(_切る回数,L1,_切ったならび).

ならびを切る(0,L,L).
ならびを切る(N,L1,L) :-
  N1 is N - 1,
  X_0 is random mod 6,
  X_1 is random mod 6,
  X_2 is random mod 6,
  Y is X_0 + X_1 + X_2 + 1,
  list_nth(Y,L1,A),
  B is A + 1,
  ならびの位置指定置換(Y,B,L1,L2),
  ならびを切る(N1,L2,L).

ならびの位置指定置換(1,A,[_|R],[A|R]) :- !.
ならびの位置指定置換(N,A,[B|R1],[B|R2]) :-
  N1 is N - 1,
  ならびの位置指定置換(N1,A,R1,R2).
823デフォルトの名無しさん:2009/10/22(木) 07:59:35
>>815 A
% Prolog

t815_2 :-
  user_parameters([_年,_月]),
  月末日(_年,_月,_月末日),
  write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]).

月末日(_年,2,29) :-
  atom_to_term(_年,_年整数,_),
  うるう年(_年整数),!.
月末日(_年,2,28).
月末日(_年,_月,30) :-
  member(_月,['4','6','9','11']).
月末日(_年,_月,31) :-
  member(_月,['1','3','5','7','8','10','12']).

うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- not(0 is _年 mod 4),fail.
824デフォルトの名無しさん:2009/10/22(木) 08:10:30
>>823 訂正
% Prolog

t815_2 :-
  user_parameters([_年,_月]),
  月末日は何日(_年,_月,_月末日),
  write_formatted('%t年%月の月末日は%t日です\n',[_年,_月,_月末日]).

月末日は何日(_年,'2','29') :-
  atom_to_term(_年,_年整数,_),
  うるう年(_年整数),!.
月末日は何日(_年,'2','28').
月末日は何日(_年,_月,'30') :-
  member(_月,['4','6','9','11']).
月末日は何日(_年,_月,'31') :-
  member(_月,['1','3','5','7','8','10','12']).

うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4,!.
うるう年(_年) :- not(0 is _年 mod 4),fail.
825デフォルトの名無しさん:2009/10/22(木) 15:17:55
826デフォルトの名無しさん:2009/10/22(木) 15:24:40
827デフォルトの名無しさん:2009/10/22(木) 16:04:56
>>806
% Prolog
t806(X) :- 二分法(0.0,1.0,X).

func(X,FX) :- FX is exp(X)- 3 * X.

二分法(S,E,X) :-
  H is ( S + E) / 2,
  func(S,FX1),func(H,FX2),func(E,FX3),二分法(S,H,E,FX1,FX2,FX3,X).

二分法(S,X,E,FX1,FX2,FX3,X) :- FX2 < 1.0e-05,!.
二分法(S,H,E,FX1,FX2,FX3,X) :-
  こちらの区間に解はある(FX1,FX2),!,
  H2 is ( S + H ) / 2,
  func(H2,FX4),
  二分法(S,H2,H,FX1,FX4,FX2,X).
二分法(S,H,E,FX1,FX2,FX3,X) :-
  こちらの区間に解はある(FX2,FX3),!,
  H2 is ( H + E ) / 2,
  func(H2,FX4),
  二分法(H,H2,E,FX2,FX4,FX3,X).

こちらの区間に解はある(A,B) :- A1 is abs(A),B1 is abs(B),こちらの区間に解はある
(A,B,A1,B1).

こちらの区間に解はある(A,A,B,B1) :- \+(B=B1).
こちらの区間に解はある(A,A1,B,B) :- \+(A=A1).
828デフォルトの名無しさん:2009/10/23(金) 05:30:39
http://pc12.2ch.net/test/read.cgi/tech/1255709298/210
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# [1 2 0] [3 2 0 1] [3 4 0 2 1]みたいな同じ数字を使わない任意の長さで
# ランダムな数列の作成するプログラム。
#
829デフォルトの名無しさん:2009/10/23(金) 08:40:34
>>828
% Prolog

t828(_要素数,L) :-
  同一要素のないランダムな数列(1,3721,69069,65535,_要素数,[],L).

同一要素のないランダムな数列(Nth1,A,N,_法,Nth,L,L) :-
  Nth1 > Nth,!.
同一要素のないランダムな数列(Nth1,A,N,_法,Nth,L1,L) :-
  \+(member(N,L1)),
  乗算合同法演算(A,N,_法,M),
  Nth2 is Nth1 + 1,
  同一要素のないランダムな数列(Nth2,A,M,_法,Nth,[N|L1],L).
同一要素のないランダムな数列(Nth1,A,N,_法,Nth,L1,L) :-
  member(N,L1),
  乗算合同法演算(A,N,_法,M),
  同一要素のないランダムな数列(Nth1,A,M,_法,Nth,L1,L).

乗算合同法演算(A,N,_法,M) :-
  M is (A * N + 5) mod _法.
830デフォルトの名無しさん:2009/10/23(金) 12:05:16
http://pc12.2ch.net/test/read.cgi/tech/1255709298/230
# 【質問テンプレ】
# [1] 授業単元:プログラミング言語C
# [2] 問題文:
# 以下のプログラムの『考える』ところを直し、キーボードから1を入力したらRed
# 2ならGreen、
# 3ならBlueの文字列が画面表示されるようにせよ。
# またそれ以外の数字が入力されたら『終了します』と画面表示され
# プログラムが終了するようにせよ
831デフォルトの名無しさん:2009/10/23(金) 12:09:37
>>830
% Prolog

t830 :-
  get_line(Line),
  atom_to_term(Line,N,_),
  文字表示(N,S),
  write_formatted('%t\n',[S]),!.

文字表示(1,'Red').
文字表示(2,'Green').
文字表示(3,'Blue').
文字表示(_,終了します).
832デフォルトの名無しさん:2009/10/23(金) 17:48:44
http://pc12.2ch.net/test/read.cgi/tech/1200175247/692
# [1] 授業単元:プログラミング初歩
# [2] 問題文(含コード&リンク):
#
# 正の整数 n の約数の総和を求めるメソッド (関数) を,繰り返し(while,for)と再帰で書きなさい.
# 繰り返しにより計算する関数を sigma_i(n),再帰により最計算する関数を sigma_r(n, m) とすること.
# 再帰の場合には,正の整数 k の約数の和を求めるときには sigma_r(k, k) で実行するものとする.
833デフォルトの名無しさん:2009/10/23(金) 17:57:57
>>832
% Prolog

sigma_i(K,X) :- findsum(N,(for(K,N,1),0 is K mod N),X).

sigma_r(K,X) :- sigma_r(K,K,X).

sigma_r(1,K,1) :- !.
sigma_r(N,K,X) :- 0 is K mod N,N1 is N - 1,sigma_r(N1,K,Y),X is N + Y.
sigma_r(N,K,X) :- N1 is N - 1,sigma_r(N1,K,X).
834デフォルトの名無しさん:2009/10/24(土) 03:56:52
>>832
;; Common Lisp
(defun sigma_i (n)
(do ((i 1 (incf i)) (sum 0))
((> i n) sum)
(if (= (mod n i) 0)
(incf sum i))))

(defun sigma_r (n m)
(if (> m 0)
(if (= (mod n m) 0)
(+ m (sigma_r n (- m 1)))
(sigma_r n (- m 1)))
0))
835デフォルトの名無しさん:2009/10/24(土) 04:14:48
>>828
(defun get-ramdom-list (num)
(let (lst)
(dotimes (i num)
(setf lst (cons i lst)))
(dotimes (i (random num))
(let (tmp (i1 (random num)) (i2 (random num)))
(setf tmp (car (nthcdr i1 lst)))
(setf (car (nthcdr i1 lst)) (car (nthcdr i2 lst)))
(setf (car (nthcdr i2 lst)) tmp)))
lst))
836デフォルトの名無しさん:2009/10/24(土) 04:26:19
>>835
いろいろムダがあったorz
;; Common Lisp
(defun get-ramdom-list (num)
(let (lst)
(dotimes (i num)
(setf lst (cons i lst)))
(dotimes (i (random num))
(rotatef (nth (random num) lst) (nth (random num) lst)))
lst))
837デフォルトの名無しさん:2009/10/24(土) 05:23:29
>>806
;; Common Lisp
(defun solve (fx a b eps)
(let ((fa (funcall fx a)) (fb (funcall fx b)))
(if (<= (* fa fb) 0)
(do ((c) (fc))
((< (abs (- b a)) eps) (float c))
(setf c (/ (+ a b) 2)
fc (funcall fx c))
(format t "f(~A) = ~A\n" (float c) fc)
(if (< (* fa fc) 0)
(setf b c
fb fc)
(setf a c
fa fc))))))

(solve #'(lambda (x) (- (exp x) (* 3 x))) 0.0 1.0 1.0e-5)
838デフォルトの名無しさん:2009/10/24(土) 05:42:39
>>837
ちょっと修正
;; Common Lisp
(defun solve (fx a b eps)
(let ((fa (funcall fx a)) (fb (funcall fx b)))
(if (<= (* fa fb) 0)
(do ((c) (fc))
((< (abs (- b a)) eps) (float c))
(setf c (/ (+ a b) 2)
fc (funcall fx c))
(format t "f(~A) = ~A\n" (float c) fc)
(if (= fc 0.0)
(return c))
(if (< (* fa fc) 0)
(setf b c
fb fc)
(setf a c
fa fc))))))

(solve #'(lambda (x) (- (exp x) (* 3 x))) 0.0 1.0 1.0e-5)
839デフォルトの名無しさん:2009/10/24(土) 06:17:47
http://pc11.2ch.net/test/read.cgi/php/1147830986/9
# 1.1行ずつURLが記述されたテキストファイルを読み込み、
# 2.そのURLのコンテンツを取得して
# 3.タイトルとURLを画面に出力(コンソールに直接でもブラウザへでも可)
# するプログラムを作ってください。
# 尚テキストファイルに記述されているURLは妥当なものと見なして構わないものとする。
840デフォルトの名無しさん:2009/10/24(土) 06:29:16
http://pc11.2ch.net/test/read.cgi/php/1147830986/155
# $number = array(21,22,5,-2,4,25,-7,27);
# 上記のような配列がある場合に以下に列挙する期待値どおりにせよ。
#
# $number = array(21,22,5,-2,4,23,-7,24);
#
# やり方とアルゴリズム
#
# まず配列の0番目と1番目を比較し、比較される側のほうが大きければ比較する側の配>列を+1にして繰り返す。
# 比較される側のほうが小さい場合、比較対象をずらして(配列に+1して)比較される側>の数が大きくなるまで処理を繰り返す。
# 比較する数より比較される数のほうが大きくなったときその数字を比較する数+1にす>る。
# つまり、$number = array(21,22,5,-2,4,25,-7,27);の場合はまず
# 21と22を比較、22のほうが大きいので次に22と5を比較、5のほうが小さいので22と-2>を比較、-2のほうが小さいので22と4を比較、
# これも4のほうが小さいので22と25を比較、25のほうが大きいので25を22に+1して23にする。
# 次に23と-7を比較、-7のほうが小さいので23と27を比較、27のほうが大きいので27を23+1にし、24にする。
841デフォルトの名無しさん:2009/10/24(土) 09:42:39
>>839
% Prolog

t839(_ファイル) :-
  get_chars(_ファイル,Lines),
  member(URL,Lines),
  w3c(URL,Lines2),
  concat_atom(Lines,_改行を削除した全文),
  atom_chars(_改行を削除した全文,Chars),
  タイトルを得る(Chars,_タイトル),
  write_formatted('%t,%t\n',[URL,_タイトル]),
  fail.
t839(_).

タイトルを得る([<A,B,C,D,E,>|R1],_タイトル) :-
  (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'),
  タイトル文字ならびを切り取る(R1,_タイトル文字ならび),
  concat_atom(_タイトル文字ならび,_タイトル).
タイトルを得る([_|R1],_タイトル) :-
  タイトルを得る(R1,_タイトル).

タイトル文字ならびを切り取る([<,/,A,B,C,D,E,>|_],[]) :-
  (A=t;A='T'),(B=i;B='I'),(C=t;C='T'),(D=l;D='L'),(E=e;E='E'),!.
タイトル文字ならびを切り取る([A|R1],[A|R2]) :-
  タイトル文字ならびを切り取る(R1,R2).
842デフォルトの名無しさん:2009/10/24(土) 10:07:57
>>840
% Prolog

t840([A|R1],[A|R2]) :-
  t840(A,R1,R2).

t840(_,[],[]).
t840(A,[B|R1],[B|R2]) :-
  A >= B,
  t840(A,R1,R2).
t840(A,[B|R1],[C|R2]) :-
  A < B,
  C is A + 1,
  t840(C,R1,R2).
843デフォルトの名無しさん:2009/10/24(土) 11:01:35
http://pc12.2ch.net/test/read.cgi/tech/1255709298/256
#
# 2変量のデータ {{x1, y1}, {x2, y2}, ... , {xn, yn}} を引数として,散布図と相関係数を出力する関数を作成せよ.
844デフォルトの名無しさん:2009/10/24(土) 16:35:20
http://pc12.2ch.net/test/read.cgi/tech/1255709298/246
# [1] C言語中級
# [2] 8X8のオセロの全局面をリスト構造で列挙しそれを適当なファイルに保存するプログラム
# 次の問いの答えも添付すること
# (1)先手必勝、後手必勝かの決定
# (2)平行初期値と通常初期値(回転対称、鏡映は同一視)それぞれの
# 場合において到達可能な葉は全部の場合の何パーセント程度であるか?
845デフォルトの名無しさん:2009/10/24(土) 16:37:51
846デフォルトの名無しさん:2009/10/25(日) 04:54:20
http://pc12.2ch.net/test/read.cgi/tech/1255709298/294
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10004.txt
# 課題
# 整数列を右に任意数だけローテーション(右ローテーション:right rotation)する
# プログラムを作りなさい.ただし,以下の点に留意すること.
#
# ・整数列はキーボードから入力すること.
# ・入力できる整数列の最大長は 10 とし,長さ 0 以下と 11 以上を指定した場合エラー終了すること.
# ・ローテーション数が整数列の長さを超える場合でも正しい処理になるようにすること
847デフォルトの名無しさん:2009/10/25(日) 05:36:12
>>846
% Prolog
t846 :-
  t846_入力(_整数ならび,_ローテーションする数),
  length(_整数ならび,_入力した要素数),
  t846(_ローテーションする数,_入力した要素数,_整数ならび,_ローテーションした整数ならび),
  concat_atom(_ローテーションした整数ならび,',',S),
  write_formatted('ローテーションした整数列 %t です\n',[S]),!.
t846.

t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
  _入力した要素数>0,_入力した要素数<11,
  ならびの回転(右方向,_ローテーションする数,L,X),!.
t846(_ローテーションする数,_入力した要素数,L,X) :-
  \+((_入力した要素数>0,_入力した要素数<11)),
  write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]),
  fail.

t846_入力(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
  write('整数をカンマで区切り最大10個まで入力してください : '),
  get_line(Line),
  split(Line,[','],_整数ならび),
  write('ローテーションする数を入れてください : '),
  get_integer(_ローテーションする数),!.

ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1),append([A],L0,L2).
ならびの回転(右方向,N,L1,L2) :- N > 1,append(L0,[A],L1),append([A],L0,L3).
848デフォルトの名無しさん:2009/10/25(日) 05:42:01
>>847 訂正
% t846/4 の L を _整数ならび に置換します

t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
  _入力した要素数>0,_入力した要素数<11,
  ならびの回転(右方向,_ローテーションする数,_整数ならび,X),!.
t846(_,_入力した要素数,_,_) :-
  \+((_入力した要素数>0,_入力した要素数<11)),
  write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]),
  fail.
849デフォルトの名無しさん:2009/10/25(日) 07:23:28
>>843
% Prolog 相関係数のみ

相関係数(_サンプルならび,_相関係数) :-
  length(_サンプルならび,Len),
  x要素の取り出し(_サンプルならび,LX),
  y要素の取り出し(_サンプルならび,LY),
  標準偏差(LX,_標準偏差X),
  標準偏差(LY,_標準偏差Y),
  相加平均(LX,_平均値X),
  相加平均(LY,_平均値Y),
  findsum(U,(for(1,I,Len),list_nth(I,LX,X),
              list_nth(I,LY,Y),
              U is (X-_平均値X) * (Y-_平均値Y)),
      S1),
  _相関係数 is ( 1 / ((Len-1)*_標準偏差X*_標準偏差Y)) * S1.

x要素の取り出し(L,LX) :- findall(X,member([X,_],L),LX).

y要素の取り出し(L,LY) :- findall(Y,member([_,Y],L),LY).
850デフォルトの名無しさん:2009/10/25(日) 17:06:21
http://pc12.2ch.net/test/read.cgi/tech/1255709298/321
# [1] 授業単元:C++
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10006.txt
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10007.txt
# まず二つの数の割り算の商と余りを一度に計算する関数を作成する。
# 整数の場合と,実数の場合の,2つの関数を同じ名前で定義し,
# オーバーロードされることを確認せよ。ただし,
# 関数名前命は div ,第1引数は被除数,第2引数は除数,
# 第3引数は商を格納するアドレス,第4引数は余りを格納するアドレスとする。
851デフォルトの名無しさん:2009/10/25(日) 20:15:42
>>850
% Prolog

div(_被除数,_除数,_商,_余り) :-
  integer(_被除数),
  integer(_除数),
  _商 is _被除数 // _除数,
  _余り is _被除数 mod _除数.
div(_被除数,_除数,_商,_余り) :-
  float(_被除数),
  float(_除数),
  _商 is truncate(_被除数 / _除数),
  _余りの一 is _被除数 - _商 * _除数,
  div_1(_被除数,_除数,_商,_余りの一,_余り).

div_1(_被除数,_除数,_商,_余り,_余り) :- _余り < _除数.
div_1(_被除数,_除数,_商,_余りの一,_余り) :-
   _余りの一 >= _除数,
   _余り is _被除数 - (_商 + 1.0) * _除数.
852デフォルトの名無しさん:2009/10/26(月) 01:47:48
http://pc12.2ch.net/test/read.cgi/tech/1255709298/343
# [1] 授業単元: C言語演習
# [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10014.txt
#
# 図のような過程を辿るもっとも簡単な整列アルゴリズムを実現せよ
# [0] 567,724,23,43,148,72
# [1] 23,724,567,43,148,72
# [2] 23,43,567,724,148,72
# [3] 23.43,72,724,148,567
# [4] 23,43,72,148,724,567
# [5] 23,43,72,148,567,724
853デフォルトの名無しさん:2009/10/26(月) 02:32:54
>>852
% Prolog

整列([],[]) :- !.
整列([A|R1],[B|R3]) :-
  自分より後のならびの最小値が自分より小さいときにはこれと置換する([A|R],[B|R2]),
  整列(R2,R3),!.
整列([A|R1],[A|R2]) :-
  整列(R2,R3).

自分より後のならびの最小値が自分より小さいときにはこれと置換する([_自分|R1],[_最小値|R2]) :-
  最小値(R,_最小値位置,_最小値),
  _最小値 < _自分,
  要素番号によるならびの置換(_最小値位置,_自分,R1,R2).

最小値([A|R],_最小値位置,_最小値) :- 最小値(2,A,R,1,_最小値位置,_最小値).

最小値(_,_最小値,[],M,M,_最小値).
最小値(N1,Min,[A|R],M,N_最小値) :- A < Min,N2 is N + 1,最小値(N2,A,R,N1,N,_最小値).
最小値(N1,Min,[_|R],M,N,_最小値) :- A >= Min,N2 is N + 1,最小値(N2,Min,R,M,N,_最小値).

要素番号によるならびの置換(1,_置換要素,[_|R1],[_置換要素|R1]) :- !.
要素番号によるならびの置換(N,_置換要素,[A|R1],[A|R2]) :- N1 is N - 1,要素番号によるならびの置換(N1,_置換要素,R1,R2).
854デフォルトの名無しさん:2009/10/26(月) 05:45:12
>>852
比較関数の設定などは省略
;; Common Lisp
(defun mysort (lst)
(dotimes (i (- (length lst) 1))
(let ((cdrmin (apply 'min (nthcdr (+ i 1) lst))))
(if (> (nth i lst) cdrmin)
(rotatef (nth i lst) (nth (position cdrmin lst) lst)))))
lst)
855デフォルトの名無しさん:2009/10/26(月) 05:46:30
http://pc12.2ch.net/test/read.cgi/tech/1255709298/326
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文: http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10008.txt
# ●問題1−1 反復型処理(ビット列の表示)
#  符号なし32bit整数を入力して、その数を2進表示するプログラムを作成しなさい。
# さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切ること。
#
# ●問題1−2
#  符号なし32bit整数を2つ入力して、それらを2進表示するプログラムを作成しなさい。
# さらに、実行例のようにビット反転(1の補数表示〜),ビットシフト(<<, >>), ビット論理積(&),ビット論理和(|),
# ビット排他的論理和(^)を表示しなさい。ただし2進表示は4桁ずつ区切ること.
# また問題1−1で作成した2進表示の関数を再利用すること。
856デフォルトの名無しさん:2009/10/26(月) 07:14:53
>>855
% Prolog 問題1−1 反復型処理(ビット列の表示)

t855_1(_10進数) :-
  二進数(_10進数,L),
  '4文字区切り'(L,S),
  findsum(1,member(0,L),S0),
  findsum(1,member(1,L),S1),
  write_formatted('%t は2進表示で %t です\n0のビット数は%t,1のビット数は%tで
す.\n',[_10進数,S,S0,S1]).

二進数(_10進数,L) :-
  length(L,32),
  二進数(_10進数,[],X),
  append(L1,X,L),
  all(L1,0).

二進数(J,Y,[J|Y]) :- J < 2.
二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X).

'4文字区切り'([],'').
'4文字区切り'([A,B,C,D|R],S) :-
  '4文字区切り'(R,S1),
  concat_atom([A,B,C,D,' ',S1],S).
857デフォルトの名無しさん:2009/10/26(月) 08:16:41
858デフォルトの名無しさん:2009/10/26(月) 17:05:11
http://pc12.2ch.net/test/read.cgi/tech/1255709298/358
# [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# (1)ライプニッツの公式を用いて円周率の近似値を求める時、
# その値が3.14から3.15の間になるまで
# nを増やしていき、そのnの値(繰り返し回数)を求めるプログラムを作成せよ。
#
# (2)ライプニッツの公式を用いて円周率の近似値を以下の条件で求めよ。
# nの値が増えるにつれ、それまでの近似値の平均値を求め、近似値と平均値の
# 差が平均値の1%におさまるまで繰り返す。
859デフォルトの名無しさん:2009/10/26(月) 17:44:17
http://pc12.2ch.net/test/read.cgi/tech/1255709298/355
# [1] 授業単元:C言語とアルゴリズム
# [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10016.txt
# [1] 文字列処理(文字分類関数)
# キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、
# その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。
# ただし、入力する文字数は最大30文字とする。文字分類関数を必ず用いること

# [2] 文字列処理(文字列操作関数、文字変換関数、文字分類関数)
# キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後
# 小文字と大文字を入れ換えた文字列を表示するプログラムを作成しなさい。ただし、入力する
860デフォルトの名無しさん:2009/10/26(月) 18:12:03
861デフォルトの名無しさん:2009/10/26(月) 18:25:05
>>858
;; Common Lisp
(defun lebniz-formula (n)
(if (> n 0)
(+ (/ (expt -1 (mod n 2)) (+ (* 2 n) 1)) (lebniz-formula (- n 1)))
1.0))
lebniz-formula

;; (1)
(do ((n 0 (incf n)) (m_pi 0))
((and (< 3.14 m_pi) (< m_pi 3.15)) n)
(setf m_pi (* (lebniz-formula n) 4)))

;; (2)
(do ((n 0 (incf n)) (m_pi 0) (lst '(0)) (ave))
((and (> n 1) (< (abs (- ave m_pi)) (* ave 0.01))) m_pi)
(setf m_pi (* (lebniz-formula n) 4)
lst (cons m_pi lst)
ave (/ (apply #'+ lst) (length lst))))
862デフォルトの名無しさん:2009/10/26(月) 19:39:47
>>858
% Prolog

'ライプニッツの公式を用いて円周率の近似値を求める時、その値が3.14から3.15の間になるまでnを増やしていき、そのnの値(繰り返し回数)を求める'(Pai) :-
  'ライプニッツの公式を用いてその一'(1,4.0,Pai).

'ライプニッツの公式を用いてその一'(N,X,X) :- X > 3.14,X < 3.15,!.
'ライプニッツの公式を用いてその一'(N,Y,X) :-
  U is 4 * (-1 ^ N) / (2 * N + 1),
  N2 is N + 1,
  Z is Y + U,
  'ライプニッツの公式を用いてその一'(N2,Z,X) .

'ライプニッツの公式を用いて円周率の近似値を以下の条件で求めよ。 nの値が増えるにつれ、それまでの近似値の平均値を求め、近似値と平均値の差が平均値の1%におさまるまで繰り返す。'(Pai) :-
  'ライプニッツの公式を用いてその二'(1,4.0,Pai).

'ライプニッツの公式を用いてその二'(N,X,X) :-
  Avg is X / N,
  abs((Y - Avg) / Avg) =< 1.0,!.

'ライプニッツの公式を用いてその二'(N,Y,X) :-
  U is 4 * (-1 ^ N) / (2 * N + 1),
  N2 is N + 1,
  Z is Y + U,
  'ライプニッツの公式を用いてその二'(N2,Z,X).
863デフォルトの名無しさん:2009/10/26(月) 19:47:05
>>862 訂正
'ライプニッツの公式を用いてその二'(N,X,X) :-
  Avg is X / N,
  abs((X - Avg) / Avg) =< 1.0,!. /* Y となっていたところを X に変更 */

'ライプニッツの公式を用いてその二'(N,Y,X) :-
  U is 4 * (-1 ^ N) / (2 * N + 1),
  N2 is N + 1,
  Z is Y + U,
  'ライプニッツの公式を用いてその二'(N2,Z,X).
864デフォルトの名無しさん:2009/10/26(月) 20:39:47
>>859 [1]
% Prolog

'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'
:-
  write('アルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力してください(最大30文字)\n'),
  get_line(Line),
  '30文字を越えたら切り取る'(Line,Line1),
  atom_codes(Line1,Codes),
  文字種判定(Chars,_小文字カウント,_大文字カウント,_数字カウント),
  write_formatted('文字列 %t のなかに 小文字は %t文字 大文字は %t文字 数字は%t文字ありました\n',[Line1,_小文字カウント,_大文字カウント,_数字カウント]).

'30文字を越えたら切り取る'(Line,Line1) :- sub_atom(Line,0,30,_,Line1),!.
'30文字を越えたら切り取る'(Line,Line).

文字種判定([],0,0,0).
文字種判定([U|R],A,B,C) :- 文字種判定(R,A2,B,C),U >=97,U =< 122,A is A2 + 1.
文字種判定([U|R],A,B,C) :- 文字種判定(R,A,B2,C),U >=65,U =< 90,B is B2 + 1.
文字種判定([U|R],A,B,C) :- 文字種判定(R,A,B,C2),U >=48,U =< 57,C is C2 + 1.
865デフォルトの名無しさん:2009/10/26(月) 20:45:05
>>859 [2]
% Prolog

'キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後小文字と大文字を入れ換えた文字列を表示するプログラムを作成しなさい。ただし、入力する' :-
  write('姓名をローマ字で入力してください\n'),
  write('姓 ? '),get_line(_姓),
  write('名 ? '),get_line(_名),
  atom_concat(_姓,_名,_姓名),
  atom_codes(_姓名,Codes),
  大文字小文字相互変換(Codes,Codes2),
  atom_codes(_大文字小文字相互変換された姓名,Codes2),
  write_formatted('大文字と小文字を相互に変換した姓名は %t です\n',[_大文字小文字相互変換された姓名]).

大文字小文字相互変換([],[]).
大文字小文字相互変換([A|R1],[B|R2]) :-
  A >= 65,
  A =< 90,
  B is A + 32,
  大文字小文字相互変換(R1,R2).
大文字小文字相互変換([A|R1],[B|R2]) :-
  A >= 97,
  A =< 122,
  B is A - 32,
  大文字小文字相互変換(R1,R2).
大文字小文字相互変換([A|R1],[A|R2]) :-
  大文字小文字相互変換(R1,R2).
866デフォルトの名無しさん:2009/10/26(月) 21:50:09
http://pc12.2ch.net/test/read.cgi/tech/1255709298/365
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10019.txt
#
# 区分積分法を用いて、 y=3x*x , (0 ≦ x ≦1)の面積を求めるプログラム
867デフォルトの名無しさん:2009/10/26(月) 22:04:40
http://pc12.2ch.net/test/read.cgi/tech/1255709298/369
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10021.txt
# 1.
# 整数nをscanfで入力後"factorial"という関数を呼び出して、n!を求めるプログラム。
#
# (定義例:int factorial(int num))
#
# 2.
# 2*2の行列A,Bの積(Cij=?Aik Bkj)を実行・表示するプログラム
868デフォルトの名無しさん:2009/10/26(月) 22:35:00
>>866
% Prolog

f(X,Y) :- Y is 3 * X * X.

区間求積法(M,S) :-
  findsum(U,(for(0,N,M),V is N / M,f(V,W),U is (1.0 / M) * W),S).
869デフォルトの名無しさん:2009/10/26(月) 22:37:28
>>868 訂正

f(X,Y) :- Y is 3 * X * X.

区分求積法(M,Sum) :-
findsum(U,(for(0,N,M),V is N / M,f(V,W),U is 1.0 / M * W),Sum).
870デフォルトの名無しさん:2009/10/26(月) 23:23:41
>>867
% Prolog

'整数nをscanfで入力後"factorial"という関数を呼び出して、n!を求める'(N,X) :-
  get_integer(N),
  factorial(N,X).

factorial(1,1) :- !.
factorial(N,X) :- N>1,N1 is N-1,factorial(N1,Y),X is N * Y.

'2×2行列と2×2行列の積'([[A1,A2],[A3,A4]],[[B1,B2],[B3,B4]],[[C1,C2],[C3,C4]])
:-
  C1 is A1*B1+A2*B3,
  C2 is A1*B2+A2*B4,
  C3 is A3*B1+A4*B3,
  C4 is A3*B2+A4*B4.
871デフォルトの名無しさん:2009/10/26(月) 23:30:51
http://pc12.2ch.net/test/read.cgi/tech/1255709298/371
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):ニュートン法を用いて三次方程式の解を求める。
872デフォルトの名無しさん:2009/10/27(火) 05:18:23
http://pc12.2ch.net/test/read.cgi/tech/1248012902/430
# 【 課題 】http://ime.nu/uploader.sakura.ne.jp/src/up1280.jpg
#
# スタックへのpush,pop,add(先頭と次の要素をpopして足したものをpush),
# sigma(スタックにpushされたすべての要素をpopしてその合計をpushする)
# を定義しなさい。
873デフォルトの名無しさん:2009/10/27(火) 05:56:17
>>872
% Prolog

push(_追加要素,_スタック,_追加されたスタック) :- _追加されたスタック = [_追加要
素|_スタック].

pop(_取り出される要素,_スタック,_取り出された後のスタック) :- _スタック = [_取
り出される要素|_取り出された後のスタック].

empty(_スタック) :- _スタック = [].

length(_スタック,Length) :- length(_スタック,Length).

add(_スタック,[0]) :- length(_スタック,0),!.
add(_スタック,_加算後のスタック) :-
  length(_スタック,1),
  pop(_要素,_スタック,_スタック2),
  push(_要素,_スタック2,_加算後のスタック),!.
add(_スタック,_加算後のスタック) :-
  pop(_要素1,_スタック,_スタック1),
  pop(_要素2,_スタック1,_スタック2),
  push(_合計,_スタック2,_加算後のスタック).

sigma(_スタック,_スタック) :- length(_スタック,1),!.
sigma(_スタック,_全要素加算後のスタック) :-
  add(_スタック,_スタック2),
  sigma(スタック2,_全要素加算後のスタック).
874デフォルトの名無しさん:2009/10/27(火) 05:59:05
>>872 一部書き直し
push(_追加要素,_スタック,_追加されたスタック) :- _追加されたスタック = [_追加要素|_スタック].

pop(_取り出される要素,_スタック,_取り出された後のスタック) :- _スタック = [_取り出される要素|_取り出された後のスタック].
875デフォルトの名無しさん:2009/10/27(火) 07:31:59
http://chomework.sakura.ne.jp/log1/1135125328_02.html
# 問題文
# データを読み込み2進、8進、10進、16進で表示せよ。
# ただし、読み込みはgetchar()で4桁入力。表示はputchar()で必要桁数表示する。
# データが0の時処理を終了、データ入力はXXXXとする。
876デフォルトの名無しさん:2009/10/27(火) 07:37:54
http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号139)
# [1] 授業単元:プログラミング
# [2] HEADコマンドを実装せよ
#   構文head[-Ln][filename]
# 実現する機能:ファイルの先頭の複数行を画面に出力する。
#   引数:Ln:出力する行数nを指定する(デフォルトは10行)
877デフォルトの名無しさん:2009/10/27(火) 07:41:53
http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号194)
# [1] 授業単元: 情報処理
# [2] 問題文(含コード&リンク):ファイルからデータ(迷路空間)を読み込む処理と構造体・リストを用いた、
# 迷路空間を作成せよ。
# 読み込むデータは右図のような形式であり、    ******
# 各記号は次の意味を持つものとする。       *8000*
# * : 壁                     ****0*
# 0 : 通路                    **000*
# 8 : 通路 & スタート               *90*0*
# 9 : 通路 & ゴール                ******
# 迷路空間は、必ず長方形であることを前提とする。
# そして、再帰を用いた迷路空間の探索プログラムも作成せよ。
# 最短経路と後戻りした記録付き経路のどちらを表示しても構わないが両方表示した方がポイント高し
878デフォルトの名無しさん:2009/10/27(火) 07:55:25
http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110)
# [1] 授業単元:プログラミング1
# [2] 問題文(含コード&リンク):
# 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。
# なお,データは,学籍番号順に入力されるわけではない。
# このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。
# ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。
# 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。
879デフォルトの名無しさん:2009/10/27(火) 08:05:14
http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号186)
[1] 授業単元:プログラミング
[2] 問題文:次のような英小文字の「変換規則」が複数個入ったファイルを用意する。例えばruleとする。
# a -> b
# b -> c
# c -> x
# c -> z
# 変換規則のファイル名、及び「開始文字」を入力し、変換規則を可能な限り使い、変換できなくなるまで変換の過程を出力せよ。何通りもある場合はせべて出力せよ。
# ただし、変換過程にループがある場合にはその旨を表示して終了すること。
#〜例1〜
# 変換規則のファイル:rule
# 開始文字:a
# 出力:
# [1]a -> b -> c -> d
# [2]a -> b -> x
# 〜例2〜
# 変換規則の例
# a -> b
# b -> a
# 開始文字:a
# 出力:ループがあります。
880デフォルトの名無しさん:2009/10/27(火) 08:34:44
>>875
% Prolog

データを読み込み2進、8進、10進、16進で表示 :-
  repeat,
  write('4桁の数字を入力してください : '),
  get_char(Line),
  sub_atom(Line,0,4,_,Line),
  atom_to_term(Line,_10進数,_),
  データを読み込み2進、8進、10進、16進で表示(_10進数).

データを読み込み2進、8進、10進、16進で表示(0) :- !.
データを読み込み2進、8進、10進、16進で表示(_10進数) :-
  N進数(2,_10進数,_2進数文字列),
  N進数(8,_10進数,_8進数文字列),
  N進数(16,_10進数,_16進数文字列),
  write_formatted('%tの 2進数表示は %t, 8進数表示は %t, 16進数表示は %t,です\
n',[_2進数文字列,_8進数文字列,_16進数文字列]),
  fail.

% N進数/3の定義は http://nojiriko.asia/prolog/t875.html 参照
881デフォルトの名無しさん:2009/10/27(火) 08:54:10
>>876
% Prolog

program :- head.

head :-
  user_parameters(_パラメータリスト),
  ファイル名と表示行数の取得(_パラメータリスト,_ファイル名,N),
  get_lines(_ファイル,Lines),
  length(L,N),
  append(L,L2,Lines),
  member(_行,L),
  write_formatted('%t\n',[_行]),
  fail.
head.

ファイル名と表示行数の取得(['-L',A,_ファイル名],_ファイル名,N) :-
  atom_to_term(A,N,_),!.
ファイル名と表示行数の取得(['-l',A,_ファイル名],_ファイル名,N) :-
  atom_to_term(A,N,_),!.
ファイル名と表示行数の取得([A,_ファイル名],_ファイル名,N) :-
  sub_atom(A,0,2,J,_),
  sub_atom(A,2,J,_,B),
  atom_to_term(B,N,_).
882デフォルトの名無しさん:2009/10/27(火) 09:27:47
>>878
% Prolog

成績上位11名 :-
  成績データを得る(_成績ならび),
  sort(_成績ならび,_整列した成績ならび),
  上位11名の選別(_整列した成績ならび,_上位11名ならび),
  member([A,B,C],_上位11名ならび),
  write_formatted('%t %t\n',[C,A]),
  fail.
成績上位11名.

成績データを得る(_成績ならび) :-
  get_line(Line),
  成績データを得る(1,Line,_成績ならび).

成績データを得る(_,'0 0',[]).
成績データを得る(N行,_行,[[_成績,N行,_学籍番号]|R]) :-
  split(_行,[' '],[_学籍番号,_成績]),
  get_line(_行2),
  N2行 is N行 + 1,
  成績データを得る(N2行,_行2,R).

上位11名の選別(L,X) :-
  length(X,11),
  append(X,_,L),!.
上位11名の選別(X,X).
883デフォルトの名無しさん:2009/10/27(火) 09:38:50
>>882
% ちがった! reverseし忘れたのと、入力順の関係を逆転させなくては・・・

成績上位11名 :-
  成績データを得る(_成績ならび),
  sort(_成績ならび,_点数が少ない順に整列した成績ならび),
  reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび),
  上位11名の選別(_整列した成績ならび,_上位11名ならび),
  member([A,B,C],_上位11名ならび),
  write_formatted('%t %t\n',[C,A]),
  fail.
成績上位11名.

成績データを得る(_成績ならび) :-
  get_line(Line),
  成績データを得る(100,Line,_成績ならび).

成績データを得る(_,'0 0',[]) :- !.
成績データを得る(0,_,[]) :- !.
成績データを得る(N行,_行,[[_成績,N行,_学籍番号]|R]) :-
  split(_行,[' '],[_学籍番号,_成績]),
  get_line(_行2),
  N1行 is N行 - 1,
  成績データを得る(N1行,_行2,R).
884デフォルトの名無しさん:2009/10/27(火) 10:19:40
>>879
% Prolog

'変換規則を可能な限り使い、変換できなくなるまで変換の過程を出力'(_ファイル名,_開始要素) :-
  abolish(変換規則/2),
  変換規則ファイルの読み込み(_ファイル名),
  変換規則の変換過程ならび(_開始要素,_変換過程ならび),
  concat_atom(_変換過程ならび,' -> ',S),
  wr('%t\n',[S]),
  fail.
'変換規則を可能な限り使い、変換できなくなるまで変換の過程を出力'(_,_).

変換規則の変換過程ならび(A,[]) :-
  \+(変換規則(A,_)).
変換規則の変換過程ならび(A,[A,B|R]) :-
  変換規則(A,B),
  変換規則の変換過程ならび(B,R).

変換規則ファイルの読み込み(_ファイル) :-
  get_lines(_ファイル,Lines),
  member(_行,Lines),
  split(_行,[' -> ','->'],[A,B]),
  assertz(変換規則(A,B)),
  fail.
変換規則ファイルの読み込み(_).
885デフォルトの名無しさん:2009/10/27(火) 10:24:45
>>884
  wr('%t\n',[S]), は
  write_formatted('%t\n',[S]),

に置換してください
886デフォルトの名無しさん:2009/10/27(火) 12:55:29
http://pc12.2ch.net/test/read.cgi/tech/1248012902/434
# 【 課題 】http://ime.nu/www1.axfc.net/uploader/Sc/so/49653
# レストランのメニューを表示するクラス
# レベル1: 6点満点メニューを表示するだけ。ただし、各フィールドやメソッドに
# 適切なコメントを記述すること。
# レベル2:7点満点キーボード入力でデザートを切り替える機能を追加。
# レベル3: 8点満点キーボード入力された値が無効な場合と有効な場合で実行結果を切り替える機能を追加。
# レベル4: 9点満点RestaurantMenu2.java という名前で、RtaurantMenu.javaの
# コピーを作る。RestaurantMenu2.javaでは、mainDish, dessertという配列を
# 廃止し、2次元配列menuでそれらと同等の文字列を管理する。その上で各メソッドを
# 改造し、レベル3と同じ機能を持つようにする。実行結果もレベル3と同じ。
# レベル5: 10点満点メインディッシュとデザートの組み合わせからなる
# セットメニューを表示するためのメソッド、showSetMenu を追加し、
# それを用いて下記の実行結果を得る。プログラム内のデザート番号入力及び
# メニュー表示部分は消さずにコメントアウトしておく。
887デフォルトの名無しさん:2009/10/27(火) 15:57:50
http://pc12.2ch.net/test/read.cgi/tech/1255709298/389
# 四角形の頂点が全て、三角形の内側にある事。
888デフォルトの名無しさん:2009/10/27(火) 16:01:34
>>887
% Prolog

四角形の頂点が全て、三角形の内側にある(_四角形のX1,_四角形のY1,_四角形のX2,_四角形のY2,_四角形のX3,_四角形のY3,_四角形X4,_四角形Y4,X1,Y1,X2,Y2,X3,Y3) :-
  三角形による包含判定(_四角形のX1,_四角形のY1,X1,Y1,X2,Y2,X3,Y3),
  三角形による包含判定(_四角形のX2,_四角形のY2,X1,Y1,X2,Y2,X3,Y3),
  三角形による包含判定(_四角形のX3,_四角形のY3,X1,Y1,X2,Y2,X3,Y3),
  三角形による包含判定(_四角形のX4,_四角形のY4,X1,Y1,X2,Y2,X3,Y3).

三角形による包含判定(PのX座標,PのY座標,X1,Y1,X2,Y2,X3,Y3) :-
  _中心X座標 is (X1+X2+X3) / 3,
  _中心Y座標 is (Y1+Y2+Y3) / 3,
  それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X1,Y1,X2,Y2),
  それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X1,Y1,X3,Y3),
  それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X2,Y2,X3,Y3).

それぞれ2点を通る2直線が交差しない(X1,Y1,X2,Y2,X3,Y3,X4,Y4) :-
  U1 is (X1-X2)*(Y3-Y1)+(Y1-Y2)*(X1-X3),
  U2 is (X1-X2)*(Y4-Y1)+(Y1-Y2)*(X1-X4),
  U is U1 * U2,
  U >= 0.
889デフォルトの名無しさん:2009/10/27(火) 16:26:13
http://pc12.2ch.net/test/read.cgi/tech/1255709298/396
# [1] 授業単元:卒業研究
# [2] 問題文(含コード&リンク):白黒濃淡画像[0-255]をカラー画像に変換
# [5]その他の制限:
# ・色をユーザーから指定することはできない。
# ・画像はできればppm形式
890デフォルトの名無しさん:2009/10/27(火) 22:45:51
http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号196)
# [1] 授業単元:プログラミング1
# [2] 問題文(含コード&リンク):
# 全部で20個の整数データを順に入力するものとする。
# その際,各データを入力する毎に,新たに入力されたデータが,すでに入力されたデータと異なる場合だけ,
# そのデータを出力するプログラムを書け。
# なお,データは,1行に1つずつ出力せよ.
891デフォルトの名無しさん:2009/10/27(火) 23:08:45
>>890
% Prolog

すでに入力されていたデータは対象としない :-
  すでに入力されていたデータは対象としない(20,[]).

すでに入力されていたデータは対象としない(0,_) :- !.
すでに入力されていたデータは対象としない(N,L) :-
  get_line(Line),
  \+(member(Line,L)),
  write_formtted('%t\n',[Line]),
  N2 is N - 1,
  すでに入力されていたデータは対象としない(N2,[Line|L]),!.
すでに入力されていたデータは対象としない(N,L) :-
  すでに入力されていたデータは対象としない(N,L).
892デフォルトの名無しさん:2009/10/27(火) 23:21:47
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号37)
# [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):1から999までの整数を入力 その読み方をを表示するプログラムを書け
# 1から999でない場合エラーを表示せよ
893デフォルトの名無しさん:2009/10/27(火) 23:42:38
>>892
% Prolog

数値の読み方(N,エラー) :- N < 1,!.
数値の読み方(N,エラー) :- N >= 1000,!.
数値の読み方(0,'').
数値の読み方(1,いち).
数値の読み方(2,に).
数値の読み方(3,さん).
数値の読み方(4,よん).
数値の読み方(5,ご).
数値の読み方(6,ろく).
数値の読み方(7,なな).
数値の読み方(8,はち).
数値の読み方(9,きゅう).
894デフォルトの名無しさん:2009/10/27(火) 23:45:17
>>892 (>>893 のつづき)
% Prolog

数値の読み方(N,S) :-
   N > 9,N < 20,
   N1 is N - 10,
   数値の読み方(N1,S1),
   concat_atom([じゅう,S1],S).
数値の読み方(N,S) :-
   N > 19,N < 100,
   N1 is N // 10,
   M1 is N mod 10,
   数値の読み方(N1,S1),
   数値の読み方(M1,S2),
   concat_atom([S1,じゅう,S2],S).
数値の読み方(N,S) :-
   N > 99,N < 199,
   N1 is N - 100,
   数値の読み方(N1,S1),
   concat_atom([ひゃく,S1],S).
数値の読み方(N,S) :-
   N > 199,N < 1000,
   N1 is N // 100,
   M1 is N mod 100,
   数値の読み方(N1,S1),
   数値の読み方(M1,S2),
   concat_atom([S1,びゃく,S2],S).
895デフォルトの名無しさん:2009/10/28(水) 00:17:10
http://pc12.2ch.net/test/read.cgi/tech/1255709298/422
# [1] 授業単元: c言語
# [2] 問題文
# 課題1 整数 n を入力すると n から1 までを出力する
# プログラムを作成せよ。
# 課題2 整数 n を入力すると1からn まで出力する。
# ただし、3の倍数か、5の倍数の時には数字の右側に* と表示すること。
# プログラムを作成せよ。
# 課題3 整数 n を入力すると1 から n までの間の、
# 3か5いずれかの倍数の個数を数えて表示するプログラムを作成せよ。
896デフォルトの名無しさん:2009/10/28(水) 00:18:03
897デフォルトの名無しさん:2009/10/28(水) 05:03:17
>>895
% Prolog 課題1 三つの解答例
t895_1_1(N) :- for(N,J,1),write_formatted('%t\n',[J]),N=1.

t895_1_2(0) :- !.
t895_1_2(N) :- write_formatted('%t\n',[N]),N1 is N-1,t895_1_2(N1).

t895_1_3(N) :- t895_1_3(N,1).
t895_1_3(M,N) :- M < N,!.
t895_1_3(M,N) :- write_formatted('%t\n',[M]),M1 is M-1,t895_1_3(M1,N).
898デフォルトの名無しさん:2009/10/28(水) 05:19:41
>>895
% Prolog 課題2

t895_2(N) :- for(N,J,1),t895_2_表示(J),J=1.
t895_2_表示(N) :- 0 is N mod 3,write_formatted('%t\n',[N]),!.
t895_2_表示(N) :- 0 is N mod 5,write_formatted('%t\n',[N]),!.
t895_2_表示(N) :- write_formatted('%t\n',[N]).
899デフォルトの名無しさん:2009/10/28(水) 05:43:10
>>895
% Prolog 課題3

t895_3(N) :-
  findsum(1,(for(1,J,N),'3か5の倍数'(J)),X),
  write_formatted('3か5の倍数は%t個あります\n',[X]).

'3か5の倍数'(J) :- 0 is J mod 3,!.
'3か5の倍数'(J) :- 0 is J mod 5,!.
900デフォルトの名無しさん:2009/10/28(水) 08:53:40
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号55)
# [1] 授業単元:プログラミング2
# [2] 問題文(含コード&リンク):
# アルファベットと数字からなる文字列 str と文字 c を引数として受け取り,
# 文字列 str から文字 c をすべて削除する返す関数 del_chrを定義し,
# 動作を確認するプログラムを作成せよ.
901デフォルトの名無しさん:2009/10/28(水) 08:58:37
>>900
% Prolog

del_chr(_対象文字列,_削除する文字,_削除された文字列) :-
  atom_chars(_対象文字列,_対象文字ならび),
  findall(C,(member(C,_対象文字ならび),\+(C=_削除する文字)),L),
  atom_chars(_削除された文字列,L).
902デフォルトの名無しさん:2009/10/28(水) 09:03:33
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号145)
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# 次の説明を読んで、プログラムを作成しなさい。
#
# 小数で入力される気温のデータを5℃単位の整数に丸めたい。
# キーボードからdouble型変数kに気温を入力し、
# 丸めた数値はint型変数gに求め、gを画面に出力する。
#
# ただし入力データに負の気温はないものとする。
903デフォルトの名無しさん:2009/10/28(水) 09:20:05
>>902
% Prolog

t902 :-
  write('気温データを浮動小数点数値として入力してください : '),
  get_line(Line),
  atom_to_term(Line,_小数,_),
  '五度単位の丸め'(_小数,_丸めた整数),
  write('五度単位で丸めると %t となります\n',[_丸めた整数]).

'五度単位で丸め'(_小数,_丸めた整数) :-
  _丸めた整数 is truncate(floor(_小数 / 5.0) * 5.0).
904デフォルトの名無しさん:2009/10/28(水) 09:23:22
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号146)
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# キーボードから100点満点のテストの点数を入力し(-1で終了)、
# 10点ごとの人数を int型の配列 count[11]に数えるプログラムを
# 作成せよ。 テストは100点満点とし、それ以外の入力はエラーとし
# て無視する。ただし -1 はデータの終了を表すものとする。 点数
# の入力が終了したら、度数分布を画面に出力して終了する。出力は
# 人数と,*(アスタリスク)によるグラフとする。
905デフォルトの名無しさん:2009/10/28(水) 10:32:12
>>904
% Prolog

t904 :-
  write('点数(整数)をカンマで区切って入力してください : '),
  get_line(Line),
  split(Line,[','],_成績ならび),
  findall(U,(member(V,_成績ならび),'10点ごとの丸め'(V,U)),_丸めた成績ならび),

  分布ならびを得る(_丸めた成績ならび,[0,10,20,30,40,50,60,70,80,90,100],[[],[],[],[],[],[],[],[],[],[],[]],L1),
  アスタリスクによる横棒グラフ([0,10,20,30,40,50,60,70,80,90,100],L1).

'10点ごとの丸め'(_点数,_10点ごとに丸めた点数) :-
  _10点ごとに丸めた点数 is (_点数 // 10) * 10.

分布ならびを得る([],_,L,L) :- !.
分布ならびを得る([V|R],L1,L2,L3) :-
  list_nth(N,L1,V),
  list_nth(N,L2,W),
  要素番号によるならびの置換(N,[*|W],L2,L4),
  分布ならびを得る(R,L1,L4,L3).

アスタリスクによる横棒グラフ([],_) :- !.
アスタリスクによる横棒グラフ([A|R1],[L|R2]) :-
  atom_chars(B,L),
  write_formatted('%3d %t\n',[A,B]),
  アスタリスクによる横棒グラフ(R1,R2).
906デフォルトの名無しさん:2009/10/28(水) 11:40:19
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号264)
# [1]C言語中上級
# [2]
# 3つの65535以下の非負整数a,b,cを乱数で生成します。a,b,cから次のような文字列を作ります。
# [a+b][b+c][c+a][a][b][c][|a-b|][|b-c|][|c-a|][ab][bc][ac]
# [m]はmを10進表示した文字列を表す
# |m|はmの絶対値を表す
# それを10進数表示し結合した文字列を作り、それらをdecomposite関数に引数渡しして、
# 元の3つの数を再現する処理をC言語プログラムで記述しなさい。
# 元の3数は、decompositeからはアクセスできない、呼び出し側のローカル変数領域の外側に公開しないで下さい。
# 23,39,17が生成された場合文字列 62564023391716226897663391をdecompositeに渡す。
# 生成された3つの数、渡す文字列共に出力してから、decomposite関数を呼び出して下さい。
# (関数の中で、決定された3数を出力)
# 一意に元の数を決定できない場合はdecomposite関数の中で一意決定不能と表示し、#すべての候補を出力して下さい。
907デフォルトの名無しさん:2009/10/28(水) 21:15:01
>>906
こんなの本当に解けるの?
908デフォルトの名無しさん:2009/10/28(水) 22:25:04
http://pc12.2ch.net/test/read.cgi/tech/1255709298/442
# [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10025.txt
# 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。
#
# 降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、
# 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、
# 上位10件のデータを再度書き込むプログラムを作成せよ
#
# 999999,6,faegalr
# 999976,123,aaaaaa
# 999923,23,Steel
# 999765,43,tyudayo
# 786754,34,tyui
# 713146,10,gawehgpoin
# 654789,12,abaeuogn
# 479136,65,gwerhja
# 456789,43,tyu
# 454545,45,454545
# 123456,34,ert
909デフォルトの名無しさん:2009/10/28(水) 22:48:00
>>908
% Prolog

t908(File) :-
  get_lines(File,Lines),
  findall(U,(member(A,Lines),split(A,[','],U)),L1),
  get_line(Line),
  split(Line,[','],W),
  降順整列状態を保って挿入する(W,L1,L2),
  append(L3,[_],L2),
  findall(S,(member(L4,L3),concat_atom(L4,',',S)),L5),
  put_lines(File,L5).

降順整列状態を保って挿入する(_挿入要素,L1,L2) :-
  append(L3,L4,L1),
  append(L3,[_挿入要素|L4],L2),
  すべての要素が大きい(L3,_挿入要素),
  すべての要素が小さいか等しい(L4,_挿入要素).

すべての要素が大きい([],_).
すべての要素が大きい([A|R],B) :- A @> B,すべての要素が大きい(R,B).

すべての要素が小さいか等しい([],_).
すべての要素が小さいか等しい([A|R],B) :- A @=< B,すべての要素が小さいか等しい(R,B).
910デフォルトの名無しさん:2009/10/29(木) 04:42:46
>>908

;; Common Lisp

(defun get-data-from (filename)
(let (score-list)
(with-open-file (file filename :direction :input)
(do ((i 0 (incf i)) (buff))
((or (> i 10) (null (setf buff (read-line file nil)))))
(setf score-list (cons buff score-list))))
score-list))

(defun insert-data (dat lst)
(sort (cons dat lst) #'(lambda (a b)
(setf as (parse-integer (subseq a 0 (position #\, a)))
bs (parse-integer (subseq b 0 (position #\, b))))
(> as bs))))

(defun write-data-to (lst filename)
(with-open-file (file filename :direction :output)
(dotimes (i 10)
(princ (format nil "~A\n" (nth i lst)) file))))

;; (main "999975,10,newbee" "/file/of/data.txt")
(defun main (dat filename)
(write-data-to (insert-data dat (get-data-from filename)) filename))
911デフォルトの名無しさん:2009/10/29(木) 05:53:48
>>886
% Prolog 作り掛けです
http://nojiriko.asia/prolog/t886.html
912デフォルトの名無しさん:2009/10/29(木) 12:40:15
http://pc12.2ch.net/test/read.cgi/tech/1248012902/442
# 【 課題 】h ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/820.txt
# 【 形態 】2. Applet
# 1)各自のPC1とPC2のそれぞれにサーバーをたてる。
# サーバー1,2:メッセージを受け、自分のメッセージを付加(アペンド)して返す。
#
# 2)その両方のサーバーに交信する以下のクライアントを作成する。
# クライアント:一方のサーバーにメッセージを送り、
# サーバーは、それまでにクライアントから来たメッセージを貯め、まとめて返す。
# Localhostではなく実際にipアドレスを確認し、複数のプロセッサ間の動作を
# 確認すること。
913デフォルトの名無しさん:2009/10/29(木) 12:44:08
http://pc12.2ch.net/test/read.cgi/tech/1255709298/449
# [1] 授業単元:C++実習2
# [2] 問題文(含コード&リンク):
# -関数テンプレート-
# 配列へのポインタと要素数を渡すと昇順にソートする関数を作成せよ。
# 但し,関数テンプレートにより作成すること。想定する配列の型は文字列以外とする。
# ソートのアルゴリズムはバブルソート(単純交換法)とする。また,関数をテストする適切なmain関数も作成し提出すること。
# 関数名前名は b_sort とし,第1引数は配列へのポインタ, 第2引数はint型で配列の要素数, 戻値は無しとする。
914デフォルトの名無しさん:2009/10/29(木) 13:14:33
>>913
% Prolog

b_sort(L,X) :-
  昇順が崩れるまで数値版(L,L2),
  b_sort(L2,X),!.
b_sort(L,L).

昇順が崩れるまで数値版([A],_) :- !,fail.
昇順が崩れるまで数値版([A,B|R1],[A|R2]) :-
  A =< B,
  昇順が崩れるまで数値版([B|R1],R2).
昇順が崩れるまで数値版([A,B|R1],[B,A|R1]) :-
  A > B.
915デフォルトの名無しさん:2009/10/29(木) 13:52:07
916デフォルトの名無しさん:2009/10/29(木) 14:22:05
>>912
% Prolog (クライアント)
http://nojiriko.asia/prolog/t912_2.html
917デフォルトの名無しさん:2009/10/29(木) 14:56:13
>>912
% Prolog (サーバー)

サーバー(_舫い) :-
  socket(internet,stream,Socket),
  socket_bind(Socket,_舫い),
  サーバー(_舫い,[]),
  socket_shutdown(Socket).

サーバー(_舫い,['shutdown -h server'|_]) :- !.
サーバー(_舫い,_メッセージならび) :-
  socket_listen(Socket),
  socket_accept(Socket,Host : _舫い2,NewSocket),
  open(NewSocket,read,Input),
  open(NewSocket,write,Output),
  get_line(Input,Line),
  append(_メッセージならび,[Line],_メッセージならびの二),
  サーバーメッセージの送信(Output,_メッセージならびの二),
  close(Input),
  close(Output).
  socket_shutdown(NewSocket),
  サーバー(_舫い,_メッセージならびの二).

サーバーメッセージの送信(Output,_メッセージならび) :-
  member(_メッセージ,_メッセージならび),
  put_line(Output,_メッセージ),
  fail.
サーバーメッセージの送信(Output,_).
918デフォルトの名無しさん:2009/10/29(木) 16:11:37
http://pc12.2ch.net/test/read.cgi/tech/1255709298/451
# http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html
# 【質問テンプレ】
# [1] 授業単元:計算機実習応用
# [2] 問題文(含コード&リンク):
# http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html
#
# 問1 上のプログラムのfunction1()の定義を改造して,function1(int x, int y)がx*x+y*yの値をint型で返すようなプログラムに改造し,100*100+50*50の計算をさせて画面に結果を表示させよ(仮引数が2つになっている).
#
# 問2 このプログラムを改造し,2つの非負の実数の四則演算(和差積商)を求め画面表示させるプログラムにせよ.なお,配布した1030sample.exeのように動作するように作ること.また以下の点をよく考えること.
# 1.aとbの値(ゼロより大きい実数)をキーボードから入力させること(scanfを2回使う)
# 2.関数wasasekisho(double x, double y, double * pwa, double * psa, double *pseki, double * psho)を定義して中身を作ること
# 4.main関数に帰ってきてから1030sample.exeのように表示されるものを作ること(printfをうまく使う).
#
# 問3 上記のプログラムを改造して,与えられたデータの平均値を計算する関数はそのまま利用し,main関数の中で分散値を計算して両者を画面表示させなさい(分散を計算する関数は定義しない).画面表示の形式としては,
# データの平均は 4.460000
# データの分散は 7.623000
# 続行するには何かキーを押してください.. .
919デフォルトの名無しさん:2009/10/29(木) 16:38:34
>>918
% Prolog

関数定義(function1(X,Y),_値) :- function1(X,Y,_値).
関数定義(wasasekisho(X,Y),_値) :-
  wasasekisho(X,Y,Pwa,Psa,Pseki,Psho),
  _値 = [Pwa,Psa,Pseki,Psho].
関数定義(heikin(L),_値) :- 相加平均(L,_値).
関数定義(bunsan(L),_値) :- 分散(L,_値).

function1(X,Y,Z) :- Z is X * X + Y * Y.

wasasekisho(X,Y,Pwa,Psa,Pseki,Psho) :- Pwa is X + Y,Psa is X - Y,Pseki is X * Y
,Psho is X / Y.

相加平均(L,Avg) :- findsum(U,member(U,L),Avg).

分散(L,_分散) :-
  length(L,Len),
  相和平均(L,_相加平均),
  分散(L,Len,_相加平均,0.0,_分散).

分散([],N,M,S,V) :- V is S / N,!.
分散([A|R],N,M,S,V) :-
  S1 is (A - M) ^ 2,
  S2 is S + S1,
  分散(R,N,M,S2,V).
920デフォルトの名無しさん:2009/10/29(木) 17:57:20
http://pc12.2ch.net/test/read.cgi/tech/1248012902/443
# 【 課題 】(nの階乗 < 10000)が成り立つ最大の n を求める.
# ループは while 文を利用すること.
# n の階乗とは, n! := 1×2×3×…×n である.[ヒント]: 10000 を超えるまで
# 順に階乗の n を増やし,階乗が 10000 を超えた時点で最後の n を乗算する前の
# n を出力する.与えられた課題文をそのまま書きます
921デフォルトの名無しさん:2009/10/29(木) 18:02:19
>>920
% Prolog

t920(X) :-
  t920(1,1,X).

t920(N,X,X) :-
  (N + 1) * X >= 10000,!.
t920(N,Y,X) :-
  N2 is N + 1,
  Z is Y * N,
  t920(N2,Z,X).
922デフォルトの名無しさん:2009/10/30(金) 10:10:43
>>920
;; Common Lisp
(defun get-largest-n ()
(do ((n 1 (incf n)) (fact 1 (setf fact (* fact n))))
((> fact 10000) (- n 1))
(print fact)))
923デフォルトの名無しさん:2009/10/31(土) 03:01:14
http://pc12.2ch.net/test/read.cgi/tech/1255709298/461
# [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10031.txt
#
# 問題1:整数表記を <integer>::= <digit> {<digit>|'_'}*に書き換える
# 正の整数をdigitだけではなく、'_'もトークンの一部として判別させてやるようにプログラムを書きかえる
# 例えば、10_23と仮に有った場合は10=整数値、_=識別子、23=整数値という風に判別 されるのではなく10_23=1023=整数値となるようにし
# 問題2:以下のようなトークンも判別できるようにしてみる
# 句切り文字:'(',
# 句切り文字:'(',
# 句切り文字:';',
# 演算子:'='
924デフォルトの名無しさん:2009/10/31(土) 03:30:31
>>923
% Prolog 問題1

整数表記の定義例(_t923の整数表記,_整数値) :-
  integer(_t923の整数表記,_整数値).

integer(Atom,Integer) :-
  atom_chars(Atom,Chars),
  integer(Chars,IntegerChars),
  number_chars(Integer,IntegerChars).

integer([],[]).
integer([A,'_'|R1],[A|R2]) :- digit(A),integer(R1,R2).
integer([A|R1],[A|R2]) :- digit(A),integer(R1,R2).
925デフォルトの名無しさん:2009/10/31(土) 04:37:24
926デフォルトの名無しさん:2009/10/31(土) 04:57:35
>>925
% Prolog (問題1)

t925_1 :-
  write('段数を入れてください : '),
  get_integer(_段数),
  _最終行の星数 is (_段数 - 1) * 2 + 1,
  for(1,N,_段数),
  length(L,_最終行の星数),
  length(L1,N),
  all(L1,'*'),
  append(L0,L1,L0,L),
  all(L0,' '),
  atom_chars(Atom,L),
  write_formatted(' %t \n',[Atom]),
  N = _段数.

927デフォルトの名無しさん:2009/10/31(土) 09:35:45
>>925
% Prolog (問題1) 訂正。現在のものでも間違いではないが

t925_1 :-
  write('段数を入れてください : '),
  get_integer(_段数),
  _最終行の星数 is (_段数 - 1) * 2 + 1,
  length(L,_最終行の星数), /* forループの外側に出すことができる */
  for(1,N,_段数),
  length(L1,N),
  all(L1,'*'),
  append(L0,L1,L0,L),
  all(L0,' '),
  atom_chars(Atom,L),
  write_formatted(' %t \n',[Atom]),
  N = _段数.
928デフォルトの名無しさん:2009/10/31(土) 09:45:43
>>927
このlength/2のLの挙動がfor/3を使った反駁機構を利用した
処理にした理由です。再帰の場合、length(L,_最終の星数) は
>>926のように、再帰の中側で必ず実行して、新しいLを
作り出さなくてはならない。引数で持ち回ろうとすると、
append(L0,L1,L0,L) でLは決定されてしまい、次の再帰
呼び出しのなかでfailとなってしまう。
これは高階述語の定義の時にも屡々現れ、Prologの難しい
部分のひとつです。
929デフォルトの名無しさん:2009/10/31(土) 19:36:10
>>925
% Prolog 問題2
t925 :-
  _開始時刻 is time,
  for(1,N,5),
  t925_一問答える,
  N = 5,
  _終了時刻 is time,
  _回答するのに要した時間 is _終了時刻 - _開始時刻,
  write_formatted('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]).

t925_一問答える :-
  A is random mod 100,
  B is random mod 100,
  write_formatted('%t + %t =? ',[A,B]),get_integer(_答え),
  _正解 is A + B,
  t925_診断(_正解,_答え,_診断),
  write_formatted('%t\n',[_診断]).

t925_診断(_正解,_正解,'正解です!!').
t925_診断(_正解,_答え,_診断) :-
1 is abs(_正解 - _答え),
concat_atom(['惜しいです。正解は',_正解],_診断).
t925_診断(_正解,_答え,_診断) :-
  \+(_答え=_正解),\+(1 is abs(_正解 - _答え)),
  concat_atom(['間違いです。正解は',_正解],_診断).
930デフォルトの名無しさん:2009/10/31(土) 19:55:30
>>925
% Prolog 問題3
t925_3 :-
  write('ファイル名を入力してください\n'),
  get_line(_ファイル名),
  get_chars(_ファイル名,Chars),
  t925_3_集計(Chars,_行数,_小文字数,_大文字数,_その他文字数),
  write_formatted('%t行ありました\n',[_行数]),
  write_formatted('小文字の数は%t\n',[_小文字数]),
  write_formatted('大文字の数は%t\n',[_大文字数]),
  write_formatted('その他の数は%t\n',[_その他文字数]).

t925_3_集計([],0,0,0,0).
t925_3_集計(['\n'|R],S1,S2,S3,S4) :-
  t925_3_集計(R,S11,S2,S3,S4),
  S1 is S11 + 1,!.
t925_3_集計([A|R],S1,S2,S3,S4) :-
  A @>= 'a',A @=< 'x',
  t925_3_集計(R,S1,S21,S3,S4),
  S2 is S21 + 1,!.
t925_3_集計([A|R],S1,S2,S3,S4) :-
  A @>= 'A',A @=< 'Z',
  t925_3_集計(R,S1,S2,S31,S4),
  S3 is S31 + 1,!.
t925_3_集計([_|R],S1,S2,S3,S4) :-
  t925_3_集計(R,S1,S2,S3,S41),
  S4 is S41 + 1,!.
931デフォルトの名無しさん:2009/10/31(土) 20:13:01
932デフォルトの名無しさん:2009/10/31(土) 20:14:57
http://pc12.2ch.net/test/read.cgi/tech/1255709298/462
# [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):キューをC言語で作成する
# http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10032.txt
#
933デフォルトの名無しさん:2009/10/31(土) 20:37:24
>>932
% Prolog (この問題は既出でした)

新しいキューを作る(X-X).
キューは空である(X-Y) :- X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).
キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y).

% http://nojiriko.asia/prolog/t561.html 参照
934デフォルトの名無しさん:2009/11/01(日) 12:45:12
935デフォルトの名無しさん:2009/11/01(日) 13:36:04
>>10
ずいぶん前のお題に挑戦
;; Common Lisp
(defun main ()
(let (s lst)
(format t "数字を入力して下さい~%> ")
(setf s (read-line))
(dotimes (i (length s))
(setf lst (cons (- (char-code (char s (- (length s) (+ i 1)))) (char-code #\0)) lst)))
(do ((i 0 (+ i 1)))
((equal (length lst) 0))
(format t "~{~A~}~{~A ~}~%" (make-list i :initial-element " ") lst)
(if (equal (length lst) 1)
(format t "最後に残った数字は~Aです。~%" (car lst)))
(setf lst (mapcar #'(lambda (l) (mod l 10))
(mapcar #'+ lst (cdr lst)))))))
936デフォルトの名無しさん:2009/11/02(月) 06:17:56
http://pc12.2ch.net/test/read.cgi/tech/1255709298/471
# [1] 授業単元:C++
# [2] 問題文(含コード&リンク):メニューを表示し選択された処理を行なう。各機ごとに関数にし,各関数へのポインタは配列に格納しておきメニュー選択に応じて動 妨討喀个后�
# 実行例:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/i10037.txt
937デフォルトの名無しさん:2009/11/02(月) 06:19:25
938デフォルトの名無しさん:2009/11/02(月) 06:56:22
http://pc12.2ch.net/test/read.cgi/tech/1255709298/481
# [1]C言語初級
# [2] 次のプログラムから仕様書を起こして、全く異なるアルゴリズム
# で同じ処理をするものに書き換えよ
# http://ime.nu/codepad.org/FjM5LBs9
939デフォルトの名無しさん:2009/11/02(月) 07:01:04
>>938
ひとまず仕様は

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

要求仕様

1から10000*10000までの範囲の整数Nが以下の条件を満たす時、
1) Nが3の倍数
2) Nを10進表示した時にどこかの桁に3が現れる

全てのNを昇順に整列して、順序番号を付加して表示せよ。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
940デフォルトの名無しさん:2009/11/02(月) 07:28:07
>>938
;; Common Lisp
;; [仕様]
;; 1~10000*10000までの整数のうち、「3の倍数」または「どこかの桁に3が含まれる整数」を
;; 1行に1つずつ小さい順に表示
(defun nabea2 ()
(do ((l 1 (+ l 1)))
((> l (* 10000 10000)))
(if (or (zerop (mod l 3)) (> (count #\3 (princ-to-string l)) 0))
(format t "~a~%" l))))
941デフォルトの名無しさん:2009/11/02(月) 07:31:29
>>939
順序番号はcodepadの表示の仕様じゃないかと
942デフォルトの名無しさん
>>938
% Prolog アルゴリズム案(1) 後はできこなそう・・・
>>941 確かに。Copy&Pasteが変だった。ここでは>>939に従います。

'3の倍数であるか、10進数表記で3が現れる' :-
  '3の倍数であるか、10進数表記で3が現れる'(1,1).

'3の倍数であるか、10進数表記で3が現れる'(_,100000000) :- !.
'3の倍数であるか、10進数表記で3が現れる'(_順序番号,N) :-
  '3の倍数であるか、10進数表記で3が現れるかの判定'(N),
  write_formatted('%8d,%8d\n',[_順序番号,N]),
  _順序番号_2 is _順序番号 + 1,
  N2 is N + 1,
  '3の倍数であるか、10進数表記で3が現れる'(_順序番号_2,N2),!.
'3の倍数であるか、10進数表記で3が現れる'(_順序番号,N) :-
  N2 is N + 1,
  '3の倍数であるか、10進数表記で3が現れる'(_順序番号,N2).

'3の倍数であるか、10進数表記で3が現れるかの判定'(N) :-
  N < 3,!,fail.
'3の倍数であるか、10進数表記で3が現れるかの判定'(N) :-
  0 is N mod 3,!.
'3の倍数であるか、10進数表記で3が現れるかの判定'(N) :-
  N2 is N // 10,
  '3の倍数であるか、10進数表記で3が現れるかの判定'(N2).