자체 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의 요점에 따라 질문을 게시하기 전에 피드백을 얻기 위해 샌드 박스 에 게시해야합니다 :-)
Giuseppe

@Giuseppe Ok, 지금부터 할게요, 고마워요 :)
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
일반적으로 우리는 자신의 것 중 하나를 게시하기 전에 다른 제출을 기다리는 것이 좋습니다 :-)
Giuseppe

1
@Giuseppe Ok, 조언 주셔서 감사합니다 :)
JoshM

1
함수가 허용되므로 제출시 print 문을 사용할 필요가 없습니다.
ASCII 전용

1
그래서 : 96
ASCII-only


6

R , 41 바이트

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

온라인으로 사용해보십시오!

combnn입력의 모든 조합을 계산하므로 확실히 직교 제품이 아닙니다 .

R , 40 바이트

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

온라인으로 사용해보십시오!

expand.grid 아마도 직교 제품 내장 일 것입니다.


기본 제출의 순열 순서가 잘못된 것 같습니다.
Kirill L.

@KirillL. 주문이 중요한 특별한 이유가 있습니까? 나는 출력 스펙을 임의의 순서로 허용 할 수있을 정도로 유연하다고 해석했다.
주세페

OP의 의견에 "출력이 올바른 순서로되어 있는지 확인하십시오"라는 말이 있습니다. "올바른"은 예와 같은 의미라고 생각했습니다.
Kirill L.

@KirillL. 아 그것을 보지 못했다; 그것은 질문의 본문에 없기 때문에 그것이 존재한다는 것을 몰랐습니다! 나는 그것을 명확히하기 위해 거기에 도착하도록 요청할 것입니다.
주세페


3

K (ngn / k) , 10 바이트

{x@+!y##x}

온라인으로 사용해보십시오!

{ }인수가있는 함수 x이며y

#x ~의 길이 x

y##x의 길이 x반복 y시간

!y##x 0,1, ..., 길이 (x) -1 이상의 모든 길이 -y 튜플을 조옮김 행렬로

+ 바꾸어 놓다

x@x그 지수의 요소


3

APL (Dyalog Classic) , 18 12 바이트

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

온라인으로 사용해보십시오!

@ngn 덕분에 -6 바이트!


당신은 할 수 있습니다 사용 후 인덱스를 생성하는 벡터 인수 및 ⍺[ ]해당 값을 얻기 위해
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

라켓, 92 바이트

(define(f l n)(if(> n 0)(apply append(map(λ(r)(map(λ(e)(cons e r))l))(f l(- n 1))))'(())))

온라인 시도

언 골프

(define (f l n)
    (if (> n 0)
        (apply append
            (map
                (λ (r)
                    (map (λ (e) (cons e r)) l)
                )
                (f l (- n 1))
            )
        )
        '(())
    )
)

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 개의 중첩 for 루프는 기본적으로 직교 곱의 정의입니다. 나는 당신이 그것을 바꿔야한다고 말하는 것이 아닙니다. 나는이 도전에 내장 된 것을 금지하는 것이 불분명하다고 생각합니다.
dylnan

2

퓨어 배쉬 (외부 유틸리티 없음), 57

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

입력은 명령 행 매개 변수로 제공됩니다. 첫 번째는 n이고 두 번째는 쉼표로 구분 된 목록입니다.

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

자바 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;
}

감사의 말

  • Kevin Cruijssen 덕분에 Java 10으로 포트

자바 (10) 대신 8을 사용하는 경우에는 변경 ObjectList를위한 각 루프에에 var대한 -4 바이트. 또한, 당신은 변경할 수 있습니다 Set<List>fList<List>fSet o=new HashSet();var o=new Stack();추가 -1 바이트를 위해. 온라인으로 사용해보십시오.
Kevin Cruijssen

흠. 더 이상 유효 람다에 대한 유형을 떠나하지 않습니다
ASCII 전용

@ASCII 전용 아니요, 형식화되지 않은 람다는 허용됩니다. 솔루션이 재귀를 사용하기 때문에 람다를 사용할 수 없습니다.
Jakob

@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

입력 매개 변수가 테이블에 있다고 가정하면 iab:

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

SQL 바이올린

결과 :

|     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

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

온라인으로 사용해보십시오!




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.