Prostopadłościany o charakterystyce wyjściowej

14

Prostopadłościany o charakterystyce wyjściowej

Dzisiejsze zadanie jest bardzo proste: biorąc pod uwagę dodatnią liczbę całkowitą, wypisuje reprezentant każdego prostopadłościanu formowalnego przez jego czynniki.

Objaśnienia

Objętość prostopadłościanu jest iloczynem jego trzech długości boków. Na przykład, sześcienna tom 4, których długości boków są liczbami całkowitymi może mieć boki [1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], [2, 2, 1], i [4, 1, 1]. Jednak niektóre z nich reprezentują ten sam prostopadłościan: np. [1, 1, 4]I [4, 1, 1]są obrócone o tę samą prostopadłościan. Istnieją tylko dwie wyraźne prostopadłościany o objętości 4 i bokach całkowitych: [1, 1, 4]i [1, 2, 2]. Wyjściem może być dowolna reprezentacja pierwszego prostopadłościanu i dowolna reprezentacja drugiego prostopadłościanu.

Wejście

Twój program musi przyjąć jedną dodatnią liczbę całkowitą .1n2)31-1

Wynik

Musisz wyprowadzić wszystkie możliwe prostopadłościany w formie listy lub w inny dopuszczalny sposób. Na przykład

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

Podlisty nie muszą być sortowane, o ile są unikalne.

Punktacja

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki są zabronione.

Oto generator przypadków testowych

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Lyxal
źródło

Odpowiedzi:

4

Galaretka , 7 bajtów

œċ3P⁼¥Ƈ

Monadyczny link akceptujący dodatnią liczbę całkowitą, która daje listę 3-list dodatnich liczb całkowitych.

Wypróbuj online!

W jaki sposób?

œċ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
źródło
5

JavaScript (V8) ,  61  60 bajtów

Drukuje prostopadłościany do STDOUT.

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

Wypróbuj online!

Skomentował

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
źródło
5

Haskell , 52 bajty

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

Wypróbuj online!

Krotki są w kolejności malejącej. „3” wydaje się być wystarczająco małą liczbą, aby napisanie 3 pętli było krótsze niż cokolwiek innego, co mogłem wymyślić.

xnor
źródło
Podoba mi się meta-zaciemnianie wywołania krotek zawartości zwracanej listy.
Jonathan Frech,
5

Python 3.8 (wersja wstępna) ,  83  80 bajtów

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]

Wypróbuj online!


... pokonując wersję dwupętlową o trzy bajty:

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
źródło
4

Galaretka , 11 bajtów

ÆDṗ3Ṣ€QP=¥Ƈ

Wypróbuj online!

Monadyczny link przyjmujący za argument liczbę całkowitą i zwracający listę list liczb całkowitych.

Wyjaśnienie

Æ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
źródło
2

Haskell , 67 60 59 bajtów

n{1,2),,n}

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

Wypróbuj online!

wada
źródło
1
Myślę, że trzy krotki można poprawnie wyprodukować tylko z buźką.
Jonathan Frech,
: -)
flawr
2

Siatkówka , 59 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:

.+
*

Konwertuj na unary.

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

Powtarzając dwa razy, podziel ostatnią liczbę w każdej linii na wszystkie możliwe pary czynników. Wygląd jest chciwy i atomowy, więc po dopasowaniu prefiksu ostatniego numeru nie będzie się cofał. To generuje wszystkie możliwe kombinacje trzech czynników.

A`_(_+) \1\b

Usuń wiersze, w których czynniki nie są w porządku rosnącym.

_+
$.&

Konwertuj na dziesiętny.

Neil
źródło
2

Pyth , 11 bajtów

fqQ*FT.CSQ3

Wypróbuj 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
źródło
2

05AB1E , 8 bajtów

Ò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

Wypróbuj online!

Ponury
źródło
2

C (brzęk) , 89 bajtów

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

Wypróbuj online!

Port @Arnauld 👍

Zapisano 1 dzięki lepszemu formatowi wyjściowemu @Jonathan Frech

AZTECCO
źródło
1
"%d %d %d\n"~> "%d,%d,%d "uratuje bajt.
Jonathan Frech,
1

Ikona , 87 bajtów

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

Wypróbuj online!

Blisko do Pythona :)

Galen Iwanow
źródło