1 :
a36 ◆K0BqlCB3.k :
2009/05/21(木) 12:30:47
% 宿題:
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).
4 :
Prolog工作員 :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), ....
となる。
5 :
3 :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. やれやれ、面倒なこととなりました。
>>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).
でよいはず。
ああ、だめだ! 訂正。 get_integer(N) :- get_code(C),C >= 48,C =< 57,N is C-48,!. get_integer(N) :- get_integer(N). でした。 大変失礼しました。
「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).
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
10 :
a36 ◆K0BqlCB3.k :2009/05/23(土) 03:50:22
11 :
a36 ◆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..]
12 :
a36 ◆K0BqlCB3.k :2009/05/23(土) 03:55:37
言語名書き忘れた。 Haskellね。
>>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]
16 :
デフォルトの名無しさん :2009/05/27(水) 06:12:35
Linuxのシェルプログラミング XXXディレクトリに存在するファイル名をすべて小文字のファイル名に変更 ただし、変更後のファイル名がすでに存在する場合は「error!」と画面に出力し、 ファイル名を変更しないようにする というプログラミングを作ってください for文やtr,mvを使うことはわかるんですが・・・ どうかよろしくお願いします。
すいません、急を要するのでageさせていただきます。
>>17 シェル名を書かないのは宗教上の理由からですか?
ていうかこのスレの趣旨に合わないんでUNIX板のエスパーくだ質スレにでもどうぞ
;;;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つのプログラムをアセンブリ言語に翻訳せよという課題があるのですがわかる方教えてもらえませんか? コンパイラによって異なると言われたのですが翻訳例として↓
21 :
20 :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: は
22 :
20 :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 のように翻訳できるとのことです
>>20 LISPマシンではLispがPrologマシンではPrologがアセンブラだよ。
Lispに変換するのでよいのかな?
>>20 #!/bin/sh
gcc -S hoge1.c
gcc -S hoge2.c
>>23 INTER LISPか。マニュアルは持ってるけど機械がないw
26 :
20 :2009/05/28(木) 23:07:54
27 :
23 :2009/05/29(金) 09:06:50
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] その他の制限:なし
% 悪い解答をひとつ % 言語: 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).
;; 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))
;; scheme ;;なんか無駄なことやってた。やり直し。 (define ans (let loop ((x 1)) (if (<= x 0.00001) x (+ x (loop (* x 1/3)))))) (display ans) (newline) (display (exact->inexact ans))
scheme と同じ発想で import Data.Ratio f :: Rational -> Rational f x | x < 0.00001 = x | otherwise = x + f (x/3) main = print $ fromRational $ f 1
# 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)
>>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.
>>32 Rationalな割り算は%じゃないかな。
俺はこんな感じで。
-- Haskell
import Data.Ratio
main = print $ fromRational $ sum $ takeWhile ((>0.00001) . fromRational) $ iterate (\n -> n * (1%3)) 1
いろいろ無駄があったから修正 import Data.Ratio main = print $ fromRational $ sum $ takeWhile (>(1%100000)) $ iterate ((1%3)*) 1
>>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.
>>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).
となる。
>>37 少々癪だが、Haskell短くていいなぁ。
# Prolog流の表示は普通はインタプリタによる論理変数の解決表示ですから # 言語: Prolog データ(山下,65,177,23). データ(尾崎,64,168,60). データ(飯島,72,173,29). データ(吉田,69,166,44). foo(_氏名) :- データ(_氏名,_,_身長,_),_身長>=160,_身長<170. #どうしても強制表示したい場合は、 foo :- foo(_氏名),write(_氏名),nl,fail;true.
# こんなのも可能かな。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,未満,の,人,の,名前,は,_氏名] # が得られるなら、結構おもしろい事がやれるでしょうけれど。
>>36 (%)は整数比からRatioを構築する演算
(/)はRatio同士の割り算
だから、たとえば1%3のことを1/3と書いても大丈夫
# 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))))
>>43 これは、
?- 身長 が 160 cm 以上 で 170 cm 未満 の 人 の 名前 は _誰.
というように使うのですか?
47 :
197 :2009/05/30(土) 13:59:28
>>46 そうですね。「名前 は _誰.」 は少し不自然なので
?- 身長 が 160 cm 以上 で 170 cm 未満 の 人 の 名前 は X.
X = 尾崎;
X = 吉田;
no
で十分でしょう。
"が","で","の","は" が関数になっていますから、
名前 が _名前 の 人 の 体重 は _体重 :- データ(_名前,_体重,_,_).
のような定義が何も考えずにできます。
ここまで単純だと節の自動生成をする述語定義もすぐできます。
48 :
197 :2009/05/30(土) 14:03:27
名前の197は「Prologでまったり Part4」スレに書き込んだ時の残り滓でした。 無視してください。
49 :
デフォルトの名無しさん :2009/05/30(土) 15:44:59
インタラクティブなプログラムのコーディングで勝負しようぜ
インタラクティブな環境だとわかりますが、 インタラクティブなプログラムだとイメージできません。 申し訳ないが、少し説明してください。
>>50 たとえば任意の文字列を一文字ずつ順番に0.5〜2秒のランダムな間隔でCUI表示するプログラム。
>>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";;
>>52 >>35 の第二節が
f(P,_,P) :- P < 0.00001,!. であるか
f(P,_,0.0) :- P < 0.00001,!. であるかということかな。
>>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;;
>>53 今わかったw
>f(P,_,P) :- P < 0.00001,!. であるか
>f(P,_,0.0) :- P < 0.00001,!. であるかということかな。
そうです
で、問題に合う(0.00001以下の項を加えた時点で加算終了)のは前者のほうですね
>>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より小さくなった時の逆数分数は加算せずに
再帰的に逆数分数が加算されて解が求まるという宣言です。
第三節で次の逆数分数を先読み的に計算してしまっている点に注意してください。
>>57 詳しい解説ありがとうございます
第三引数の扱いがイマイチ分からなかったので助かります
>>56 >29は終了条件の判定で分母しかみてないのでは?
>>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
<<問題>> この問題は他の言語の宿題スレの問題ではありません。 「論理少女1」つじ要作 というマンガの中に出てくる問題です。 できるだけ、問題文に忠実な表現になるようにこの問題を解いてください。 <<問題は3問ありますが、手始めに第一問>> ちょうど一万円札・千円札・百円玉・十円玉があるわ。今からこのお金を・・・ 髪の中、胸のポケット、スカートのポケット、靴の中に・・・それぞれ一つずつ隠します ヒントをもとにどこに何を隠したかを当てていくのよ では第一問 ヒントは、 ・ 一万円札は髪の中 ・ 千円札は十円玉より上の位置 ・ スカートには胸の10倍のお金が入っている それでは、全てのお金の位置は?
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"
>62-64 スレ違い > 他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。
>>65 まぁ、スレの目的と外れすぎているというわけでもないから、多少の柔軟性は考えるよ。
>>62 から出題された宿題ということで。
# では、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())
# >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())
>>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.
% 続きです。この他に順列/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).
>>69 誤りがあった。
... :- お金(_物1,_円1 円),お金(_物2,_円2 円),_円_1 is _円2 * 10.
_円_1 という所は _円1 ですね。
% こういうのもある。マンガの表現から遠い気がして採用しなかったが、 % こちらの方が引数がすっきりして分かり易いかもしれない。 ヒント(1,_解). member([髪の中,一万円札],_解). ヒント(2,_解) :- member([_千円札の場所,千円札],_解), member([_十円玉場所,十円玉],_解), _千円札の場所 は _十円玉の場所 の 上にある. ヒント(3,_解) :- member([スカートのポケット,_物1],_解), member([胸のポケット,_物2],_解), お金(_物1,_円1 円), お金(_物2,_円2 円), _円1 is _円2 * 10. 全てのお金の位置は?(_解) :- 解候補の作成(_解), ヒント(1,_解), ヒント(2,_解), ヒント(3,_解).
% *** 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) .
<<問題2>>「論理少女1」つじ要作 というマンガの中に出てくる問題です。
4箇所の隠し場所と4つのアイテム(お金)は
>>62 と同じですが、
隠す場所は一度ご破算にします。以下のヒントを読んで、
できるだけ問題文に忠実な表現になるようにプログラミングしてください。
1) 髪の中かスカートのポケットのどちらか一万円札が入っている
2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍
3) 百円玉は千円札より上の位置にある
4) 靴の中のお金は髪の中のお金の100倍
そして、1)..4)のうちどれかが嘘。
それでは、
靴の中のお金は?
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)))
76 :
75 :2009/06/02(火) 23:22:51
もはや「問題文に忠実な表現」とかよく分からなくなっているw そして1レスに詰め込むのも限界にきている。
>>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 % Prolog
push(X,L,[X|L]).
pop(X,[X|L],L).
empty([]).
show(L) :- write(L).
>>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
?-
>>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
?-
>>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
?-
// 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();// 動作テスト
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 時間にかかる
とする。
>>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).
% Prolog (2/2) 許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_距離 km,_許容 最長時間 h,_交通手段) :- findall([_費用,_交通手段],(交通手段(_交通手段),目的地に到達時間(_交通手段,_ 距離 km,_許容最長時間 h,_費用)),_候補リスト), min(_候補リスト,[_費用,_交通手段]),!. 許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_,_,'不可能です '). 目的地に到達時間(_交通手段,_距離 km,_許容最長時間 h,_費用) :- 利用規定(_交通手段,_距離 km), 時速(_交通手段,_時速 km / h), 料金(_交通手段,_料金 円 / km), 付加的な所要時間(_交通手段,_,_付加的な所要時間 h), _到達時間 is (_距離 / _時速) + _付加的な所要時間, _到達時間 =< _許容最長時間, _費用 is _料金 * _距離.
>>86 全面的に書き換え % Prolog (2/2)
許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_距離 km,_許容
最長時間 h,_交通手段) :-
findall([_費用,_交通手段],
( 交通手段(_交通手段),
許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h),
料金(_交通手段,_料金 円 / km),
_費用 is _料金 * _距離),_候補リスト),
min(_候補リスト,[_費用,_交通手段]),!.
許容最長時間内に目的地に到着可能で、かつ、費用が一番安い交通手段(_,_,'不可能です
').
許容時間内に到達可能(_交通手段,_距離 km,_許容最長時間 h) :-
利用規定(_交通手段,_距離 km),
時速(_交通手段,_時速 km / h),
付加的な所要時間(_交通手段,_,_付加的な所要時間 h),
_到達時間 is (_距離 / _時速) + _付加的な所要時間,
_到達時間 =< _許容最長時間.
>>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.
>>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'),
入力データ数の読み込み(_入力データ数).
>>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.
>>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'),
入力データ数の読み込み(_入力データ数).
>>92 そのまま続けると入力規制に引っ掛かりますよ!
% 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).
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つ以上の連続したスペースはないとする。
入力する文字列の最初と最後はスペースでないとする。
>>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 % 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,_経路).
>>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 =< _桝.
#-*- coding: utf-8 -*- # python2.6で>99。といいつつ出題を無視してジェネレータで遊んでみた。schemeなら継続を使うところなんだろうね。 class solver: delta = ((1,2),(1,-2),(-1,2),(-1,-2),(2,1),(-2,1),(2,-1),(-2,-1)) def __init__(self, n): self.n, self.field = n, [[0] * n for i in range(n)] def generator(self, x=0, y=0, m=1): if 0 <= x < self.n and 0 <= y < self.n and self.field[y][x] == 0: self.field[y][x] = m if m == self.n * self.n: yield tuple(self.field) else: for dx,dy in self.delta: for field in self.generator(x+dx, y+dy, m+1): yield field self.field[y][x] = 0 if __name__ == '__main__': import re, sys # 解を表示 g = solver(5).generator(); def display(f): print'\n'.join(' '.join(map(lambda x:'%2d'%x ,L)) for L in f)+'\n' while True: print u'数字入力で次のN件表示 / qで終了' line = sys.stdin.readline() if len(line) > 0 and line[0].lower() == 'q': break if re.match(r'^\d+$', line): try: map(lambda x: display(g.next()), range(int(line))) except: break
103 :
100 :2009/06/06(土) 05:32:54
すみません。一箇所間違っていた。
可能経路数(_桝,_開始点_X,_開始点_Y,_経路の数) :-
findall(1,駒の動き(_桝,_開始点_X,_開始点_Y,_),L),
length(L,_経路の数).
findall/3の中の 駒の動き/4 の第一引数 _桝 が
>>100 では落ちていて、
駒の動き/3 になってしまっていた。
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] その他の制限: 配列などの初歩的な概念まで
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
% 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).
>>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 を使いたくなかったのだろうけれど。
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を作成せよ.
% Prolog (問題やさし過ぎた! Prologチュートリアルと思ってください) month(['None','January','February','March','April','May','June','July', 'August','September','October','November','December']). 'GetMonth'(_数値,_月名) :- month(_月名ならび), M is _数値 + 1, /* どうしても'None'から始まるのだとすると */ list_nth(_数値,_月名ならび,_月名). % 組込みになっていると思いますが list_nth/3 の定義は、 list_nth(1,[X|_],X). list_nth(N,[_|R],X) :- integer(N),N > 1,M is N-1,list_nth(M,R,X).
110 :
109 :2009/06/08(月) 05:41:15
% 間違い。 'GetMonth'(_数値,_月名) :- month(_月名ならび), M is _数値 + 1, /* どうしても'None'から始まるのだとすると */ list_nth(_数値,_月名ならび,_月名). は 'GetMonth'(_数値,_月名) :- month(_月名ならび), M is _数値 + 1, /* どうしても'None'から始まるのだとすると */ list_nth(M,_月名ならび,_月名). が正しい。お粗末!
http://pc12.2ch.net/test/read.cgi/tech/1153585095/640 【 課題 】
指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップするソフトを作成すること。
尚、バックアップファイルには以下の機能を持つようにすること。
・ 対象ファイルや除外ファイルを指定できるような
仕組みを持つこと。
・ バックアップ経過のログを作成すること。
ログにはバックアップ処理の実行時間を出力すること。
また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して
機能の実装を行うこと。
作業に余裕のある人は以下の機能を追加すること。
・バックアップしたファイルを圧縮する仕組みの追加。
・プログラムが常駐する仕組みの追加。
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までの全ての数が入力されるまで繰り返す
>>112 (5、この問題だけしか通用しないアルゴリズム?)
t112_5(L,X) :-
t112_5(L,[0,0,0],X).
t112_5([],L,L).
t112_5([A|R],L1,L) :-
top3(A,L1,L2),
t112_5(R,L2,L).
top3(N,[A,B,C],[A,B,N]) :-
A >= B,A >= C,B >= C,N > C.
top3(N,[A,B,C],[A,C,N]) :-
A >= B,A >= C,C >= B,N > B.
top3(N,[A,B,C],[B,C,N]) :-
B >= A,B >= C,C >= A,N > A.
top3(N,[A,B,C],[A,B,N]) :-
B >= A,B >= C,A >= C,N > C.
top3(N,[A,B,C],[B,C,N]) :-
C >= A,C >= B,B >= A,N > A.
top3(N,[A,B,C],[A,C,N]) :-
C >= A,C >= B,A >= B,N > B.
top3(_,L,L).
114 :
113 :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).
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に追加
つづき、 処理手順 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)両方のファイルがなくなれば終了
>>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).
% Prolog(2/2) g115(File,X) :- open(File,read,Input), findall(W,(repeat,get_line(Input,U),(U=end_of_file,!,fail;cut115(U,W)),X), close(Input). p115(File,L) :- open(File,write,Output), ( member(U,L), concat_atom(U,X), write_formatted(Output,'%t\n',[X]), fail; close(Output) ). cut115(A,[A1,A2]) :- sub_atom(A,0,4,R,A1),subatom(A,4,R,_,A2). % Library Utility get_line(Stream,X) :- findall(C,(repeat,get_char(C),(X='\n',!,fail;true)),X). concat_atom(L,X). concat_atom([A],A). concat_atom([A|R],X) :- concat_atom(R,Y),atom_concat(A,Y,X).
119 :
117 :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箇所誤りがありました。
>>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,!.
>>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,!.
127 :
124 :2009/06/10(水) 05:45:42
>>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).
課題はリンクを張っただけだと、そちらのスレが 過去スレログに回ってしまうと簡単には見られなくなるな。 やはり、少なくともポイントは<<課題>>の後に書かないと。
いい問題みつけた。
[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
<<課題>> 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"=>"赤"}
>>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]),
曜日連鎖(_前日の曜日,_曜日).
すみません。書き直しです。 % 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]), 曜日連鎖(_前日の曜日,_曜日).
% Prolog(2/2) 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N + 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜).
140 :
139 :2009/06/11(木) 05:13:26
訂正 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1.
>>140 の 一つ違い という述語ですが、これは
>>135 の 前日・今日 に
「双方向性」を与えるたのトリックです。
一般に関数評価述語 is が条件に現れると双方向性は失われてしまいます。
?- var(A),5 is A + 2. がエラーになってしまうからです。
それを回避するというか、誤魔化しているのですね。
前日・今日の最後の節がコピペできていませんでした。 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日). が一番最後に来ますね。
>>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).
144 :
143 :2009/06/11(木) 07:25:29
>>143 色色とあるのは色の間違いです。
atom_chars(_英語色色,L2),
atom_chars(_日本語色色,L3),
=>
atom_chars(_英語色,L2),
atom_chars(_日本語色,L3),
>>145 % Prolog
'4で割ったあまり'(0,0).
'4で割ったあまり'(1,1).
'4で割ったあまり'(2,2).
'4で割ったあまり'(3,3).
'4で割ったあまり'(N,X) :- M is N-4,'4で割ったあまり'(M,X).
>>145 このプログラムを
?- member(N,[11,33,47,51]),'4で割ったあまり'(N,X).
のように使うと不具合が生じる。どんなことになるか?
>>146 を適切なプログラムに書き換えなさい。
148 :
143 :2009/06/11(木) 21:42:17
Prologでペアリストとは[[a,1],[c,3], ... [y,26]]のような形式かな。
>>143 では _=>_ の形式にしたからペアではないかも知れない。
Rubyに合わせてみたのだが。
ここでは、その方が分かり易いかと思ってペアリストという名称を
借用したが、普段は「対のならび」という言葉を使うところ。
% 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 % Prolog (1/2)
文字列から切り出した単語の行表示(_文字列) :-
文字列から単語の切り出し(_文字列,_単語ならび),
wrln(_単語ならび).
文字列から単語の切り出し(_文字列,_単語ならび) :-
atom_chars(_文字列,_文字ならび),
文字ならびを区切り文字により分割する(_文字ならび,L),
単語ならびに変換(,_単語ならび).
文字ならびを区切り文字により分割する([A|R1],R2) :-
区切り文字(A),
文字ならびを区切り文字により分割する(R1,R2),!.
文字ならびを区切り文字により分割する(_文字ならび,[L1|R]) :-
append(L1,[A|L2],_文字ならび),
区切り文字(A),
文字ならびを区切り文字により分割する(L2,R),!.
文字ならびを区切り文字により分割する(_,[]) :- !.
>>151 % Prolog (2/2)
区切り文字(' ').
区切り文字('\n').
区切り文字('.').
区切り文字(',').
単語ならびに変換([]) :- !.
単語ならびに変換([L|R1],[_単語|R2]) :-
concat_atom(L,_単語),
単語ならびに変換(R1,2).
wrln([]) :- !.
wrln([A|R]) :-
write_formatted('%t\n',[A]),
wrln(R).
>>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).
>>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();
}
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倍の範囲
# を考慮する正規分布に従うものとする。
# 変わった課題ですがよろしくお願いします。
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\n
http://a.pic.to/11fgne のような美しい表を作るにはポストスクリプト
命令述語を使う必要がありますね\n').
http://pc12.2ch.net/test/read.cgi/tech/1232627790/663 #【 課題 】3桁の数値データが複数入ったファイルをバブルソートを用いて
# 昇順に整列、新しいファイルに格納。データの件数は50件まで
#【 形態 】1. Javaアプリケーション(main()で開始)
#【 GUI 】制限なし
#【 期限 】6月11日
#【 Ver 】1.6.0_13
#【 用語 】
#【 補足 】例外処理として、コマンドライン引数が間違っている場合、
# 読み込みファイルがオープンできない、書き込みファイルも
# オープンできない、読み込みにファイルがない場合をお願いします。
#
>>168 続き
#【課題2】
#
# 順次生成・比較法により、閉路を順次生成し、これまでの最短経路長をもった閉路と閉路長を比較することによってTPSを解くプログラムを作成せよ。
# (※1 : 適当に出発点を定め、そこを出発点とする閉路をひとつ生成し、それをとりあえず最短閉路とする)
# (※2 : 新たに経色を生成し、その閉路長をその時点での最短閉路長と比較し、短い方を最短閉路とする)
# (※3 : 上記のことを全ての閉路について繰り返し、最短閉路を求める)
>>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.
>>173 普通は、
sum([],0).
sum([A|R],X) :- sum(R,Y),X is A + Y.
で十分。
リストの中に浮動小数点数が一つでもあれば、X は浮動小数点。一つもなく、
整数リストの時は整数解となります。
>>173 は実務的には演算はすべて浮動小数点であり、整数の合計はほとんど
使うことがないため、
sum([],0.0).
sum([A|R],X) :- sum(R,Y),X is A+X.
と定義してしまいます。逆にこの問題のように、整数の合計を求める場合は
N is trancate(X) のような評価を被せなくてはならず不便です。それを回避
しようとしているのが
>>173 の第一引数の指定ということになります。
しかし、上記の理由から型指定としては曖昧で好ましいものではありません。
176 :
175 :2009/06/15(月) 19:59:05
N is trancate(X) ではなく N is truncate(X) ですね。
>>177 % Prolog
木の高さ([],-1).
木の高さ(_根,_高さ) :-
枝(_根,_左,_右),
木の高さ(_左,_左の高さ),
木の高さ(_右,_右の高さ),
max([_左の高さ,_右の高さ],_高さの二),
_高さ is _高さの二 + 1.
179 :
177 :2009/06/15(月) 20:51:49
まちがえた。枝ではなくて、木でした。 % Prolog 木の高さ([],-1). 木の高さ(_根,_高さ) :- 木(_根,_左枝,_右枝), 木の高さ(_左枝,_左枝の高さ), 木の高さ(_右枝,_右枝の高さ), max([_左枝の高さ,_右枝の高さ],_高さの二), _高さ is _高さの二 + 1.
http://pc12.2ch.net/test/read.cgi/tech/1244449887/446 #[1] 授業単元:プログラミング
#[2] 問題文(含コード&リンク):
# キーボードから入力された1行(空白で区切られた正整数並びの文字列)を項に分解して,i番目の項の整数値を配列要素d[i-1]に累算しながら格納するプログラムをつくりなさい。
# ただし,配列dの要素数は10として宣言し,10項目より多い入力の場合は11項目以降を棄却しなさい。
# 1行の入力には関数fgetsを用いなさい。
# fgetsは改行文字も取り込む点に注意して,入力の終了は「改行のみの入力」で判定しなさい。
>>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;
}
ひどい宣伝だな
>>168 >>169 完全列挙法 順次生成・比較法 というのがわからない。
「最短経路の本 レナのふしぎな数学の旅」 p253以下を読み直してみます。
>>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 .
>>187 % Prolog (2/2)
行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :-
行列の転置(R1,R2,R3) .
行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :-
行列の転置(L,B,R2),
行列の転置(R2,R1),!.
>>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
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.
>>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).
すみません。再表示です。 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).
>>196 % Prolog (ちょっとだけ変更)
t193 :-
t193_1([' ',' ',' ',' ',★],[★,' ',' ',' ',' ']).
t193_1(L1,L2) :-
L1=[★|_],
★を表示(L1,L2),!.
t193_1(L1,L2) :-
★を表示(L1,L2),
append([A],R1,L1),
append(R1,[A],L3),
append(L4,[B],L2),
t_193_1(L3,[B|L4]).
★を表示([],[]) :- nl.
★を表示([' '|R1],[' '|R2]) :-
!,
write(' '),
★を表示(R1,R2).
★を表示([_|R1],[_|R2]) :-
write(★),
★を表示(R1,R2).
198 :
197 :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).
http://pc12.2ch.net/test/read.cgi/tech/1244449887/505 #[1] 授業単元: C言語
#[2] 問題文
# (1)
# 文字列を受け取る関数(charポインタを使用)
# その文字列の一番最後の文字を消去する関数を作る。
# (2)
# 文字列を受け取る関数(charポインタ使用)
# その文字列の一番最初の文字を消去する関数を作る。
# (3)'文字列を入力し、ある文字を入力。その文字列の中にその入力した文字がいく
つあるかを数える関数。
# 例 文字列 asdfgvbfdcaa 文字aと入力したら 3となる
# その関数は二つのパラメータをもち、一つ目は文字列へのポインタ、二つ目は数えた文
字の数である。
>>199 % Prolog
% (1)
'その文字列の一番最後の文字を消去する'(_文字列,_一番最後の文字を消去された文字列
) :-
sub_atom(_文字列,0,Len,1,_一番最後の文字を消去された文字列).
% (2)
'文字列の一番最初の文字を消去する'(_文字列,_一番最初の文字を消去された文字列) :-
sub_atom(_文字列,1,_,0,_一番最初の文字を消去された文字列).
% (3)
文字列中である文字の出現回数(_文字,_文字列,_出現回数) :-
findall(_,sub_atom(_文字列,_,1,_,_文字),L),
length(L,_出現回数).
>>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).
% 間違いがありました。訂正します。 % 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).
% もう一ヶ所訂正。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).
>>200 ですが、
これではPrologが誇るスーパー組込み述語 sub_atom/5 の
リファレンスの意味しかないので、sub_atom/5を使わない版を
後で示します。
それからアトムに対して文字列という言葉を使っていることに、
違和感を覚える方がおられると思いますが、私は"文字列"は
絶対といっていいくらい使いません。私の書き込みで文字列と
言うときは文字列アトムのことだと思ってください。
http://pc12.2ch.net/test/read.cgi/tech/1244449887/514 #[1]授業単元:プログラミング演習1
#
#[2]問題文:画面より入力した成績データをファイルに登録する。
# 画面より入力する項目は以下のとおり。
# ・生徒コード、数字6桁、数字であること。
# ・氏名、文字列20文字、1字以上、20字以内
# ・国語(点数)、数字3桁、数字であること、0<=点数<=100
# ・算数(点数)、国語と同じ
# ・社会(点数)、国語、算数と同じ
#
#
# 生徒コードに999999が入力されたら終了する。
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"=>"赤"}
>>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.
VB6をやっているのですが、 「ストアド関数」というものが、 いまいちどういう役割を担っているものなのかわかりません。 MSDNを見たりウェブで調べたりはしたのですが… 宜しければ、どなたかお願いします。
>>214 % Prolog (最初に組込述語から)
t214(_人の名前,_検索文字列の変位,_その長さ,_残った文字列長さ,_検索文字列) :-
sub_atom(_人の名前,_検索文字列の変位,_その長さ,_残った文字列長さ,_検索文字列).
?- t214('Hitomaro Kakinomoto',A,B,C,'kino').
A = 11,
B = 4,
C = 4;
no
?- /*
>>200 参照 */
>>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.
?-
>>216 % Prolog より一般的にsCharsという述語の中に検索条件を書き込めないであろうか?
% sChars/7を定義する。_検索条件項の中でEかFを使用しなければならない。
sChars(_検索条件項,A,B,C,D,E,F) :- sChars(A,B,C,D,E,F),call(_検索条件項).
%
>>216 に較べてこちらの方が優れているかは疑問だ。
>>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(_検索条件項).
% のように上に定義を加えていけばよい。
http://pc12.2ch.net/test/read.cgi/tech/1200175247/560 #[1] 授業単元: C
#[2] 問題文(含コード&リンク):アルファベットの小文字を大文字に変換するプログラムを作成せよ
# ヒント: 'a'〜'z'は連続した文字コードが割り当てられている。'A'〜'Z'も連続した文字コードが割り当てられている。すなわち、'a'の文字コード
# にある定数を足す(または引く)と'A'になり、'b'にその定数を足す(または引く)と'B'になる。この定数さえ求められれば、簡単に計算できることがわかる。
# 定数は、'a'や'A'を使えば計算できる。
>>219 % Prolog 敢えて、出題の題意通りやってみる。
英小文字から大文字へのコード変換(_英小文字,_英大文字) :-
char_code(a,_aの文字コード),
char_code('A',_Aの文字コード),
_変位 is _aの文字コード - _Aの文字コード,
char_code(_英小文字,_英小文字の文字コード),
_英大文字の文字コード is _英小文字の文字コード - _変位,
char_code(_英大文字,_英大文字の文字コード).
>>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(_英大文字,_英大文字の文字コード).
>>221 すみません。これだとやっぱりだめだ。
char_code/2を使う以上は、変数の有無だけは検査しないといけないのかな。
ちょっと考えます・・・
文字連鎖('A','B').
文字連鎖('B','C').
...
文字連鎖('Z','A').
...
文字連鎖(a,b).
文字連鎖(b,c).
・・・
文字連鎖(z,a).
を定義しないと無理かな。
>>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']).
>>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).
% で済むようです。まあ、ペアで定義すればいいだけですが。
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つ並んだかチェック、勝敗表示、コンピュータの手番
228 :
デフォルトの名無しさん :2009/06/18(木) 14:56:57
>>227 できますた
これでいいですか?
↓
(defun s (a b)
(let ((ya (cos a)) (yb (cos b)))
(/ (* (- b a) (+ ya yb)) 2)))
>>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座標) / _分割数.
>>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).
>>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).
>>228 ニュートン・コーツ とか
区分求積法 でググれ
>>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'])).
>>233 訂正
% Prolog
入力した文字の種類を表示するプログラム(_文字) :-
文字の範疇(_文字の範疇,_文字),
% 2引数ではなく、1引数の述語です。削り忘れてました。
% なんて冗長な馬鹿なプログラムだと思われるでしょうが、渡された
% 仕様を可能な限りそのまま利用して、何も考えずにプログラムすると
% こんな事になるという例です。
入力した文字の種類を表示するプログラム(_文字,_文字の種類) :-
表示は次に従うとする(_文字の範疇,_,_表示メッセージ),
文字の範疇(_文字の範疇,_文字),
write(_表示メッセージ).
% 順序をひっくり返してもちゃんと動作します。開発順序としては
% この述語を作ってから、2行目と3行目を入れ替えました。
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等 ループ文を使ってはいけないそうです
>>236 % Prolog
評価値(_点数,'A+') :- _点数>=90,_点数=<100.
評価値(_点数,'A') :- _点数>=80,_点数=<89.
評価値(_点数,'B') :- _点数>=70,_点数=<79.
評価値(_点数,'C') :- _点数>=60,_点数=<69.
評価値(_点数,'F') :- _点数>=0,_点数=<59.
評価値(_,error).
>>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).
>>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 もっと一般化したら・・
二つの文字列を交互に併合する(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).
>>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).
ということは、
>>238 >>239 文字コードによる暗号化/3 も以下がよい。
文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :-
integer(_鍵整数),
_鍵整数>=10
_鍵整数=<99,
atom_codes(_元の文字列,Codes),
_奇数番目の鍵 is _鍵整数 // 10,
_偶数番目の鍵 is _鍵整数 mod 10,
文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes),
atom_codes(_暗号文字列,_暗号Codes).
文字コードによる暗号化(_,_,[],[]) :- !.
文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :-
一文字の暗号化(_鍵1,A,B),
文字コードによる暗号化(_鍵2,_鍵1,R1,R2).
一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :-
_文字コード+_変位 =< 122,!,
_暗号化された文字コード is _文字コード+_変位.
一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :-
_文字コード+_変位 >122,!,
_暗号化された文字コード is _文字コード+_変位-90.
249 :
248 :2009/06/20(土) 08:47:22
ごめんなさい。
>>238 を更新してしまった。
これでは以前との比較ができない。もう一度復元しますから、少し待って。
>>249 >>239 の話でした。元々はこうなっていたはずです。
文字コードによる暗号化(_,_,[],[]).
文字コードによる暗号化(_奇数番目の鍵,_,[A],[C]) :-
一文字の暗号化(_奇数番目の鍵,A,C).
文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,[A,B|R1],[C,D|R2]) :-
一文字の暗号化(_奇数番目の鍵,A,C),
一文字の暗号化(_偶数番目の鍵,B,D),
文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,R1,R2).
>>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).
http://pc12.2ch.net/test/read.cgi/tech/1244449887/708 # 入力件数nをキーボードより入力し、n人分のテストデータを入力する。
# その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。
# ただし、平均点は実数型とし小数点第2位まで出力する。
# 平均点以外の変数は整数型とする。
#
# 問A棒グラフ出力プログラム
# 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。
# 大きい値の方の棒グラフが上に来るようにすること。
# (値として0〜50までしか入力されないものとする)
>>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).
>>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).
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を掛けて返済額を求める。
>>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).
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の階乗=”};
# ソースプログラム、変数の意味、工夫した点を書きなさい
>>259 % Prolog
計算ドリル :-
write('五問出題します。すぐに答えてください\n'),
質問(L1),
正解(L2),
計算ドリル(L1,L2,0,X),
write_formatted('%t問正解です\n',[X]).
計算ドリル([],_,N,N) :- !.
計算ドリル([A|R1],[B|R2],N,X) :-
write(A),
get_line(S),
atom_to_term(S,B),
M is N + 1,
計算ドリル([A|R1],[B|R2],M,X),!.
計算ドリル([_|R1],[_|R2],N,X) :-
計算ドリル(R1,R2,N,X).
質問(['12×(3+4)=',
'(1+1÷9)×9=',
'(29‐5)÷(17‐11)=',
'2の10乗=',
'(3×9+44÷2)のルート=',
'8の階乗=']).
正解([84,10,4,1024,7,40320]).
261 :
260 :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).
% 一般的には以下のような定義にします。これだと不正解の時にも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]).
>>256 % Prolog
interest(R,N,X) :-
X is (1+R/100)^N.
返済額(Y,R,N,,X) :-
interrest(R,N,Z),
X is Y * Z.
>>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 % 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) .
>>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) .
272 :
デフォルトの名無しさん :2009/06/22(月) 23:08:00
>>271 問題が面白くないっす
やる気起きないっす
% 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 % 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).
>>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 % Prolog
t277 :-
質問文(L),
findall(U,(member(A,L),write(A),nl,get_line(U)),VL),
write_formatted('あなたは%t年生まれの%才で、%tが好きですね\n',VL).
質問文([年齢を入力してください,生まれた年を入力してください,好きな数字を入力してください]).
>>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).
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
>>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.
>>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).
>>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).
>>287 forループがlengthの中に閉じ込められているんだね。
これぞ宣言型プログラミング!
>>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).
>>294 all(L1,' '), はスペース2個だと思ってください。
>>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 % 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))).
>>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
>>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).
303 :
299 :2009/06/26(金) 20:35:21
なぜこうまでも全編の書き直しを余儀なくされたかというと、 123abc の場合の 123 Alfa ... 3とAlfaの間のスペースを入れることが 難しかったと言うことです。sub_atomで次の文字をこっそり見てしまえば いいだけの事なのですが、潔しとせずと言うところでしょうか。
>>303 前後関係を検査しやすいパターンで記述するので正解じゃないか。
ご苦労様ですw
>>305 % Prolog
t305(N,X) :-
for(1,M,N),
2 ^ M > N,
X is M - 1.
>>305 -- Haskell
import Data.List (find)
main = do
n <- getLine
let Just m = find ((read n <=) . (2^)) [1..] in print (m-1)
309 :
308 :2009/06/28(日) 14:59:04
「Prologでまったり」スレに書き込んだつもりでした。失礼しました。
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}})
>>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).
>>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).
324 :
323 :2009/07/02(木) 05:34:22
>>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),!.
>>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).
>>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を使うのかわからない!
% これからカードを「切る」課題でも出てくるのだろうか。
>>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).
>>319 失礼しました。問題文を読み落としていました。
すべて最初に「切る」ことが指定されていました。
最初に切ってしまうなら、swap_nthではなく、swapでも処理できます。
t319_xx(X) :-
findall(N,for(1,N,52),L),
t319_cut(100,L,L1),
... ,
のような進行になります。
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
#
# のような形で出力
>>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 % 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) .
>>333 % Prolog (2/2)
quicksort([],[]) :- !.
quicksort([X|Xs],Ys) :-
partition(Xs,X,Littles,Gigs),
quicksort(Littles,Ls),
quicksort(Bigs,Bs),
append(Ls,[X|Bs],Ys).
partition([],Y,[],[]) :- !.
partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs).
336 :
335 :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).
ですね。
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
>>337 % Prolog
最大公約数をユークリッドの互除法で求める(M,N,N) :-
0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
Mod is M mod N,
最大公約数をユークリッドの互除法で求める(N,Mod,X).
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
#
# とする.
>>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 課題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).
>>344 課題2
% Prolog
inpro([],[],0) :- !.
inpro([A|R1],[B|R2],X) :-
inpro(R1,R2,Y),
X is A * B + Y.
347 :
343 :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 % 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 (2)
% Prolog
:- op(450,xfx,分の).
分数の積(A 分の B,C 分の D,X 分の Y) :-
X is A * C,
Y is B * D.
>>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()
>>352 % Prolog
t352 :-
get_chars('url.txt',Chars),
t352(Chars,Chars2),
put_chars('result.txt',Chars).
t352([],[]) :- !.
t352(['h','t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
t352(R1,R2),!.
t352(['t','t','p',':','/','/'|R1],['h','t','t','p',':','/','/'|R2]) :-
t352(R1,R2),!.
t352([A|R1],[A|R2]) :-
t352(R1,R2).
355 :
354 :2009/07/04(土) 06:20:33
>>352 % Prolog
>>352 また間違い。訂正,Chars -> Chars2 のところがある。
t352 :-
get_chars('url.txt',Chars),
t352(Chars,Chars2),
put_chars('result.txt',Chars2).
356 :
354 :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 % 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.
>>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.
>>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).
>>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,_現在の最大コード,_最大の文字コード),!.
http://pc12.2ch.net/test/read.cgi/tech/1245853701/607 # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で
考えてください.
# (住所録,商品の在庫,図書,ワールドカップの勝敗....)
# 以下の要件を示します.
#
# 1. ファイルからデータを読み込む機能をつけること.
# 2. データは4つ以上の項目を保持させること.
# (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上)
# 3. 並び替えの機能をつけること.また並び替える項目が指定できること.
# 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ
せることができること.
# (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま
る 等)
# 5. データは半角英数字(英語やローマ字)で扱ってよい
# 6. データの追加ができること.
# 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に
合致したデータを削除できること.
# 8. 追加・削除した結果をファイルに保存できること.
場違いか心配ですが・・・。 質問です ?- 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を使えば良いと言われたのですが よくわかりません・・・。
>>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).
>>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).
>>369 # 次の各プログラムを作成
#
# 1.線分の長さを求める
# -両端点の座標値(浮動小数点)を入力
# -線分の長さを計算、表示
#
# 2.三角形の面積を求める
# -3頂点の座標軸(浮動小数点)を入力
# -面積を計算、表示
#
# 2では1つの点を原点に移動させてあとはS=1/2|ad-bc|でお願いします
#
# 補足でこれがありました
# ◆ 平方根を求める関数
#
# double型の関数 sqrt() を使います.仮引数もdouble型です.
#
# 例えばdouble型の変数 len の平方根を求める場合には,次のように呼び出
# します.
#
# sqrt(len)# 関数sqrt()を使用するソースプログラムをコンパイルするときには,
#
# gcc -lm ***.c
#
# のように,コンパイルオプション「-lm」が必要です.
#
#
#
# ・main関数の座標値読み込み部分を省略したものは以下の通りです
>>369 (1)
% Prolog
線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :-
_線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2).
>>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.
>>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.
>>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とかに置き換えてもいいのですか?
>>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するのか
わからない人が多いと思ったのでこの変数名を使いました。
>>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).
>>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 % 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 .
>>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,_年/_月/_日).
>>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,_年/_月/_日).
#
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を利用せよ。
>>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 % 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.
>>377 さん
誤植でした;;
無事出来ました
ちなみに述語がmemberだけで出来ると
聞いたのですが出来るのでしょうか?
出来るとしたらどんな感じに
なるのでしょうか?
>>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).
ならうまくいくかな。
>>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 % 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 さん
成る程、丁寧にありがとうございました
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
>>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),!.
>>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),!.
>>399 もうひとつ違っていた。
open(File,read,Input), ですね。
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} の
# バイナリファイルの作成
>>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(_,_).
>>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(_,_).
>>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
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 % 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 -- 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
>>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)),_各科目の平均点).
>>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 % Prolog
t416 :-
read(N),
奇数・偶数判定(N,X),
write_formatted('入力されたのは%tです\n',[X]).
奇数・偶数判定(N,奇数) :- 1 is N mod 2.
奇数・偶数判定(N,偶数) :- 0 is N mod 2.
>>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 % 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 % Prolog
t421(_文字ならび,_一文字ごとに空白を開けた逆順ならび) :-
t421(_文字ならび,[],_一文字ごとに空白を開けた逆順ならび).
t421([A],X,[A|X]) :- !.
t421([A|R1],L,X) :- t421(R1,[A,' '|R1],X).
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つ作成のこと。
>>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))))
>>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).
>>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).
>>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]).
とすっきりする。
>>430 ?- sum(N,M,55).
N = 55,
M = 55;
N = 1,
M = 10;
N = 9,
M = 13;
N = 27,
M = 28;
no.
?-
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の積は
# ?,?,?
# ?,?,?
# ?,?,?]
>>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 % 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).
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 ... のように加減乗除のみで整数を順に造っていってください
x^y は加減乗算ではないよ。
439 :
デフォルトの名無しさん :2009/07/11(土) 21:09:05
4 = (4 + 8) / (3 * 1)
http://pc12.2ch.net/test/read.cgi/tech/1245853701/929 # [1] 授業単元: C言語
# [2] 問題文(含コード&リンク):
# 主語、目的語、述部が入ったデータファイルを読み込み、それらをランダムに
# 組み合わせて生成した短文を20個ファイルに出力するプログラムの作成。
# 短文の構文は必ず、「(主語)は、(目的語)(述部)。」となるようにする。
#
# 出力例:俺は、カレーが大好きだ。
#
# データファイルは以下を使用すること。
# 主語: 俺 私 あなた 彼 彼女 先生 犬のポチ 猫のタマ ライオン
# その人 政治家 ネズミ の12個
# 目的語: カレー ご飯 肉 授業 男 女 すごいもの アレ アンパン
# お金 の10個
# 述部: が大好きだ が大嫌いだ を作った をなくした が欲しい
# に全力を尽くす を新しいものに交換した ?なにそれ美味いの?
# について深く考えた を捨てた に塩をふりかけた の11個
>>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.
>>440 % Prolog (2/2)
文(_文,R) :- 主語(_文,R1),後置部(R2,R3),目的語(R2,R3),述部(R3,R4),句点(R4,R).
後置部(L,R) :- 後置詞(L,R1),読点(R1,R).
後置詞(['は'|R],R).
読点(['、'|R],R).
句点(['。'|R],R).
構造定義(Lines) :-
member(_行,Lines),
split(_行,[':',':',' ',' '],[F|L2]),
append(L3,[_],L2),
要素定義(F,L3),
fail;
true.
要素定義(F,L) :-
member(A,L),
P =.. [F,[A|R],R],
assertz(P),
fail;
true.
443 :
440 :2009/07/12(日) 06:11:44
>>440 訂正 write_formattedの表現に誤りがありました。
'20文を選択して表示'(_文集) :-
length(_文集,Len),
Div is Len // 20,
tell('t440_2.txt'),
for(1,N,20),
Nth is N * Div,
list_nth(Nth,_文集,_選択文),
concat_atom(_選択文,_選択文文字列),
write_formatted('%t\n',[_選択文文字列]),
N = 20,
told.
444 :
443 :2009/07/12(日) 06:12:58
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
>>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 % 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 % 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,_最小値,_最大値).
>>452 また間違い。
整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :-
get_chars(_ファイル,Chars),
concat_atom(Chars,Atom),
split(Atom,['\n',' '],[A|L]),
ならびの中の最小値・最大値(L,A,A,_最小値,_最大値).
>>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
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
>>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 % 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(_数値).
>>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(_数値).
>>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(_数値).
>>463 コピペの際に誤って改行してしまいましたが、Prologでは
write_formatted('%tは身長として適切な数値ではありませんでした。再入力が必要
です\n',[_身長]),fail.
のように文字列のなかで改行すると構文エラーとなります。
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)))
どうぞ
>>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).
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"=>"赤"}
http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 期限 】7/14 am6:00
# 【 Ver 】Eclipse Version: 3.4.2
# 【 補足 】
# あいう
# かきく
# さしす
# 上記のようなテキストファイルを読み込み、
# あかさ
# いきし
# うくす
# のように別のテキストファイルに書き出す感じです。
>>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).
>>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 % 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).
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月として計算するものとする。
>>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,日曜).
>>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).
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)
>>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
484 :
483 :2009/07/16(木) 17:31:06
| ?- 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]). */ コレを完成させるにはどうすればいいのでしょうか?
http://pc12.2ch.net/test/read.cgi/tech/1247438792/160 # [1]プログラミング
# [2] 課題
# 言語: C もしくは C++ 言語
#
# (1)以下のプログラムを作成しなさい(数当てゲーム)
#
# *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を
# 待つ。
# 変数aを定義して、10までの乱数を発生させて変数aに代入する。
# キーボードからの入力があれば、先に発生させた乱数と一致しているならば
# 「あたり!!」と表示する。
# 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を
# 表示する)
>>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]).
>>486 ハノイの塔の課題をその仕様通り自然に定義していったらどうなるか?
興味がありますが、私が何か書き込めるまでにはもう少し時間が必要なので、
最小サンプルで確認することによって、ディスクの大小順序問題を
スキップしてしまっている最もよく知られたアルゴリズムによる
プログラム例を
http://nojiriko.asia/prolog/hanoi.html に示します。
問題を直感的に理解するには
「Prologプログラミング入門」安部憲広著 共立出版刊 の29頁 図3.3
がよいと思います。
http://pc12.2ch.net/test/read.cgi/tech/1232627790/970 # 配列に関する基本問題
# フィールド int型の配列numberのみ
# コンストラクタ 引数で与えられたScannerから整数を順次読み取る、
# 最初に読み取った整数を配列サイズとみなし、int型の配列を生成し
# numberで参照する
# その後整数を読み取ってnumber[0],number[1]、・・・・と順に代入していき、
# 配列サイズ分だけ読み取る
# number中の全要素,最大値、最小値を表示
>>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 % 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 % 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.
>>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.
>>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 ++ "です"
>>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
>>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 % 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,文字長いです。],_診断).
504 :
503 :2009/07/17(金) 23:01:55
>>503 訂正
名前付き文字列長さの診断(文字列A,A,文字列B,B,_診断),
->
名前付き文字列長の診断(文字列A,A,文字列B,B,_診断),
505 :
503 :2009/07/17(金) 23:32:27
>>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
>>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 -> "二つの文字列は同じ長さです"
http://pc12.2ch.net/test/read.cgi/tech/1153585095/904 # [課題]
# ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を
# 取り除く
# ・一度に取ることのできるマッチ棒は1から3本
# ・山を空にしたプレーヤが勝ち
# 人間2人でこのゲームを行なうプログラムを作成せよ.
#
# プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと,
# 勝負がついたかどうかのチェックを行なうこと。
# また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの
# 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような
# プログラムにすること。
512 :
493 :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).
% バックトラックすると値の束縛は解かれてしまうから。
Prologで盛り上がっているのは、あんた一人だけだよ
prolog恐ろしす・・・
http://pc12.2ch.net/test/read.cgi/tech/1247438792/196 # [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に
# スタックに一時的に格納するプログラムを作成する
# このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり
# ポップしたりする過程が分かるプログラムを作成する。
# なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる
#
# [プログラムの例]
# 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり
# ポップしたりするたびにデータベースに格納された全データを表示する。
>>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]).
>>514 チュートリアルの題材を求めるのが狙いなので、他の言語の人の
書き込みを待たずに進めてしまってちょっと申し訳けない。
Prologの場合は、低水準のコードにサイト上でなかなか出会えないと
いうことがあって、そこが初心者にとって辛いところです。
そこらあたりの欠落を些かでも埋められればと書き込んでいます。
繰り返し、いろんな表記法で、できれば螺旋状に発展していければ
おもしろいと思うのですが、間違いの訂正に数レスとられることが
多くて、1000スレまでの間では貧弱なものにしかなりそうもない。
それにしても、「C/C++の宿題片付けます 12*代目」の方々には感謝です。
>>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).
連休見なかったら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 "回文ではありません~%")))) こんな感じです
524 :
デフォルトの名無しさん :2009/07/21(火) 12:26:07
>>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
>>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)
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
>>523 % Prolog
二分木の総節数([],0).
二分木の総節数(_節,_節の大きさ) :-
節(_節,_左枝,_右枝),
二分木の総節数(_左枝,_左枝の大きさ),
二分木の総節数(_右枝,_右枝の大きさ),
_節の大きさ is _左枝の大きさ + _右枝の大きさ + 1.
>>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)
>>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)
>>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命令を使用すれば良い。
http://pc12.2ch.net/test/read.cgi/tech/1247438792/300 # [1] 授業単元:プログラミング基礎
# [2] 繰り返しをwhileもしくはdo\uff5ewhile文を使って作成しなさい。
#
# 任意の数字を入力し、その数字分まで1つずつ加算して表示する。
# 入力した数字までいったら逆に1になるまで表示する。
#
# 例
# 8
#
# *
# **
# ***
# ****
# *****
# ******
# *******
# ********
# *******
# ******
# *****
# ****
# ***
# **
# *
>>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]).
>>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 (1)
% Prolog
f(X,Y) :- Y is 1 / (1 + x ^ 2).
シンプソンの公式(A,B,M,X) :-
D is (B - A) / (2 * M),
f(A,S),
N is 2 * M - 1,
シンプソン公式の二(1,N,A,D,S,S2),
f(B,Z),
X is (S2 + Z) * D / 3.
シンプソンの公式の二(M,N,_,_,X,X) :- M > N,!.
シンプソンの公式の二(M,N,A,D,Y,X) :-
U is A + M * D,
Mod is M mod 2,
シンプソンの公式の三(Mod,U,Y,Z),
M2 is M + 1,
シンプソンの公式の二(M2,N,A,D,Z,X).
シンプソンの公式の三(0,X,S,S2) :- f(X,Y),S2 is S + 2 * Y.
シンプソンの公式の三(1,X,S,S2) :- f(X,Y),S2 is S + 4 * Y.
542 :
541 :2009/07/22(水) 14:42:49
>>541 訂正 X が x になっていた。
f(X,Y) :- Y is 1 / (1 + X ^ 2).
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] その他の制限:できるだけ簡単に
#
# 倍精度浮動小数点型変数で数値を入力し,
# 小数点以下を切り捨て・切り上げ・四捨五入するプログラムを作成せよ.
# ただし, 条件式は使用せず, 型変換を必ず使用すること.
>>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)
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))
こんな感じ?
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),!.
なんかこのスレ コードばっかで良スレっぽいな
>>537 main = do
n <- getLine >>= return . read
mapM_ (putStrLn . flip replicate '*') [1..n]
mapM_ (putStrLn . flip replicate '*') $ reverse [1..n-1]
>>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]]
>>543 % Prolog 条件式(Prologの場合,節の選択)なしで切り上げ、思いつきません!
切り下げ(_浮動小数点数,_切り下げられた整数) :-
_切り下げられた整数 is truncate(float_integer_part(_浮動少数点数)).
四捨五入(_浮動小数点数,_四捨五入された整数) :-
_四捨五入された整数 is truncate(0.5 + float_integer_part(_浮動少数点数)).
>>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).
>>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).
>>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).
>>543 Haskell では RealFrac クラスに floor, ceil, round が定義されている
main = do
v <- getLine >>= return . read
mapM_ (print . ($ v)) [floor, ceiling, round]
>>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
http://pc12.2ch.net/test/read.cgi/tech/1247438792/473 # [1] 授業単元:プログラミング論
# [2] 問題文:入力ストリームから読み込んだデータ文字列を、
# データベースに格納する前にキューに一時的に格納するプログラムを
# 作成する。このとき、データをまとめたデータ文字列を一つずつ、キューへ
# エンキューしたり、デキューしたりする過程が分かるプログラムを作成する。
# なお、キューを実現するライブラリは、キューのための別のヘッダにまとめる。
# [そのほか]
# ・入力ストリームから読み込んだデータ文字列を、キューにエンキューしたり、
# デキューしたりするたびにデータベースに格納された全データを表示する。
# ・構造体オブジェクトは動的な記憶域に生成する。
# ・生徒の名前、試験の点数を構造体オブジェクトに格納することとする。
# ・関数の処理にコメントをつけて、キューをどのように実現しているか、
# そのプログラムの処理内容が分かるようにする。
# [このプログラムの流れ]
# (1)ファイルやキーボードなどの入力ストリームから
# データをデータ文字列として読み込む
# (2)このデータ文字列をキューに一時的に蓄える
# (3)キューからデータ文字列を取り出す
# (4)このデータ文字列からそれぞれデータを取り出して
# 文字列や数値データに変換する
# (5)変換したデータをデータベース(構造体の配列など)に格納してまとめて管理する
# (6)このデータベースからデータを参照し、ディスプレイに出力する
>>562 すみません。二ヶ所、述語名の付け違いがありました。
書き直しました。
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構造体からなる計算木から
# 計算式の文字列を作成せよ。
(quote exp)
# [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
>>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),!.
>>572 % Prolog
t572(L,X) :- length(L,Len),Len < 3,!,write('nil\n').
t572(L,X) :-
max(L,Max),
ならびから削除(Max,L,X).
ならびから削除(_,[],[]) :- !.
ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :-
ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!.
ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :-
ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!.
>>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]
>>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 % 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',[_述語,_ならびのならび]).
>>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,_,_,_,_キーワード,'&',_,_,_,_),!.
580 :
579 :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,_,_,_,_キーワード,'&',_,_,_,_),!.
>>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
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] その他の制限:ポインタ履修済みです
>>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]).
>>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).
>>583 -- Haskell
import Data.Char (isAlpha)
import Data.Map (Map, fromListWith, toList)
countChar :: String -> Map Char Int
countChar = fromListWith (+) . flip zip (repeat 1) . filter isAlpha
main = getContents >>= mapM_ putStrLn . prettify . countChar
where
prettify :: Map Char Int -> [String]
prettify = map (\(k,v) -> k : ": " ++ (replicate v '*')) . toList
588 :
585 :2009/07/30(木) 12:54:13
>>584 >>585 訂正
get_lines(File2,L1),
get_lines(File2,L2),
とありますが、上の行は get_lines(File1,L1), です。
>>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,!.
>>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),!.
>>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).
>>598 -- Haskell では Prelude に gcd が含まれている
import Control.Monad (replicateM)
main = replicateM 2 readLn >>= print . foldl1 gcd
601 :
599 :2009/08/02(日) 15:07:41
>>606 [2]
% Prolog 見かけ再帰を含みませんが、実はfor/3やconcat_atom/3は再帰なしには書けない・・・
t606_2(N,R,X) :-
findall(N1,for(N,N1,R+1),L1),
findall(N2,for(R,N2,1),L2),
concat_atom(L1,'*',S1),
concat_atom(L2,'*',S2),
atom_to_term(S1,Term1,_),
atom_to_term(S2,Term2,_),
X is Term1 / Term2.
608 :
607 :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.
>>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
>>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 % Prolog でハッシュといえば述語のこと。
t613(Key,Data) :- 'KeyAndData'(Key,Data).
>>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).
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
>>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).
>>617 -- Haskell
import System.IO (hFlush, stdout)
import Data.List (permutations, intercalate, sort)
main = putStr "String: " >> hFlush stdout >> getLine >>= putStrLn . intercalate " " . sort . permutations
>>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).
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(){
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座です
# }
>>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).
627 :
626 :2009/08/12(水) 11:03:38
628 :
627 :2009/08/12(水) 11:22:21
>>627 % Prolog 訂正 旅先で、全角スペースが入らないのでちょっと見にくい。
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月下限,
_月 = _月上限,
_日 >= _日下限,
_日 =< _日上限,!.
星座判定(_月,_日,_星座) :-
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月下限,
_日 >= _日下限,!.
星座判定(_月,_日,_星座) :-
星座(_星座,_月下限/_日下限-_月上限/_日上限),
_月 = _月上限,
_日 =< _日上限,!.
>>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).
633 :
デフォルトの名無しさん :2009/08/15(土) 17:07:21
>>634 辞書順の定義が変だなぁ。"aaa" < "az" が普通だろう。
>>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).
>>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).
>>637 >>639 まちがえた。
t637(_着手された盤面) :-
findall(L,(for(1,N,10),length(10,L),all('□',L)),_盤面),
着手(X,Y),
現在の盤面(_盤面,X,Y,_着手された盤面).
t637(_).
にしないと第二手から以降がつづかない。
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を使えばいいのでしょうか?
# 件数は累計を表示したいのですが、どの関数を使えばいいのでしょうか?
Prologによる回答を保存している nojiriko.asia サイトのサーバが 落雷事故で昨夜故障しました。復旧は9月2日になると思います。
>>650 % Prolog
円周率(3.14159).
中空円筒の体積(_高さ,_外径,_内径,_中空円筒の体積) :-
円周率(_円周率),
_中空円筒の体積 is _円周率 * _高さ * (_外径 ^ 2 - _内径 ^ 2).
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 % Prolog
654(1) :- write_formatted('%t\n',[ようこそC言語へ]).
654(2) :- write_formatted('%t\n%t\n',[ようこそC言語へ,'C言語をはじめましょう']).
657 :
デフォルトの名無しさん :2009/09/03(木) 09:37:50
>>656 -- Haskell
import Data.List (sort)
main = lines `fmap` getContents >>= print . reverse . sort . map (read :: String -> Double) . take 5
>>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) :- !)).
>>661 多倍長整数演算が必須だね。K-Prologとか。それでどのくらいまで
だせるかな?
>>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]
664 :
661 :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 % 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),!.
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の 個数),!.
>>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
670 :
おじいちゃんへ :2009/09/08(火) 22:00:40
おじいちゃん、三四郎がいいソフトだっていうのは前々から分かっているだから チョコレート嫌いとかいつまでも言ってないで。
>>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]),!.
ならびから削除(_,[],[]) :- !.
ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび)
:-
ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!.
ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび])
:-
ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!.
ならびから削除する(C,Chars,_削除されたChars), は、 ならびから削除(C,Chars,_削除されたChars), だね。
>>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.
>>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.
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};
#
# グローバル変数に格納された配列の数字列を読み込んで
# ランレングス符号化を行い、バイナリデータとして
# 圧縮・解凍するプログラムを作成せよ。
>>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 % 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).
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つ入力し、全パターンを出力するプログラムをお願いします。
>>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.
>>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].
としなくてはならないか。
ごめん。 687_1([A,B],C,X) :- C is 10 * A + B. だ。無駄にひとつレスを使ってしまった。
>>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 % 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.
素数である(_).
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 に関して考察せよ。
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
>>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).
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 % 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.
>>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,[],[]).
>>702 import Data.Map (elemAt, fromListWith)
t702 :: Ord a => [a] -> Int
t702 = snd . elemAt 1 . fromListWith (+) . (`zip` repeat 1)
UML関係の過去問の答えがわからないから、教えてくれ 問)配置図に置けるコンポーネントの利用方法として適切なものを選択しなさい。 1.実行ファイルの呼び出しの関係を表現する。 2.C++のソースファイルの#include(依存)の関係を表現する。 3.開発環境におけるファイル構成を表現する。 4.実行環境におけるデバイスを表現する 5.実行環境に置けるプロセッサーを表現する。
708 :
デフォルトの名無しさん :2009/09/25(金) 05:09:12
709 :
デフォルトの名無しさん :2009/09/25(金) 07:53:08
>>708 % Prolog
t708(_行,_href部,_表示) :-
split(_行,['href='],[_,S1|_]),
split(S1,['>','<'],[_href部,_表示|_]).
てか意図的に別な方法を採用しようとしない限り単に正規表現のレベルだな
>>710 こういう手抜きではダメですか。HTMLやXMLの構文解析をきっちりやるべし
ということかな?
>>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.
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円)
>>716 % Prolog
米国への船便小包の郵便料金(_小包の重さ,1800) :-
_小包の重さ > 0,
_小包の重さ =< 1000,!.
米国への船便小包の郵便料金(_小包の重さ,_郵便料金) :-
_小包の重さ > 1000,
_小包の重さ =< 10000,
米国への船便小包の郵便料金(1000,_1000gまでの郵便料金),
_郵便料金 is _1000gまでの郵便料金 + ((_小包の重さ - 1000) // 1000) * 550,!.
米国への船便小包の郵便料金(_小包の重さ,_郵便料金) :-
_小包の重さ > 10000,
_小包の重さ =< 20000,
米国への船便小包の郵便料金(10000,_10000gまでの郵便料金),
_郵便料金 is _10000gまでの郵便料金 + ((_小包の重さ - 10000) // 1000) * 350,!.
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 % 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),!.
>>727 訂正
最小値・最大値・標準偏差(L,_最小値,_最大値,_標準偏差) :-
length(L,_標本数),
算術平均(L,_算術平均),
L = [A|R],
最小値・最大値・標準偏差(L,_標本数,A,_最小値,A,_最大値,_算術平均,0.0,_標準偏差),!.
% 最後の副目標の論理変数_最小値と_最大値の順番を間違えた。
>>725 % Prolog
'2個の物を買うときに一緒に買う場合と,別々に会計をする場合と 消費税の1円未満の切り捨てにより、値段が変わることがある。'(_商品価格1,_商品価格2,_一緒に精算した時の消費税込み価格,_個別に精算した時の消費税込み価格) :-
_一緒に精算した時の消費税 is truncate(floor((_商品価格1+_商品価格2) * 1.05)),
_個別に精算した時の消費税込み価格 is
truncate(floor(_商品価格1 * 1.05)) + truncate(floor(_商品価格2 * 1.05)).
>>729 % また間違えた。
'2個の物を買うときに一緒に買う場合と,別々に会計をする場合と 消費税の1円未満の切り捨てにより、値段が変わることがある。'(_商品価格1,_商品価格2,_一緒に精算した時の消費税込み価格,_個別に精算した時の消費税込み価格) :-
_一緒に精算した時の消費税込み価格 is truncate(floor((_商品価格1+_商品価格2) * 1.05)),
_個別に精算した時の消費税込み価格 is
truncate(floor(_商品価格1 * 1.05)) + truncate(floor(_商品価格2 * 1.05)).
% "込み"が一ヶ所抜けた
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乗以下の整数であるとしてよい。
>>731 % Prolog
t731(AL,BL,L) :-
findall(C,(member(A,AL),member(B,BL),C is A + B),L).
>>733 ソート忘れてた。あとからソートするのではダメなのか。抜本的に書き直しね。
http://pc12.2ch.net/test/read.cgi/tech/1250204272/658 # [1] C言語とアルゴリズム
# [2] 関数(非回帰)
# キーボードから自然数を入力し1からその自然数までの
# 二乗和を求めるプログラムを作成しなさい。
# ただし二乗和を求める部分は関数(関数名をsqrsumとする)にすること。
# [実行例]
# 自然数を入力して下さい. ←自然数の入力をうながすメッセージを表示
# 10 ←自然数を入力してEnter
# 1から10までの自然数の二乗和は371です. ←計算結果を表示する
>>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,!.
>>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.
>>738 % Prolog 訂正
行を表示しながら出力(Output,end_of_file) :- !.
行を表示しながら出力(Output,Line) :-
write('%t\n',[Line]),
write_formatted(Output,'%t\n',[Line]),
fail.
741 :
デフォルトの名無しさん :2009/10/05(月) 17:30:15
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をインクルードすること)
>>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 % 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
求む、DarkBASIC・3Dプログラマー。 学歴:高校生程度 必要な知識:三角関数の簡単な知識 求めるもの:広範な探究心
750 :
749 :2009/10/07(水) 20:30:15
給料:薄給。 労働条件:厳寒。長きにわたる完全な暗闇行。絶え間ない危険。賞与の保証無し。 備考:成功の暁には名誉と賞賛を得る。
待遇 勤務時間:8時〜8時、完全無休、無給制 労働条件:キャノン方式
# [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 (安定させるためコピーさせていただきました)
>>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),!.
http://pc12.2ch.net/test/read.cgi/tech/1250204272/770 # [1] 授業単元:プログラミング演習2
# [2] 問題文(含コード&リンク):
# テキストファイルを読み込み、
# 文字コード表を利用して種類ごとに文字を分類し、それぞれをカウントするプログラムを作れ
# 分類は以下の通りとする。
# 1.半角英数
# 2.半角カナ
# 3.半角記号
# 4.全角かな
# 5.全角記号
# 6.漢字
# 以上のように分類した上で「半角英数:XX字、半角カナ:XX字・・・」というように結果をファイルに出力せよ。
# 使用する文字コード表は自由だが一般に使われているものを選択せよとのことでした。
# コード内にコメントで使用した文字コードを注釈として記載するようにとの連絡がありました。
>>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).
>>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).
>>760 訂正(第3節追加)
文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
eucコード分類(_分類,_コード下限,_コード上限),
A >= _コード下限,
A =< _コード上限,
文字コード分類ならびの更新(_分類,_分類ならびの一,_分類ならびの二),
文字コード分類(R1,_分類ならびの二,_分類ならび).
文字コード分類([_|R1],_分類ならびの一,_分類ならび) :-
文字コード分類(R1,_分類ならびの一,_分類ならび).
>>760 もう一ヶ所間違っていた。訂正箇所にコメント
文字コード分類([],_分類ならび,_分類ならび).
文字コード分類([A|R1],_分類ならびの一,_分類ならび) :-
eucコード分類(_分類,_コード下限,_コード上限),
A >= _コード下限,
A =< _コード上限,
文字コード分類ならびの更新(_分類ならびの一,_分類,_分類ならびの二), /* 第一引数と第二引数が逆になっている */
文字コード分類(R1,_分類ならびの二,_分類ならび).
文字コード分類([_|R1],_分類ならびの一,_分類ならび) :-
文字コード分類(R1,_分類ならびの一,_分類ならび).
>>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).
>>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).
>>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).
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つの元号を持つ年の扱いについては余裕がある人は、月、日も入れて、その日の正しい
# 元号を表示することによって元号を一つ表示するプログラムとしてもよい。)
>>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 % 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.
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 ←最後の行に合計を出力すること
>>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).
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.漢字
>>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).
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
#
# ただし、この例の配列要素の値は整数乱数であるので、場合ごとに異なった値が代入されている。
# だそうです。まったく意味がわかりません。お願いします
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件)+
>>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(_,_),_)).
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|***************
#
>>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,_星表示).
>>787 (訂正)
星表現(_点数,_星表示) :-
Y is _点数 // 5,
length(L,Y),
all(L,'*'), /* Y を L に変更 */
concat_atom(Y,_星表示).
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
# 文字を一文字入力して、入力された文字が、英字の小文字であるか、英字の大文字であるか、
# 数字であるか、それ以外の文字であるか判別して、判別結果を表示する
# プログラムを作成せよ。
>>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).
>>790 % Prolog
課題文1 :-
write('一文字入力してください: '),
get_line(_行),
atom_codes(_行,[_文字コード|_]),
次の文字コードを得る(_文字コード,_次の文字コード),
char_code(_次の文字,_次の文字コード),
write_formatted('次の文字は"%t"です\n',[_次の文字]).
次の文字コードを得る(_文字コード,_次の文字コード) :-
_文字コード < 256,
_次の文字コード is _文字コード + 1.
次の文字コードを得る(_文字コード,_次の文字コード) :-
_文字コード >= 256,
_次の文字コード is _文字コード + 2.
>>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_文字選択(_文字,_文字).
>>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_文字種判別(_,それ以外の文字).
>>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_文字種判別(_,それ以外の文字).
こんにちは。どなたかC♯でBMI計算プログラムをvisual studio 2008 もしくは2005 で作成してアップしてくださいませんか・・・? そのプロジェクトフォルダ全部をアップお願いします。 Webアプリケーションでお願いします。
>>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).
>>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,_曜日).
>>800 訂正
論理変数として Y が 使われているところは _ に置換してください。
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文を使用しなさい
>>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(_,_,'この文字列は存在しません。').
>>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).
置換対象文字列(日暮るればうたふ乙女が声すみてとほき田面に早苗とるなり).
>>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).
>>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
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)).
812 :
デフォルトの名無しさん :2009/10/21(水) 04:29:59
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コマンドライン引数に入力された日付が、入力された日付の年の何番目の週かを
# 「●年の●週目」と表示しなさい。(●年の"●"は入力された日付の年)(日付その他のチェックも行う事)
>>812 % Prolog
符号無し整数を右にnビット回転(_整数,N,X) :-
i2b(32,_整数,L1),
ならびの回転(右方向,N,L1,L2),
i2b(32,X,L2).
% i2b/3,ならびの回転/4 は
http://nojiriko.asia/prolog/t812.html 参照
>>816 第三引数のXは回転後の整数値で、
>>812 の問題でのxではありません。
xは_整数に当たります。
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
>>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).
>>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))))
>>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).
>>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.
>>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.
>>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 % 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 % Prolog
t830 :-
get_line(Line),
atom_to_term(Line,N,_),
文字表示(N,S),
write_formatted('%t\n',[S]),!.
文字表示(1,'Red').
文字表示(2,'Green').
文字表示(3,'Blue').
文字表示(_,終了します).
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) で実行するものとする.
>>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).
>>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))
>>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))
>>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))
>>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)
>>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)
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にする。
>>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).
>>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).
>>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).
>>847 訂正
% t846/4 の L を _整数ならび に置換します
t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
_入力した要素数>0,_入力した要素数<11,
ならびの回転(右方向,_ローテーションする数,_整数ならび,X),!.
t846(_,_入力した要素数,_,_) :-
\+((_入力した要素数>0,_入力した要素数<11)),
write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]),
fail.
>>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 % Prolog
div(_被除数,_除数,_商,_余り) :-
integer(_被除数),
integer(_除数),
_商 is _被除数 // _除数,
_余り is _被除数 mod _除数.
div(_被除数,_除数,_商,_余り) :-
float(_被除数),
float(_除数),
_商 is truncate(_被除数 / _除数),
_余りの一 is _被除数 - _商 * _除数,
div_1(_被除数,_除数,_商,_余りの一,_余り).
div_1(_被除数,_除数,_商,_余り,_余り) :- _余り < _除数.
div_1(_被除数,_除数,_商,_余りの一,_余り) :-
_余りの一 >= _除数,
_余り is _被除数 - (_商 + 1.0) * _除数.
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
>>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).
>>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 % 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).
http://pc12.2ch.net/test/read.cgi/tech/1255709298/358 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# (1)ライプニッツの公式を用いて円周率の近似値を求める時、
# その値が3.14から3.15の間になるまで
# nを増やしていき、そのnの値(繰り返し回数)を求めるプログラムを作成せよ。
#
# (2)ライプニッツの公式を用いて円周率の近似値を以下の条件で求めよ。
# nの値が増えるにつれ、それまでの近似値の平均値を求め、近似値と平均値の
# 差が平均値の1%におさまるまで繰り返す。
>>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))))
>>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).
>>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).
>>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.
>>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 % 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).
>>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).
>>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.
>>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,_全要素加算後のスタック).
>>872 一部書き直し
push(_追加要素,_スタック,_追加されたスタック) :- _追加されたスタック = [_追加要素|_スタック].
pop(_取り出される要素,_スタック,_取り出された後のスタック) :- _スタック = [_取り出される要素|_取り出された後のスタック].
http://chomework.sakura.ne.jp/log1/1135125328_02.html (レス番号194)
# [1] 授業単元: 情報処理
# [2] 問題文(含コード&リンク):ファイルからデータ(迷路空間)を読み込む処理と構造体・リストを用いた、
# 迷路空間を作成せよ。
# 読み込むデータは右図のような形式であり、 ******
# 各記号は次の意味を持つものとする。 *8000*
# * : 壁 ****0*
# 0 : 通路 **000*
# 8 : 通路 & スタート *90*0*
# 9 : 通路 & ゴール ******
# 迷路空間は、必ず長方形であることを前提とする。
# そして、再帰を用いた迷路空間の探索プログラムも作成せよ。
# 最短経路と後戻りした記録付き経路のどちらを表示しても構わないが両方表示した方がポイント高し
http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110)
# [1] 授業単元:プログラミング1
# [2] 問題文(含コード&リンク):
# 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。
# なお,データは,学籍番号順に入力されるわけではない。
# このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。
# ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。
# 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。
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
# 出力:ループがあります。
>>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 参照
>>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,_).
>>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).
>>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).
>>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.
変換規則ファイルの読み込み(_).
>>884 wr('%t\n',[S]), は
write_formatted('%t\n',[S]),
に置換してください
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 % 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.
>>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 % Prolog
数値の読み方(N,エラー) :- N < 1,!.
数値の読み方(N,エラー) :- N >= 1000,!.
数値の読み方(0,'').
数値の読み方(1,いち).
数値の読み方(2,に).
数値の読み方(3,さん).
数値の読み方(4,よん).
数値の読み方(5,ご).
数値の読み方(6,ろく).
数値の読み方(7,なな).
数値の読み方(8,はち).
数値の読み方(9,きゅう).
>>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).
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いずれかの倍数の個数を数えて表示するプログラムを作成せよ。
>>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).
>>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]).
>>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 % Prolog
del_chr(_対象文字列,_削除する文字,_削除された文字列) :-
atom_chars(_対象文字列,_対象文字ならび),
findall(C,(member(C,_対象文字ならび),\+(C=_削除する文字)),L),
atom_chars(_削除された文字列,L).
>>902 % Prolog
t902 :-
write('気温データを浮動小数点数値として入力してください : '),
get_line(Line),
atom_to_term(Line,_小数,_),
'五度単位の丸め'(_小数,_丸めた整数),
write('五度単位で丸めると %t となります\n',[_丸めた整数]).
'五度単位で丸め'(_小数,_丸めた整数) :-
_丸めた整数 is truncate(floor(_小数 / 5.0) * 5.0).
http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号146)
# [1] 授業単元: C++
# [2] 問題文(含コード&リンク):
# キーボードから100点満点のテストの点数を入力し(-1で終了)、
# 10点ごとの人数を int型の配列 count[11]に数えるプログラムを
# 作成せよ。 テストは100点満点とし、それ以外の入力はエラーとし
# て無視する。ただし -1 はデータの終了を表すものとする。 点数
# の入力が終了したら、度数分布を画面に出力して終了する。出力は
# 人数と,*(アスタリスク)によるグラフとする。
>>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).
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関数の中で一意決定不能と表示し、#すべての候補を出力して下さい。
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
>>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).
>>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))
http://pc12.2ch.net/test/read.cgi/tech/1255709298/449 # [1] 授業単元:C++実習2
# [2] 問題文(含コード&リンク):
# -関数テンプレート-
# 配列へのポインタと要素数を渡すと昇順にソートする関数を作成せよ。
# 但し,関数テンプレートにより作成すること。想定する配列の型は文字列以外とする。
# ソートのアルゴリズムはバブルソート(単純交換法)とする。また,関数をテストする適切なmain関数も作成し提出すること。
# 関数名前名は b_sort とし,第1引数は配列へのポインタ, 第2引数はint型で配列の要素数, 戻値は無しとする。
>>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.
>>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 % 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 % 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).
>>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
>>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 % 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 = _段数.
>>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 = _段数.
>>927 このlength/2のLの挙動がfor/3を使った反駁機構を利用した
処理にした理由です。再帰の場合、length(L,_最終の星数) は
>>926 のように、再帰の中側で必ず実行して、新しいLを
作り出さなくてはならない。引数で持ち回ろうとすると、
append(L0,L1,L0,L) でLは決定されてしまい、次の再帰
呼び出しのなかでfailとなってしまう。
これは高階述語の定義の時にも屡々現れ、Prologの難しい
部分のひとつです。
>>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(['間違いです。正解は',_正解],_診断).
>>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,!.
>>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)))))))
>>938 ひとまず仕様は
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
要求仕様
1から10000*10000までの範囲の整数Nが以下の条件を満たす時、
1) Nが3の倍数
2) Nを10進表示した時にどこかの桁に3が現れる
全てのNを昇順に整列して、順序番号を付加して表示せよ。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>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))))
>>939 順序番号はcodepadの表示の仕様じゃないかと
>>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).