LYnLab 로고

블로그취미로그

Prolog: Find Criminal (범인을 찾아라)

6명의 용의자들이 서로를 범인이라고 지목하고 있다. 이 중 3명만 범인이라고 할 때, 다음 대화를 참고하여 범인을 가려내시오. 주의할 점은 범인은 항상 거짓말만 하고, 범인이 아닌 사람은 항상 참인 말만 한다.

2015-12-05#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

문제

6명의 용의자들이 서로를 범인이라고 지목하고 있다. 이 중 3명만 범인이라고 할 때, 다음 대화를 참고하여 범인을 가려내시오. 주의할 점은 범인은 항상 거짓말만 하고, 범인이 아닌 사람은 항상 참인 말만 한다.

  • A : B, D중에 한 명만 범인이야.
  • B : C, E중에 한 명만 범인이야.
  • C : B가 범인이야.
  • D : A가 범인이야.
  • E : A, B는 범인이 아니야.
  • F : A, B중에 한 명만 범인이야

예시 코드

더욱 간결한 방법이 있다면 언제든지 알려주세요.

is_equal(A, B):- X is A-B, X==0.

is_not_equal(A, B):- X is A-B, not(X==0).

find_criminal(Group):-
    (member(a, Group) -> A=1; A=0),
    (member(b, Group) -> B=1; B=0),
    (member(c, Group) -> C=1; C=0),
    (member(d, Group) -> D=1; D=0),
    (member(e, Group) -> E=1; E=0),
    (member(f, Group) -> F=1; F=0),
    (member(a, Group) -> is_not_equal(B+D, 1); is_equal(B+D, 1)),
    (member(b, Group) -> is_not_equal(C+E, 1); is_equal(C+E, 1)),
    (member(c, Group) -> B=0; B=1),
    (member(d, Group) -> A=0; A=1),
    (member(e, Group) -> is_not_equal(A+B, 0); is_equal(A+B, 0)),
    (member(f, Group) -> is_not_equal(A+B, 1); is_equal(A+B, 1)),
    is_equal(A+B+C+D+E+F, 3).

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

LYnLab, 2011 - 2024.