Bu son mücadelenin bir versiyonu. Bu sayı -2 olan bir tamsayı mı? sorunun ilginç yapısını vurgulamak ve mücadeleyi zorlaştırmak için tasarlanmış farklı bir kriter seti ile. Bu konuda biraz dikkate koymak burada .
Toby'nin bağlantılı soruda harika bir şekilde ifade ettiği zorluk:
Bir tamsayının 2 tam gücü olup olmadığını belirlemenin akıllı yolları var. Bu artık ilginç bir sorun değil, o zaman verilen bir tamsayının -2 tam bir gücü olup olmadığını belirleyelim . Örneğin:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Kurallar:
- Bir tamsayı 64 bit, imzalanmış, ikisinin tamamlayıcısıdır. Bu çalışabileceğiniz tek veri türüdür.
- Sadece aşağıdaki işlemleri kullanabilirsiniz. Bunların her biri bir işlem olarak sayılır.
n << k
,n >> k
: Sol / sağ shiftn
tarafındank
bit. İşaret biti sağa kaydırmada uzatılmıştır.n >>> k
: Sağa kaydırma ancak işaret bitini uzatma. 0'lar içeri kaydırıldı.a & b
,a | b
,a ^ b
: Bitwise AND, OR, XOR.a + b
,a - b
,a * b
: Çarpma, çıkarma, ekleyin.~b
: Bit yönünde ters çevir.-b
: İkisinin tamamlayıcı olumsuzlaması.a / b
,a % b
: Böl (tamsayı bölümü, 0'a yuvarlar) ve modulo.- Negatif sayılardan oluşan Modulo, C99'da belirtilen kuralları kullanır :
(a/b) * b + a%b
eşit olacaktıra
. Yani5 % -3
bir2
ve-5 % 3
olduğu-2
: 5 / 3
olduğu1
,5 % 3
olduğu2
, 1 ila * 3 + 2 = 5.-5 / 3
olduğu-1
,-5 % 3
olduğu-2
, -1 * 3 ± 2 = -5.5 / -3
olduğu-1
,5 % -3
olduğu2
, -1 * -3 + 2 = 5.-5 / -3
olduğu1
,-5 % -3
olduğu-2
, 1 ila * -3 ± 2 = -5.- Python'un
//
kat bölümü operatörünün, bu bölümdeki "0'a doğru yuvarlama" özelliğini%
karşılamadığını ve Python'un operatörünün de gereksinimleri karşılamadığını unutmayın.
- Negatif sayılardan oluşan Modulo, C99'da belirtilen kuralları kullanır :
- Atamalar bir işlem olarak sayılmaz. C olduğu gibi, atamalar görevden sonra sol tarafta değerine değerlendirmek:
a = (b = a + 5)
setlerib
içina + 5
, daha sonra setleria
içinb
bir işlem olarak ve sayımları. - Bileşik atamaları kullanılabilmektedir
a += b
aracıa = a + b
ve bir işlem olarak sayılır.
- Tamsayı sabitlerini kullanabilirsiniz, hiçbir şey olarak sayılmazlar.
- İşlem sırasını belirtmek için parantezler kabul edilebilir.
- İşlevleri ilan edebilirsiniz. İşlev bildirimleri sizin için uygun herhangi bir stilde olabilir, ancak 64 bit tam sayıların yalnızca geçerli veri türü olduğunu unutmayın. İşlev bildirimleri işlem olarak sayılmaz, ancak işlev çağrısı biri olarak sayılır. Ayrıca, açık olması gerekirse: İşlevler birden fazla
return
ifade içerebilir vereturn
herhangi bir noktadan izin verilir.return
Kendisi bir operasyon olarak sayılmaz. - Değişkenleri hiçbir ücret ödemeden beyan edebilirsiniz.
while
Döngüler kullanabilirsiniz , ancakif
veya kullanamazsınızfor
. Buwhile
durumda kullanılan operatörler puanınıza göre sayılır.while
döngüler durumları sıfır olmayan bir değere sahip olduğu sürece yürütülür (bu kavramın geçerli bir sonucu olmayan dillerde bir "truthy" 0 olması). Erken dönüş izin yana, kullanmak için izin verilirbreak
ve ayrıca- Taşma / taşma izin verilir ve değer kenetlemesi yapılmaz. İşlem gerçekten doğru bir şekilde gerçekleşmiş gibi muamele görür ve ardından 64 bite indirilir.
Puanlama / Kazanma Kriterleri:
Girişiniz -2, aksi halde sıfır ise, kodunuz sıfır olmayan bir değer üretmelidir.
Bu atomik kod golfü . Puanınız, çalışma zamanında yürütülen toplam işlem sayısı değil , kodunuzda bulunan toplam işlem sayısıdır ( yukarıda tanımlandığı gibi) . Aşağıdaki kod:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
5 işlem içerir: iki işlevde ve üç işlev çağrısı.
Sonucunuzu nasıl sunduğunuz önemli değildir, kendi dilinizde uygun olanı kullanın, sonuçta bir değişkeni saklarsanız, bir fonksiyondan döndürürken veya her neyse.
Kazanan, gözle görülür şekilde doğru olan yazıdır (gerekiyorsa geçici veya resmi bir kanıt sunun) ve yukarıda açıklandığı gibi en düşük puana sahip olan yazıdır.
Bonus Çok Zor Mod Mücadelesi!
Partileri insanları etkileme potansiyeli dışında kesinlikle hiçbir şey kazanma şansı için, while
döngü kullanmadan bir cevap gönderin ! Bunların yeteri kadar sunulması durumunda, kazanan grupları iki gruba ayırmayı düşünebilirim (döngüler olsun ve olmasın).
Not: Yalnızca 32 bit tam sayıyı destekleyen bir dilde bir çözüm sağlamak istiyorsanız, bir açıklamada 64 bit tam sayı için hala doğru olması için yeterince haklı olması koşuluyla bunu yapabilirsiniz.
Ayrıca: Kurallara aykırı değilse, ancak dilinizi yukarıdaki kurallara göre davranmaya zorlamak için gerekliyse, belirli bir dile özgü özelliklere ücretsiz olarak izin verilebilir . Mesela ( haklı), "truthy" 0 'lı olan bir dil için geçici bir çözüm olarak koşula bir bütün halinde uygulandığında , döngülerdeki 0 karşılaştırmaya eşit değil . Bu tür şeylerden yararlanmak için açık girişimlere izin verilmez - örneğin, "kural" 0 veya "tanımsız" değerler kavramı yukarıdaki kuralda mevcut değildir ve bu nedenle güvenilmeyebilir.while
m ^= s
olduğunu kabul etmek ve yerini daha da geliştirmek için ikame etmenin tamamen uygun olacağını düşünüyorum.
while
ve break
ancak if
? if (x) { ... }
eşittir while (x) { ... break; }
.
break
ve erken getirileri pişman olan kısmıdır) ve gelecekteki zorluklar için kurallarda öğrenilen uzun bir hikaye ve bir derstir. Her zaman "bonus" versiyonu var! :)
if
ve for
izin verilmez? int x=condition; while (x) { ... x=0; }
ücretsiz, sadece daha fazla kod. C tarzı ile aynı şey for
.