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.


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)

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!


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! .


6

PHP, 15 bajtów

$f=array_chunk;

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


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

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.


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

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

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



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.



3

PHP , 45 bajtów

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

Wypróbuj online!


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





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

3

Clojure, 14 bajtów

#(partition %)

chyba wbudowane


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



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.