N选择列表


12

给定一个integers列表L和一个integer N,输出L分成N相等长度的子列表。

不可分割的长度

如果N不除的长度L,则不可能所有子列表都具有相等的长度。

无论如何,输出的最后一个子列表是调整其长度以包含列表其余部分的子列表。

这意味着L除最后一个列表外的所有子列表都应为length length(L) // N,其中//为楼底分隔(例如3//2 = 1)。

一些规则

  • L 可以为空。

  • N >= 1

  • 您可以使用任何所需的内置函数。

  • 您可以通过接受输入STDIN,作为函数参数,或类似的东西。

  • 您可以将输出打印到STDOUT,从函数返回它或类似的东西。

  • 您可以为列表和整数选择任何格式,只要它是您语言中最自然的列表和整数表示形式即可。

测试用例

Input:  [1,2,3,4], 2
Output: [[1,2],[3,4]]

Input:  [-1,-2,3,4,-5], 2
Output: [[-1,-2],[3,4,-5]]

Input:  [1,2,3,4], 1
Output: [[1,2,3,4]]

Input:  [4,8,15,16,23,42], 5
Output: [[4],[8],[15],[16],[23,42]]

Input:  [4,8,15,16,23,42], 7
Output: [[],[],[],[],[],[],[4,8,15,16,23,42]]

Input:  [2,3,5,7,11,13,17,19,23], 3
Output: [[2,3,5],[7,11,13],[17,19,23]]

Input:  [], 3
Output: [[],[],[]]

Input:  [1,2,3,4,5,6,7,8], 3
Output: [[1,2],[3,4],[5,6,7,8]]

计分

这是,因此最短的答案以字节为单位。




只有正整数?或添加一个测试用例
Luis Mendo

@LuisMendo不,我更改了一个测试用例以反映这一点。
致命

一个长度为8且长度为n = 3的列表(由user2357112建议)将是一个很好的测试用例-它破坏了我的方法。
xnor

Answers:


2

Pyth,11个10字节

1个字节,感谢@FryAmTheEggman

cJEt*R/lJQ

测试套件。

以相反的顺序输入。

输入样例:

5
[1,2,3,4,5,6,7]

样本输出:

[[1], [2], [3], [4], [5, 6, 7]]

说明

cJEt*R/lJQ     Main function, first input:Q, second input:E.
cJEt*R/lJQQ    Implicit arguments.

c              The function c is special.
               It can chop arrays.
               If the second argument is a list of integers,
               then it chops the first array at the indices
               specified by the second array.

 JE            The first argument is the second input, stored
               to the variable J.

   t*R/lJQQ    This is the second argument.
      /lJQ     Yield length of J, integer-divided by Q.
    *R    Q    Multiply it to the following respectively:
                   [0,1,2,3,...,Q-1]
   t           Then throw away the first element.
               For example, if Q=3 and E=[1,2,3,4,5,6,7,8],
               we would now have [3,6].

4

JavaScript(ES6),63个字节

(a,n,l=a.length/n|0)=>[...Array(n)].map(_=>--n?a.splice(0,l):a)

2

Python,76 73字节

