Bu kod golfü .
Bu meydan okumada, " Şövalyeler ve Knaves " bulmacalarını çözen programlar / fonksiyonlar yazacağız .
Arka fon
Kendinizi bir adada buluyorsunuz ... vs. ... sizden başka adadaki herkes bir şövalye ya da bir knave .
Şövalyeler sadece gerçek ifadeler yapabilir .
Bıçaklar yalnızca yanlış ifadeler yapabilir .
"İfade" yi titizlikle tanımlamak istemiyorum ama bir ifadenin "doğru" veya "yanlış" olan herhangi bir şey olduğunu söyleyeceğiz. Bunun paradoksal cümleleri içermediğini unutmayın.
Bu meydan okuma için, adalı gruplarına rastlayacaksınız; size açıklama yapacaklardır.
Göreviniz kimin şövalye olduğunu ve kimin knave olduğunu belirlemektir.
Giriş:
Size (makul biçimlerde) aşağıdaki bilgiler verilecektir:
Mevcut insanların bir listesi. Büyük harfli alfabe karakterleri "AZ" olarak adlandırılacaktır. Bunun getirdiği kişi sayısındaki sınır aşılmayacaktır.
Her insanın yaptığı açıklamalar. Bununla ilgili önemli ayrıntılar için aşağıya bakın.
Çıktı
Daha sonra, her kişinin ne olduğunu (herhangi bir makul formatta) çıkartabilirsiniz. Örneğin, oyuncular varsa A B C Dve Abir şövalyeyse, ama geri kalanlar bıçaksa,
A: 1
B: 0
C: 0
D: 0
Önemli ayrıntılar:
Büyük alfabe karakterleri AZ adalılara atıfta bulunur.
0(Sıfır) ve1(bir) karakterleri sırasıyla bir "Knave" ve "Knight" anlamına gelir. (Belirttiğiniz sürece diğer iki AZ olmayan karakteri de kullanabilirsiniz)Mevcut her adalı doğal sayıda ifade yapabilir veya hiçbir şey söylememeyi seçebilir.
Normal mantıksal işleçler ifadelerde kullanılabilir ( IS *, AND, OR, NOT ). Bunun üzerine De Morgan Yasaları ve Şartları da kullanılabilir. Aşağıda, sözlü bir bulmacada nasıl sunulabileceğine ve ardından programınıza nasıl girilebileceğine ilişkin örnekler verilmiştir.
(* daha teknik bir notta. "IS" operatörü gerçekten sınırlama olarak kullanılır (bu mantıksal bir operatör değildir). "A bir şövalye" derken, gerçekten de "A, Şövalyeler ". Kullanılan gerçek işleç 'ϵ' olurdu. Sadelik için bunun yerine '=' kullanacağız.)
Aşağıdakileri kullanıyorum (makul ve tutarlı olduğu sürece kullanabilirsiniz):
^VEvVEYA=DIR-DİR~DEĞİL=>GELMEKTEDİRX:Kişi X iddia ...
Kişi Z tabloların aşağıdaki türlerden herhangi bir kombinasyon yapabiliriz:
Kişi Z diyor ki ...
Kişi A Şövalyesi olduğunu.
Z: A = 1Kişi Q bir Knave'dir.
Z: Q = 0Ben bir şövalyeyim.
Z: Z = 1Kişi A Şövalyedir VEYA Kişi B Şövalyedir.
Z: ( A = 1 ) v ( B = 1)Kişi C Şövalyesi olduğunu VE ben Knave değilim.
Z: ( C = 1 ) ^ ( Z = 0 )Kişi R Şövalyesi değil.
Z: ~( R = 1 )
Bunun da ötesinde, girdi De Morgan Yasalarını da kullanabilir
Hem A kişisinin hem de B kişisinin bıçak olduğu doğru değildir.
Z: ~( ( A = 0 ) ^ ( B = 0 ) )A kişisi veya B kişisinin bir şövalye olması yanlıştır
Z: ~( ( A = 1 ) v ( B = 1) )
Son olarak, şartlar ve olumsuzlamaları kullanılabilir
Eğer bir şövalyeysem, o zaman B kişisi bir Knave'dir
Z: ( Z = 1 ) => ( B = 0 )Eğer B kişisi bir Şövalye ise, o zaman C Kişisinin bir Knave olduğu doğru değildir.
Z: ~( ( B = 1 ) => ( C = 0 ) )
Şartlı notlar
Daha fazla bilgi için wikipedia'ya göz atın .
Koşullu bir ifade p => q şeklindedir ; burada p ve q ifadelerdir. p "öncül" ve q "sonuç" dur . İşte bazı yararlı bilgiler
Bir koşulun reddi şuna benzer: ~ (p => q) p ^ ~ q ile eşdeğerdir
Sahte bir öncül her şeyi ima eder. Şudur: eğer p yanlıştır, sonra herhangi bir açıklamada p => q olursa olsun ne doğrudur, q olduğunu. Örneğin: "2 + 2 = 5 ise ben Örümcek Adamım" gerçek bir ifadedir.
Bazı basit test senaryoları
Bu durumlar aşağıdaki şekilde (1) konuşmadaki problemi nasıl ortaya koyacağımız (2) bilgisayara nasıl sağlayabileceğimize (3) bilgisayarın verebileceği doğru çıktıyı verir.
A kişisi ve B kişisi size yolda yaklaşır ve aşağıdaki ifadeleri yapar:
C: B bir knave veya ben bir şövalyeyim.
B: A bir şövalyedir.
Cevap:
B bir şövalyedir ve A bir şövalyedir.
Giriş:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
Çıktı:
A = 1 B = 1
A, B ve F kişileri size yolda yaklaşır ve aşağıdaki ifadeleri yapar:
C: Ben bir Şövalyeysem, B o zaman bir Knave'dir.
B: Bu doğruysa, F de bir Knave'dir.
Cevap:
A bir şövalye, B bir knave, F bir şövalye.
Giriş
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
Çıktı:
A = 1 B = 0 F = 1
Q, X ve W size yolda yaklaşıyor ve aşağıdaki ifadeleri yapıyorlar:
W: Hem Q hem de X'in Şövalyeler olduğu doğru değil.
S: Bu doğru.
X: W'nin söylediği doğruysa, Q'nun söylediği yanlıştır.
Cevap:
W ve Q şövalyelerdir. X bir Knave'dir.
Giriş
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
Çıktı
W = 1 Q = 1 X = 0
Bir yoktur benzer meydan 3 yıl ayrıştırma ve çıkarabilseniz içermiyor veya De Morgan o odaklarının öncesinin. Bu nedenle, bunun bir dupe olmasını önlemek için odaklanma ve uygulama konusunda yeterince farklı olduğunu iddia ediyorum.
Bu meydan okuma bir dupe olarak kısaca kapatıldı. O zamandan beri yeniden açıldı.
Bu zorluğun öncelikle farklı odaklandığını iddia ediyorum. Diğer zorluk İngilizce ayrıştırmaya odaklanır, bu değildir. İkincisi sadece VE ve VEYA kullanır, oysa bu koşullu kullanır ve daha fazla bulmacanın çözülmesine izin verir. Günün sonunda, soru, bu zorluğun cevaplarının önemsiz bir şekilde ikame edilip edilemeyeceğidir ve şartlı koşulların ve koşullu olumsuzlukların dahil edilmesinin, daha sağlam değişikliklerin sırayla yapılması gereken yeterli karmaşıklığı eklediğine inanıyorum. bu zorluğa uyması için.
OR, bu olabilir A:1 B:1veya A:1 B:0B'nin çünkü B=1yanlış olabilir bir hala gerçek olacağını ise.
(B=1)^(C=1)şartların normal olarak nasıl ele alındığına bağlıdır
(B=1)=>(C=0)?~((B=1)=>(C=0))ya(B=1)=>(C=1)da başka bir şey?