Создать куски из массива

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)
Arnauld
источник
Теперь это аккуратное и чистое решение, и я также узнал о рекурсивных анонимных функциях!
Джо Человек
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
         ↑⍨   12 = 1 0
             1 2 3 4 5 6 7
   (⍴ )       1 2 3 4 5 6 7 = 7
             71 0 = 1 0 1 0 1 0 1
             1 2 3 4 5 6 7
 ⊂⍨           1 0 1 0 1 0 11 2 3 4 5 6 7 = (1 2)(3 4)(5 6)(7)

Попробуйте онлайн!

ASCII-только
источник
7
Поздравляю с первым ответом APL. И тоже хорошо объяснил! Здесь есть пирог APL: 🥧
Адам
7

Пролог (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).

Titus
источник
6
Я не думаю, что вам нужно давать другое имя встроенному, так что это всего лишь 11 баллов, не так ли?
Нил
@Neil Я думал, что это может быть запрещенной лазейкой ; но вы можете быть правы.
Титус
5

Python 2 , 39 байт

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

Попробуйте онлайн!

Предполагается, что 1 порция на строку является приемлемым выводом.

ElPedro
источник
4
36 байтов в качестве рекурсивной лямбда-функции
ovs
@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
vityavv
источник
2
Удалить пробелы для 71 символа
MilkyWay90
лол, я думал, что я удалил их все, но я их не заметил, спасибо!
Витявв
Попробуйте реорганизовать ячейки так, чтобы использовавшиеся вами ячейки были более доступными (например, если входная ячейка (та, в которой вы используете ,больше) используется больше, ее можно поместить в ячейку, доступ к которой проще, чем если бы она была размещена). в других клетках) или используйте брутфорсер. Я не опытный игрок в гольф в BF, поэтому эти предложения могут быть бесполезны.
MilkyWay90
Пока что у меня есть n n n A spaceнастройка моей камеры, если вы можете придумать лучший способ ...
Витявв
Может ли A space n n n ...работать (или space A n n n...)?
MilkyWay90
4

CJam , 3 байта

{/}

Это анонимный блок, который берет массив чисел и число из стека и заменяет их массивом массивов.

Попробуйте онлайн!

Луис Мендо
источник
4

Древесный уголь , 1 байт

Попробуйте онлайн! Стандартный ввод / вывод Charcoal затрудняет демонстрацию с использованием чего-либо, кроме строк. Если вам нужна полная программа, которая принимает числовые списки и выводит отформатированные списки, то это можно сделать следующим образом:

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, хотя я использую его на работе.
Луис Фелипе Де Иисус Муньос
Я также не уверен на 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
DJMcMayhem
источник
3

Clojure, 14 байтов

#(partition %)

встроенные я думаю

nihilazo
источник
Привет, добро пожаловать. Функция должна принимать два аргумента: массив для разбиения и длина фрагмента. И что произойдет, если последний блок не будет "полным" при использовании раздела?
NikoNyrh
3

Haskell , 26 байтов

import Data.Lists
chunksOf

Вот более интересная версия, всего несколько байтов (спасибо nimi за пять байтов в каждом решении):

Haskell , 31 байт

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

Попробуйте онлайн!

dfeuer
источник
Я думаю, что вы можете
aloisdg говорит восстановить Monica
1
n!x=take n x:n!drop n x, Data.Listsобеспечивает также chunksOf.
Ними
3

PowerShell , 67 65 байт

-2 байта спасибо AdmBorkBork

param($n,$a)$a|%{$b+=,$_
if($b.Count-ge$n){,$b;rv b}}
if($b){,$b}

Попробуйте онлайн!

Mazzy
источник
2
Вы должны иметь возможность rv b(псевдоним для Remove-Variable) вместо того, $b=@()чтобы сохранить два байта.
AdmBorkBork
3

Желе , 1 байт

s

Попробуйте онлайн!

Хотя принтер создает видимость, что одноэлементные разбиения не заключены в списки, на самом деле они есть.

Вен
источник
1
Этой ночью лучше показать, что одноэлементные массивы все еще являются массивами.
Ник Кеннеди
Э-э, это провал, потому что я не добавил ссылку @Nick Kennedy?
Ven
конечно не от меня
Ник Кеннеди