通过顺序浏览列表列表中的元组


9

挑战:

给定一个非空的整数列表,返回一个具有以下形式的元组列表:第一个列表元组以第一个列表的每个元素开头,然后是每个后续列表的第一个元素,因此第一个元组应该为[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是的长度,[[]]而不是的长度[]。不过,这是个书呆子问题...
胡德

1
我们可以假设所有条目都是不同的吗?或者,更强烈地讲,像您的示例一样,对1..n进行排列?
xnor18年

Answers:


5

JavaScript(ES6),59个字节

需要一个整数列表。

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

在线尝试!

怎么样?

在每次迭代中:

  • 我们输出一个由每个列表的第一个元素组成的新列表。
  • 我们删除包含至少2个元素的第一个列表的第一个元素,然后重复该过程。或者,如果不存在这样的列表,我们将停止递归。

1
这个a.some把戏真棒!
ETHproductions

1
@ETHproductions现在正在寻找一个使用awe.some字节数不会浪费字节的挑战... :)
Arnauld


2

果冻,15 字节

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

在线尝试!(页脚显示实际返回的列表,而不是Jelly表示形式)

怎么样?

在所需点上列表的笛卡尔乘积的索引...

ẈṚṪ×€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

JavaScript(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

感谢ngn指出不必要的字节

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

在线尝试!

{∪⌈\,⍉⍳≢¨⍵}生成列表以索引到输入中。例如(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很好,我不记得是什么让我觉得是这样。谢谢!
H.PWiz '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.