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
źródło
Odpowiedzi:
Python, 491 znaków
Działa poprzez konwersję każdej linii do wyrażenia w języku Python i wywołanie go.
Walka i rycerz są oceniane jako 0 i 1. Dla dwóch osób próbujemy obu opcji.
Na przykład
Joe: Steve is a knave
staje sięJoe==(Steve==knave)
. W ten sposób, jeśliJoe
jest łajdakiem, wynik jest prawdziwy tylko wtedy, gdy kłamie.Otrzymujesz brzydkie błędy, gdy jest to niemożliwe lub niezdecydowane. Jeśli to niemożliwe,
r[0]
oznacza błąd indeksu, ponieważr
jest pusty. Jeśli nierozstrzygalne, konkatenacjar[1:]
z listą ciągów powoduje problemy.źródło
Rubinowy, 352 znaków
Rozwiązanie stało się dość długie, więc może być jeszcze miejsce do gry w golfa. Wymaga to poprawnego sformułowania danych wejściowych (jak wszystkie powyższe przykłady - ale nie próbuj nazywać osoby „Obiema…”).
źródło
Perl - 483 bajtów
Podobne do rozwiązania Python. Redukuje zdania do kodu Perla, a następnie
eval
je s. Może wydrukować prawie prawidłowy wynik, jeśli dane wejściowe są dziwne, ale nie drukuje niczego, jeśli jest niezdecydowany. Dobrze sformułowane dane wejściowe działają zgodnie z oczekiwaniami. Zdania są przekazywane w wierszu polecenia w cudzysłowie i nie są wymagane żadne specjalne flagi.źródło