いろんな言語で宿題スレat TECH
いろんな言語で宿題スレ - 暇つぶし2ch2:デフォルトの名無しさん
09/05/21 23:47:48
>>1=カス

3:デフォルトの名無しさん
09/05/22 03:44:26
% 宿題: スレリンク(tech板: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工作員
09/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
09/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.

やれやれ、面倒なこととなりました。

6:Prolog工作員
09/05/22 15:29:31
>>5
それもおかしい。
get_integers(L) :- findall(N,(for(1,_,10),get_integer(N)),L).
get_integer(N) :- get_code(C),C >= 48, C =< 57,N is C-48.
get_integer(N) :- get_integer(N).

でよいはず。


7:Prolog工作員
09/05/22 15:35:55
ああ、だめだ! 訂正。
get_integer(N) :- get_code(C),C >= 48,C =< 57,N is C-48,!.
get_integer(N) :- get_integer(N).
でした。
大変失礼しました。


8:デフォルトの名無しさん
09/05/22 15:58:39
「10個の数字を入力する」のもっとも自然な表現は、
get_integersの引数を増やして、そこに整数の個数を取ります

get_integers(N,L) :- findall(A,(for(1,_,N),get_integer(A)),L).
get_integer(A) :- get_code(C),C >= 48,C =< 57,A is C-48,!.
get_integer(A) :- get_integer(A).

9:デフォルトの名無しさん
09/05/22 18:29:19
program EX38 ! やー ふぉー ふぉーとらんらんらん♪
 implicit none
 integer, parameter :: Nmax = 10
 integer :: A(1:Nmax), n
 
 print *, "数字列を入力してください。"; read "(99I1)", A
 do n = Nmax, 2, -1
  print "(A,99(I1,1X))", repeat(" ", Nmax-n), A(1:n)
  A(1:n-1) = mod(A(1:n-1) + A(2:n), 10)
 end do
 print "(A,I1,A)", "残った数字は", A(1), "です。"
end program EX38


10:a36 ◆K0BqlCB3.k
09/05/23 03:50:22
スレリンク(tech板:38番)

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

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

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

      最後に残った数字は 2 です。

11:a36 ◆K0BqlCB3.k
09/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
09/05/23 03:55:37
言語名書き忘れた。
Haskellね。

13:デフォルトの名無しさん
09/05/26 18:15:27
>>11
ほ、ほー。さすが Haskell すっきりと短いね。
どうも次の言語が続かないようだから、今度は
スレリンク(tech板:789番)
でいこう。上のお題に一部集計を付加するだけ。

14:デフォルトの名無しさん
09/05/27 00:02:33
>>10>>13の違いが分からない。

python 2.6 で

>10 (のつもり)
import sys
print u'数字を入力してください。'
a = map(int, list(sys.stdin.readline().rstrip()))
indent = 0
while(True):
    print ' ' * indent + ' '.join(map(str,a))
    if len(a) == 1:
        break
    b = []
    for i in range(0, len(a)-1):
        b.append(int(a[i] + a[i+1]) % 10)
    a = b
    indent += 1
print u'最後に残った数字は %d です。' % a[0]


15:デフォルトの名無しさん
09/05/27 00:23:09
>>14
ごめん。
スレリンク(tech板:790番)
の方だった。どう化けるかだけのことだが。

16:デフォルトの名無しさん
09/05/27 06:12:35
Linuxのシェルプログラミング

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

というプログラミングを作ってください
for文やtr,mvを使うことはわかるんですが・・・
どうかよろしくお願いします。

17:デフォルトの名無しさん
09/05/27 06:15:21
すいません、急を要するのでageさせていただきます。

18:デフォルトの名無しさん
09/05/27 09:50:32
>>17
シェル名を書かないのは宗教上の理由からですか?

ていうかこのスレの趣旨に合わないんでUNIX板のエスパーくだ質スレにでもどうぞ

19:デフォルトの名無しさん
09/05/28 01:28:49
;;;scheme勉強中。>10 を書いてみた。入力文字列の長さはチェックしてないです。
;;;gaucheとDrScheme で動作確認。(read)で得た数値を、number のリストにするのがなんかめんどくさかった。
;;;もっと簡単な方法あるのかな?
(define (print-result lis)
    (define (get-next-list lis)
        (if (= 1 (length lis))
            '()
            (cons (modulo (+ (car lis) (cadr lis)) 10)
                (get-next-list (cdr lis)))))
    (define (list->line lis)
        (if (= 1 (length lis))
        (number->string (car lis))
        (string-append
            (number->string (car lis))
            " "
            (list->line (cdr lis)))))
    (let loop ((lis lis) (indent 0))
        (display (make-string indent))
        (display (list->line lis))
        (display "\n")
        (if (= 1 (length lis))
            (car lis)
            (loop (get-next-list lis) (+ indent 1)))))
(display "数字を入力してください。\n")
(define src-list
    (map string->number
        (map string
            (string->list
                (number->string (read))))))
(display (format "最後に残った数字は ~A です。"
            (print-result src-list)))

20:デフォルトの名無しさん
09/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
09/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
09/05/28 03:48:32
.data
#int i
.globl i
i: .word 0
#int j
.globl j
j: .word 0
#main()
.text
.globl main
main:

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

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

のように翻訳できるとのことです

23:デフォルトの名無しさん
09/05/28 05:45:32
>>20
LISPマシンではLispがPrologマシンではPrologがアセンブラだよ。
Lispに変換するのでよいのかな?

24:デフォルトの名無しさん
09/05/28 06:17:26
>>20
#!/bin/sh
gcc -S hoge1.c
gcc -S hoge2.c

25:デフォルトの名無しさん
09/05/28 06:19:15
>>23 INTER LISPか。マニュアルは持ってるけど機械がないw


26:20
09/05/28 23:07:54
>>23
はい。お願いしたいです

27:23
09/05/29 09:06:50
>>26
INTER LISP 只今、勉強中w

28:デフォルトの名無しさん
09/05/29 16:10:18
スレリンク(tech板:23番)
[1] 授業単元: 社会情報入門
[2] 問題文(含コード&リンク):
次の無限等比級数の和を、各項を順に加算していくことにより求めるプログラムを書け。
1+(1/3)+(1/9)+(1/27)+.....
ただし、0.00001以下となる項を加えた時点で加算を終了することとする。 
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: 2009年5月22日12:50まで
[5] その他の制限:なし

29:デフォルトの名無しさん
09/05/29 16:12:14
% 悪い解答をひとつ
% 言語: IF/Prolog
f(X) :- f(1,1,X).
f(N,S,X) :- N > 100000,X is S / N,!.
f(N,S,X) :- M is N * 3,S2 is S + M,f(M,S2,X).

30:デフォルトの名無しさん
09/05/29 20:00:59
;; scheme
;; 分数が組み込みで使えるって、素敵やん?

(define ans
  (let loop ((x 1)(total 0))
    (let ((total (+ total x)))
      (if (<= x 0.00001)
          total
          (loop (* x 1/3) total)))))
(display ans)
(newline)
(display (exact->inexact ans))

31:デフォルトの名無しさん
09/05/29 20:06:15
;; scheme
;;なんか無駄なことやってた。やり直し。

(define ans
  (let loop ((x 1))
      (if (<= x 0.00001)
        x
        (+ x (loop (* x 1/3))))))
(display ans)
(newline)
(display (exact->inexact ans))

32:デフォルトの名無しさん
09/05/29 22:42:51
scheme と同じ発想で

import Data.Ratio

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

main = print $ fromRational $ f 1

33:デフォルトの名無しさん
09/05/29 23:16:00
>>29
答えが違ってるので0点

34:デフォルトの名無しさん
09/05/30 01:37:00
# python2.6 で >10 と >15 まとめて。
import sys
from itertools import count
def job(handler, lst):
    while True:
        handler.callback(lst)
        if len(lst) == 1: break
        lst = map(lambda x:(x[0]+x[1]) % 10, zip(lst, lst[1:]))
    handler.finish(lst)
class Handler1:
    def __init__(self):
        self.indent = ''
    def callback(self, lst):
        print self.indent + ' '.join(map(str, lst))
        self.indent += ' '
    def finish(self, lst):
        print u'最後に残った数字は %d です。' % lst[0]
class Handler2:
    def __init__(self):
        self.buffer = [0] * 10
    def callback(self, lst):
        for i in lst:
            self.buffer[i] += 1
    def finish(self, lst):
        total = reduce(lambda a,b:a+b, self.buffer)
        print u'%d個' % total
        for i,v in zip(count(), self.buffer):
            print u'%d: %d回 %d%%' % (i, v, v*100.0/total)
print u'数字を入力してください。'
lst = map(int, list(sys.stdin.readline().rstrip()))
job(Handler1(), lst)
job(Handler2(), lst)

35:デフォルトの名無しさん
09/05/30 03:32:13
>>28
% 言語: Prolog
f(S) :- f(1.0,1,S).
f(P,_,P) :- P < 0.00001,!.
f(P,N,S) :- M is N * 3,P2 is 1 / M,f(P2,M,S2),S is S2 + P.

36:a36 ◆K0BqlCB3.k
09/05/30 03:42:13
>>32
Rationalな割り算は%じゃないかな。

俺はこんな感じで。

-- Haskell

import Data.Ratio

main = print $ fromRational $ sum $ takeWhile ((>0.00001) . fromRational) $ iterate (\n -> n * (1%3)) 1

37:a36 ◆K0BqlCB3.k
09/05/30 03:47:42
いろいろ無駄があったから修正

import Data.Ratio

main = print $ fromRational $ sum $ takeWhile (>(1%100000)) $ iterate ((1%3)*) 1

38:デフォルトの名無しさん
09/05/30 04:20:51
>>15
% Prologの苦手とする処理ですね。長くなったので表示部分は省略します。
% 言語: IF/Prolog
modulus38([X],X,CL,CL).
modulus38(L,X,CL1,CL) :-
 modulus38_1(L,L2,CL1,CL2),
 modulus38(L2,X,CL2,CL).
modulus38_1([_],[],CL,CL).
modulus38_1([A,B|R1],[C|R2],CL1,CL) :-
 C is (A+B) mod 10,
 n番目に1を加算(C,CL1,CL2),
 modulus38_1([B|R1],R2,CL2,CL).
n番目に1を加算(N,L,X) :-
 append(L1,[B|R],L),
 M is N-1,
 length(L1,M),
 B2 is B+1,
 append(L1,[B2|R],X).
sum_list([],0).
sum_list([N|R],X) :- sum_list(R,Y),X is Y + N.

39:デフォルトの名無しさん
09/05/30 04:52:49
>>38
集計リストは連想配列的に[0:N0,1:N1,2:N2, ... ,9:N9] で持つこともある。
そうすると、n番目に1を加算/3ではなくて、
nに1を加算(N,L,X) :-
 append(L1,[N:Ns1|R],L),
 Ns2 is Ns1+1,
 append(L1,[N:Ns2|R],X).
となる。

40:デフォルトの名無しさん
09/05/30 06:50:45
>>37
少々癪だが、Haskell短くていいなぁ。

41:デフォルトの名無しさん
09/05/30 06:56:23
# Prolog向きの見つけたw
スレリンク(tech板:1番)
1 :BASIC:2006/01/09(月) 15:35:00
N人分のデータ(氏名、体重、身長、年齢)がDATA文で入力されているプログラムが
ある。これを用いて次のプログラムをBASICで作成しなさい
身長が160CM以上で170cm未満の人の名前を表示する


42:デフォルトの名無しさん
09/05/30 08:41:13
# Prolog流の表示は普通はインタプリタによる論理変数の解決表示ですから
# 言語: Prolog
データ(山下,65,177,23).
データ(尾崎,64,168,60).
データ(飯島,72,173,29).
データ(吉田,69,166,44).

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

#どうしても強制表示したい場合は、
foo :- foo(_氏名),write(_氏名),nl,fail;true.

43:デフォルトの名無しさん
09/05/30 09:05:03
# こんなのも可能かな。op定義に汎用性はないけど。
# 言語: Prolog
:- op(800,xfx,は).
:- op(750,xfx,が).
:- op(700,xfx,の).
:- op(650,xfx,で).
:- op(600,xf,以上).
:- op(600,xf,未満).
:- op(500,xf,cm).

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

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

# 「身長が160cm以上で170cm未満の人の名前は_氏名」を形態素解析して、
# Term = [身長,が,160,cm,以上,で,170,cm,未満,の,人,の,名前,は,_氏名]
# が得られるなら、結構おもしろい事がやれるでしょうけれど。

44:デフォルトの名無しさん
09/05/30 10:43:38
>>36
(%)は整数比からRatioを構築する演算
(/)はRatio同士の割り算
だから、たとえば1%3のことを1/3と書いても大丈夫

45:デフォルトの名無しさん
09/05/30 11:10:37
# python2.6 で >>41

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

# 無理やりワンライナー
print ' '.join(map(lambda dic:dic[u'氏名'], filter(lambda dic:160 <= dic[u'身長'] < 170, map(lambda d:dict(zip(columns,d)), data))))


46:デフォルトの名無しさん
09/05/30 13:38:53
>>43
これは、

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

というように使うのですか?


47:197
09/05/30 13:59:28
>>46
そうですね。「名前 は _誰.」 は少し不自然なので

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

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

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

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

のような定義が何も考えずにできます。
ここまで単純だと節の自動生成をする述語定義もすぐできます。

48:197
09/05/30 14:03:27
名前の197は「Prologでまったり Part4」スレに書き込んだ時の残り滓でした。
無視してください。

49:デフォルトの名無しさん
09/05/30 15:44:59
インタラクティブなプログラムのコーディングで勝負しようぜ

50:デフォルトの名無しさん
09/05/30 16:02:19
インタラクティブな環境だとわかりますが、
インタラクティブなプログラムだとイメージできません。
申し訳ないが、少し説明してください。

51:デフォルトの名無しさん
09/05/30 16:29:22
>>50
たとえば任意の文字列を一文字ずつ順番に0.5~2秒のランダムな間隔でCUI表示するプログラム。

52:デフォルトの名無しさん
09/05/30 19:38:00
>>33
ぱっと見あってそうだが…
"~加えた時点で加算を終了" のところが違うかも
でもこれってみんな違うよねw

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

f 1. 0. |> printfn "%f";;


53:デフォルトの名無しさん
09/05/30 19:45:41
>>52
>>35 の第二節が
f(P,_,P) :- P < 0.00001,!. であるか
f(P,_,0.0) :- P < 0.00001,!. であるかということかな。

54:デフォルトの名無しさん
09/05/30 20:03:07
>>53
ごめん…Prologは名前を知ってる程度でその違いまではわかんない
というか>>29は分かるけど>>35は理解できなかった
できれば解説キボン…

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

List.iter (fun (n, _, t, _) -> if t >= 160 && t < 170 then printfn "%s" n) data;;

55:デフォルトの名無しさん
09/05/30 20:18:28
>>53
今わかったw

>f(P,_,P) :- P < 0.00001,!. であるか
>f(P,_,0.0) :- P < 0.00001,!. であるかということかな。
そうです
で、問題に合う(0.00001以下の項を加えた時点で加算終了)のは前者のほうですね

56:デフォルトの名無しさん
09/05/30 20:32:23
>>29もそこ合ってますね…何が違うんだろ

57:デフォルトの名無しさん
09/05/30 20:33:50
>>54
fは3引数でその第一引数に 1/1->1/3->1/9->1/27 ... 逆数分数の遷移が
第二引数に 1->3->9->27 と次の逆数計算の分母からきます。
第三引数はその逆数計算の累計が計算されるところですが、論理変数のままで、
実値がここに入って次の呼び出しに渡されるというようなことはありません。
再帰が終了して漸く計算が始まるように見えます。それが第三節の最後の
f(P2,M,S2), の後にある S is S2 + P です。
f(P,_,P) :- P < 0.00001,!. だと分数が0.00001より小さくなったときその最小分数を起点に
再帰的に逆数分数が加算されて解を求めるという宣言であり、
f(P,_,0.0) :- P < 0.0001,!. は0.00001より小さくなった時の逆数分数は加算せずに
再帰的に逆数分数が加算されて解が求まるという宣言です。
第三節で次の逆数分数を先読み的に計算してしまっている点に注意してください。

58:デフォルトの名無しさん
09/05/30 20:53:31
>>57
詳しい解説ありがとうございます
第三引数の扱いがイマイチ分からなかったので助かります

59:デフォルトの名無しさん
09/05/31 00:07:45
>>56
>29は終了条件の判定で分母しかみてないのでは?

60:デフォルトの名無しさん
09/05/31 01:54:55
>>59
普通
sigma = a + a(1/r) + a(1/r) + ... + a(1/r^n) (問題では 1/r^n < 0.00001 で、ここで加算終了)
なんだけど、
>>29
sigma = (a + ar + ar^2 + ... + ar^n) / r^n
って解いてる。つまり、最後に足した項が普通のほうの初項
だから、
1/r^n < 0.00001 ⇔ r^n > 100000 が終了条件でおk

まぁ、そのへんが「悪い回答」なんだろうw

61:デフォルトの名無しさん
09/05/31 05:56:38
>>46
やっぱり膠着語の方が便利だねw


62:デフォルトの名無しさん
09/05/31 14:35:45
<<問題>> この問題は他の言語の宿題スレの問題ではありません。
「論理少女1」つじ要作 というマンガの中に出てくる問題です。
できるだけ、問題文に忠実な表現になるようにこの問題を解いてください。
<<問題は3問ありますが、手始めに第一問>>

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

ヒントをもとにどこに何を隠したかを当てていくのよ では第一問 ヒントは、
・ 一万円札は髪の中
・ 千円札は十円玉より上の位置
・ スカートには胸の10倍のお金が入っている
それでは、全てのお金の位置は?

63:デフォルトの名無しさん
09/05/31 15:00:35
>>62
著作権の問題が心配だが・・・


64:Haskellで
09/05/31 16:20:18
import Data.List
import Control.Monad

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

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

main = putStr $ unlines solve

mappings :: (Eq a, Eq b) => [a] -> [b] -> [(a -> b, b -> a)]
mappings xs ys = do
  ys' <- permutations ys
  return (make xs ys', make ys' xs)
  where
    make from to = \value -> case lookup value (zip from to) of
      Just r -> r
      Nothing -> error "lookup failed"

65:デフォルトの名無しさん
09/05/31 19:04:09
>62-64

スレ違い

> 他の宿題スレで出された問題を各々好きな言語で解答して言語の良さを競い合うスレです。


66:a36 ◆K0BqlCB3.k
09/05/31 20:09:23
>>65
まぁ、スレの目的と外れすぎているというわけでもないから、多少の柔軟性は考えるよ。

>>62から出題された宿題ということで。

67:デフォルトの名無しさん
09/05/31 22:30:17
# では、python2.6 で >62。 posは、indexが小さいほど体の上の方であるとします。
money = {u'一万円札':10000,u'千円札':1000,u'百円玉':100,u'十円玉':10}
pos = [u'髪の中',u'胸のポケット',u'スカートのポケット',u'靴の中']
m2p = dict(zip(money.keys(),pos))
def hint1(m2p):
    u"""一万円札は髪の中"""
    return m2p[u'一万円札'] == u'髪の中'
def hint2(m2p):
    u"""千円札は十円玉より上の位置"""
    return pos.index(m2p[u'千円札']) < pos.index(m2p[u'十円玉'])
def hint3(m2p):
    u"""スカートには胸の10倍のお金が入っている"""
    p2m = dict((v.split(u'の')[0],k) for k,v in m2p.items())
    return money[p2m[u'スカート']] == money[p2m[u'胸']] * 10
def solve(m2p, m2p_keys):
    solve_list = []
    if len(m2p_keys) > 1:
        k1 = m2p_keys[0]
        for k2 in m2p_keys:
            m2p[k1], m2p[k2] = m2p[k2], m2p[k1]
            solve_list += solve(m2p, m2p_keys[1:])
            m2p[k1], m2p[k2] = m2p[k2], m2p[k1]
    elif hint1(m2p) and hint2(m2p) and hint3(m2p):
        solve_list.append(m2p.copy())
    return solve_list
if __name__ == '__main__':
    lst = solve(m2p, m2p.keys())
    if not lst: print u'解なし'; exit()
    print u'解を%d個見つけました' % len(lst)
    for d in lst:
        print "\n"+"\n".join(u'%sに%s'%(p, m)for m,p in d.items())

68:デフォルトの名無しさん
09/06/01 00:25:16
# >67の solve 以下を書き直し。
# こっちだと、>67の 4行目 m2p = ... の部分は要らなくなります。
# 結果はどちらも同じです。

def solv():
    def permutation(lst):
        if not lst:
            yield []
            return
        for i in range(0, len(lst)):
            for x in permutation(lst[:i] + lst[i+1:]):
                yield x + [lst[i]]
    is_match = lambda m2p:hint1(m2p) and hint2(m2p) and hint3(m2p)
    return filter(is_match, map(lambda m:dict(zip(m,pos)), permutation(money.keys())))
if __name__ == '__main__':
    lst = solv()
    if not lst: print u'解なし'; exit()
    print u'解を%d個見つけました' % len(lst)
    for d in lst:
        print '\n'+'\n'.join(u'%sに%s'%(p, m)for m,p in d.items())

69:デフォルトの名無しさん
09/06/01 13:01:53
>>62
% Prolog (残り半分があります)
:- op(800,xfx,は).
:- op(650,xfx,の).
:- op(250,xf,円).

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

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

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

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

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

ヒント(1,髪の中,一万円札).
ヒント(2,_千円札の場所,千円札,_十円玉の場所,十円玉) :- _千円札の場所 は _十円玉の場所 の 上にある.
ヒント(3,スカートのポケット,_物1,胸のポケット,_物2) :- お金(_物1,_円1 円),お金(_物2,_円2 円),_円_1 is _円2 * 10.


70:デフォルトの名無しさん
09/06/01 13:07:03
% 続きです。この他に順列/3の定義が必要ですが。
全てのお金の位置は?(_解) :-
解候補の作成(_解),
member([_場所1,_物1],_解),
ヒント(1,_場所1,_物1),
member([_場所2,_物2],_解),
member([_場所3,_物3],_解),
ヒント(2,_場所2,_物2,_場所3,_物3),
member([_場所4,_物4],_解),
member([_場所5,_物5],_解),
ヒント(3,_場所4,_物4,_場所5,_物5).

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

解候補の生成([],_,[]).
解候補の生成([A|R1],[B|R2],[[A,B]|R]) :-
解候補の生成(R1,R2,R).

71:デフォルトの名無しさん
09/06/01 18:13:36
>>69 誤りがあった。
... :- お金(_物1,_円1 円),お金(_物2,_円2 円),_円_1 is _円2 * 10.

_円_1 という所は _円1 ですね。

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

全てのお金の位置は?(_解) :-
  解候補の作成(_解),
  ヒント(1,_解),
  ヒント(2,_解),
  ヒント(3,_解).


73:デフォルトの名無しさん
09/06/01 18:30:09
% *** user: '順列' / 3 ***
'順列'(Y,0,[]).
'順列'(Y,N,[A|X]) :-
  del(Z = Y - A),
  M is N - 1,
  '順列'(Z,M,X) .
% *** user: del / 1 ***
del(X = [A|X] - A).
del([B|Y] = [B|X] - A) :-
  del(Y = X - A) .

74:デフォルトの名無しさん
09/06/02 19:23:00
<<問題2>>「論理少女1」つじ要作 というマンガの中に出てくる問題です。
4箇所の隠し場所と4つのアイテム(お金)は>>62と同じですが、
隠す場所は一度ご破算にします。以下のヒントを読んで、
できるだけ問題文に忠実な表現になるようにプログラミングしてください。
1) 髪の中かスカートのポケットのどちらか一万円札が入っている
2) 胸のポケットに入っているお金はスカートに入ってるお金の10倍
3) 百円玉は千円札より上の位置にある
4) 靴の中のお金は髪の中のお金の100倍
そして、1)..4)のうちどれかが嘘。
それでは、
靴の中のお金は?

