Кубы с разным коэффициентом выхода

13

Кубы с разным коэффициентом выхода

Сегодняшняя задача очень проста: с положительным целым числом выведите представителя каждого кубоида, который можно сформировать по его факторам.

Пояснения

Объем кубоида является произведением его трех сторон длины. Так , например, параллелепипед объема 4, боковые длины представляют собой целые числа могут иметь стороны [1, 1, 4], [1, 2, 2], [1, 4, 1], [2, 1, 2], [2, 2, 1], или [4, 1, 1]. Однако некоторые из них представляют один и тот же кубоид: например, [1, 1, 4]и один [4, 1, 1]и тот же кубоид вращается. Есть только два отдельных кубоида с объемом 4 и целыми сторонами: [1, 1, 4]и [1, 2, 2]. Выход может быть любым представлением первого кубоида и любым представлением второго кубоида.

вход

Ваша программа должна принимать одно положительное целое число 1N231-1 .

Выход

Вам нужно будет вывести все возможные кубоиды в списке или любым другим приемлемым способом. Например

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

Подсписки не нужно сортировать, если они уникальны.

счет

Это код гольфа, поэтому выигрывает кратчайший ответ в байтах. Стандартные лазейки запрещены.

Вот генератор тестовых случаев

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в свой заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать название языка ссылкой, которая затем будет отображаться в фрагменте списка лидеров:

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

Lyxal
источник

Ответы:

4

Желе , 7 байт

œċ3P⁼¥Ƈ

Монадическая ссылка, принимающая положительное целое число, которое выдает список из 3-х списков натуральных чисел.

Попробуйте онлайн!

Как?

œċ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 байт

Печатает кубоиды в STDOUT.

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

Попробуйте онлайн!

комментарии

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
источник
5

Haskell , 52 байта

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

Попробуйте онлайн!

Кортежи в порядке убывания. «3» кажется достаточно малым числом, чтобы выписать 3 цикла было короче всего, что я мог придумать.

XNOR
источник
Мне нравится мета-обфускация вызова кортежей содержимого возвращенного списка.
Джонатан Фрех
4

Желе , 11 байт

ÆDṗ3Ṣ€QP=¥Ƈ

Попробуйте онлайн!

Монадическая ссылка, принимающая целое число в качестве аргумента и возвращающая список списков целых чисел.

объяснение

Æ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 байт

N{1,2,...,N}

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

Попробуйте онлайн!

flawr
источник
1
Я думаю, что три кортежа могут быть правильно сделаны только со смайликом.
Джонатан Фрех
: -)
flawr
2

Сетчатка , 59 байт

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

Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение:

.+
*

Преобразовать в одинарный.

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

Повторяя дважды, разделите последнее число в каждой строке на все возможные пары факторов. Внешний вид является жадным и атомарным, поэтому, если он соответствует префиксу последнего номера, он не будет возвращен. Это создает все возможные перестановки трех факторов.

A`_(_+) \1\b

Удалите строки, где факторы не в порядке возрастания.

_+
$.&

Преобразовать в десятичную.

Нил
источник
2

C (лязг) , 89 байт

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

Попробуйте онлайн!

Порт @ Арнаулд 👍

Сохранено 1 благодаря лучшему выходному формату @Jonathan Frech

AZTECCO
источник
1
"%d %d %d\n"~> "%d,%d,%d "сохранил бы байт.
Джонатан Фрех