「prolog勉強15日目 小町算や大町算を解くプログラム」の編集履歴(バックアップ)一覧はこちら

prolog勉強15日目 小町算や大町算を解くプログラム - (2013/06/09 (日) 17:52:26) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

http://tutorial.jp/prog/prolog/prolog.pdf こちらの大学生向けだと思われるPrologの勉強サイト。 power_set関数を自力で思いつけなかった。 全部の部分集合は得られるのだが[]がネストする形でしかコードを書けず平らなリストにすることが出来なかった。 http://www.geocities.jp/m_hiroi/puzzle/number.html#back0 小町算や大町算をPrologで解くプログラム。 リストを文字コードに変える処理がよくわからなかったので数からリストを生成したり。 大町算のコードがなにか冗長な感じがしたり色々まだまだな感じ。 まだまだってことは成長の余地が残ってることだと信じたい。 selects([],Y,Y). selects([X|Rest],Y,Result):-select(X,Y,RestY),selects(Rest,RestY,Result). check([],[]). check([X|RestN],CodeL):-select(X,CodeL,RestL),check(RestN,RestL). check_zyunnbi(N,L):-integer(N),atom_codes(N,CodeN),atom_codes(L,CodeL), check(CodeN,CodeL). %M/N komati1or2(M,N,AnsL,AnsR):- selects([A,B,C,D],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I]), AnsL is A*1000+B*100+C*10+D, AnsL*N mod M=:=0, AnsR is AnsL*N//M, CheckNo is E*10000+F*1000+G*100+H*10+I, check_zyunnbi(AnsR,CheckNo). komati3(AnsL,AnsR):- selects([A,B,C],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I,J]), AnsL is (A*100+B*10+C), AnsR is AnsL*AnsL, CheckNo is E*100000+F*10000+G*1000+H*100+I*10+J, check_zyunnbi(AnsR,CheckNo). komati4(AnsL,AnsR):- create_perm([A,B,C,D,E],[0,1,2,3,4,5,6,7,8,9]), AnsL is A*10000+B*1000+C*100+D*10+E, AnsR is AnsL*AnsL, check_zyunnbi(AnsR,123456789). create_perm([],Y). create_perm([X|Rest],Y):-select(X,Y,Z),create_perm(Rest,Y). %答えの表示 oomati([],[+|Ans],999,0):-!,oomati([],[0,+ | Ans],999,0). oomati([],[-|Ans],999,0):-!,oomati([],[0,- | Ans],999,0). oomati([],Ans,999,0):-reverse(Ans,[A|Last]),!,write(Last),nl,fail. %最後の数を確定する oomati([],[+ | Ans],Sum,X):-Sum1 is Sum+X,oomati([],[X,+|Ans],Sum1,0). oomati([],[- | Ans],Sum,X):-Sum1 is Sum-X,oomati([],[X,-|Ans],Sum1,0). %ここでXを確定する oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[+,X,+ | Ans],Sum1,N). oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[-,X,+ | Ans],Sum1,N). oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[+,X,- | Ans],Sum1,N). oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[-,X,- | Ans],Sum1,N). %数字を繋げる oomati([N|Nums],Ans,Sum,X):-X1 is X*10+N,oomati(Nums,Ans,Sum,X1). oomati:-oomati([8,7,6,5,4,3,2,1,0],[+],0,9).
http://tutorial.jp/prog/prolog/prolog.pdf こちらの大学生向けだと思われるPrologの勉強用資料。 power_set関数を自力で思いつけなかった。 全部の部分集合は得られるのだが[]がネストする形でしかコードを書けず平らなリストにすることが出来なかった。 答えはきっと物凄く短いのでは? と考えて考え過ぎたのが敗因。 後継関数などの数学的処理は結構自力でいけたんだけどな。 http://www.geocities.jp/m_hiroi/puzzle/number.html#back0 小町算や大町算をPrologで解くプログラム。 リストを文字コードに変える処理がよくわからなかったので数からリストを生成したり。 大町算のコードがなにか冗長な感じがしたり色々まだまだな感じ。 まだまだってことは成長の余地が残ってることだと信じたい。 selects([],Y,Y). selects([X|Rest],Y,Result):-select(X,Y,RestY),selects(Rest,RestY,Result). check([],[]). check([X|RestN],CodeL):-select(X,CodeL,RestL),check(RestN,RestL). check_zyunnbi(N,L):-integer(N),atom_codes(N,CodeN),atom_codes(L,CodeL), check(CodeN,CodeL). %M/N komati1or2(M,N,AnsL,AnsR):- selects([A,B,C,D],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I]), AnsL is A*1000+B*100+C*10+D, AnsL*N mod M=:=0, AnsR is AnsL*N//M, CheckNo is E*10000+F*1000+G*100+H*10+I, check_zyunnbi(AnsR,CheckNo). komati3(AnsL,AnsR):- selects([A,B,C],[1,2,3,4,5,6,7,8,9],[E,F,G,H,I,J]), AnsL is (A*100+B*10+C), AnsR is AnsL*AnsL, CheckNo is E*100000+F*10000+G*1000+H*100+I*10+J, check_zyunnbi(AnsR,CheckNo). komati4(AnsL,AnsR):- create_perm([A,B,C,D,E],[0,1,2,3,4,5,6,7,8,9]), AnsL is A*10000+B*1000+C*100+D*10+E, AnsR is AnsL*AnsL, check_zyunnbi(AnsR,123456789). create_perm([],Y). create_perm([X|Rest],Y):-select(X,Y,Z),create_perm(Rest,Y). %答えの表示 oomati([],[+|Ans],999,0):-!,oomati([],[0,+ | Ans],999,0). oomati([],[-|Ans],999,0):-!,oomati([],[0,- | Ans],999,0). oomati([],Ans,999,0):-reverse(Ans,[A|Last]),!,write(Last),nl,fail. %最後の数を確定する oomati([],[+ | Ans],Sum,X):-Sum1 is Sum+X,oomati([],[X,+|Ans],Sum1,0). oomati([],[- | Ans],Sum,X):-Sum1 is Sum-X,oomati([],[X,-|Ans],Sum1,0). %ここでXを確定する oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[+,X,+ | Ans],Sum1,N). oomati([N|Nums],[+|Ans],Sum,X):-Sum1 is Sum+X,oomati(Nums,[-,X,+ | Ans],Sum1,N). oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[+,X,- | Ans],Sum1,N). oomati([N|Nums],[-|Ans],Sum,X):-Sum1 is Sum-X,oomati(Nums,[-,X,- | Ans],Sum1,N). %数字を繋げる oomati([N|Nums],Ans,Sum,X):-X1 is X*10+N,oomati(Nums,Ans,Sum,X1). oomati:-oomati([8,7,6,5,4,3,2,1,0],[+],0,9).

表示オプション

横に並べて表示:
変化行の前後のみ表示: