Sadece C # destekli makineye özgü yapısallar… Bunu x86 montaj dilinde ve diğer işlemci mimarilerinin çoğunda yapabilen tek bir komut vardır. O zaman sadece en kısa koda değil, aynı zamanda en hızlı koda sahip olursunuz.
Aslında, bu kodu daha kısa yapmak, bu kodu hızlı hale getirmeye kıyasla son derece sıkıcı bir sorundur . Gerçekten düzgün, verimli, biraz çevirme çözümleri var ve ayrıca bir arama tablosu kullanmayı düşünebilirsiniz.
Bunların hiçbiri golf oynamak için önemli değil. Bana şu anki çözümünüz yapabileceğiniz en iyi şey gibi geliyor. Tabii ki, gereksiz boşlukları kaldırabilirsiniz:
k<1?0:(int)Math.Log(k&-k,2)+1
Ben şahsen şöyle yazar:
k>0?(int)Math.Log(k&-k,2)+1:0
çünkü koşullu testin yönüne bu şekilde sahip olmanın yanı sıra sıfıra göre karşılaştırmanın biraz daha açık olduğunu düşünüyorum, ancak sanırım altı bir yol, yarım düzine diğeri.
C # örtük dönüştürme desteklemediği int
için bool
gerçekten koşullu testi başka kısaltmak edemez böylece, C ve C ++ yapmak gibi.
Ayrıca , C # öğesinin dolaylı olarak gerçekleşmesine izin vermeyeceğinden , double
(döndürüldüğüm gibi Math.Log
) ile arasındaki açık dökümle sıkışmışsınızdır int
. Normalde bu size sahip olduğunu işaret olur çünkü iyi bir şey tabii, ki büyük Burada performans sorunu: Bir teşvik int
a kadardouble
günlüğünü hesaplamak double
ve ardından double
sonucu tekrar bir haline dönüştürmek çok yavaş int
olacak , bu yüzden normalde bir şey kaçınmak istersiniz. Ancak bunlar, kod golf oynarken katlanmak zorunda olduğunuz sapkınlık türleri.
Başlangıçta
k > 0
? ((k & -k) >> 1) + 1
: 0
(netlik için kurtulmuş), ki bu da logaritmayı almaktan kaçınır ve bu nedenle kod boyutunda ve hızında bir gelişmedir. Ne yazık ki, bu her zaman doğru cevabı alamıyor ve bunun esnek bir gereklilik olduğunu varsayıyorum. :-) Özellikle, giriş değeri ( k
) 8 faktörü ise başarısız olur . Bu düzeltilebilir, ancak kodu Math.Log
sürümden daha uzun yapmadan .