75:python2.6で>74
09/06/02 23:20:11
money = {u'一万円札':10000,u'千円札':1000,u'百円玉':100,u'十円玉':10}
pos = [u'髪の中',u'胸のポケット',u'スカートのポケット',u'靴の中']
class assumption:
    def __init__(self, m2p):
        self.m2p, self.p2m = m2p, dict((v,k) for k,v in m2p.items())
class condition:
    hint = {
        (1):lambda a:a.m2p[u'一万円札'] in (u'髪の中', u'スカートのポケット'),
        (2):lambda a:money[a.p2m[u'胸のポケット']] == money[a.p2m[u'スカートのポケット']] * 10,
        (3):lambda a:pos.index(a.m2p[u'百円玉']) < pos.index(a.m2p[u'千円札']),
        (4):lambda a:money[a.p2m[u'靴の中']] == money[a.p2m[u'髪の中']] * 100,
    }
    @classmethod
    def match(cls, a):
        return 3 == len(filter(lambda h:h(a), cls.hint.itervalues()))
def solv():
    def permutation(lst):
        if not lst:
            yield []
            return
        for i in range(0, len(lst)):
            for x in permutation(lst[:i] + lst[i+1:]):
                yield x + [lst[i]]
    return filter(condition.match, map(lambda m:assumption(dict(zip(m, pos))),
                                      permutation(money.keys())))
