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


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
         ↑⍨   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)

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


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.