SORU
14 EKİM 2011, Cuma


Optimal Yahudi tırnak kesme algoritması nedir?

Üzerinde çalışıyorum, bu yazılım için bir makine otomatik olarak trim ayak tırnakları, böylece kullanıcıların basitçe ayakları ve koşmak yerine sahip elle artık onları ısırma ya da tırnak makası kullanarak.

Potansiyel kullanıcı tabanı büyük bir yüzdesi muhtemelen Yahudi olacak, ve, besbelli, tradition about not trimming toenails (or fingernails) sıralı bir düzen var

Bu geleneğin kesin uygulama konusunda görüş ayrılığı var gibi görünüyor, ama aşağıdaki kurallara tırnaklarını kesmek yasakla olan insanları görmezden gelmek için yeterli olduğunu düşünüyoruz:

  • Yan yana iki ayak arka arkaya kesilmelidir
  • Sol ayak üzerinde kesme sırası sağ ayak üzerinde sırası aynı olmalıdır
  • Üst üste iki çalışan kesim sırası aynı olmalıdır. Dizileri kolayca tahmin edilebilir olmamalı, alternatif bir dizi hardcoding çalışmıyor.

Bu ayak numarasına karar verdik nasıl:

5 4 3 2 1  1 2 3 4 5
Left foot  Right foot

Kod sorunu çözmek için yazdım, ama kullanılan algoritma alt-optimum: aslında en kötü durum performansO (bi****). Çalışma şekli bogosort karşılaştırılabilir. İşte gerçek kod kullanılan yalancı bir basitleştirme:

function GenerateRandomSequence
   sequence = Array[5]
   foreach (item in sequence)
       item = RandomNumberBetween(1,5)
   return sequence

function GetToenailCuttingOrder
   while (true)
      sequence = GenerateRandomSequence()
      if (!AllItemsAreUnique(sequence))
         continue
      if (NoTwoAdjacentItemsHaveConsecutiveNumbers(sequence))
         return sequence

do
    leftFootSequence = GetToenailCuttingOrder()
    rightFootSequence = GetToenailCuttingOrder()
until (leftFootSequence != rightFootSequence &&
       leftFootSequence != leftFootSequenceFromLastRun &&
       rightFootSequence != rightFootSequenceFromLastRun)

Temel olarak, eğer kriterleri yerine getirmeleri halinde rasgele dizileri ve kontrolleri oluşturur. Eğer kriterlere uygun değil ise, baştan başlar. Zaman çok uzun bir süre alır değil, ama çok önceden kestirilemez.

Şu anda bunu yapıyorum yolu berbat olduğunun farkındayım, ama sorun daha iyi bir yol geliyor geçiriyorum. Eğer herhangi bir daha şık ve ölçülebilir bir algoritma önerir misiniz?

CEVAP
14 EKİM 2011, Cuma


Tüm olası tırnak herhangi bir kısıtlama ile dizileri kesme, ve sonra Yahudi kuralı ihlal eden tüm dizileri filtre oluşturabilirsiniz. Neyse ki, insanlar sadece ayak başına beş parmağı sadece 5 var*, var! = 120 dizileri sınırsız.

Örnek Python:

#seq is only valid when consecutive elements in the list differ by at least two.
def isValid(seq):
    for i in range(len(seq)-1):
        a = seq[i]
        b = seq[i 1]
        if abs(a-b) == 1:
            return False
    return True


from itertools import ifilter, permutations
validseqs = ifilter(isValid, permutations([1,2,3,4,5]))
for i in validseqs:
    print i

(1, 3, 5, 2, 4)
(1, 4, 2, 5, 3)
(2, 4, 1, 3, 5)
(2, 4, 1, 5, 3)
(2, 5, 3, 1, 4)
(3, 1, 4, 2, 5)
(3, 1, 5, 2, 4)
(3, 5, 1, 4, 2)
(3, 5, 2, 4, 1)
(4, 1, 3, 5, 2)
(4, 2, 5, 1, 3)
(4, 2, 5, 3, 1)
(5, 2, 4, 1, 3)
(5, 3, 1, 4, 2)

"Aynı sırada" sadece yukarıdaki dörtlü diziler seçebilir ve onları dönüşümlü olarak kullanın. kural, hiçbir tekrarlar sizin zorlamak için Sadece bu işte bir bit yeniği var "üst üste", sonra iki dizileri seçemezsin, son ve başlangıç 1, sırasıyla. iki büyük ayak sayarsak yani

NumberOfToesPerFoot bir değişken yapmak isteyebilirsiniz, bu yüzden kolayca eğer müşterilerin herhangi beklenenden daha az ayak dönüşmek zorunda kalırsa veya daha fazla değiştirebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • SPBedition

    SPBedition

    24 HAZİRAN 2013