Twórz porcje z tablicy

21

Twoim zadaniem jest napisanie programu, który poda tablicę i liczbę, musisz podzielić tablicę na kawałki o rozmiarze liczba.

Zasady

Twój program otrzyma tablicę A, a także dodatnią liczbę całkowitą n. Tablica powinna być następnie podzielona na kawałki długości n, jeśli długość łańcucha nie jest podzielna przez nresztki na końcu, powinna być uważana za własną część.

  • Jeśli njest większa niż długość tablicy A, musisz zwrócić tablicę A, na przykład: if n = 4i array A = [1,2,3]powinieneś zwrócić[1,2,3]

  • Tablica może zawierać dowolny typ, a nie liczbę.

  • Nie należy zmieniać kolejności (ani kierunku) żadnego elementu od lewej do prawej. Na przykład if n = 2i A= [1,2,3]. Każdy wynik zamiast [[1,2],[3]]będzie nieprawidłowy.

Przypadki testowe

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

To jest , więc wygrasz najkrótsze bajty każdego języka.

Chau Giang
źródło
4
Jeśli njest większa niż długość A, musimy Azwrócić‽ Czy na pewno nie masz na myśli [A]?
Adám
9
@chaugiang Nadal uważam, że zbyt duży npowinien powrócić [A], np [[1,2,3]]. Co jeśli njest dokładnie takiej długości A?
Adám
4
@chaugiang Adam ma poprawne imo. Zwracana wartość powinna być spójna.
Jonasz
1
@chaugiang Czy n kiedykolwiek może równać się 1 ?
DJMcMayhem
4
W silnie typami języka, jest to po prostu niemożliwe, aby powrócić Azamiast [A] , co wyklucza bardzo dużo języków.
dfeuer

Odpowiedzi:

9

JavaScript (ES6), 36 bajtów

Pobiera dane wejściowe jako (n)(array).

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

Wypróbuj online!

Skomentował

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
źródło
To miłe i czyste rozwiązanie. Dowiedziałem się także o rekurencyjnych funkcjach anonimowych!
Joe the Person
9

APL (Dyalog Unicode) , 12 bajtów SBCS

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

Ogromne podziękowania dla Adáma za po prostu granie w golfa (i za całą wiedzę APL, którą mam obecnie> _>).

Wyjaśnienie

 ⊂⍨           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

Wykonanie

Argumenty 2, 1 2 3 4 5 6 7. Zauważ, że tablice APL są w formie a b c, z opcjonalnymi otaczającymi nawiasami.

             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)

Wypróbuj online!

Tylko ASCII
źródło
7
Gratuluję pierwszej odpowiedzi APL. I też ładnie wyjaśnione! Tutaj masz ciasto APL: 🥧
Adám
7

Prolog (SWI) , 90 84 61 bajtów

Kod:

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

Format wejściowy może być nieco dziwny, ale jest to:

A * n * Result.

Na przykład dla danych wejściowych:

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

Musisz użyć [1, 2, 3, 4, 5, 6] * 2 * Result..

Wypróbuj online!


Wersja bez golfa:

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

Wypróbuj online! .

Adnan
źródło
6

PHP, 15 bajtów

$f=array_chunk;

wymaga PHP 7. Zadzwoń z $f(ARRAY, N).

Tytus
źródło
6
Nie sądzę, że musisz podać inną nazwę wbudowanemu, więc to tylko 11, prawda?
Neil
@ Neil Myślałem, że może to być zakazana luka ; ale możesz mieć rację.
Tytus
5

Czysty , 54 bajty

import StdEnv
$n l=[l%(i,i+n-1)\\i<-[0,n..length l-1]]

Wypróbuj online!

Obrzydliwe
źródło
5

Python 2 , 39 bajtów

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

Wypróbuj online!

Zakłada, że ​​1 porcja na linię jest akceptowalnym wyjściem.

ElPedro
źródło
4
36 bajtów jako rekurencyjna funkcja lambda
ovs
@ovs - Bardzo fajny i wystarczająco inny, abyś mógł opublikować własną odpowiedź, jeśli chcesz.
ElPedro
5

Brainfuck, 71 bajtów

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

Nie wiem, czy to się liczy, czy nie ... format wejściowy:

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

Pobiera dane wejściowe i umieszcza spację za każdym razem, gdy nznaki przechodzą

Objaśnienie (bez przecinków, ponieważ spowodowałoby to uszkodzenie programu):

