Calcular quantos cubos um cubo pode ser cortado

9

Imagine um cubo que possamos cortar em cubos menores sem pedaços restantes.

Encontre quantos cubos um cubo pode ser cortado.

Por exemplo, um cubo pode ser cortado em 8, 27 (obviamente, terceira potência de números inteiros) e 20 (19 cubos pequenos mais um oito vezes o tamanho dos outros, veja a imagem).
Veja aqui alguma ajuda: http://mathworld.wolfram.com/CubeDissection.html

insira a descrição da imagem aqui O programa deve assumir como número inteiro de entrada n( 0 <= n <= 1 000) e imprimir todos os números menores ou iguais a, npara que um cubo possa ser cortado nesse número de cubos. Suponha que o cubo possa ser cortado em 1 cubo e não em 0 cubos.

Você pode usar apenas tipos de dados integrais (sem matrizes, objetos etc.) de tamanho não superior a 64 bits. O menor código vence.

Somnium
fonte
Isso tem potencial, mas você precisa especificá-lo mais claramente. Um cubo pode de fato ser cortado em 20 cubos: em vez de cortá-lo em 27 cubos do lado 1/3 do original, corte-o em 19 cubos do lado 1/3 do original e um 8 vezes maior (lado 2/3 do original.) Sim, acho que uma imagem seria útil #
Level River St
Esse é um cubo bem bruto que eu desenhei, fique à vontade para alterá-lo. À primeira vista, isso parece trivial, mas acho que há um intervalo interessante em torno de 125-216 (5 ^ 3-6 ^ 3.). É provável que, para números muito grandes, quase todas as divisões sejam possíveis.
Level River St
Veremos se todos os números após algum limite serão possíveis.
Somnium 21/07
3
A resposta está realmente aqui: mathworld.wolfram.com/CubeDissection.html
Level River St
11
Como temos uma solução bastante trivial agora, convém alterar isso de volta para codificar golf ou colocar alguma restrição muito rígida nos envios.
Martin Ender

Respostas:

1

Golfscript, 55 (ou 43 42)

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

Pode ser testado aqui (basta alterar o número na linha 2) e usa apenas a matriz (dois últimos caracteres de código) para impressão limpa, não para coleta ou solução de problemas. Se você deixar de fora, todos os resultados serão concatenados.

Método: Iterate down from from n: Se o número atual for maior que 47 ou no formato 1 + 7x, 20 + 7x, 38 + 7x ou 39 + 7x em que x = qualquer número inteiro não negativo, mantenha-o na pilha , caso contrário, solte-o.

Resposta curta (43 bytes):

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

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

Método: Similar, mas com algumas operações de teoria dos conjuntos. Isso usa matrizes, portanto tecnicamente não é uma resposta aceitável. Pode ser testado aqui . Btw: ninguém nunca disse que tinha que estar em uma ordem específica;)

Kyle McCormick
fonte
1

Mathematica, 62 bytes (ou 52)

É uma resposta codificada, nada de interessante.

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

Este tem 52 bytes, mas viola minhas regras - usa números inteiros grandes (potências de 2) e listas (Intervalo).

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

Somnium
fonte
0

C, 72

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

Outra resposta codificada. Isso conta para baixo (não há nada nas regras sobre a ordem em que os números devem ser impressos.) Em teoria, deveria funcionar. A constante tem um bit definido como 1 para todos os números nos quais um cubo NÃO pode ser cortado e um 0 para os números que podem. Em teoria, a constante quando deslocada para a direita por um número muito grande deve ser zero, portanto o número grande sempre deve ser impresso.

O interessante é que, na prática, isso não funciona. O código acima compila e executa bem no GCC até 65. Mas acima desse número, há um erro (ou "recurso") no compilador. interpreta 0x952BD7AF7EFC>>icomo 0x952BD7AF7EFC>>i%64. Por isso, pula (por exemplo) os números 66 a 71 (64 + 2 a 64 + 7).

Para executar no Visual Studio, é necessário um pouco mais de clichê (não permite que você se dê bem com números e números implícitos #include). Depois que o programa estiver em funcionamento, é possível chegar a 257 ... Em seguida, pula 258 263 (256 + 2 a 256 + 7).i%256.

Posso corrigi-lo mais tarde (se puder me incomodar.) Moral: os manuais do compilador normalmente não informam o limite superior dos turnos de bits. Há uma razão para isso!

Level River St
fonte
Isto usa exatamente o mesmo princípio como resposta mina)
Somnium
De fato, temos basicamente a mesma constante (com o bit zero não utilizado e o bit 1 representando o número 1.) No IC, salve um único byte especificando a constante em hexadecimal. Eu tenho um 0para zero, eu poderia alterá-lo para um 1como o seu para o caso i = 0. Mas nunca é exibido de qualquer maneira.
Level River St
@steveverrill, explique como NUM>>imuda para NUM>>i%64. Além disso, se um 64-bitnúmero é direito deslocou mais de 64 vezes, deve tornar-sezero
manav mn
@ Manav realmente deve se tornar zero. Como eu disse, o compilador tem um bug. NUM>>ise torna NUM>>(i%64)ou equivalentemente NUM>>(i&63)porque o compilador está truncando os bits mais à esquerda iantes de executar o deslocamento de bits. O GCC considera apenas os 6 bits mais à direita. O Visual Studio tem o mesmo bug, mas é um pouco melhor, considerando apenas os 8 bits mais à direita NUM>>(i%256). Por curiosidade, tentarei o Ideone quando chegar em casa do trabalho.
Level River St
A ideona se comporta exatamente como o GCC. ideone.com/EpKTpO
Level River St