tło
Są dwie osoby, Bill i John. Jeden z nich to rycerz, który zawsze mówi prawdę, a drugi to łotr, który zawsze kłamie. Nie wiesz, kto jest rycerzem, a kto knave. Każda osoba następnie mówi kilka stwierdzeń o tym, kto jest knave, a kto rycerzem. Korzystając z tych informacji, musisz dojść do wniosku, kto jest rycerzem, a kto podstępem.
Rycerze i giermków problemem logika opiera się na Booleen algebry. Słowa, które dana osoba mówi, stanowią problem satysfakcji Booleena. Wypowiedzi łotra zawsze muszą być fałszywe, a oświadczenia drugiego rycerza zawsze muszą być prawdziwe.
John mówi: „Zarówno ja jestem niewolnikiem, a Bill jest niewolnikiem”. Gdyby Jan był rycerzem, to stwierdzenie byłoby fałszywe, więc nie mógłby być rycerzem. Gdyby był łotrem, a Bill był rycerzem, to stwierdzenie byłoby nadal fałszywe, nawet jeśli pierwsza część jest prawdziwa. Tak więc John jest knave.
Wyzwanie
Twoim wyzwaniem jest napisanie najkrótszego możliwego programu, który sporządzi listę oświadczeń złożonych przez każdą osobę i zorientuje się, kto jest podstępem, a kto rycerzem. Jest wiele szczegółów do omówienia, więc ten problem opisano w trzech sekcjach.
Wejście
Dane wejściowe będą składać się z dwóch wierszy i nowego wiersza. Każda linia podaje nazwę jednego z bohaterów, dwukropek, a następnie kilka zdań wypowiedzianych przez tę osobę. Jeśli jedna osoba jest rycerzem, wówczas wszystkie jego zdania będą prawdziwe, a wszystkie zdania łotra będą fałszywe. Pierwsza litera zdania zawsze będzie pisana wielką literą, a każde zdanie kończy się kropką. Oto przykład:
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.
Rozbiór gramatyczny zdania
Każde zdanie składa się z co najmniej jednej klauzuli. Każda klauzula zawiera jedną z kilku rzeczy (mam nadzieję, że rozumiesz moją notację):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Jest to mało ambitne, ponieważ można je zrozumieć w sposób podobny do polskiej notacji. Oto przykład zdania:
Both I am a knight and neither Steve is a knave nor I am a knave.
Tłumaczenie na algebrę Booleena jest proste. Instrukcje „oba” są AND, instrukcje „oba” to XOR, a „oba” to NOR.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Wynik
Dane wyjściowe będą składać się z dwóch wierszy. Każda linia składa się z nazwiska osoby (w kolejności), a następnie mówi, czy jest to rycerz, czy knave. Zawsze będzie jeden rycerz i jeden łotr. Oto wynik dla powyższego przykładu:
Joe is the knave.
Steve is the knight.
Jeśli problemu nie da się rozwiązać (albo nie możesz powiedzieć, kto jest, albo nie ma rozwiązania), wówczas twój program może zrobić wszystko Z WYJĄTKIEM poprawnego wyniku.
Więcej przykładów
Wejście
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.
Wynik
Sir Lancelot is the knight.
Merlin is the knave.
Wejście
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.
Wynik
David is the knave.
Patrick is the knight.
Wejście
Lizard: I am a knight.
Spock: I am a knave.
Jedno możliwe wyjście
Rock Paper Scissors
Zasady, przepisy i uwagi
- Obowiązują standardowe zasady gry w golfa
- Twój program musi składać się wyłącznie z drukowalnego ASCII
- Wszystkie wejścia i wyjścia będą pochodzić ze STDIN i STDOUT