Calcola il numero di cubi che un cubo può essere tagliato


9

Immagina un cubo che possiamo tagliare in cubetti più piccoli senza rimanere pezzi.

Scopri quanti cubi un cubo può essere tagliato.

Ad esempio, un cubo può essere tagliato in 8, 27 (ovviamente 3a potenza di numeri interi) e 20 (19 cubetti più uno otto volte più grande degli altri, vedi immagine).
Consulta qui un aiuto: http://mathworld.wolfram.com/CubeDissection.html

inserisci qui la descrizione dell'immagine Il programma dovrebbe assumere come input intero n( 0 <= n <= 1 000) e stampare tutti i numeri in modo uguale o minore in nmodo che un cubo possa essere tagliato in quel numero di cubi. Supponiamo che il cubo possa essere tagliato in 1 cubo e non in 0 cubi.

È possibile utilizzare solo tipi di dati integrali (no array, oggetti ecc.) Di dimensioni non superiori a 64 bit. Il codice più corto vince.


Questo ha potenziale ma è necessario specificarlo più chiaramente. Un cubo può davvero essere tagliato in 20 cubi: invece di tagliarlo in 27 cubi di lato 1/3 dell'originale, tagliarlo in 19 cubi di lato 1/3 dell'originale e uno che è 8 volte più grande (lato 2/3 il originale.) Sì, penso che una foto sarebbe utile
Level River St

È un cubo piuttosto ruvido che ho disegnato, sentiti libero di cambiarlo. A prima vista questo sembra banale, ma penso che ci sia un intervallo interessante intorno a 125-216 (5 ^ 3-6 ^ 3.) È probabile che per numeri molto grandi quasi tutte le divisioni siano possibili.
Level River St

Vedremo se saranno possibili tutti i numeri dopo una certa soglia.
Somnium,

3

1
Dal momento che abbiamo una soluzione abbastanza banale ora, potresti voler tornare a codificare golf o porre delle restrizioni davvero difficili agli invii.
Martin Ender,

Risposte:


1

Golfscript, 55 (o 43 42)

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

Può essere testato qui (basta cambiare il numero alla riga 2) e utilizza solo l'array (ultimi due caratteri di codice) per una stampa pulita, non per alcuna raccolta o risoluzione dei problemi. Se lo lasci, tutti i risultati verranno concatenati.

Metodo: Scorri verso il basso da un dato n: se il numero corrente è maggiore di 47 o del formato 1 + 7x, 20 + 7x, 38 + 7x o 39 + 7x dove x = qualsiasi numero intero non negativo, quindi tienilo nello stack , altrimenti rilasciarlo.

Risposta breve (43 byte):

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

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

Metodo: simile, ma con alcune operazioni teoriche stabilite. Questo utilizza array quindi non è tecnicamente una risposta accettabile. Può essere testato qui . A proposito: nessuno ha mai detto che dovevano essere in un ordine particolare;)


1

Mathematica, 62 byte (o 52)

È una risposta codificata, niente di interessante.

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

Questo è lungo 52 byte ma viola le mie regole - usa numeri interi grandi (potenze di 2) ed elenchi (Range).

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


0

C, 72

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

Un'altra risposta codificata. Questo conta verso il basso (non c'è nulla nelle regole sull'ordine in cui devono essere emessi i numeri.) In teoria dovrebbe funzionare. La costante ha un bit impostato su 1 per tutti i numeri in cui un cubo NON può essere tagliato e uno 0 per i numeri che possono. In teoria, la costante quando spostata a destra di un numero molto grande dovrebbe essere zero, quindi il numero grande dovrebbe sempre essere stampato.

La cosa interessante è che in pratica questo non funziona. Il codice sopra si compila e funziona bene su GCC fino a 65. Ma sopra quel numero c'è un bug (o "caratteristica") nel compilatore. interpreta 0x952BD7AF7EFC>>icome 0x952BD7AF7EFC>>i%64. Quindi salta (ad esempio) i numeri da 66 a 71 (da 64 + 2 a 64 + 7).

Per funzionare in Visual Studio, è necessario un po 'più di plateplate (non ti consente di cavartela con cose come numeri interi impliciti e #includes.) Una volta che il programma è attivo e funzionante, va bene fino a 257 ... Quindi salta 258 attraverso 263 (da 256 + 2 a 256 + 7). Quindi sta prendendoi%256.

Potrei risolverlo più tardi (se posso essere disturbato.) Morale: i manuali del compilatore normalmente non ti dicono il limite superiore sui bitshift. C'è una ragione per questo!


Questo utilizza esattamente lo stesso principio della mia risposta)
Somnium,

In effetti, abbiamo persino sostanzialmente la stessa costante (con bit zero inutilizzato e bit 1 che rappresenta il numero 1.) In CI salvare un singolo byte specificando la costante in esadecimale. Ho un 0bit per zero, potrei cambiarlo con un 1tuo simile per il caso i = 0. Ma non viene mai visualizzato comunque.
Level River St

@steveverrill, per favore, spiega come NUM>>icambia NUM>>i%64. Inoltre, se un 64-bitnumero viene spostato a destra più di 64 volte, dovrebbe diventarezero
manav mn

@Manav infatti dovrebbe diventare zero. Come ho già detto, il compilatore ha un bug. NUM>>idiventa NUM>>(i%64)o equivalentemente NUM>>(i&63)perché il compilatore sta troncando i bit più a sinistra iprima di eseguire lo spostamento dei bit. GCC considera solo i 6 bit più a destra. Visual Studio ha lo stesso bug ma è leggermente migliore, considerando solo gli 8 bit più a destra NUM>>(i%256). Per curiosità proverò Ideone quando torno a casa dal lavoro.
Level River St

L'ideone si comporta esattamente come GCC. ideone.com/EpKTpO
Level River St
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.