Bu bulmacanın amacı 52 kartlık bir desteyi almak ve karıştırmaktır, böylece her kart rastgele bir konumdadır.
Verilen:
deck
Kartları temsil eden 52 farklı tamsayıdan oluşan bir dizi . Başladığınızda,deck
bilinmeyen bir sırada her karttan tam olarak birini içerir.int rand(min, max)
Intsmin
ilemax
kapsayı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 pozisyonlardax
vey
yer değiştirir.
Ne zaman:
- Program çağırır
shuffle()
(veyashuffle(deck)
veyadeck.shuffle()
veya uygulamanız çalışmayı sever),
Sonra:
deck
her karttan tam olarak birini rasgele sırada içermelidir.
Yakalayış:
Herhangi bir değişken bildiremezsiniz. İstediğiniz kadar arayın swap
ve rand
kendinize ait herhangi bir değişken bildiremezsiniz. Bu, for
dö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,
swap
baş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. deck
global 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
shuffle
iş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
swap
verand
yardı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.
deck
Kendisinden başka herhangi bir parametre olmadan yapılabileceğini biliyorum .
swap
temel amacını yerine getirdiği sürece , istediğiniz herhangi bir uygulamayı varsayabileceğinizdir . swap
Verilen 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, swap
size kalmış.