Створіть фрагменти з масиву


21

Ваше завдання - написати програму, яка задала масив і число, вам потрібно розділити масив на шматки з розміром число.

Правила

Ваша програма отримає масив A, а також додатне ціле число n. Потім масив слід розділити на шматки довжини n, якщо довжина рядка не ділиться nжодним залишком на кінці, слід вважати його власним відрізком.

  • Якщо nбільша довжина масиву A, вам потрібно буде повернути масив A, наприклад: якщо n = 4і array A = [1,2,3], ви повинні повернутися[1,2,3]

  • Масив може містити будь-який тип, а не число.

  • Не слід змінювати порядок (або напрямок) будь-якого предмета зліва направо. Наприклад if n = 2і A= [1,2,3]. Будь-який результат, а не [[1,2],[3]]буде недійсним.

Випробування

n   A               Output

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

Це , тож найкоротший байт кожної мови стане переможцем.


4
Якщо nбільша довжина, яку Aнам потрібно повернути‽ AВи впевнені, що не маєте на увазі [A]?
— Адам

9
@chaugiang Я все ще думаю, що надто великий nповинен повернутися [A], наприклад [[1,2,3]]. Що робити, якщо nрівно довжина A?
— Адам

4
@chaugiang Адам правильно. Повернене значення повинно бути послідовним.
— Йона

1
@chaugiang Can п завжди дорівнює 1 ?
— DJMcMayhem

4
У сильно набраній мові повернутися просто неможливо, Aа [A] це виключає дуже багато мов.
— dfeuer

Відповіді:



9

JavaScript (ES6), 36 байт

Вводиться як " (n)(array).

n=>g=a=>a+a&&[a.splice(0,n),...g(a)]

Спробуйте в Інтернеті!

Прокоментував

n =>                  // n = chunk size
  g = a =>            // g = recursive function taking the array a[]
    a + a             // if a[] is empty, stop recursion and return an empty string
    &&                // otherwise, return an array made of:
    [ a.splice(0, n), //   the next chunk
      ...g(a)         //   followed by the result of a recursive call
    ]                 //   (the last call leads to ...'', which adds nothing)

Тепер це акуратне та чисте рішення, і я дізнався про рекурсивні анонімні функції теж!
— Джо Персона

9

APL (Dyalog Unicode) , 12 байт SBCS

⊢⊂⍨(⍴⊢)⍴1↑⍨⊣

Велика подяка Адаму за те, що в основному я займаюся гольфом (і за всі знання APL, які я зараз маю> _>).

Пояснення

 ⊂⍨           Partitioned enclose (commuted, i.e. left and right switched) - for each ⍵ in left, ⍺ in right, if ⍺ = 0, create a new sub-array, push ⍵ to latest sub-array
⊢             Right argument of entire expression
       ⍴      Reshape - Change size of right into dimensions specified by left
   (⍴ )       Shape of (here, there is only one dimension - length)
     ⊢        Right argument of entire expression
         ↑⍨   Take (commuted) - takes ⍺ elements from left where ⍺ is right. Extra elements (zeroes here) are automatically added
        1     1
           ⊣  Left argument of entire expression

Виконання

Аргументи 2, 1 2 3 4 5 6 7. Зауважте, що масиви APL мають форму a b c, з необов’язковими оточуючими дужками.

           ⊣  2
        1     1
         ↑⍨   1↑2 = 1 0
     ⊢        1 2 3 4 5 6 7
   (⍴ )       ⍴1 2 3 4 5 6 7 = 7
       ⍴      7⍴1 0 = 1 0 1 0 1 0 1
⊢             1 2 3 4 5 6 7
 ⊂⍨           1 0 1 0 1 0 1⊂1 2 3 4 5 6 7 = (1 2)(3 4)(5 6)(7)

Спробуйте в Інтернеті!


7
Вітаємо вас з першою відповіддю APL. І добре пояснив теж! Тут майте пиріг APL: 🥧
— Adám


7

Prolog (SWI) , 90 84 61 байт

Код:

[]*_*[].
L*N*[P|R]:-length(P,N),append(P,T,L),T*N*R;P=L,R=[].

Формат введення може бути трохи дивним, але це:

A * n * Result.

Наприклад, для введення:

n = 2
 A = [1, 2, 3, 4, 5, 6]

Вам потрібно буде скористатися [1, 2, 3, 4, 5, 6] * 2 * Result..

Спробуйте в Інтернеті!


Негольована версія:

divide([], _, []).
divide(List, N, [Prefix | Result]) :-
    length(Prefix, N), append(Prefix, Remaining, List), divide(Remaining, N, Result) 
  ; Prefix = List, Result = [].

Спробуйте в Інтернеті! .


6

PHP, 15 байт

$f=array_chunk;

вимагає PHP 7. Дзвінок за допомогою $f(ARRAY, N).


6
Я не думаю, що вам потрібно давати інше ім’я вбудованому, так що це лише 11 балів, чи не так?
— Ніл

@Neil Я подумав, що це може бути заборонена лазівка ; але ти можеш мати рацію.
— Тит



5

Python 2 , 39 байт

i,j=input()
while j:print j[:i];j=j[i:]

Спробуйте в Інтернеті!

Припускає, що 1 шматок на рядок є прийнятним результатом.


4
36 байт як рекурсивна лямбда-функція
— п.

@ovs - Дуже приємно, а також достатньо різне, щоб ви могли розмістити як свою відповідь, якщо хочете.
— ElPedro

5

Brainfuck, 71 байт

,[>+>+<<-]>>>,[<[>.,<-]>>>++++[<++++++++>-]<.[-]<<<[<+>>+<-]<[->+<]>>>]

Не знаю, чи вважається це чи ні ... формат введення:

<character whose ascii is n>AAAAAAAAAAAAA
For example, in the input:
 1234567890123492034
n is 32 since the ASCII value of space is 32

Бере введення та розміщує пробіл кожного разу, коли nсимволи проходять

Пояснення (без коми через те, що це порушило б програму):

, take n
[>+>+<<-] copy into next two cells (destroys original)
>>>, take first of A into next cell
[ while that input exists
<[>.,<-] if n is nonzero output take next of A subtract one from n
>>>++++[<++++++++>-]<.[-]< n is zero so put a space
<<[<+>>+<-] copy the old n into surrounding cells
<[->+<] move from first cell to second
>>>] take input, do again

2
Видаліть пробіли для 71 символу
— MilkyWay90

хаха, я думав, що я їх видалив, але я цього не помітив, дякую!
— vityavv

Спробуйте реорганізувати комірки таким чином, щоб комірки, якими ви користуєтеся, були більш доступними (наприклад, якщо вхідна комірка (та, де ви використовуєте ,більше), вона більше може бути поставлена ​​комірка, до якої легше отримати доступ, ніж якби вона була розміщена в інших клітинах) або використовувати брутефорсер. Я не досвідчений в гольфі в BF, тому ці пропозиції можуть бути не корисними.
— MilkyWay90

Поки що у мене є n n n A spaceустановка стільникового зв'язку, якщо ви можете придумати кращий спосіб ...
— vityavv

Може A space n n n ...працювати (чи space A n n n...)?
— MilkyWay90





4

Вугілля деревне , 1 байт

⪪

Спробуйте в Інтернеті! За замовчуванням введення / виведення деревного вугілля важко продемонструвати, використовуючи що-небудь, крім рядків. Якщо ви хочете отримати повну програму, яка приймає числові списки та виводить списки у форматі, це можна зробити наступним чином:

E⪪AN⪫ι,

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

  A      Input array
 ⪪       Split into chunks of
   N     Input number
E       Map over chunks
     ι  Current chunk
    ⪫   Joined with
      , Literal `,`
        Implicitly print each chunk on its own line



4

J , 4 байти

<\~-

Спробуйте в Інтернеті!

Приймає масив як лівий аргумент, а розмір фрагменту - як правий аргумент.

Використовує діадичний гак та прислівник інфіксації з негативним аргументом, який робить те, що ми хочемо за визначенням.

Примітка. Тип повернення повинен бути встановлений у вікні, оскільки J дозволяє лише таблиці рівних елементів.



3

PHP , 45 байт

function f($a,$b){return array_chunk($a,$b);}

Спробуйте в Інтернеті!


3
Була б просто array_chunkправильною відповіддю?
— Арнольд

@Arnauld я не знаю. Ніколи не гольфував у php раніше, хоча я використовую його на роботі.
— Luis felipe De jesus Munoz

Я також не на 100% впевнений, але ми можемо зловживати неявним перетворенням незадекларованих змінних у рядок і робити щось подібне .
— Арнольд

(помилка: я мав на увазі невизначені константи )
— Арнольд

3

Java 10, 106 80 байт

L->n->{for(int l=L.size(),i=0;i<l;)System.out.print(L.subList(i,(i+=n)<l?i:l));}

Друкує шматки без роздільника.

Спробуйте в Інтернеті.

106 байт:

L->n->{var r=new java.util.Stack();for(int l=L.size(),i=0;i<l;)r.add(L.subList(i,(i+=n)<l?i:l));return r;}

Фактично повертає список списків.

Спробуйте в Інтернеті.

Пояснення:

L->n->{                       // Method with List and integer parameters and List return-type
  var r=new java.util.Stack();//  Create an empty List
  for(int l=L.size(),         //  Determine the size of the input-List
      i=0;i<l;)               //  Loop `i` in the range [0, size):
    r.add(                    //   Add to the result-List:
      L.subList(i,            //    A sublist of the input-list in the range from `i`
        Math.min(i+=n,l)));   //    to the minimum of: `i` + input-integer or the size
                              //    (and increase `i` by the input-integer at the same)
  return r;}                  //  Return the List of Lists of integers as result





3

V , 6 байт

òÀf,r

Спробуйте в Інтернеті!

Hexdump:

00000000: f2c0 662c 720a                           ..f,r.

Пояснення:

ò           " Until an error happens:
  f         "   (f)ind the...
 À          "     n'th...
   ,        "     ","
            "   (If there are less than n commas after the cursor, throw an error)
    r       "   Replace the char under the cursor with...
     <cr>   "     A newline

3

Clojure, 14 байт

#(partition %)

здається, будується


Привіт, ласкаво просимо. Функція повинна брати два аргументи: масив, який слід розділити, і довжина фрагмента. Що також відбувається, якщо останній фрагмент не "повний" при використанні розділу?
— NikoNyrh

3

Haskell , 26 байт

import Data.Lists
chunksOf

Ось більш цікава версія, що містить лише кілька байтів (завдяки німі за п’ять байтів у кожному рішенні):

Haskell , 31 байт

n![]=[]
n!x=take n x:n!drop n x

Спробуйте в Інтернеті!


Я думаю, що можна
— aloisdg каже: Відновити Моніку

1
n!x=take n x:n!drop n x. Data.Listsзабезпечує також chunksOf.
— німі


3

Желе , 1 байт

s

Спробуйте в Інтернеті!

Хоча принтер виглядає так, що одноелементні розбиття не загорнуті в списки, вони насправді є.


1
Цієї ночі дають кращий результат щодо того, щоб показати, що масиви з одноелементними елементами все ще є насправді масивами.
— Нік Кеннеді

Ер, чи є суперечливим, тому що я не додав посилання @Nick Kennedy?
— Вень

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