if __name__ == '__main__':
    lst = solv()
    if not lst: print u'解なし'; exit()
    print u'条件を満たす組み合わせは%d通りありました。' % len(lst)
    print u'靴の中には%sが入っています。' % u'か'.join(set(map(lambda a:a.p2m[u'靴の中'], lst)))

76:75
09/06/02 23:22:51
もはや「問題文に忠実な表現」とかよく分からなくなっているw
そして1レスに詰め込むのも限界にきている。

77:デフォルトの名無しさん
09/06/03 00:53:48
>>64のsolveを差し替えで

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

78:デフォルトの名無しさん
09/06/03 07:34:14
スレリンク(tech板:645番)
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):1方向線上リストを使って、スタックを実現せよ。ただ
し、各記憶要素xは整数値をとるもの
とする。 要素xをプッシュするpush(int x)、ポップしてその値を返すpop()、スタック

空かどうかを判断し真偽値を返すempty()、ならびに現在のスタック内容全体を表示するs
how()を用意する。

79:デフォルトの名無しさん
09/06/03 07:35:44
>>78
% Prolog
push(X,L,[X|L]).
pop(X,[X|L],L).
empty([]).
show(L) :- write(L).

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

               URLリンク(kansai2channeler.hp.infoseek.co.jp)
joyful/img/9352.txt
               ↑これの続きにお願いします!

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

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

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

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


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

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

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

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

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

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

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


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

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

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

