Salida de factores distintos de los cuboides

13

Salida de factores distintos de los cuboides

La tarea de hoy es muy simple: dado un entero positivo, genera un representante de cada cuboide formable por sus factores.

Explicaciones

El volumen de un cuboide es el producto de sus tres lados. Por ejemplo, un cuboide de volumen 4 cuyo lado longitudes son números enteros puede tener lados [1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], [2, 2, 1], o [4, 1, 1]. Sin embargo, algunos de estos representan el mismo cuboide: por ejemplo, [1, 1, 4]y [4, 1, 1]son el mismo cuboide rotados. Solo hay dos cuboides distintos con volumen 4 y lados enteros: [1, 1, 4]y [1, 2, 2]. La salida puede ser cualquier representación del primer cuboide, y cualquier representación del segundo cuboide.

Entrada

Su programa debe tener un único número entero positivo de 1norte231-1 .

Salida

Deberá generar todos los cuboides posibles en una lista o de cualquier otra forma aceptable. P.ej

Input  Output
  1    [[1, 1, 1]]
  2    [[1, 1, 2]]
  3    [[1, 1, 3]]
  4    [[1, 1, 4], [1, 2, 2]]
  8    [[1, 1, 8], [1, 2, 4], [2, 2, 2]]
 12    [[1, 1, 12], [1, 2, 6], [1, 3, 4], [2, 2, 3]]
 13    [[1, 1, 13]]
 15    [[1, 1, 15], [1, 3, 5]]
 18    [[1, 1, 18], [1, 2, 9], [1, 3, 6], [2, 3, 3]]
 23    [[1, 1, 23]]
 27    [[1, 1, 27], [1, 3, 9], [3, 3, 3]]
 32    [[1, 1, 32], [1, 2, 16], [1, 4, 8], [2, 2, 8], [2, 4, 4]]
 36    [[1, 1, 36], [1, 2, 18], [1, 3, 12],[1, 4, 9], [1, 6, 6], [2, 2, 9], [2, 3, 6], [3, 3, 4]]

No es necesario ordenar las sublistas, siempre que sean únicas.

Puntuación

Este es el código de golf, por lo que la respuesta más corta en bytes gana. Las lagunas estándar están prohibidas.

Aquí hay un generador de casos de prueba

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

# Perl, 43 + 2 (-p flag) = 45 bytes

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Lyxal
fuente

Respuestas:

4

Jalea , 7 bytes

œċ3P⁼¥Ƈ

Un enlace monádico que acepta un entero positivo que produce una lista de 3 listas de enteros positivos.

Pruébalo en línea!

¿Cómo?

œċ3P⁼¥Ƈ - Link: positive integer, N
  3     - literal three
œċ      - all combinations (of [1..N]) of length (3) with replacement
           i.e. [[1,1,1],[1,1,2],...,[1,1,N],[1,2,2],[1,2,3],...,[1,2,N],...,[N,N,N]]
      Ƈ - filter keep those for which:
     ¥  -   last two links as a dyad:
   P    -     product
    ⁼   -     equals (N)?
Jonathan Allan
fuente
5

JavaScript (V8) ,  61  60 bytes

Imprime los cuboides en STDOUT.

n=>{for(z=n;y=z;z--)for(;(x=n/y/z)<=y;y--)x%1||print(x,y,z)}

Pruébalo en línea!

Comentado

n => {                // n = input
  for(                // outer loop:
    z = n;            //   start with z = n
    y = z;            //   set y to z; stop if we've reached 0
    z--               //   decrement z after each iteration
  )                   //
    for(              //   inner loop:
      ;               //     no initialization code
      (x = n / y / z) //     set x to n / y / z
      <= y;           //     stop if x > y
      y--             //     decrement y after each iteration
    )                 //
      x % 1 ||        //     unless x is not an integer,
      print(x, y, z)  //     print the cuboid (x, y, z)
}                     //
Arnauld
fuente
5

Haskell , 52 bytes

f n=[[a,b,c]|a<-[1..n],b<-[1..a],c<-[1..b],a*b*c==n]

Pruébalo en línea!

