Görev, bitlerin toplamı için küçük mantıksal formüller bulabilen kod yazmaktır.
Genel zorluk, kodunuzun y ikili 0/1 değişkenlerinin toplamının x değerine eşit olup olmadığını kontrol etmek için mümkün olan en küçük öneri mantıksal formülünü bulmasıdır. X1, x2, x3, x4 vb. Değişkenlerini çağıralım. İfadeniz, toplamla eşdeğer olmalıdır. Yani, mantıksal formül yalnızca toplam x'e eşitse doğru olmalıdır.
İşte başlamak için saf bir yol. Y = 15 ve x = 5 deyin. 5 değişken seçmenin 3003 farklı yolunu seçin ve her biri için bu değişkenlerin AND'ini VE kalan değişkenlerin olumsuzlanmasını AND VE ile yeni bir cümle oluşturun. Toplam 45054 maliyetle her biri tam olarak 15 olan 3003 maddeyle sonuçlanırsınız.
Cevabınız, python'a yapıştırılabilecek bu tür bir mantıksal ifade olmalı, diyelim ki test edebilirim. İki kişi aynı boyut ifadesini alırsa, en hızlı çalışan kod kazanır.
Çözümünüze yeni değişkenler tanıtabilirsiniz. Dolayısıyla bu durumda mantıksal formülünüz y ikili değişkeninden, x ve bazı yeni değişkenlerden oluşur. Tüm formül yalnızca ve ancak y değişkenlerinin toplamı x'e eşitse tatmin edici olacaktır.
Bir başlangıç egzersizi olarak, bazı insanlar x = 2'ye eklenen y = 5 değişkenle başlamak isteyebilir. Saf yöntem daha sonra 50 maliyet verecektir.
Kod, girdi olarak iki y ve x değerini almalı ve formülü ve çıktıyı çıktı olarak almalıdır. Bir çözümün maliyeti, çıktısında sadece değişkenlerin ham sayısıdır. Yani (a or b) and (!a or c)
4. olarak sayar sadece izin operatörleri and
, or
ve not
.
Güncelleme Bu sorunu x = 1 olduğunda, en azından teoride çözmek için akıllı bir yöntem olduğu ortaya çıktı .
z[0] = y[0] and y[1]
, bunun nasıl belirtilmesini istersiniz?
z[0]
temsil etmek istiyorsanız, y[0] or y[1]
o zaman ben sadece (y[0] or y[1]) or not z[0]
(veya izin verilen 3 operatörleri kullanarak herhangi bir eşdeğer ifade) gibi bir cümle tanıtmak gerekir .