lambda L,N:list(map(lambda x,r=len(L)//N:L[x*r:][:r+(x>N-2)*N],range(N)))

基本上是执行任务的未命名函数。感谢LeakyNun节省了字节!


1
另外,欢迎来到PPCG!
Leaky Nun

@LeakyNun Nun我实际上是73岁。同样,这主要是我的错,因为我在编辑时没有注意太多。在工作codegolfing的危险中:P
Lause

@LeakyNun-首先-它不起作用。对于常规项目,该表达式基本上是[:r],对于最后一个项目,该表达式基本上是[:r + N],应该捕获所有其余元素。第二点-我尝试了所有方法,但我知道让我分配r使它比我的代码更长。
Lause

可以,但是在r *(x> N-2)的情况下,它是[:0],而不是[:]。
Lause

好吧,这里
Leaky Nun

2

Common Lisp,114个字节

(defun f(l n &optional(p(floor(length l)n))(i 1))(if(= i n)(list l)(cons(subseq l 0 p)(f(subseq l p)n p(+ i 1)))))

取消高尔夫:

(defun f (l n &optional (p (floor (length l) n)) (i 1))
  (if (= i n) (list l)
              (cons (subseq l 0 p)
                    (f (subseq l p) n p (+ i 1))))
  )

示例调用:

(format t "~A~C~C" (f (read) (read)) #\return #\newline)

在这里尝试!

基本上:

  • 如果要剪切最后一组,请返回初始列表中剩下的所有内容。
  • 否则,将p = |L| / N元素从列表中删除,然后将其加入到其余部分的递归调用的结果中。i是用于停止条件的迭代计数器。

起初,我误解了挑战,认为程序应该构建N元素N组而不是组。无论如何,此版本的工作需要额外的10个字节。LisP这次不会赢,但是我真的不能错过这个机会:')


2

Haskell,69 67字节

a%b=a#b where l#1=[l];l#n|(h,t)<-splitAt(div(length a)b)l=h:t#(n-1)

用法示例:[1,2,3,4] % 3-> [[1],[2],[3,4]]

一种简单的递归方法,类似于@xnor的answer

编辑:@Will Ness保存了2个字节。谢谢!


h:t#(n-1)也可以。
尼斯(Ness Ness)

1

PowerShell v2 +,125字节

param($l,$n)if($p=[math]::Floor(($c=$l.count)/$n)){1..$n|%{$l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]}}else{(,''*($n-1))+$l}

感觉太长了,但是如果输出中有空数组,我似乎无法想出一种使切片快乐地工作的方法,因此我需要封装if/ else处理这些情况。此外,由于PowerShell .ToString()通过控制台输出的默认数组看起来有些奇怪,因此您可以使用a -join','来在控制台上将数组显示为逗号分隔而不是换行分隔。我已经在下面的示例中做到了这一点,以使输出更加清晰,但是如果您将输出留在管道上以供其他命令使用,则您不想这样做。

说明

分别输入param($l,$n)分区列表和数量。然后,我们输入if/ else语句。如果每个分区的大小,$p是非零(设置助手$c.count一路走来),我们这边的if

里面的if,我们从循环1$n|%{...},和每次迭代,我们正在做一个相当复杂的前瞻性阵列片$l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]。第一个参数是我们的起始索引,它基于我们所在的分区以及分区的大小。我们将其范围设置..为由伪三进制组成的结束索引。在这里,我们$c根据是否在最后一块来选择(数组的字面末尾)还是分区的长度$_-$n

否则,我们将进入else。我们构造一个空数组,其逗号运算符,''*的分区数少于请求的分区数,然后将输入数组作为最后一个元素。

例子

在这里,我展示了用换行符分隔的分区以及用分隔的每个单独元素,,如上所述。

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 2
1,2
3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (-1,-2,3,4,-5) 2
-1,-2
3,4,-5

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 1
1,2,3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 5
4
8
15
16
23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 7






4,8,15,16,23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (2,3,5,7,11,13,17,19,23) 3
2,3,5
7,11,13
17,19,23

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 $null 3



PS C:\Tools\Scripts\golfing> 

1

F#,100 98字节

fun n l->
let a=List.length l/n
List.init n (fun i->if i<n-1 then l.[a*i..a*i+a-1] else l.[a*i..])

使用F#列表切片,用if子句决定是否接一个元素或所有剩余的元素。


1

Prolog,100 99字节。

n(A,B):-length(B,A).
p(L,K,G):-n(K,G),append(A,[_],G),n(N,L),M is N//K,maplist(n(M),A),append(G,L).

致电例如

α-p([1,2,3,4,5,6,7],3,X)。
X = [[1,2],[3,4],[5,6,7]]


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.