Las tuplas están en orden descendente. "3" parece ser un número lo suficientemente pequeño como para que escribir los 3 bucles sea más corto que cualquier cosa general que se me ocurra.

xnor
fuente
Me gusta la meta-ofuscación de llamar a las tuplas de contenido de la lista devuelta.
Jonathan Frech
5

Python 3.8 (prelanzamiento) ,  83  80 bytes

lambda n:[[i,j,k]for i in(r:=range(n+1))for j in r[i:]for k in r[j:]if i*j*k==n]

Pruébalo en línea!


... superando una versión de dos bucles por tres bytes:

lambda n:[[i,j,n//i//j]for i in(r:=range(1,n+1))for j in r if(i<=j<=n/i/j)>n%(i*j)]
Jonathan Allan
fuente
4

Jalea , 11 bytes

ÆDṗ3Ṣ€QP=¥Ƈ

Pruébalo en línea!

Un enlace monádico que toma un entero como argumento y devuelve una lista de listas de enteros.

Explicación

ÆD          | Divisors
  ṗ3        | Cartesian power of 3
    Ṣ€      | Sort each list
      Q     | Unique
         ¥Ƈ | Keep only where the following is true (as a dyad, using the original argument as right argument)
       P    | - Product
        =   | - Is equal (to original argument)
Nick Kennedy
fuente
2

Haskell , 67 60 59 bytes

Para una dada norte, esto produce todas las 3 tuplas de con entradas en {1,2,...,norte}y filtra los válidos. Para garantizar la unicidad, requerimos que las tuplas estén ordenadas.

f n=[x|x@[a,b,c]<-mapM id$[1..n]<$":-)",a*b*c==n,a<=b,b<=c]

Pruébalo en línea!

falla
fuente
1
Creo que las tres tuplas solo se pueden producir adecuadamente con una carita sonriente.
Jonathan Frech
: -)
flawr
2

Retina , 59 bytes

.+
*
2+%L$`(?<=(_+))(?=(\1)*$)
$` _$#2*
A`_(_+) \1\b
_+
$.&

Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:

.+
*

Convierte a unario.

2+%L$`(?<=(_+))(?=(\1)*$)
$` _$#2*

Repitiendo dos veces, divida el último número en cada línea en todos sus posibles pares de factores. La mirada atrás es codiciosa y atómica, por lo que una vez que coincida con el prefijo del último número, no retrocederá. Esto genera todas las permutaciones posibles de tres factores.

A`_(_+) \1\b

Eliminar líneas donde los factores no están en orden ascendente.

_+
$.&

Convierte a decimal.

Neil
fuente
2

Pyth , 11 bytes

fqQ*FT.CSQ3

Pruébalo en línea!

        SQ  #              range(1, Q+1)          # Q = input
      .C  3 # combinations(             , 3)
f           # filter(lambda T: vvv, ^^^)
 qQ         # Q == 
   *FT      #      fold(__operator_mul, T) ( = product of all elements)

ar4093
fuente
2

05AB1E , 8 bytes

Ò3.ŒP€{ê
Ò               # prime factors of the input
 3.Œ            # all 3-element partitions
    P           # take the product of each inner list
     €{         # sort each inner list
       ê        # sort and uniquify the outer list

Pruébalo en línea!

Mugriento
fuente
2

C (clang) , 89 bytes

a,b,x;f(n){for(a=n;a;a--)for(b=a;b&&(x=n/a/b)<=b;b--)x*b*a-n||printf("%d,%d,%d ",x,b,a);}

Pruébalo en línea!

Puerto de @Arnauld 👍

Guardado 1 gracias a @Jonathan Frech mejor formato de salida

AZTECCO
fuente
1
"%d %d %d\n"~> "%d,%d,%d "ahorraría un byte.
Jonathan Frech
1

Icono , 87 bytes

procedure f(n)
k:=[]
a:=1to n&b:=1to a&c:=1to b&a*b*c=n&k|||:=[[a,b,c]]&\z
return k
end

Pruébalo en línea!

Cerca de Python :)

Galen Ivanov
fuente