N-чотомизировать список

12

Учитывая список целых чисел Lи целое число N, выходные данные Lразделены на Nподсписки одинаковой длины.

Неделимые длины

Если 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]]

счет

Это , поэтому выигрывает самый короткий ответ в байтах.

Fatalize
источник
Только положительные целые числа? Или, может быть, добавить тестовый пример
Луис Мендо
@ LuisMendo Нет. Я изменил тестовый пример, чтобы отразить это.
Роковая
Список длины 8 с длиной n = 3 (предложенный user2357112) был бы хорошим тестовым примером - он сломал мой метод.
xnor

Ответы:

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 за сохраненные байты!

Lause
источник
1
Кроме того, добро пожаловать в PPCG!
Утренняя монахиня
@LeakyNun Nun Это 73, я думаю, на самом деле. Кроме того, это в основном моя вина, так как я не уделял много внимания редактированию. Опасности игры в гольф на работе: 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)))))

Ungolfed:

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

Редактировать: @ Уилл Несс спас 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, мы перебираем от 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> 
AdmBorkBork
источник
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 # список нарезки, с если п решить , следует ли выбрать элементы или все остальные элементы.

хло
источник
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).

Позвоните, например

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

Уилл Несс
источник