93:デフォルトの名無しさん
09/06/05 06:22:50
>>92
そのまま続けると入力規制に引っ掛かりますよ!


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

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



96:デフォルトの名無しさん
09/06/05 07:16:37
スレリンク(tech板:725番)
苗字・名前・年齢・身長・体重を入力し、
その個人データを氏名・年齢・身長・体重・BMIの値とコメントを出力する。

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


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

98:デフォルトの名無しさん
09/06/05 09:22:23
>>96
URLリンク(nojiriko.asia)


99:デフォルトの名無しさん
09/06/05 16:11:59
スレリンク(tech板:809番)

<問題>>
URLリンク(kansai2channeler.hp.infoseek.co.jp)

突然骨のある問題が。

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

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

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

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

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

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

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

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

104:デフォルトの名無しさん
09/06/07 11:32:48
スレリンク(tech板:547番)

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

が正しい。お粗末!

111:デフォルトの名無しさん
09/06/08 05:52:17
スレリンク(tech板:640番)
【 課題 】
指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップするソフトを作成すること。

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

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

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


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

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


112:デフォルトの名無しさん
09/06/08 06:06:01
スレリンク(tech板:385番)
問題文:
1、10個の文字を1つずつ入力し、それらを入力した順に
  並べて表示
2、10個の文字を1つずつ入力し、それらを入力した順と逆順に
  並べて表示
