배경
Bill과 John의 두 사람이 있습니다. 그들 중 하나는 항상 진실을 말하는 기사이고, 다른 하나는 항상 거짓말을하는 칼입니다. 당신은 누가 기사이고 누가 칼인지 모릅니다. 그런 다음 각 사람은 누가 칼과 누가 기사인지에 대해 몇 가지 진술을합니다. 이 정보를 사용하여 누가 기사인지, 누가 건달인지에 대해 결론을 내려야합니다.
기사와 Knaves 로직 문제는 Booleen 대수를 기반으로합니다. 사람이 말하는 단어는 Booleen 만족도 문제를 형성합니다. Knave의 진술은 항상 거짓이어야하고 다른 기사의 진술은 항상 참이어야합니다.
존은 "내가 건달이고 빌은 건달이다"고 말합니다. 요한이 기사라면,이 진술은 거짓이되어 기사가 될 수 없습니다. 그가 건달이고 빌이 기사 였다면,이 진술은 여전히 틀렸을 것입니다. 심지어 첫 번째 부분이 사실이라고 생각했습니다. 요한은 건달입니다.
도전
당신의 도전은 가능한 한 가장 짧은 프로그램을 작성하여 각 사람이 작성한 진술 목록을 취하고 누가 칼과 기사인지 알아내는 것입니다. 다룰 세부 사항이 많으므로이 문제는 세 가지 섹션으로 설명됩니다.
입력
입력은 두 줄에 이어 줄 바꿈이됩니다. 각 줄에는 문자 중 하나의 이름, 콜론, 그 사람이 말한 여러 문장이 표시됩니다. 한 사람이 기사라면 그의 모든 문장은 사실이되고 모든 건달의 문장은 거짓이됩니다. 문장의 첫 글자는 항상 대문자로 표시되며 모든 문장은 마침표로 끝납니다. 예를 들면 다음과 같습니다.
Joe: Both I am a knight and neither Steve is a knave nor I am a knave.
Steve: Joe is a knave. Either Joe is a knight or I am a knight.
파싱
각 문장은 하나 이상의 절로 구성됩니다. 각 절에는 몇 가지 사항 중 하나가 포함되어 있습니다 (내 생각에 따라 내 표기법을 이해할 수 있음).
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
이것은 폴란드어 표기법과 유사한 방식으로 이해할 수있는 명백한 베큐 아제입니다. 다음은 문장의 예입니다.
Both I am a knight and neither Steve is a knave nor I am a knave.
Booleen 대수로의 번역은 간단합니다. "둘 다"문은 AND이고 "둘 중 하나"문은 XOR이고 "둘 다"문은 NOR입니다.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
산출
출력은 두 줄로 구성됩니다. 각 줄은 사람의 이름 (순서대로)으로 구성되어 있으며 기사인지 건반인지를 말합니다. 기사와 칼 하나가 항상 있습니다. 위 예제의 결과는 다음과 같습니다.
Joe is the knave.
Steve is the knight.
문제를 해결할 수없는 경우 (누가 무엇인지 알 수 없거나 해결책이없는 경우) 프로그램에서 유효한 출력을 제외하고 무엇이든 할 수 있습니다.
더 많은 예
입력
Sir Lancelot: Either both I am a knight and Merlin is a knave or both I am a knave and Merlin is a knight.
Merlin: Either both I am a knight and Sir Lancelot is a knight or both I am a knave and Sir Lancelot is a knave.
산출
Sir Lancelot is the knight.
Merlin is the knave.
입력
David: Neither I am a knave nor Patrick is a knight. Either I am a knight or Patrick is a knave.
Patrick: Either I am a knight or both I am a knight and David is a knight.
산출
David is the knave.
Patrick is the knight.
입력
Lizard: I am a knight.
Spock: I am a knave.
하나의 가능한 출력
Rock Paper Scissors
규칙, 규정 및 참고 사항
- 표준 코드 골프 규칙이 적용됩니다
- 프로그램은 인쇄 가능한 ASCII로만 구성되어야합니다.
- 모든 입력 및 출력은 STDIN 및 STDOUT에서