Arka fon
İki kişi var, Bill ve John. Bunlardan biri her zaman gerçeği söyleyen bir şövalye, diğeri ise her zaman yalan söyleyen bir knave. Şövalyenin kim olduğunu ve dizlerin kim olduğunu bilmiyorsun. Daha sonra her kişi kimin knave kimin şövalye olduğu hakkında birkaç açıklama yapar. Bu bilgileri kullanarak şövalyenin kim ve kimin knave olduğu hakkında bir sonuca varmalısınız.
Şövalyeler ve Knaves mantık problemi Booleen cebir dayanmaktadır. Bir kişinin söylediği kelimeler Boole memnuniyeti sorunudur. Knave'nin ifadeleri her zaman yanlış olmalı ve diğer şövalyenin ifadeleri her zaman doğru olmalıdır.
John, "Hem ben de knave'yim, Bill de knave" diyor. Eğer John şövalye olsaydı, bu ifade yanlış olurdu, bu yüzden şövalye olamaz. Eğer knave olsaydı ve Bill şövalye olsaydı, ilk kısım doğru olsa bile, bu ifade hala yanlış olurdu. Yani, John knave.
Meydan okuma
Zorluğunuz, her bir kişi tarafından yapılan açıklamaların bir listesini alacak ve kimin knave kimin şövalye olduğunu anlayabilecek en kısa programı yazmaktır. Ele alınacak çok fazla ayrıntı var, bu nedenle bu sorun üç bölümde açıklanmıştır.
Giriş
Girdi iki satırdan sonra bir satırsonu olacaktır. Her satır, karakterlerden birinin adını, ardından iki nokta üst üste işaretini ve o kişi tarafından söylenen birkaç cümleyi verecektir. Eğer bir kişi şövalye ise, o zaman tüm cümleleri doğru olur ve tüm knave cümleleri yanlış olur. Bir cümlenin ilk harfi daima büyük harfle yazılır ve her cümle bir nokta ile biter. İşte bir örnek:
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.
ayrıştırma
Her cümle en az bir maddeden oluşur. Her fıkra birkaç şeyden birini içerir (umarım gösterimi anlayabilirsiniz):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Bu, Polonyalı gösterime benzer bir şekilde anlaşılabildiğinden, dinsizdir. İşte bir cümle örneği:
Both I am a knight and neither Steve is a knave nor I am a knave.
Booleen cebirine çeviri kolaydır. "Her ikisi de" ifadeleri AND, "iki" ifadesi XOR ve "hiçbiri" ifadesi NOR'dur.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Çıktı
Çıktı iki satırdan oluşacaktır. Her satır bir kişinin isminden (sırayla) oluşur ve daha sonra şövalye mi yoksa knave mi olduğunu söyler. Her zaman bir şövalye ve bir knave olacak. Yukarıdaki örnek için çıktı:
Joe is the knave.
Steve is the knight.
Sorun çözülemiyorsa (ya kimin ne olduğunu söyleyemezsiniz ya da çözüm yoktur), o zaman programınız geçerli bir çıktı üretmek DIŞINDA her şeyi yapabilir.
Daha fazla örnek
Giriş
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.
Çıktı
Sir Lancelot is the knight.
Merlin is the knave.
Giriş
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.
Çıktı
David is the knave.
Patrick is the knight.
Giriş
Lizard: I am a knight.
Spock: I am a knave.
Bir olası çıktı
Rock Paper Scissors
Kurallar, Yönetmelikler ve Notlar
- Standart kod golf kuralları geçerlidir
- Programınız yalnızca yazdırılabilir ASCII'den oluşmalıdır
- Tüm giriş ve çıkışlar STDIN ve STDOUT'tan olacaktır