3、5文字以上の長さの文字列を入力し、4番目の文字と5番目の文字を入れ替えて表示
4、10個の1桁の整数を入力し、それらを大きい順に並べて表示
5、10個の1桁の整数を入力し、その中から最も大きい3個を入力した順に表示
6、1桁の整数の入力を、同じ数が3回入力されるまで繰り返す
7、1桁の整数の入力を、0から9までの全ての数が入力されるまで繰り返す

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

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

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

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

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

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

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

115:デフォルトの名無しさん
09/06/08 21:21:24
スレリンク(tech板:9番)
マッチロジックを用い、次に示すようなプログラムを作りなさい

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

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

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

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

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


116:デフォルトの名無しさん
09/06/08 21:22:42
つづき、
処理手順
1)M、Tともにデータがある、MとTを比較
 ①M<Tのとき
  →Mを出力
 ②M=Tのとき
  →Tを出力③
 ③T同士で比較
  同じコードのデータが複数ある→1番下のデータを出力
 ④Mを読み込む
 ⑤M>Tのとき
  →Tを出力③
2)Mにのみデータがある
  Mを出力
3)Tにのみデータがある
  Tを出力③
4)両方のファイルがなくなれば終了


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

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

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

118:デフォルトの名無しさん
09/06/09 12:13:21
% Prolog(2/2)

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

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

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

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

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

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

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

