이것은 code-golf 입니다.
이 도전에서 우리는 " 기사와 칼 "퍼즐 을 해결하는 프로그램 / 기능을 작성합니다 .
배경
당신은 섬에서 자신을 찾을 수 있습니다 ... 당신을 제외하고 섬의 모든 사람은 기사 또는 건달 입니다.
기사는 진실한 진술 만 할 수 있습니다 .
칼은 거짓 진술 만 할 수 있습니다 .
"문장"을 엄격하게 정의하고 싶지는 않지만, "설명"은 "참"또는 "거짓"이라고 말할 것입니다. 여기에는 역설적 문장이 포함되지 않습니다.
이 도전의 목적을 위해, 당신은 섬 주민들을 만나게 될 것입니다. 그들은 당신에게 진술 할 것입니다.
당신의 임무는 누가 기사이고 누가 Knave인지 결정하는 것입니다.
입력:
다음과 같은 정보가 (합리적인 형식으로) 제공됩니다 :
참석 한 사람들의 목록입니다. 대문자 알파벳 "AZ"로 이름이 지정됩니다. 이에 의해 부과되는 인원 수의 한도를 초과하지 않습니다.
각 사람의 진술. 이에 대한 자세한 내용은 아래를 참조하십시오.
산출
그런 다음 각 개인의 내용을 합리적인 형식으로 출력합니다. 예를 들어,이 경우 플레이어했다 A B C D및 A기사이지만, 나머지 knaves는, 당신은 출력을 할 수
A: 1
B: 0
C: 0
D: 0
중요한 세부 사항 :
대문자 알파벳 문자 AZ는 제도자를 나타냅니다.
문자
0(0) 및1(1)은 각각 "Knave"및 "Knight"를 나타냅니다. (지정하는 한 AZ 이외의 다른 두 문자를 사용할 수 있습니다)존재하는 각 섬 주민은 자연스럽게 많은 진술을하거나 아무 말도하지 않을 수 있습니다.
일반 논리 연산자 는 명령문 ( IS *, AND, OR, NOT )에 사용할 수 있습니다. 이 외에도 De Morgan의 법률 및 조건 이 사용될 수 있습니다. 다음은 음성 퍼즐로 표시되는 방법과 프로그램에 입력되는 방법의 예입니다.
(* 좀 더 기술적 인 참고 사항에 따르면 "IS"연산자는 실제로 격리 (논리 연산자가 아님)로 사용됩니다. "A는 기사"라고 말하면 "A는 기사 세트의 구성원입니다. Knights ". 사용 된 실제 연산자는 'ϵ'입니다. 단순성을 위해 대신 '='를 사용합니다.)
나는 다음을 사용합니다 (합리적이고 일관된 한 무엇이든 사용할 수 있습니다).
^과v또는=IS~아니=>임 플리X:사람 X는 그 주장 ...
사람 Z 는 다음 유형의 진술을 조합하여 사용할 수 있습니다.
사람 Z 는 말합니다 ...
사람 A 는 기사입니다.
Z: A = 1사람 Q 는 Knave입니다.
Z: Q = 0나는 기사입니다.
Z: Z = 1사람 A 는 기사이거나 사람 B 는 기사입니다.
Z: ( A = 1 ) v ( B = 1)사람 C 는 기사 이고 나는 Knave입니다.
Z: ( C = 1 ) ^ ( Z = 0 )사람 R 은 기사가 아닙니다.
Z: ~( R = 1 )
이 외에도 입력은 De Morgan 's Laws를 사용할 수도 있습니다.
사람 A와 사람 B가 모두 나이프 인 것은 사실이 아닙니다
Z: ~( ( A = 0 ) ^ ( B = 0 ) )사람 A 또는 사람 B가 기사 인 것은 거짓입니다.
Z: ~( ( A = 1 ) v ( B = 1) )
마지막으로 조건부와 그 부정을 사용할 수 있습니다
내가 기사라면 사람 B는 Knave입니다
Z: ( Z = 1 ) => ( B = 0 )사람 B가 기사라면 사람 C가 Knave라는 것은 사실이 아닙니다.
Z: ~( ( B = 1 ) => ( C = 0 ) )
조건에 대한 참고 사항
자세한 내용은 Wikipedia 를 확인하십시오 .
조건문은 p => q 형식을 취하며 , 여기서 p 및 q 는 명령문입니다. p 는 "antecedent"이고 q 는 "consequent"입니다. 여기 유용한 정보가 있습니다
조건의 부정은 다음과 같습니다. ~ (p => q)는 p ^ ~ q와 같습니다.
거짓 전제는 무엇이든 의미합니다. 즉, p 가 false 이면, q 가 무엇이든 관계없이 모든 문장 p => q 가 참 입니다. 예를 들어 : "2 + 2 = 5이면 스파이더 맨입니다"는 사실입니다.
간단한 테스트 사례
이러한 사례는 다음과 같은 방식으로 제공됩니다. (1) 어떻게 말로 문제를 제기 할 것인지 (2) 어떻게 컴퓨터에 문제를 제기 할 것인지 (3) 컴퓨터가 줄 수있는 올바른 결과물입니다.
사람 A와 사람 B는 도로에서 당신에게 다가 가서 다음 진술을합니다.
A : B는 건달이거나 기사입니다.
B : A는 기사 야.
대답:
B는 기사이고 A는 기사입니다.
입력:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
산출:
A = 1 B = 1
사람 A, B 및 F는 도로에서 당신에게 다가 가서 다음과 같이 진술합니다.
A : 내가 기사라면 B는 Knave입니다.
B : 그것이 사실이라면, F도 역시 Knave입니다.
대답:
A는 기사, B는 Knave, F는 기사입니다.
입력
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
산출:
A = 1 B = 0 F = 1
Q, X, W는 도로에서 당신에게 다가 가서 다음과 같이 진술합니다 :
W : Q와 X가 모두 기사라는 것은 사실이 아닙니다.
Q : 맞습니다.
X : W가 말하는 것이 사실이라면, Q가 말하는 것은 거짓입니다.
대답:
W와 Q는 기사입니다. X는 Knave입니다.
입력
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
산출
W = 1 Q = 1 X = 0
이 유사한 도전 삼년 분석 및 조건문을 포함하지 않거나 드 모건의에 그 초점을 맞추고 전부터는. 따라서 나는 이것이 속임수를 피하기 위해 초점과 구현이 충분히 다르다고 주장합니다.
이 도전은 속임수로 잠깐 닫혔습니다. 그 후 다시 열렸습니다.
나는이 도전이 우선 초점이 다르다고 주장한다. 다른 과제는 영어 파싱에 중점을 두지 만 그렇지 않습니다. 둘째, AND와 OR 만 사용하는 반면 조건을 사용하고 더 많은 퍼즐을 풀 수 있습니다. 하루가 끝날 무렵, 문제는 그 도전에 대한 답변이이 질문에 대한 사소한 대안으로 대체 될 수 있는지 여부이며, 조건부와 조건부 제외를 포함하면보다 강력한 변경이 순서대로 이루어져야 할만큼 복잡성이 높아진다고 생각합니다 이 도전에 맞습니다.
OR, 그것은 수 A:1 B:1또는 A:1 B:0B의가 있기 때문에 B=1거짓이 될 수 A는 여전히 사실 일 것입니다 동안.
(B=1)^(C=1)조건을 다루는 방법에 따라 부정을 할 것 입니다
(B=1)=>(C=0)있습니까?~((B=1)=>(C=0))또는(B=1)=>(C=1)다른 것?