Декартовий твір списку з собою n разів


10

Якщо вам надано список значень і натуральне ціле число n, ваш код повинен вивести декартовий добуток списку із самим nчасом.

Наприклад, у псевдокоді ваша функція може бути схожа на:

for x1 in list:
    for x2 in list:
        for x3 in list:
            ...
            for xn in list:
                print x1, x2, x3, ... , xn

Приклад:

repeated_cart([1,2,3], 3)

1 1 1  
1 1 2  
1 1 3  
1 2 1  
1 2 2  
1 2 3  
1 3 1  
1 3 2  
1 3 3  
2 1 1  
2 1 2  
2 1 3  
2 2 1  
2 2 2  
2 2 3  
2 3 1  
2 3 2  
2 3 3  
3 1 1  
3 1 2  
3 1 3  
3 2 1  
3 2 2  
3 2 3  
3 3 1  
3 3 2  
3 3 3

Вбудовані функції (або функції із імпортованих бібліотек), які обчислюють декартовий продукт (або потужність), заборонені, оскільки отриманий код є дещо нудним.

Вхідні та вихідні дані повинні бути обмеженими, але їх можна прийняти будь-яким розумним методом.

порядок виведення результатів не має значення, але копії заборонені.

Це вперше я публікую запитання, тому, якщо я зробив щось жахливо неправильне, будь ласка, скажіть мені.


5
Ласкаво просимо до PPCG! Нічого страшного неправильного, але знайдіть трохи часу, щоб переглянути цей мета-пост та відповіді. Що слід уникати під час написання викликів
JayCe

4
і слідкувати за пунктом @JayCe, ви можете (слід) опублікувати в The Sandbox, щоб отримати зворотній зв'язок перед тим, як розміщувати питання :-)
Джузеппе

@Giuseppe Добре, я зроблю це відтепер, дякую :)
JoshM


1
@Jakob набори повинні бути добре
JoshM

Відповіді:



6

Звичайний Лисп , 146 байт

(defun f(l n)(if(< n 2)(loop for x in l collect(list x))(loop for a in l nconc(loop for b in(f l(1- n))collect(cons a b)))))(princ(f(read)(read)))

Спробуйте в Інтернеті!

неозорий

(defun nloops (lst n)
  (if (< n 1)
      '(())
      (if (< n 2)
          (loop for x in lst collect (list x))
          (loop for a in lst
                nconc (loop for b in (nloops lst (1- n))
                            collect (cons a b))))))

2
Зазвичай ми пропонуємо чекати інших публікацій, перш ніж опублікувати одне із своїх :-)
Джузеппе

1
@Giuseppe Добре, дякую за пораду :)
JoshM

1
у поданні ви не повинні мати твердження про друк, оскільки функція дозволена
лише ASCII

1
так: 96
лише ASCII


6

R , 41 байт

function(l,n)unique(t(combn(rep(l,n),n)))

Спробуйте в Інтернеті!

combnце, безумовно, не вбудований декартовий продукт, оскільки він обчислює всі nкомбінації вкладених даних.

R , 40 байт

function(l,n)expand.grid(rep(list(l),n))

Спробуйте в Інтернеті!

expand.grid мабуть, вбудований декартовий продукт.


Схоже, порядок перестановок у вашому головному поданні неправильний.
Кирило Л.

@KirillL. чи є якась конкретна причина, для якої важливий порядок? Я інтерпретував специфікацію виходу як досить гнучку, щоб дозволити їх у будь-якому порядку.
Джузеппе

є коментар ОП "переконайтеся, що результат у правильному порядку", я припускаю, що "правильний" означає те саме, що в прикладі.
Кирило Л.

@KirillL. Ага. Не бачив цього; це не в тілі питання, тому я не знав, що воно існує! Я попрошу, щоб його туди поставили для роз'яснення.
Джузеппе


3

K (нг / к) , 10 байт