120:デフォルトの名無しさん
09/06/09 13:32:07
>>112 6、
% Prolog

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

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

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

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

121:デフォルトの名無しさん
09/06/09 13:52:34
>>112 7、
% Prolog

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

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

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

122:デフォルトの名無しさん
09/06/09 16:09:43
>>74
% Prolog
URLリンク(nojiriko.asia)

123:デフォルトの名無しさん
09/06/09 20:40:10
<<問題>>
スレリンク(tech板:64番)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

124:デフォルトの名無しさん
09/06/09 20:45:27
>>123
% Prolog
URLリンク(nojiriko.asia)

125:デフォルトの名無しさん
09/06/10 05:01:30
スレリンク(tech板:355番)

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

126:デフォルトの名無しさん
09/06/10 05:06:37
>>125
URLリンク(nojiriko.asia)

127:124
09/06/10 05:45:42
URLリンク(nojiriko.asia)

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


128:デフォルトの名無しさん
09/06/10 06:58:11
<<課題>> これもC/C++の宿題から
スレリンク(tech板:122番)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

129:デフォルトの名無しさん
09/06/10 07:19:16
>>128
% Prolog
% t128_1 はパス

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

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

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

131:デフォルトの名無しさん
09/06/10 12:21:33
スレリンク(tech板:529番)
[1] 授業単元:Ruby
[2] 問題文 ファイル分割

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

