Bu bulmacanın amacı 52 kartlık bir desteyi almak ve karıştırmaktır, böylece her kart rastgele bir konumdadır.
Verilen:
deckKartları temsil eden 52 farklı tamsayıdan oluşan bir dizi . Başladığınızda,deckbilinmeyen bir sırada her karttan tam olarak birini içerir.int rand(min, max)Intsminilemaxkapsayıcı arasında rastgele bir tamsayı döndüren bir işlev . Bu işlevin gerçekten rastgele olduğunu varsayabilirsiniz.void swap(x, y)Destedeki iki kartı değiştiren bir işlev . Eğer ararsanızswap(x, y), kartlar pozisyonlardaxveyyer değiştirir.
Ne zaman:
- Program çağırır
shuffle()(veyashuffle(deck)veyadeck.shuffle()veya uygulamanız çalışmayı sever),
Sonra:
deckher karttan tam olarak birini rasgele sırada içermelidir.
Yakalayış:
Herhangi bir değişken bildiremezsiniz. İstediğiniz kadar arayın swapve randkendinize ait herhangi bir değişken bildiremezsiniz. Bu, fordöngü sayaçlarını içerir - a foreach.
Açıklamalar:
- Küçük ayrıntıları seçtiğiniz dile uyacak şekilde değiştirebilirsiniz. Örneğin,
swapbaşvuru ile iki tamsayıyı değiştirmek için yazabilirsiniz . Değişiklikler, bu bulmacayı kolaylaştırmak için değil, dilinizle çalışacak şekilde yapılmalıdır. deckglobal bir değişken olabilir veya parametre olarak kabul edebilirsiniz.- İçeriğinde istediğiniz her şeyi yapabilirsiniz
deck, ancak uzunluğunu değiştiremezsiniz. - Kartlarınız 0-51, 1-52 veya istediğiniz herhangi bir şekilde numaralandırılabilir.
- Bunu herhangi bir dilde yazabilirsiniz, ancak dilinizin yerleşik
shuffleişleviyle hile yapamazsınız . - Evet, aynı satırı 52 kez yazabilirsiniz. Hiç kimse etkilenmeyecek.
- Yürütme zamanı önemli değil, ama gerçek rastgelelik önemlidir.
- Bu gerçekten kod golf değil, ancak kodunuzu en aza indirgemek / gizlemek için çekinmeyin.
Düzenleme: Ortak kod ve görselleştirici
.NET veya JavaScript kullandıysanız, yararlı bulabileceğiniz bazı test kodları aşağıda verilmiştir:
JavaScript:
- CoffeeScript kaynağına sahip hızlı ve kirli JavaScript görselleştirici: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Çalıştırılabilir sürüm (sadece
shuffle()işlevinize yapıştırın ): http://jsfiddle.net/4zxjmy42/
C #:
- C # kodlu ASP.NET görselleştirici: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Sadece
swapverandyardımcı yöntemlerle saplama : https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Bu kod desteyi birkaç bin kez sıralar ve karıştırır ve bazı temel sağlık testi yapar: Her karıştırma için destede tam olarak 52 kartın tekrarlanmadığını doğrular. Daha sonra görüntüleyici, destedeki her yerde biten her kartın frekansını çizerek gri tonlamalı bir ısı haritası görüntüler.
Görüntüleyicinin çıktısı, belirgin bir deseni olmayan kar gibi görünmelidir. Açıkçası gerçek bir rastlantısallığı kanıtlayamaz, ancak bu nokta kontrol etmenin hızlı ve kolay bir yoludur. Karıştırma algoritmasındaki bazı hatalar çıktıda çok tanınabilir kalıplara yol açtığından, bunu veya bunun gibi bir şeyi kullanmanızı öneririm. Aşağıda, biri ortak bir kusuru olan iki uygulamadan elde edilen çıktıya bir örnek verilmiştir:

Kusurlu sürüm güverteyi kısmen karıştırır, bu yüzden diziyi elle incelerseniz iyi görünebilir. Görüntüleyici, bir patern fark etmeyi kolaylaştırır.
deckKendisinden başka herhangi bir parametre olmadan yapılabileceğini biliyorum .
swaptemel amacını yerine getirdiği sürece , istediğiniz herhangi bir uygulamayı varsayabileceğinizdir . swapVerilen bir şeyi yapma nedenimin bir kısmı, insanların ona 'sihir' olarak davranabilmeleri ve tercih ettikleri dilde çalıştıklarından endişe etmeden ana soruna konsantre olabilmeleriydi. Bunu yapabilir veya kendiniz yazabilirsiniz, swapsize kalmış.