Oblicz, ile kostek można wyciąć z jednej kostki

9

Wyobraź sobie kostkę, którą możemy pokroić na mniejsze kostki bez pozostawiania kawałków.

Sprawdź, ile kostek można wyciąć.

Na przykład, sześcian można pokroić na 8, 27 (oczywiście 3 potęgi liczb całkowitych) i 20 (19 małych kostek plus jeden osiem razy większy od pozostałych, patrz zdjęcie).
Zobacz tutaj pomoc: http://mathworld.wolfram.com/CubeDissection.html

wprowadź opis zdjęcia tutaj Program powinien przyjąć jako liczbę całkowitą wejściową n( 0 <= n <= 1 000) i wypisać wszystkie liczby mniejsze lub równe, aby nsześcian mógł zostać pocięty na tę liczbę kostek. Załóżmy, że kostkę można pokroić na 1 kostkę, a nie na 0 kostek.

Można używać tylko integralnych typów danych (bez tablic, obiektów itp.) O rozmiarze nie większym niż 64-bitowy. Najkrótszy kod wygrywa.

Somnium
źródło
Ma to potencjał, ale musisz go sprecyzować. Kostkę rzeczywiście można pokroić w 20 kostek: zamiast pokroić ją w 27 kostek strony 1/3 oryginału, pokroić ją w 19 kostek strony 1/3 oryginału i jeden, który jest 8 razy większy (strona 2/3 oryginał.) Tak, myślę, że zdjęcie byłoby pomocne
Level River St
To dość szorstka kostka, którą narysowałem, możesz ją zmienić. Na pierwszy rzut oka wydaje się to trywialne, ale myślę, że istnieje interesujący zakres wokół 125-216 (5 ^ 3-6 ^ 3.) Możliwe jest, że dla bardzo dużych liczb prawie wszystkie dywizje są możliwe.
Level River St
Zobaczymy, czy wszystkie liczby po pewnym progu będą możliwe.
Somnium
3
Odpowiedź jest tutaj: mathworld.wolfram.com/CubeDissection.html
Level River St
1
Ponieważ mamy teraz dość trywialne rozwiązanie, możesz chcieć zmienić to z powrotem na kod golfa lub nałożyć pewne naprawdę surowe ograniczenia na przesyłanie.
Martin Ender

Odpowiedzi:

1

Golfscript, 55 (lub 43 42)

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

Można go przetestować tutaj (wystarczy zmienić numer w wierszu 2) i używa tylko tablicy (ostatnich dwóch znaków kodu) do czystego drukowania, a nie do gromadzenia lub rozwiązywania problemów. Jeśli to odłożysz, wszystkie wyniki zostaną połączone.

Metoda: Iteracja w dół od podanego n: Jeśli bieżąca liczba jest większa niż 47 lub w postaci 1 + 7x, 20 + 7x, 38 + 7x lub 39 + 7x, gdzie x = jakakolwiek liczba całkowita nieujemna, trzymaj ją na stosie , w przeciwnym razie upuść.

Krótka odpowiedź (43 bajty):

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

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

Metoda: podobna, ale z kilkoma zestawami teorii. Używa tablic, więc technicznie nie jest to akceptowalna odpowiedź. Można przetestować tutaj . Btw: nikt nigdy nie powiedział, że muszą być w określonej kolejności;)

Kyle McCormick
źródło
1

Mathematica, 62 bajty (lub 52)

Odpowiedź jest zakodowana na stałe, nic ciekawego.

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

Ten ma 52 bajty długości, ale narusza moje zasady - używa dużych liczb całkowitych (potęgi 2) i list (zasięg).

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

Somnium
źródło
0

C 72

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

Kolejna zakodowana odpowiedź. Odlicza się to w dół (nie ma nic w regułach dotyczących kolejności, w jakiej liczby muszą być wyprowadzane.) Teoretycznie powinno to działać. Stała ma bit ustawiony na 1 dla wszystkich liczb, na które NIE MOŻNA wyciąć sześcianu, i 0 dla liczb, które mogą. Teoretycznie stała przesunięta w prawo o bardzo dużą liczbę powinna wynosić zero, więc dużą liczbę należy zawsze wydrukować.

Co ciekawe, w praktyce to nie działa. Powyższy kod kompiluje się i działa poprawnie na GCC do 65. Ale powyżej tej liczby jest błąd (lub „funkcja”) w kompilatorze. to interpretuje 0x952BD7AF7EFC>>ijako 0x952BD7AF7EFC>>i%64. Pomija (na przykład) liczby od 66 do 71 (od 64 + 2 do 64 + 7).

Aby uruchomić się w Visual Studio, potrzebna jest nieco więcej płyt kotłowych (nie pozwala to na uniknięcie takich rzeczy, jak domniemane liczby całkowite i #includes.) Po uruchomieniu programu jest w porządku do 257 ... Następnie przeskakuje 258 przez 263 (256 + 2 do 256 + 7). Więc to zajmujei%256.

Mogę to naprawić później (jeśli mogę się niepokoić). Morał: podręczniki kompilatora zwykle nie określają górnej granicy przesunięć bitów. Jest po temu powód!

Level River St
źródło
To stosuje dokładnie tę samą zasadę, co moja odpowiedź)
Somnium
Rzeczywiście mamy nawet w zasadzie tę samą stałą (z nieużywanym bitem zero i bitem 1 reprezentującym liczbę 1.) W CI zachowaj pojedynczy bajt, określając stałą w postaci szesnastkowej. Mam 0dla bitu zero, mógłbym to zmienić na 1podobny do twojego dla przypadku i = 0. Ale i tak nigdy się nie wyświetla.
Level River St
@steveverrill proszę wyjaśnić, w jaki sposób NUM>>izmiany NUM>>i%64. Również jeśli 64-bitliczba jest przesunięta w prawo ponad 64 razy, powinna byćzero
manav mn
@Manav rzeczywiście powinno być zero. Jak mówię, kompilator ma błąd. NUM>>istaje się NUM>>(i%64)równoważne, NUM>>(i&63)ponieważ kompilator obcina skrajnie lewe bity iprzed wykonaniem przesunięcia bitów. GCC bierze pod uwagę tylko najbardziej prawe 6 bitów. Visual Studio ma ten sam błąd, ale jest nieco lepszy, biorąc pod uwagę tylko 8 prawych bitów NUM>>(i%256). Z ciekawości spróbuję Ideone, kiedy wrócę z pracy do domu.
Level River St
ideone zachowuje się dokładnie tak jak GCC. ideone.com/EpKTpO
Level River St