リストを選択する


12

整数のリストと整数Lを指定すると、等しい長さのサブリストに分割されたN出力。LN

割り切れない長さ

Nの長さを分割しない場合L、すべてのサブリストが同じ長さになることはできません。

いずれの場合でも、出力の最後のサブリストは、リストの残りを含むようにその長さを適合させるものです。

すべてのサブリストというこの手段L最後のものを除いては、長さであるべきであるが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]]

得点

これはであるため、バイト単位の最短回答が優先されます。




正の整数のみ?または、テストケースを追加する
ルイスメンドー

@LuisMendoいいえ。テストケースを変更して、それを反映しました。
16年

長さn = 3の長さ8のリスト(user2357112が推奨)は、良いテストケースになります-私の方法を破りました。
-xnor

回答:


2

Pyth、11 10バイト

@FryAmTheEggmanのおかげで1バイト。

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へようこそ!
リーキー修道女

@LeakyNun Nun実は73だと思う。また、編集中はあまり注意を払っていなかったため、ほとんどが私のせいです。職場でのコードゴルフの危険:P
Lause

@LeakyNun-最初の点まで-それは動作しません。式は基本的に、通常のアイテムの場合は[:r]、最後のアイテムの場合は[:r + N]で、残りのすべての要素をキャッチすることになっています。2番目のポイント-私は試しましたが、rを割り当てることができるすべての方法が私のコードよりも長くなりました。
-Lause

しかし、r *(x> N-2)の場合は[:0]であり、[:]ではありません。
-Lause


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の回答に似た単純な再帰的アプローチ。

編集:@Will Nessは2バイトを節約しました。ありがとう!


h:t#(n-1)動作します。
ウィルネス

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これらのケースを処理です。さらに、.ToString()コンソール出力を介した配列のPowerShellのデフォルトは少し奇妙に見える可能性があるため、配列をコンソール上-join','で改行ではなくコンマ区切りで表示することができます。以下の例では、出力をより明確にするためにこれを行っていますが、別のコマンドを取得するために出力をパイプラインに残す場合は、これを行いたくないでしょう。

説明

param($l,$n)リストとパーティションの数をそれぞれ入力します。次にif/ elseステートメントを入力します。各パーティションのサイズが$pゼロでない場合(ヘルパー$c.count途中に設定する)、私たちはifます。

の内部でif、from 1から$nwith |%{...}にループし、各反復でかなり複雑に見える配列sliceを実行しています$l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]。最初の括弧は、現在のパーティションとパーティションサイズの大きさに基づいた開始インデックスです。疑似三項..から形成される終了インデックスでその範囲を設定します。ここでは、最後のチャンクにいるかどうかに基づいて、(配列のリテラルの終わり)、またはパーティションの長さのいずれかを選択しています。$c$_-$n

そうでなければ、我々はにいますelse,''*要求されたパーティションよりも1つ少ないパーティションに等しいカンマ演算子を使用して空の配列を作成し、最後の要素として入力配列を追加します。

ここでは,、上記のように、改行で区切られたパーティションと、で区切られた個々の要素を示しています。

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..])

要素を選択するか、残りのすべての要素を選択するかを決定するif句を使用して、F#リストスライスを使用します。


1

プロローグ、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]]


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.