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

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.




Лише додатні цілі числа? А може, додати тестовий випадок
Луїс Мендо

@LuisMendo Ні. Я змінив тестовий випадок, щоб це відобразити.
Фаталізувати

Список довжиною 8 із довжиною n = 3 (запропонований користувачем2357112) був би хорошим тестом - він порушив мій метод.
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

Пітон, 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] для останнього елемента, який повинен охопити всі решта елементів. Другий момент - я спробував, але всі способи, які я знаю, дозволяють мені призначити r, це довше, ніж мій код.
Лауза

Було б, але у випадку r * (x> N-2) це [: 0], а не [:].
Лауза


2

Лист звичайний, 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 .

Редагувати: @Буде Нісс збережений 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для обробки цих випадків. Крім того, оскільки за замовчуванням PowerShell .ToString()для масивів через консольний вихід може виглядати трохи дивно, ви можете скористатись а, -join','щоб показати масиви як розділені комами, а не розділені рядком на консолі. Я зробив це в наведених нижче прикладах, щоб зробити результат більш зрозумілим, але ви цього не хочете робити, якщо ви залишаєте висновок на конвеєрі для отримання іншої команди.

Пояснення

Бере введення param($l,$n)для списку та кількості розділів відповідно. Потім вводимо an if/ elsestatement. Якщо розмір кожного розділу $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 # список нарізки, з якщо п вирішити , чи слід вибрати елементи або всі інші елементи.


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, X).
X = [[1, 2], [3, 4], [5, 6, 7]] .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.