「이것이 풀 수 있는 수재는 모집하고 있지 않습니다^^」Prolog 「마카세로」
9666 단어 Prolog
문제문
인용 소스 : h tp // 아나고. 2ch. sc / st / re d. c/g는 rd/1437182679/#g는 rd/1437182679/218
Prolog에 의한 해법
코드
코드
count(List, X, Count) :- count_sub(List, X, 0, Count).
count_sub([], _, N, N).
count_sub([Head | Xs], X, N, Count) :-
(Head == X -> N1 is N + 1; N1 is N),
count_sub(Xs, X, N1, Count).
% トランプの数は1〜13まで。
card(X) :- between(1, 13, X).
% さやかのヒントにあてはまる(かつ、CardAはCardBより小さい)。
is_satisfy_sayaka_said(CardA, CardB) :-
card(CardA),
card(CardB),
CardA =\= 1,
CardB =\= 1,
CardA =\= CardB,
CardB mod CardA =:= 0.
% 相手の数字を確定できる。
can_guess(WinnerCard, AllCandidates) :-
flatten(AllCandidates, AllCandidateCards),
card(WinnerCard),
count(AllCandidateCards, WinnerCard, 1).
% どちらのカードからも、相手の数字を確定できない。
cannot_eiter_guess(CardA, CardB, AllCandidates) :-
card(CardA), card(CardB),
not(can_guess(CardA, AllCandidates)),
not(can_guess(CardB, AllCandidates)).
% カードの組は、解候補に含まれる。
is_candidate(CardA, CardB, AllCandidates) :-
member([CardA, CardB], AllCandidates);
member([CardB, CardA], AllCandidates).
% 以下の条件を満たす解である。
% (1) さやかのヒントにあてはまる
% (2) どちらも相手の数字を確定できない
% (3) (2)を知ると、どちらかが相手の数字を確定できる
is_answer(WinnerCard, LoserCard) :-
findall([CardA, CardB], (
is_satisfy_sayaka_said(CardA, CardB)
), CandidatesSatisfySayakaSaid),
findall([CardA, CardB], (
% (1)
is_satisfy_sayaka_said(CardA, CardB),
% (2)
cannot_eiter_guess(CardA, CardB, CandidatesSatisfySayakaSaid)
), CandidatesWhenEitherCannotGuess),
% (3)
can_guess(WinnerCard, CandidatesWhenEitherCannotGuess),
is_candidate(WinnerCard, LoserCard, CandidatesWhenEitherCannotGuess).
기본적으로 영어가 심한 것은 용서해 주세요.
결과
?- is_answer(CardA, CardB, Minami).
CardA = Minami, Minami = 10,
CardB = 2 ;
false.
미나미 씨가 10, 카오리 씨가 2 같네요.
결론
역시 Prolog는 최고야!
(영어·코드의 지적 대환영입니다)
Reference
이 문제에 관하여(「이것이 풀 수 있는 수재는 모집하고 있지 않습니다^^」Prolog 「마카세로」), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kuniwak/items/4fbeb4bd574b2980626f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(「이것이 풀 수 있는 수재는 모집하고 있지 않습니다^^」Prolog 「마카세로」), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kuniwak/items/4fbeb4bd574b2980626f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)