Calculez combien de cubes un cube peut être coupé

9

Imaginez un cube que nous pouvons couper en cubes plus petits sans morceaux restants.

Trouvez combien de cubes un cube peut être coupé.

Par exemple, un cube peut être coupé en 8, 27 (évidemment les 3èmes puissances d'entiers) et 20 (19 petits cubes plus un huit fois la taille des autres, voir image).
Voir ici de l'aide: http://mathworld.wolfram.com/CubeDissection.html

entrez la description de l'image ici Le programme doit prendre comme entier n( 0 <= n <= 1 000) d' entrée et imprimer tous les nombres inférieurs ou égaux pour nqu'un cube puisse être coupé en ce nombre de cubes. Supposons que le cube puisse être coupé en 1 cube et ne puisse pas être en 0 cube.

Vous ne pouvez utiliser que des types de données intégraux (pas de tableaux, d'objets, etc.) d'une taille ne dépassant pas 64 bits. Le code le plus court gagne.

Somnium
la source
Cela a du potentiel mais vous devez le préciser plus clairement. Un cube peut en effet être coupé en 20 cubes: au lieu de le découper en 27 cubes du côté 1/3 de l'original, coupez-le en 19 cubes du côté 1/3 de l'original et un qui est 8 fois plus grand (côté 2/3 le original.) Oui, je pense qu'une photo serait utile
Level River St
C'est un cube assez grossier que j'ai dessiné, n'hésitez pas à le changer. À première vue, cela semble trivial, mais je pense qu'il y a une fourchette intéressante autour de 125-216 (5 ^ 3-6 ^ 3.) Il est probable que pour de très grands nombres presque toutes les divisions sont possibles.
Level River St
Nous verrons si tous les nombres après un certain seuil seront possibles.
Somnium
3
La réponse est en fait ici: mathworld.wolfram.com/CubeDissection.html
Level River St
1
Comme nous avons maintenant une solution assez triviale, vous voudrez peut-être revenir au code golf ou imposer des restrictions très strictes aux soumissions.
Martin Ender

Réponses:

1

Golfscript, 55 (ou 43 42)

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

Peut être testé ici (changez simplement le nombre sur la ligne 2) et utilise uniquement le tableau (les deux derniers caractères du code) pour une impression propre, pas pour une collection ou une résolution de problème. Si vous ne le laissez pas, tous les résultats seront concaténés.

Méthode: Itérer vers le bas à partir de n donné: Si le nombre actuel est supérieur à 47 ou de la forme 1 + 7x, 20 + 7x, 38 + 7x ou 39 + 7x où x = tout entier non négatif, alors conservez-le sur la pile , sinon laissez-le tomber.

Réponse courte (43 octets):

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

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

Méthode: similaire, mais avec quelques ops de théorie des ensembles. Cela utilise des tableaux donc ce n'est techniquement pas une réponse acceptable. Peut être testé ici . Btw: personne n'a jamais dit qu'ils devaient être dans un ordre particulier;)

Kyle McCormick
la source
1

Mathematica, 62 octets (ou 52)

C'est une réponse codée en dur, rien d'intéressant.

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

Celui-ci fait 52 octets de long mais viole mes règles - il utilise de grands entiers (puissances de 2) et des listes (Range).

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

Somnium
la source
0

C, 72

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

Une autre réponse codée en dur. Cela compte vers le bas (il n'y a rien dans les règles concernant l'ordre dans lequel les chiffres doivent être sortis.) En théorie, cela devrait fonctionner. La constante a un bit mis à 1 pour tous les nombres dans lesquels un cube NE PEUT PAS être coupé, et à 0 pour les nombres qui le peuvent. En théorie, la constante lorsqu'elle est décalée vers la droite d'un très grand nombre doit être nulle, donc le grand nombre doit toujours être imprimé.

Ce qui est intéressant, c'est que dans la pratique, cela ne fonctionne pas. Le code ci-dessus compile et fonctionne correctement sur GCC jusqu'à 65. Mais au-dessus de ce nombre, il y a un bogue (ou "fonctionnalité") dans le compilateur. il interprète 0x952BD7AF7EFC>>icomme 0x952BD7AF7EFC>>i%64. Il saute donc (par exemple) les nombres 66 à 71 (64 + 2 à 64 + 7).

Pour fonctionner dans Visual Studio, un peu plus de passe-partout est nécessaire (cela ne vous permet pas de vous en tirer avec des choses comme les entiers et les #includes implicites .) Une fois le programme opérationnel, il peut aller jusqu'à 257 ... Ensuite, il passe de 258 à 263 (256 + 2 à 256 + 7.) Il faut donci%256.

Je peux le corriger plus tard (si cela me dérange). Moral: les manuels du compilateur ne vous indiquent normalement pas la limite supérieure des décalages de bits. Il y a une raison à cela!

Level River St
la source
Cela utilise exactement le même principe que la mienne)
Somnium
En effet, nous avons même fondamentalement la même constante (avec le bit zéro inutilisé et le bit 1 représentant le nombre 1.) Dans CI, enregistrez un seul octet en spécifiant la constante en hexadécimal. J'ai un 0bit zéro, je pourrais le changer 1comme le vôtre pour le cas i = 0. Mais il ne s'affiche jamais de toute façon.
Level River St
@steveverrill, veuillez expliquer comment les NUM>>imodifications ont été apportées NUM>>i%64. De plus, si un 64-bitnombre est décalé vers la droite plus de 64 fois, il devrait devenirzero
manav mn
@Manav en effet il devrait devenir nul. Comme je l'ai dit, le compilateur a un bug. NUM>>idevient NUM>>(i%64)ou de manière équivalente NUM>>(i&63)car le compilateur tronque les bits les plus à gauche de iavant d'effectuer le décalage de bits. GCC ne considère que les 6 bits les plus à droite. Visual Studio a le même bogue mais est légèrement meilleur, considérant uniquement les 8 bits les plus à droite NUM>>(i%256). Par curiosité, j'essaierai Ideone à mon retour du travail.
Level River St
ideone se comporte exactement comme GCC. ideone.com/EpKTpO
Level River St