Cuboides de fator distinto de saída

13

Cuboides de fator distinto de saída

A tarefa de hoje é muito simples: dado um número inteiro positivo, produza um representante de cada cubóide formavel por seus fatores.

Explicações

O volume de um cubóide é o produto de seus três comprimentos laterais. Por exemplo, um volume de 4 cubóide de cujo lado comprimentos são inteiros podem ter lados [1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], [2, 2, 1], ou [4, 1, 1]. No entanto, alguns deles representam o mesmo cubóide: por exemplo, [1, 1, 4]e [4, 1, 1]são o mesmo cubóide rotacionado. Existem apenas dois cuboides distintos com volume 4 e lados inteiros: [1, 1, 4]e [1, 2, 2]. A saída pode ser qualquer representação do primeiro cubóide e qualquer representação do segundo cubóide.

Entrada

Seu programa deve ter um único número inteiro positivo .1n231-1

Resultado

Você precisará gerar todos os cuboides possíveis em uma lista ou de qualquer outra maneira aceitável. Por exemplo

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]]

As sub-listas não precisam ser classificadas, desde que sejam únicas.

Pontuação

Isso é código de golfe, então a resposta mais curta em bytes vence. As brechas padrão são proibidas.

Aqui está um gerador de caso de teste

Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

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

Lyxal
fonte

Respostas:

4

Geléia , 7 bytes

œċ3P⁼¥Ƈ

Um link monádico que aceita um número inteiro positivo que produz uma lista de 3 listas de números inteiros positivos.

Experimente online!

Quão?

œċ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
fonte
5

JavaScript (V8) ,  61  60 bytes

Imprime os cuboides em STDOUT.

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

Experimente online!

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
fonte
5

Haskell , 52 bytes

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

Experimente online!

As tuplas estão em ordem decrescente. "3" parece ser um número pequeno o suficiente para escrever os 3 loops era mais curto do que qualquer coisa geral que eu pudesse criar.

xnor
fonte
Gosto da meta-ofuscação de chamar as tuplas de conteúdo da lista retornada.
Jonathan Frech
5

Python 3.8 (pré-lançamento) ,  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]

Experimente online!


... superando uma versão de dois ciclos por três 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
fonte
4

Gelatina , 11 bytes

ÆDṗ3Ṣ€QP=¥Ƈ

Experimente online!

Um link monádico usando um número inteiro como argumento e retornando uma lista de listas de números inteiros.

Explicação

Æ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
fonte
2

Haskell , 67 60 59 bytes

n{1,2,...,n}

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

Experimente online!

flawr
fonte
1
Eu acho que três tuplas só podem ser produzidas adequadamente com um smiley.
Jonathan Frech
: -)
flawr
2

Retina , 59 bytes

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

Experimente online! O link inclui o conjunto de testes. Explicação:

.+
*

Converta para unário.

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

Repetindo duas vezes, divida o último número de cada linha em todos os possíveis pares de fatores. O lookbehind é ganancioso e atômico, portanto, uma vez que corresponda ao prefixo do último número, ele não retornará. Isso gera todas as permutações possíveis de três fatores.

A`_(_+) \1\b

Exclua as linhas onde os fatores não estão em ordem crescente.

_+
$.&

Converta para decimal.

Neil
fonte
2

Pitão , 11 bytes

fqQ*FT.CSQ3

Experimente online!

        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
fonte
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

Experimente online!

Grimmy
fonte
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);}

Experimente online!

Porto de @Arnauld 👍

Guardado 1 graças a @Jonathan Frech melhor formato de saída

AZTECCO
fonte
1
"%d %d %d\n"~> "%d,%d,%d "salvaria um byte.
Jonathan Frech
1

Ícone , 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

Experimente online!

Perto de Python :)

Galen Ivanov
fonte