いろんな言語で宿題ス ..
[2ch|▼Menu]
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,_経路).


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

4630日前に更新/314 KB
担当:undef