{x@+!y##x}

Спробуйте в Інтернеті!

{ }є функцією з аргументами xіy

#x довжина x

y##xтривалість xповторних yразів

!y##x всю довжину-y кортежі понад 0,1, ..., довжину (x) -1 у вигляді транспонованої матриці

+ переносити

x@елементи xцих індексів


3

APL (Dyalog Classic) , 18 12 байт

{⍺[↑,⍳⍵⍴≢⍺]}

Спробуйте в Інтернеті!

-6 байт завдяки @ngn!


ви можете використовувати з векторним аргументом для генерування індексів, а потім ⍺[ ]отримати відповідні значення
ngn

У мене з’явилося, RANK ERRORколи я намагався це зробити.
Zacharý


єдиний улов з ⍵ = 1, у цьому випадку ⍳ повертає звичайний вектор, а не вектор вкладених векторів довжини-1, як можна було б очікувати; це одна з тих помилок , які ніколи не фіксованою, з причин забезпечення сумісності
NGN



3

Рубін , 53 байти

f=->l,n{n<2?l:l.flat_map{|i|f[l,n-1].map{|j|[i,*j]}}}

Спробуйте в Інтернеті!

Рекурсивний підхід, не такий короткий, але гарантовано позбавлений будь-яких вбудованих модулів.

Заманливо використовувати методи перестановки, але це, мабуть, не враховується, і документи фактично не містять гарантій правильності замовлення, хоча, здається, працюють на практиці:

Рубін , 35 байт

->l,n{[*l.repeated_permutation(n)]}

Спробуйте в Інтернеті!




2

Желе , 11 9 7 байт

³;þẎƊ’¡

Спробуйте в Інтернеті!

Пояснення

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times

Подивіться коментар OP: p
Zacharý

Мій коментар, до якого я підніс це: "Я також припускаю, що вбудовані проекти на весь виклик також відключені", тому я просто припустив, що це нормально.
Zacharý

Що ж, будемо чекати тоді OP
Zacharý

@ Zacharý вибачте, декартові функції живлення заборонені
JoshM

3
Я не знаю, два вкладені для циклу подібні, це в основному визначення декартового продукту. Я не кажу, що ви повинні це змінити, я просто думаю, що заборона вбудованого в цей виклик є якось незрозумілою.
ділнан

2

Pure Bash (без зовнішніх утиліт), 57

printf -vn %0$1d
a=${n//0/{$2\}}
eval echo ${a//\}{/\},{}

Введення задано як параметри командного рядка; 1-ий є n, 2-й - список, розділений комами.

printf -vn %0$1d         ;# Create a string of n "0"s in the variable v
a=${n//0/{$2\}}          ;# Replace each "0" with "{a,b,...m}"
eval echo ${a//\}{/\},{} ;# Replace each "}{" with "},{" and evaluate the resulting brace expansion

Спробуйте в Інтернеті!


2

Java 10, 19 + 135 = 154 байти

import java.util.*;

List<List>f(Set l,int n){var o=new Stack();if(n<1)o.add(new Stack());else for(var t:l)for(var i:f(l,n-1)){i.add(t);o.add(i);}return o;}

Спробуйте це в Інтернеті

Безумовно

List<List> f(Set l, int n) {
    var o = new Stack();
    if (n < 1)
        o.add(new Stack());
    else
        for (var t : l)
            for (var i : f(l, n - 1)) {
                i.add(t);
                o.add(i);
            }
    return o;
}

Подяка

  • порт на Java 10 завдяки Кевіну Крейсейну

Якщо ви використовуєте Java 10 замість 8, ви можете змінити Objectі Listв циклі для кожного циклу на var-4 байти. Крім того, ви можете змінити Set<List>fна List<List>fта Set o=new HashSet();на var o=new Stack();додатковий -1 байт. Спробуйте в Інтернеті.
Кевін Кройсейсен

Хм. випуск типів для лямбда вже не дійсний
лише для ASCII

@ Тільки ASCII Ні, нетипізовані лямбдахи дозволено. Я не міг використати лямбда тут, тому що розчин використовує рекурсію.
Якоб

@Jakob ах, це правильно> _>
ASCII лише для

2

Oracle SQL, 177 байт

Створіть тип колекції (31 байт):

CREATE TYPE t IS TABLE OF INT;

Потім використовуйте запит (146 байт):

WITH n(a,b,c)AS(SELECT a,b,t()FROM i UNION ALL SELECT a,b-1,c MULTISET UNION t(COLUMN_VALUE)FROM n,TABLE(n.a)WHERE b>=0)SELECT c FROM n WHERE b=0

Якщо припустити, що вхідні параметри знаходяться в таблиці iзі стовпцями aта b:

CREATE TABLE i (a t,b INT) NESTED TABLE a STORE AS t_a;
INSERT INTO i VALUES ( t(1,2,3), 3 );

SQL Fiddle

Результати :

|     C |
|-------|
| 1,1,1 |
| 1,1,2 |
| 1,1,3 |
| 1,2,1 |
| 1,2,2 |
| 1,2,3 |
| 1,3,1 |
| 1,3,2 |
| 1,3,3 |
| 2,1,1 |
| 2,1,2 |
| 2,1,3 |
| 2,2,1 |
| 2,2,2 |
| 2,2,3 |
| 2,3,1 |
| 2,3,2 |
| 2,3,3 |
| 3,1,1 |
| 3,1,2 |
| 3,1,3 |
| 3,2,1 |
| 3,2,2 |
| 3,2,3 |
| 3,3,1 |
| 3,3,2 |
| 3,3,3 |


1

Javascript (Вузол) , 75 байт

c=(m,n,a,i)=>a.length-n?m.map((_,j)=>c(m,n,[...a,m[j]],i+1)):console.log(a)

Рекурсивна функція, яка виводить список на консоль. Де aпорожній масив і iдорівнює 0 (не впевнений, що це все ще відповідає):

c([1,2,3], 3, [], 0);

Спробуйте в Інтернеті!


1
Я думаю, що вам доведеться це зробити(m,n,a=[],i=0)=>
Artyer


1

J , 17 байт

]{~(##)#:#@]i.@^[

Як це працює?

Я перераховую всі n-значні числа в системі чисел із базовою довжиною списку.

            i.         - creates a list from zero to (not including)
         #@]           - the length of the list 
              @^       - to the power of
                [      - n (left argument)
   (##)                - creates a list of n times the length of the list (for the bases)
       #:              - converts all the numbers into lists of digits in the new base
]{~                    - use the digits as indices into the list

Спробуйте в Інтернеті!




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.