목록 목록의 항목을 순차적으로 단계별로 튜플


9

도전:

비어 있지 않은 정수 목록이 제공되면 다음 형식의 튜플 목록을 반환하십시오. 첫 번째 목록의 각 요소로 시작하는 첫 번째 목록 튜플과 그 이후의 모든 목록의 첫 번째 요소가 이어 지므로 i 번째 튜플은이어야합니다 [ith element of first list, first element of second list, ... , first element of last list]. 예를 들면 다음과 같습니다.

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

그런 다음 형식의 튜플을 수행하십시오. [last element of first list, ith element of second list, first element of third list, ..., first element of last list]이 예에서는 다음과 같습니다.

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

다음에 도달 할 때까지 나머지 각 목록으로 계속 진행하십시오 [last element of first list, ..., last element of second to last list, ith element of last list].

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]

전체 출력은 다음과 같습니다.

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 
        [[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]

좋은 측정을위한 일부 상용구 :

  • 입력이 문자열 목록 또는 양의 정수 목록이되도록하려면 괜찮습니다. 문제는 목록에있는 내용이 아니라 목록 조작에 관한 것입니다.
  • 입력 및 출력은 허용되는 형식이 될 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 기본적으로 허용되지 않습니다.
  • 이 질문은 코드 골프이므로 바이트 수가 가장 적습니다.

예 :

[] => [[]] (or an error, thanks to ngn for correcting the output in this case)

[[1]] => [[1]]

[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]

[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]

[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]

[[1, 2, 3], []] => unspecified behavior (can be an error)

[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] => 
     [[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7], 
      [6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7], 
      [6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]  

[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
    [[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13], 
     [7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13], 
     [15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]

더 나은 타이틀을 가진 사람이 있으면 알려주세요.


1
나는 [] => []정말로 [] => [[]]그래야만하는 이유 가 있지만 그 이유를 설명 할 단어를 찾을 수 없습니다.
ngn

1
@ngn 맞습니다. [[]]각 하위 목록에서 하나의 항목이있는 단일 빈 튜플이 있기 때문입니다. 아마도 프로그램이 이것을 올바르게 출력하도록 요구하는 것은 너무 성가신 일이므로 필요하지 않다고 말할 것입니다.
후드

1
[]엄격하게, 비어 있지 않은리스트의 빈 목록을 말하고,하지만 출력 사이의 모호 []하고 [[]]그것을 허용 입력의 경우. ( "첫 번째 목록의 각 요소로 시작하는 첫 번째 목록 튜플 ..."-첫 번째 목록이 없으므로 완료됩니다-> [])
Jonathan Allan

1
@JonathanAllan 나는 이제 "올바른"출력이 []되어야한다고 확신 한다 [[]]. 예를 들어, 출력 튜플의 수 sum(inner list lengths) - length of outer list + 1는 빈 경우에 제공 1되는 길이이며 길이는 [[]]아니지만 길이입니다 []. 이것은 약간의 사소한 문제이지만 ...
Hood

1
모든 항목이 고유하다고 가정 할 수 있습니까? 또는 더 강력하게, 예에서와 같이 1..n의 순열은 무엇입니까?
xnor

답변:


5

자바 스크립트 (ES6), 59 바이트

양의 정수 목록이 필요합니다 .

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

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

어떻게?

각 반복에서 :

  • 각 목록의 첫 번째 요소로 구성된 새 목록을 출력합니다.
  • 우리는 적어도 두 개의 요소를 포함하는 첫 번째 목록의 첫 번째 요소를 제거하고 프로세스를 반복합니다. 또는 그러한 목록이 없으면 재귀를 중지합니다.

1
a.some트릭은 굉장합니다!
ETHproductions

1
@ETHproductions 이제 awe.some바이트를 낭비하지 않는 도전을 찾고 있습니다 ... :)
Arnauld

2

파이썬 2 , 62 바이트

lambda M:[zip(*M)[l.pop(0)*0]for l in M+[[1,1]]for _ in l[1:]]

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

Arnauld의 JS 제출에서 영감을 얻은 Chas Brown의 팝 아이디어 사용 .


파이썬 2 , 68 바이트

M=input()
for l in[[0,0]]+M:
 for x in l[1:]:l[0]=x;print zip(*M)[0]

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

원하는 값을 유지하기 위해 목록의 첫 번째 요소를 변경합니다. 은 [[0,0]]+초기 첫번째 값을 인쇄하는 추한 해킹입니다.


2

젤리 , 15 바이트

ẈṚṪ×€PƊƤFQṚCịŒp

온라인으로 사용해보십시오! 바닥 글은 젤리 표현이 아닌 실제 반환 목록을 표시합니다.

어떻게?

필요한 지점에서 목록의 데카르트 곱에 대한 색인 ...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(비트 레일 링) 길이가 하나 인 목록의 경우 (14 바이트)가 실패합니다. 그러나 ṣ1T$다른 것으로 대체 될 수 있습니까?


2

K (ngn / k) , 40 21 19 18 바이트

{x@'/:?|\+|!|#:'x}

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

@ H.PWiz의 답변 아이디어를 사용합니다.

{ } 인수 기능 x

#:' 각각의 길이

| 역전

! 차원을 행렬의 열로 갖는 배열에 대한 모든 인덱스 튜플 (목록 목록)

| 역전

+ 바꾸어 놓다

|\ 최대 실행

? 독특한

x@'/: 오른쪽의 각 튜플을의 해당 목록에서 인덱스로 사용하십시오. x


1

, 33 바이트

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

목록의 기본 출력 형식을 사용하여 암시 적으로 인쇄하기 전에 정수를 문자열로 캐스트하십시오. 목록은 각 행의 각 항목이며 중첩 된 목록은 공백입니다.

E⊕ΣEθ⊖Lι

리스트의 길이의 합을 취하여리스트의 길이를 뺍니다. 그런 다음 0에서이 값을 포함하여이 값으로 반복하십시오.

Eθ§λ

목록 목록을 매핑하고 각 목록에 색인을 작성하십시오.

⌈⟦⁰⌊⟦⊖Lλ

인덱스를 0과 목록의 마지막 인덱스로 고정하십시오. 닫는 괄호가 암시됩니다.

⁻ι∧μΣE…θμ⊖Lν

첫 번째 목록 다음에 가장 바깥 쪽 색인에서 모든 이전 목록의 감소 된 길이를 뺍니다. 목록의 길이가 비어 있고 합계가 숫자가 아니기 때문에 첫 번째 목록에서는 작동하지 않습니다.



1

APL (Dyalog Classic) , 32 30 27 바이트

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

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

완전한 프로그램, 입력은 키보드 ( )

입력 []출력 [[]](APL 등가 0⍴⊂⍬,⊂⍬)

입력에서 숫자의 고유성을 가정합니다.


1
출력에 차이가있는 것은 아니지만 두 번째 테스트의 입력은 다음과 같아야합니다.,⊂,1
H.PWiz

@ H.PWiz 맞습니다, 고정, 건배
ngn

1

자바 스크립트 (ES6), 58 54 바이트

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

14 번 이상 내 코드를 골라 내려고 시도했지만 (while 루프의 모든 인스턴스를 제거하고 push, 및 concat) @Arnauld의 답변 과 알고리즘 적으로 유사한 반복에 도착했습니다 .

양의 정수 목록을 허용합니다. 온라인으로 사용해보십시오!

58 바이트

1 바이트 이상 들어 교체 s = y.shift()와 함께 y.shift(s = 1)(나는 개인적으로 그것을 테스트하지 않은 것처럼, 아마도) 모든 정수를 처리해야합니다.

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58 바이트

약간 재정렬 된 보너스 버전 :

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

설명

코드의 초기 버전은 각 배열의 첫 번째 요소 (배열)의 복제본을 수정하려고 시도했지만 배열을 초기화하는 추가 단계는 비용이 많이 들었습니다 ... 각 배열의 첫 번째 요소에 대한 매핑이 대략적으로 이루어 졌다는 것을 깨달았습니다. 원래 배열을 변경하면 "전용"작업이 필요합니다.

부울 플래그를 사용하여 배열이 아직 이동되었는지 (즉, 단축되었는지) 확인합니다. JS가 숫자 값을 가진 유일한 배열을 그 숫자에 해당하는 요소로 배열을 강제하는 반면, 여러 값을 가진 배열을 NaN으로 강제하는 것을 관찰함으로써 조건부 점검을 더 진행했습니다.

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

APL (Dyalog) , 15 바이트 ( SBCS )

불필요한 바이트를 지적 해 주셔서 감사합니다.

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

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

{∪⌈\,⍉⍳≢¨⍵}입력으로 색인 할 목록을 생성합니다. 예 :(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)

≢¨⍵: 입력에서 각 목록의 길이

,⍉⍳입력까지 숫자의 모든 조합을 만듭니다. 예 :2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\: 최대로 스캔합니다. 예를 들어 위의 예는 이제(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

: 중복 제거

⊃¨¨⊂ 어느 쪽의 논증의 깊이를 염두에두고 인덱싱을한다


좋은 답변입니다! 너는 거의 반 바이트만큼 나를 때렸다. 불필요한 것 같습니다 .
ngn


@ngn Nice, 나는 그것이 무엇을 생각하게했는지 기억이 나지 않습니다. 감사!
H.PWiz

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