N-chotomize daftar

12

Diberikan daftar bilangan bulat L, dan bilangan bulat N, keluaran Ldibagi dalam daftar panjang yang Nsama.

Panjang tidak dapat dibagi

Jika Ntidak membagi panjang L, maka tidak mungkin semua sublist memiliki panjang yang sama.

Dalam setiap kasus, sublist terakhir dari output adalah salah satu yang menyesuaikan panjangnya untuk mengandung sisa daftar.

Ini berarti bahwa semua sublist Lkecuali untuk yang terakhir harus panjang length(L) // N, di mana //pembagian lantai (misalnya 3//2 = 1).

Beberapa peraturan

  • L bisa kosong.

  • N >= 1.

  • Anda dapat menggunakan built-in yang Anda inginkan.

  • Anda dapat mengambil input melalui STDIN, sebagai argumen fungsi, atau yang serupa.

  • Anda dapat mencetak output ke STDOUT, mengembalikannya dari fungsi, atau yang serupa.

  • Anda dapat memilih format apa pun untuk daftar dan bilangan bulat selama itu adalah representasi paling alami dari daftar dan bilangan bulat dalam bahasa Anda.

Uji kasus

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Terkait
Fatalkan
Juga terkait
Sp3000
Hanya bilangan bulat positif? Atau mungkin menambahkan test case
Luis Mendo
@LuisMendo No. Saya mengubah test case untuk mencerminkan hal itu.
Fatalkan tanggal
Daftar panjang 8 dengan panjang n = 3 (disarankan oleh user2357112) akan menjadi ujian yang baik - itu merusak metode saya.
xnor

Jawaban:

2

Pyth, 11 10 byte

1 byte terima kasih kepada @FryAmTheEggman .

cJEt*R/lJQ

Suite uji.

Mengambil input dalam urutan terbalik.

Input sampel:

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

Output sampel:

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

Penjelasan

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].
Biarawati Bocor
sumber
4

JavaScript (ES6), 63 byte

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

Python, 76 73 byte

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

Pada dasarnya fungsi yang tidak disebutkan namanya yang melakukan tugas. Terima kasih kepada LeakyNun untuk byte yang disimpan!

Lause
sumber
1
Juga, selamat datang di PPCG!
Leaky Nun
@LeakyNun Nun 73 tahun, saya pikir sebenarnya. Juga sebagian besar kesalahan saya karena saya tidak memperhatikan saat mengedit. Bahaya terjadinya pelanggaran kode di tempat kerja: P
Lause
@ LeakyNun - ke titik pertama - tidak bekerja. Ekspresi pada dasarnya adalah [: r] untuk item reguler dan [: r + N] untuk item terakhir, yang seharusnya menangkap semua elemen yang tersisa. Poin kedua - saya mencoba tetapi semua cara saya tahu bahwa biarkan saya menetapkan r membuatnya lebih lama dari kode saya.
Lause
Ya, tetapi dalam kasus r * (x> N-2) itu [: 0], bukan [:].
Lause,
Nah, di sini
Leaky Nun
2

Common Lisp, 114 byte

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

Tidak Disatukan:

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

Contoh panggilan:

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

Coba di sini!

Pada dasarnya:

  • Jika kami memotong grup terakhir, kembalikan apa pun yang tersisa dari daftar awal.
  • Kalau tidak, p = |L| / Nkeluarkan elemen dari daftar dan gabungkan ke hasil panggilan rekursif pada sisanya. iadalah penghitung iterasi yang digunakan untuk kondisi berhenti.

Saya telah salah paham tentang tantangan pada awalnya, berpikir program harus membangun kelompok Nelemen daripada Nkelompok. Bagaimanapun, versi ini melakukan pekerjaan untuk 10 byte tambahan. LisP tidak akan menang saat ini tetapi saya tidak bisa melewatkan kesempatan: ')

John WH Smith
sumber
2

Haskell, 69 67 byte

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

Contoh penggunaan: [1,2,3,4] % 3-> [[1],[2],[3,4]].

Pendekatan rekursif sederhana, mirip dengan jawaban @ xnor .

Sunting: @ Akankah Ness menyimpan 2 byte. Terima kasih!

nimi
sumber
h:t#(n-1)juga berfungsi.
Will Ness
1

PowerShell v2 +, 125 byte

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

Terasa terlalu lama, tapi sepertinya saya tidak bisa menemukan cara untuk membuat pengiris bekerja dengan bahagia jika ada array kosong dalam output, jadi saya perlu enkapsulasi if/ elseuntuk menangani kasus-kasus itu. Selain itu, karena standar PowerShell .ToString()untuk array melalui output konsol dapat terlihat sedikit aneh, Anda dapat menempel pada -join','untuk menunjukkan array sebagai dipisahkan oleh koma daripada dipisahkan oleh baris pada konsol. Saya telah melakukan itu dalam contoh di bawah ini untuk membuat output lebih jelas, tetapi Anda tidak ingin melakukan itu jika Anda meninggalkan output pada pipeline untuk diambil perintah lain.

Penjelasan

Mengambil input param($l,$n)untuk daftar dan jumlah partisi, masing-masing. Kami kemudian memasukkan if/ elsepernyataan. Jika ukuran setiap partisi, $pbukan-nol (pengaturan helper $cmenjadi .countsepanjang jalan), kita berada di if.

Di dalam if, kita loop dari 1ke $ndengan |%{...}, dan setiap iterasi kita melakukan irisan array yang cukup kompleks $l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]. Parens pertama adalah indeks awal kami, berdasarkan pada partisi yang kami gunakan dan seberapa besar ukuran partisi kami. Kami mengukurnya ..dengan indeks akhir kami, yang dibentuk dari pseudo-ternary . Di sini, kami memilih antara $c(akhir literal array), atau panjang partisi kami, berdasarkan apakah kami berada di chunk terakhir $_-$natau tidak.

Kalau tidak, kita di else. Kami membangun array kosong dengan koma-operator ,''*sama dengan satu partisi lebih sedikit daripada yang diminta, dan kemudian menempel pada array input sebagai elemen terakhir.

Contohnya

Di sini saya menunjukkan partisi yang dipisahkan dengan baris baru dan masing-masing elemen terpisah ,, seperti dijelaskan di atas.

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> 
AdmBorkBork
sumber
1

F #, 100 98 byte

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

Menggunakan F # daftar mengiris, dengan jika klausul memutuskan apakah akan memilih sebuah elemen atau semua elemen yang tersisa.

hlo
sumber
1

Prolog, 100 99 byte.

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

Panggil misalnya

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

Will Ness
sumber
0

PHP, 109 Bytes

<?for($n=(count($a=$_GET[0]))/($d=$_GET[1])^0;$i<$d;)$r[]=array_slice($a,$i*$n,++$i==$d?NULL:$n);print_r($r);

Semua Testcases

Jörg Hülsermann
sumber