ruby split.rb hoge.csv tmp/ 4

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

132:デフォルトの名無しさん
09/06/10 12:31:50
>>131
% Prolog
URLリンク(nojiriko.asia)


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


134:デフォルトの名無しさん
09/06/10 17:11:39
>>133
% Prolog
URLリンク(nojiriko.asia)

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


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

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

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

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

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

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


136:デフォルトの名無しさん
09/06/11 03:29:11
<<課題>> Ruby
[1] 授業単元: Ruby演習 [2] 問題文、URLリンク(kansai2channeler.hp.infoseek.co.jp)
Rubyの問題がわかりません
助けてください

(1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい

p wday["sunday"] #=> "日曜日"
p wday["monday"] #=> "月曜日"
p wday["saturday"] #=> "土曜日"

(2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい

(3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてください。
「sunday」は日曜日のことです。
「monday」は月曜日のことです。


(4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正規表現で定義するなら「/\s+/」)で区切られた文字列をハッシュに変換するメソッドstr2hashを定義してください。

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


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

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

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

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

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

140:139
09/06/11 05:13:26
訂正
一つ違い(M,N) :-
  integer(M),!,
  N is M + 1.
一つ違い(M,N) :-
  integer(N),!,
  M is N - 1.

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


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

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

が一番最後に来ますね。

143:デフォルトの名無しさん
09/06/11 07:18:14
>>136 (4)だけです
% Prolog (正規表現との競争ということかな 少し負けるが・・)
% URLリンク(nojiriko.asia)
:- 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
09/06/11 07:25:29
>>143
色色とあるのは色の間違いです。

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


145:デフォルトの名無しさん
09/06/11 21:23:42
<<問題>>
スレリンク(tech板:206番)
[1] プログラミング
[2] 入力した数値を4で割った余りを求めるプログラムを作れ。(switch)を用いて。


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

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

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

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

149:デフォルトの名無しさん
09/06/11 21:45:40
スレリンク(tech板:675番)
【 課題 】二つの文字列str1 とstr2 を入力して、str1 とstr2 から交互に一文字ずつ順番にとりだして、交
互にならべた文字列をつくれ。長い方の文字列の後の部分はそのままくっついた形になる。
String,StringBuffer クラスのメソッドを使え。

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

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

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

151:デフォルトの名無しさん
09/06/11 23:13:06
<<課題>> C
スレリンク(tech板:209番)
1行に一つづつ表示するプログラムを作成せよ。
空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、
ピリオド(,)は表示する単語に含めないこと。

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

・出力
  This
is
a
pen


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

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

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

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

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

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

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


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

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

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

156:デフォルトの名無しさん
09/06/12 10:54:16
>>151
LEXを使えば超カンタン!

これで終り


%{
#include <stdio.h>
%}

%option noyywrap

%%

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

%%

main()
{
yylex();
}


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


158:デフォルトの名無しさん
09/06/12 22:10:33
>>157
% Prolog
URLリンク(nojiriko.asia)

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

160:デフォルトの名無しさん
09/06/13 09:47:14
>>74
% Prolog これは忘れてました。
URLリンク(nojiriko.asia)

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


162:デフォルトの名無しさん
09/06/14 04:33:08
>>161
# >>701
# URLリンク(rg550.hp.infoseek.co.jp)
#
# >捌き率は標準偏差の3倍の範囲を考慮する正規分布に従うものとする。
# ここだけ意味分からなかったから、自分でGateModel#getDepartureInterval()を適当に書き換えて。

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


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

165:デフォルトの名無しさん
09/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\nURLリンク(a.pic.to) のような美しい表を作るにはポストスクリプト
命令述語を使う必要がありますね\n').

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


167:デフォルトの名無しさん
09/06/14 07:24:21
スレリンク(tech板:276番)
#[1] 授業単元:プログラミング演習
#[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
#               ほとんど英文です。訳そうとしたんですが自分でも意味がわからなくなったんでそのままにしました。すいません。

168:デフォルトの名無しさん
09/06/15 04:04:07
# <<課題>
スレリンク(tech板:364番)
# [1] 授業単元: プログラミング実験
# [2] 問題文(含コード&リンク): 
URLリンク(kansai2channeler.hp.infoseek.co.jp)
#【課題1】
#
# 完全列挙法(力ずく法)を用いて巡回セールスマン問題(TSP) を解くプログラムを作成せよ。
# (※1 : 適当に出発点を設定し、そこから出発するすべての閉路を求めその中で最短のものを選択、出力する)
# (※2 : 都市数は外部から入力するものとする)
# (注意 : プログラムを動かすとき決して大きな都市数を与えてはならない)




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

170:デフォルトの名無しさん
09/06/15 06:12:20
>>166
% Prolog
URLリンク(nojiriko.asia)

171:デフォルトの名無しさん
09/06/15 08:18:42
>>167
% Prolog
URLリンク(nojiriko.asia)

172:デフォルトの名無しさん
09/06/15 19:00:47
スレリンク(tech板)
[1] 授業単元:For文
[2] 問題文:整数1~10までの累計(1+2+3・・・・9+10=55)
 [3.1] OS: XP
 [3.2] Turbo C++
 [3.3] C++

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

173:デフォルトの名無しさん
09/06/15 19:01:53
>>172
% Prolog
整数1~10までの累計(X) :-
  sum(0,1,10,X).

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

174:デフォルトの名無しさん
09/06/15 19:19:30
>>172
スレリンク(tech板:408番)
です

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

176:175
09/06/15 19:59:05
N is trancate(X) ではなく N is truncate(X) ですね。

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

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

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

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

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


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

182:デフォルトの名無しさん
09/06/16 06:19:04
>>167
% Prolog (完全日本語版)
URLリンク(nojiriko.asia)

183:デフォルトの名無しさん
09/06/16 08:57:46
>>143

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

184:デフォルトの名無しさん
09/06/16 09:12:06
>>181
% Prolog
URLリンク(nojiriko.asia)

185:デフォルトの名無しさん
09/06/16 09:20:22
ひどい宣伝だな

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

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

188:デフォルトの名無しさん
09/06/16 10:26:32
>>187
% Prolog (1/2)
行列の積(L1,L2,X) :-
  行列の転置(L,L2,L3),
  行列の積の一(L1,L3,X).

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

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

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

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

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

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

>>187
import Data.List (transpose)

type Matrix = [[Int]]

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

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

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

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

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

192:デフォルトの名無しさん
09/06/16 19:49:14
>>191
% Prolog
URLリンク(nojiriko.asia)

193:デフォルトの名無しさん
09/06/16 21:45:48
スレリンク(tech板:482番)
#[1] 授業単元:プログラミング基礎
#[2] 問題文
#
# URLリンク(kansai2channeler.hp.infoseek.co.jp)
# for文やif文を使用して下図のように出力せよ
#
# ★   ★
#  ★ ★
#   ★
#  ★ ★
# ★   ★
#


194:デフォルトの名無しさん
09/06/16 21:49:07
>>193
% Prolog
URLリンク(nojiriko.asia)

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

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

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

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

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

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

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

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

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

198:197
09/06/17 03:42:45
% 全角スペースがうまく表示できてない・・・

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

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

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

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


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch