Hepimizin bildiği gibi, modern işletim sistemleri, kodlarınızı özel olmayan iç mantığa göre iş parçacıklarınızı planlamak için farklı siparişler seçebilen iş parçacığı zamanlayıcılarına sahiptir. Normalde, size uygulanan bu belirsizliğin çıktınızı önemli ölçüde etkilemediğinden emin olmak için çok iş parçacıklı kodunuzu tasarlarsınız.
Buradaki amaç tam tersidir. Tamsayıları [0,99] aralığında, ancak işletim sistemi iş parçacığı zamanlayıcısı nedeniyle çalıştırmadan çalışmaya değişen bir sırayla yazdıran bir program oluşturun.
Şu şekilde tanımlanan "yeterince belirsizliği" yakalamanız gerekir:
10 denemeden oluşan 10 ardışık sette, programınız her denemede en az 9 benzersiz permütasyon üretmelidir. Ardışık 10'un her iki tarafında da başarılı sayıda başarısız deneme setiniz olabilir.
Ya da başka bir deyişle, 10 çalışmanın her bloğunun aynı şeyi veren en fazla iki çalışmanın olduğu 100 programa ihtiyacınız vardır.
Yani, bazen 98 ve 99'u değiştirmek onu kesmez.
Bu bir kod golf , bu yüzden en az bayt kullanan cevap kazanır.
Önemsiz ayrıntılar
- Çıktınızı her satıra bir giriş olacak şekilde stdout'a yazın
- Biçimi iki basamaklı serpiştirme karakterine stdout'a (bazen de) yazarak üç basamaklı sayı veya boş satır gibi şeylerle sonuçlanırsanız, sonucunuz geçersizdir
- Yukarıdaki kuralın tek istisnası, gerekli son numarayı yazdırdıktan sonra tek bir boş satır yayınlayabilmenizdir (hoş geldiniz)
- Gerekli değerleri kaçırır veya çoğaltırsanız sonucunuz geçersizdir
- Programınız yok değil (öyle şeref eğer rağmen) tek çekirdekli işlemci üzerinde nondeterministic olmak gerekir
- Programınız, işletim sisteminin çekirdeği tarafından yönetilmeyen yeşil iplikler / lifler kullanabilir, ancak yine de zorluğun diğer gereksinimlerini karşılarsa ve diş açma sistemi dilinizin bir parçasıdır veya diliniz için standart kitaplıktır
- Modern bir işlemci üzerinde programınızın çalışma süresi 5 saniyenin altında olmalıdır
- Programınızın dışında gerçekleşen, beklemeler veya ayar değişiklikleri gibi ortam değişikliklerini belirtemezsiniz; programınız ister 100ish kez arka arkaya ister her çalışma arasında bir saat veya paralel olarak 100ish kez çalışsın (muhtemelen yardımcı olacaktır ...)
- GPU veya Xeon Phi gibi bir işlemciyi ve görevler için kendi dahili zamanlama mekanizmasını kullanabilirsiniz. Kurallar bunun için yeşil iplikler için geçerli olduğu gibi geçerlidir.
- Bu yayında belirtilen kurallara uyduğunuz sürece, programlayıcıyı her türlü uyku, verim ve diğer hilelerle provoke etmekten çekinmeyin.
Yasaklanan İşlemler
Çizmenize izin verilen tek bir belirsizliğin kaynağı, zamanlayıcının iş parçacıklarınızın çalışması için zamanlamasıdır. Aşağıdaki liste ayrıntılı değildir, yalnızca diğer belirsiz olmayan kaynakları kabul ettikleri için yapmanıza izin verilmeyen şeylerin örneklerini sağlamayı amaçlamaktadır.
- Doğrudan veya dolaylı olarak herhangi bir PRNG veya donanım RNG yeteneğine erişme (zamanlayıcının doğal bir parçası olmadığı sürece).
- Her türlü girişte okuma (sistem zamanı, dosya sistemi, ağ vb.)
- İş parçacığı kimliklerini veya işlem kimliklerini okuma
- İşletim sistemi zamanlayıcısını özelleştirme; genel bir işletim sisteminden standart bir işletim sistemi zamanlayıcı kullanmalısınız
- Yeşil iplik / fiber zamanlayıcıyı özelleştirmek de yasaktır. Bu, bu meydan okuma için bir dil yazarsanız , OS iş parçacıklarını kullanmanız gerektiği anlamına gelir .
Yanıt Doğrulama
Tercihen bir cevap, tüm yaygın işletim sistemlerinde ve modern işlemcilerde işe yarar, kudolar destek genişliği ile orantılı olarak verilir. Ancak, bu zorluğun bir gereği değildir. En azından bir cevap bir modern SMP işlemciyi ve modern işletim sistemini desteklemelidir. Donanım kullanılabilirliğimin ölçüsünde ölçülen yanıtları test edeceğim.
- Girişiniz Windows 10 v1607 x64 çalıştıran bir i7 5960x'de gerekli çıkışı üretmezse, gerekli ortamı belirtin
- VMWare Workstation ile kolayca üretebileceğim bir şeyse, tam OS ve VM özelliklerini sağlayın
- Bu koşullardan herhangi birinde üretilemiyorsa, testin başlık bölümünde açıklandığı gibi eşzamanlı bir ekran görüntüsünü ve fare ve klavye etkileşiminizle (veya standart olmayan hesaplamanızın kontrol düzeni ne olursa olsun) ekranınızın elde taşınır video kaydını kaydedin cihaz kullanımları) açıkça görülebilir ve her iki videoyu da cevabınızla birlikte gönderin ve neden çalıştığına dair bir açıklama ekleyin
- Alternatif olarak, sonucu yeniden oluşturmak ve sizin için kefil olmak için uygun donanıma sahip saygın ve uzun süredir devam eden bir kullanıcı (kim siz değilsiniz) alın
- Girişiniz, tipik bir geliştiricinin derleme / jit / yorumlama için ayarlanmayacağı egzotik bir programlama dilinde ise kurulum talimatlarını sağlayın
- Giriş JVM / Python yorumlayıcısının / diğer sürümünün belirli bir sürümüne bağlıysa,
- Testlerimde 10 başarılı ardışık deneme setinizi elde etmek için 10 dakikadan fazla arka arkaya çalışma süreniz başarısız olursa (bu nedenle, özellikle üste yakınsanız, başarı durumunun bir ucube olmasına izin vermeyin çalışma zamanı bağlı)