, 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
źródło
2
Usuń spacje dla 71 znaków
MilkyWay90
lol, myślałem, że usunąłem je wszystkie, ale ich nie zauważyłem, dzięki!
vityavv
Spróbuj zreorganizować komórki tak, aby komórki, których używasz więcej, były bardziej dostępne (na przykład, jeśli komórka wejściowa (ta, której używasz ,więcej) jest używana częściej, można umieścić komórkę, do której dostęp jest łatwiejszy niż gdyby została umieszczona w innych komórkach) lub użyj bruteforcer. Nie mam umiejętności gry w golfa w BF, więc te sugestie mogą nie być pomocne.
MilkyWay90
Do tej pory mam n n n A spacekonfigurację komórki, jeśli możesz wymyślić lepszy sposób ...
vityavv
Czy może A space n n n ...działać (lub space A n n n...)?
MilkyWay90
4

CJam , 3 bajty

{/}

Jest to anonimowy blok, który pobiera tablicę liczb i liczb ze stosu i zastępuje je tablicą tablic.

Wypróbuj online!

Luis Mendo
źródło
4

Węgiel , 1 bajt

Wypróbuj online! Domyślne wejścia / wyjścia Charcoal utrudniają zademonstrowanie użycia czegokolwiek poza łańcuchami. Jeśli chcesz mieć pełny program, który pobiera listy numeryczne i wyświetla listy sformatowane, można to zrobić w następujący sposób:

E⪪AN⪫ι,

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  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
Neil
źródło
4

C # (interaktywny kompilator Visual C #) , 78 77 43 bajtów

a=>b=>{int i=0;return a.GroupBy(_=>i++/b);}

Wypróbuj online!

Myślę, że powinniśmy móc po prostu pisać, int i;ponieważ 0 jest domyślną wartością int. I niech to, aby uniknąć błędu: error CS0165: Use of unassigned local variable 'i'.

aloisdg mówi Przywróć Monikę
źródło
4

J , 4 bajty

<\~-

Wypróbuj online!

Przyjmuje tablicę jako lewy argument, a wielkość porcji jako prawy argument.

Używa dyadic hook i przysłówka infix z argumentem ujemnym, który robi to, co chcemy z definicji.

Uwaga: Typ zwrotu musi być zapakowany, ponieważ J zezwala tylko na tabele przedmiotów o równej wielkości.

Jonasz
źródło
3

PHP , 45 bajtów

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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
3
Czy array_chunkbyłaby to prawidłowa odpowiedź?
Arnauld
@Arnauld Nie wiem. Nigdy wcześniej nie grałem w php, chociaż używam go w pracy.
Luis Felipe De Jesus Munoz
Nie jestem w 100% pewien, ale możemy nadużyć niejawnej konwersji niezadeklarowanych zmiennych na ciąg i zrobić coś takiego .
Arnauld
(erratum: Miałem na myśli niezdefiniowane stałe )
Arnauld
3

Java 10, 106 80 bajtów

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

Drukuje fragmenty bez ogranicznika.

Wypróbuj online.

106 bajtów:

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;}

Faktycznie zwraca listę list.

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
3

V , 6 bajtów

òÀf,r

Wypróbuj online!

Hexdump:

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

Wyjaśnienie:

ò           " 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
źródło
3

Clojure, 14 bajtów

#(partition %)

chyba wbudowane

nihilazo
źródło
Cześć witam. Funkcja powinna przyjmować dwa argumenty: tablicę do partycjonowania i długość porcji. Co się stanie, jeśli ostatni fragment nie będzie „pełny” podczas korzystania z partycji?
NikoNyrh
3

Haskell , 26 bajtów

import Data.Lists
chunksOf

Oto bardziej interesująca wersja z kilkoma dodatkowymi bajtami (dzięki nim za pięć bajtów w każdym rozwiązaniu):

Haskell , 31 bajtów

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

Wypróbuj online!

dfeuer
źródło
Myślę, że możesz
aloisdg mówi Przywróć Monikę
1
n!x=take n x:n!drop n x. Data.Listszapewnia również chunksOf.
nimi
3

PowerShell , 67 65 bajtów

-2 bajty dzięki AdmBorkBork

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

Wypróbuj online!

mazzy
źródło
2
Powinieneś być w stanie rv b(alias dla Remove-Variable) zamiast $b=@()zapisywać dwa bajty.
AdmBorkBork
3

Galaretka , 1 bajt

s

Wypróbuj online!

Chociaż drukarka sprawia, że ​​wygląda na to, że podziały jednego elementu nie są zawijane w listy, w rzeczywistości są.

Ven
źródło
1
Ta noc daje lepszy wynik, jeśli chodzi o pokazanie, że tablice jednoelementowe nadal są tablicami.
Nick Kennedy
Eee, czy opinia jest negatywna, ponieważ nie dodałem linku @Nick Kennedy?
Ven
na pewno nie ode mnie
Nick Kennedy