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



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)?

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)
}                     //

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.


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


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)


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.


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)


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!


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.