Saya sedang mengerjakan perangkat lunak untuk mesin yang secara otomatis akan memotong kuku kaki, sehingga pengguna dapat dengan mudah meletakkan kaki mereka di dalamnya dan menjalankannya daripada harus melakukannya secara manual dengan menggigitnya atau menggunakan gunting kuku.
Persentase yang cukup besar dari basis pengguna potensial kami kemungkinan besar adalah orang Yahudi, dan, jelas, ada tradisi untuk tidak memotong kuku kaki ( atau kuku ) secara berurutan
Tampaknya ada perbedaan pendapat tentang penerapan yang tepat dari tradisi ini, tetapi menurut kami aturan berikut cukup untuk mengakomodasi orang-orang yang praktik keagamaannya melarang pemotongan kuku secara berurutan:
- Tidak ada dua kuku kaki yang berdekatan harus dipotong secara berurutan
- Urutan pemotongan di kaki kiri harus tidak sesuai dengan urutan di kaki kanan
- Urutan pemotongan pada dua proses berturut-turut tidak boleh sama. Urutan seharusnya tidak mudah diprediksi, jadi pengkodean keras urutan alternatif tidak berfungsi.
Beginilah cara kami memutuskan untuk memberi nomor pada jari kaki:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Saya telah menulis kode untuk menyelesaikan masalah, tetapi algoritma yang digunakan kurang optimal: pada kenyataannya, kinerja kasus terburuk adalah O (∞) . Cara kerjanya sebanding dengan bogosort . Berikut ini adalah penyederhanaan pseudocode dari kode sebenarnya yang digunakan:
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)
Pada dasarnya, ini menghasilkan urutan acak dan memeriksa apakah memenuhi kriteria. Jika tidak memenuhi kriteria, itu akan dimulai kembali. Ini tidak membutuhkan waktu yang sangat lama, tetapi sangat tidak terduga.
Saya menyadari bahwa cara yang saya lakukan saat ini sangat buruk, tetapi saya kesulitan menemukan cara yang lebih baik. Adakah di antara Anda yang dapat menyarankan algoritme yang lebih elegan dan berperforma baik?