Output Cuboids a fattore distinto


13

Output Cuboids a fattore distinto

Il compito di oggi è molto semplice: dato un numero intero positivo, emette un rappresentante di ogni cuboide formabile dai suoi fattori.

spiegazioni

Il volume di un cuboide è il prodotto delle sue tre lunghezze laterali. Ad esempio, un parallelepipedo di volume di 4 il cui lato lunghezze sono numeri interi può avere lati [1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], [2, 2, 1], o [4, 1, 1]. Tuttavia, alcuni di questi rappresentano lo stesso cuboide: ad esempio [1, 1, 4]e [4, 1, 1]sono lo stesso cuboide ruotato. Esistono solo due cuboidi distinti con volume 4 e lati interi: [1, 1, 4]e [1, 2, 2]. L'output può essere qualsiasi rappresentazione del primo cuboide e qualsiasi rappresentazione del secondo cuboide.

Ingresso

Il tuo programma deve assumere un singolo numero intero positivo 1n231-1 .

Produzione

Dovrai produrre tutti i cuboidi possibili in un elenco o in qualsiasi altro modo accettabile. Per esempio

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

Gli elenchi secondari non devono essere ordinati, purché siano unici.

punteggio

Questo è il golf del codice, quindi vince la risposta più breve in byte. Sono vietate le scappatoie standard.

Ecco un generatore di test case

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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



Risposte:


4

Gelatina , 7 byte

œċ3P⁼¥Ƈ

Un collegamento monadico che accetta un numero intero positivo che produce un elenco di 3 liste di numeri interi positivi.

Provalo online!

Come?

œċ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 byte

Stampa i cuboidi su STDOUT.

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

Provalo online!

Commentate

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 byte

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

Provalo online!

Le tuple sono in ordine decrescente. "3" sembra essere un numero abbastanza piccolo che scrivere i 3 loop fosse più breve di qualsiasi cosa generale potrei inventare.


Mi piace la meta-offuscamento di chiamare le tuple di contenuto dell'elenco restituito.
Jonathan Frech,

5

Python 3.8 (pre-release) ,  83  80 byte

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]

Provalo online!


... battendo una versione a due loop di tre byte:

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

4

Gelatina , 11 byte

ÆDṗ3Ṣ€QP=¥Ƈ

Provalo online!

Un collegamento monadico che prende un intero come argomento e restituisce un elenco di elenchi di numeri interi.

Spiegazione

Æ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

Haskell , 67 60 59 byte

Per una data n, questo produce tutte le 3 tuple di con voci in {1,2,...,n}e filtra quelli validi. Per garantire l'unicità è necessario che le tuple siano ordinate.

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

Provalo online!


1
Penso che le tre tuple possano essere prodotte correttamente solo con una faccina.
Jonathan Frech,

: -)
flawr

2

Retina , 59 byte

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

Provalo online! Il link include la suite di test. Spiegazione:

.+
*

Converti in unario.

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

Ripetendo due volte, dividi l'ultimo numero su ciascuna riga in tutte le possibili coppie di fattori. Il lookbehind è avido e atomico, quindi una volta abbinato al prefisso dell'ultimo numero non tornerà indietro. Questo genera tutte le possibili permutazioni di tre fattori.

A`_(_+) \1\b

Elimina le righe in cui i fattori non sono in ordine crescente.

_+
$.&

Converti in decimale.


2

Pyth , 11 byte

fqQ*FT.CSQ3

Provalo 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 byte

Ò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

Provalo online!


2

C (clang) , 89 byte

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

Provalo online!

Porto di @Arnauld 👍

Salvato 1 grazie al miglior formato di output di @Jonathan Frech


1
"%d %d %d\n"~> "%d,%d,%d "salverebbe un byte.
Jonathan Frech,

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.