Bir küpün kaç küp kesilebileceğini hesaplayın


9

Parça kalmadan daha küçük küpler halinde kesebileceğimiz bir küp düşünün.

Bir küpün kaç küp kesilebileceğini bulun.

Örneğin, bir küp 8, 27 (tam olarak 3. tamsayı gücü) ve 20 (19 küçük küp artı diğerlerinin boyutunun sekiz katı olarak kesilebilir, resme bakınız).
Burada bazı yardıma bakın: http://mathworld.wolfram.com/CubeDissection.html

resim açıklamasını buraya girin Program giriş tamsayı n( 0 <= n <= 1 000) olarak almalı ve nbir küpün bu sayıda küpe kesilebilmesi için tüm sayıları daha az veya eşit olmalıdır. Küpün 1 küp şeklinde kesilebildiğini ve 0 küp halinde kesilemeyeceğini varsayalım.

Yalnızca 64 bit'ten büyük olmayan tümleşik veri türlerini (dizi, nesne vb.) Kullanabilirsiniz. En kısa kod kazanır.


Bu bir potansiyele sahiptir, ancak daha açık bir şekilde belirtmeniz gerekir. Bir küp gerçekten 20 küp şeklinde kesilebilir: orijinali 1/3 tarafı 27 küp olarak kesmek yerine, orijinali 1/3 tarafı 1/3 ve 8 kat daha büyük olan 19 küpü (yan 2/3 orijinal.) Evet bence bir resim yardımcı olacaktır
Level River St

Bu çizdiğim oldukça kaba bir küp, değiştirmekten çekinmeyin. İlk bakışta bu önemsiz görünüyor, ancak 125-216 (5 ^ 3-6 ^ 3.) Civarında ilginç bir aralık olduğunu düşünüyorum. Çok büyük sayılar için neredeyse tüm bölümler mümkündür.
Level River St

Bir eşikten sonraki tüm sayıların mümkün olup olmayacağını göreceğiz.
Somnium


1
Şu anda oldukça önemsiz bir çözümümüz olduğundan, bunu golf koduna geri döndürmek veya gönderimlere gerçekten zor kısıtlamalar koymak isteyebilirsiniz .
Martin Ender

Yanıtlar:


1

Golfscript, 55 (veya 43 42)

{.:^}{.47>20{.^>^@- 7%|!|}:/~1/38/39/{}{;}if^(}while;]`

Burada test edilebilir (sadece 2. satırdaki sayıyı değiştirin) ve herhangi bir toplama veya problem çözme için değil, temiz baskı için sadece diziyi (son iki kod satırı) kullanır. Bırakırsanız, tüm sonuçlar birleştirilir.

Yöntem: Verilen n'den aşağı doğru yinele: Geçerli sayı 47'den büyükse veya 1 + 7x, 20 + 7x, 38 + 7x veya 39 + 7x formundaysa, burada x = negatif olmayan bir tamsayı varsa, yığın üzerinde tutun , aksi takdirde bırakın.

Kısa cevap (43 bayt):

{: / 6 +, {7 * / +}% |}: &): a, 48, ^ 1 & 20 ve 38 ve 39 ve {a <} '

):a,48,^1{:/6+,{7*/+}%|}:&~20&38&39&{a<},`

Yöntem: Benzer, ancak birkaç set teori ops. Bu diziler kullanır, bu nedenle teknik olarak kabul edilebilir bir cevap değildir. Burada test edilebilir . Btw: hiç kimse belirli bir sırada olmaları gerektiğini söylemedi;)


1

Mathematica, 62 bayt (veya 52)

Bu kodlanmış bir cevap, ilginç bir şey değil.

If[EvenQ@BitShiftRight[164015534735101,n],Print@n]~Do~{n,1000}

Bu 52 bayt uzunluğunda ama kurallarımı ihlal ediyor - büyük tamsayılar (2'nin gücü) ve listeler (Aralık) kullanıyor.

Select[Range@1000,EvenQ@Floor[164015534735101/2^#]&]


0

C, 72

i;main(){for(scanf("%d",&i);i;i--)0x952BD7AF7EFC>>i&1||printf("%d ",i);}

Başka bir kodlanmış cevap. Bu aşağıya doğru sayar (sayıların çıkması gereken sıra ile ilgili kurallarda hiçbir şey yoktur.) Teorik olarak çalışmalıdır. Sabit, bir küpün kesilemediği tüm sayılar için 1 ve bit yapabilen sayılar için 0 olarak ayarlanmıştır. Teorik olarak, çok büyük bir sayı ile sağa kaydırıldığında sabit sıfır olmalıdır, bu yüzden büyük sayı her zaman yazdırılmalıdır.

İlginç olan pratikte bunun işe yaramaması. Yukarıdaki kod 65'e kadar GCC'de derlenir ve iyi çalışır. Ancak bu sayının üzerinde derleyicide bir hata (veya "özellik") vardır. o yorumladığı 0x952BD7AF7EFC>>iolarak 0x952BD7AF7EFC>>i%64. Böylece 66'dan 71'e (64 + 2'den 64 + 7'ye) sayılar atlar.

Visual Studio'da çalıştırmak için biraz daha fazla kaynak plakası gereklidir (zımni tamsayı ve #includes gibi şeylerden kurtulmanıza izin vermez .) Program çalışmaya başladıktan sonra 257'ye kadar iyi ... Sonra 258'den atlıyor 263 (256 + 2 - 256 + 7.) Yanii%256.

Daha sonra düzeltebilirim (rahatsız edilebilirsem.) Ahlaki: derleyici kılavuzları normalde bit kaydırmalarında üst limiti söylemez. Bunun bir nedeni var!


Bu benimkinin
cevabıyla

Aslında, temelde aynı sabite sahibiz (bit sıfır kullanılmamış ve 1 biti 1 sayısını temsil eder). CI'de sabiti hex cinsinden belirterek tek bir bayt kaydedin. Ben 0bit için sıfır var, 1i = 0 için senin gibi bir için değiştirebilirsiniz . Ama yine de asla gösterilmez.
Level River St

@steveverrill lütfen NUM>>ideğişikliklerin nasıl yapıldığını açıklayın NUM>>i%64. Ayrıca bir 64-bitsayı doğru 64 kattan fazla kaydırılırsazero
manav mn

@Manav gerçekten sıfır olmalı. Dediğim gibi, derleyici bir hata var. derleyici bit kaydırma işlemini gerçekleştirmeden önce en soldaki bitleri kırptığı için veya eşdeğer NUM>>iolur . GCC sadece en doğru 6 biti dikkate alır. Visual Studio aynı hataya sahiptir, ancak en sağdaki 8 bit göz önüne alındığında biraz daha iyidir . Merakımdan işten eve geldiğimde Ideone'yi deneyeceğim. NUM>>(i%64)NUM>>(i&63)iNUM>>(i%256)
Level River St

ideone tam olarak GCC gibi davranır. ideone.com/EpKTpO
Level River St
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.