Crea blocchi da un array


21

Il tuo compito è scrivere un programma che fornisca un array e un numero, devi dividere l'array in blocchi con dimensione è numero.

Regole

Il tuo programma riceverà un array A, nonché un numero intero positivo n. L'array dovrebbe quindi essere suddiviso in blocchi di lunghezza n, se la lunghezza della stringa non è divisibile per nqualsiasi residuo alla fine dovrebbe essere considerato il suo blocco.

  • Se nè maggiore della lunghezza dell'array A, sarà necessario restituire l'array A, ad esempio: se n = 4e array A = [1,2,3], è necessario restituire[1,2,3]

  • L'array può contenere qualsiasi tipo anziché numero.

  • Non è necessario modificare l'ordine (o la direzione) di alcun articolo da sinistra a destra. Ad esempio if n = 2e A= [1,2,3]. Qualsiasi risultato anziché [[1,2],[3]]sarà non valido.

Casi test

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

Questo è , quindi i byte più brevi di ogni lingua saranno i vincitori.


4
Se nè maggiore della lunghezza di cui Aabbiamo bisogno per Atornare‽ Sei sicuro di non voler dire [A]?
Adám

9
@chaugiang Penso ancora che ndovrebbe tornare un valore troppo grande [A], ad es [[1,2,3]]. E se nfosse esattamente la lunghezza di A?
Adám

4
@chaugiang Adam ha ragione imo. Il valore di ritorno dovrebbe essere coerente.
Giona

1
@chaugiang Can n mai uguali 1 ?
DJMcMayhem

4
In un linguaggio fortemente tipizzato, è semplicemente impossibile tornare Apiuttosto che [A] , il che escluderebbe moltissime lingue.
dfeuer

Risposte:



9

JavaScript (ES6), 36 byte

Accetta input come (n)(array).

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

Provalo online!

Commentate

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)

Questa è una soluzione chiara e pulita e ho imparato anche a usare funzioni anonime ricorsive!
Joe the Person

9

APL (Dyalog Unicode) , 12 byte SBCS

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

Un grande ringraziamento ad Adám per aver praticamente fatto praticamente tutto il golf (e praticamente per tutte le conoscenze APL che ho attualmente> _>).

Spiegazione

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

Esecuzione

Argomenti 2, 1 2 3 4 5 6 7. Si noti che le matrici APL hanno il formato a b c, con parentesi circostanti opzionali.

             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)

Provalo online!


7
Congratulazioni per la tua prima risposta APL. E ben spiegato anche! Qui, prendi una torta APL: 🥧
Adám


7

Prolog (SWI) , 90 84 61 byte

Codice:

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

Il formato di input potrebbe essere un po 'strano, ma è:

A * n * Result.

Ad esempio, per l'input:

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

Dovresti usare [1, 2, 3, 4, 5, 6] * 2 * Result..

Provalo online!


Versione non golfata:

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

Provalo online! .


6

PHP, 15 byte

$f=array_chunk;

richiede PHP 7. Chiama con $f(ARRAY, N).


6
Non penso che ti venga richiesto di dare un altro nome a un builtin, quindi questo segna solo 11, no?
Neil

@Neil Ho pensato che potesse essere una scappatoia proibita ; ma potresti avere ragione.
Tito



5

Python 2 , 39 byte

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

Provalo online!

Presuppone che 1 blocco per riga sia un output accettabile.


4
36 byte come funzione lambda ricorsiva
ovs

@ovs - Molto bello e anche abbastanza diverso da poter pubblicare come tua risposta se lo desideri.
ElPedro

5

Brainfuck, 71 byte

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

Non so se questo conta o no ... formato di input:

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

Accetta l'input e inserisce uno spazio ogni volta nche passano i personaggi

Spiegazione (nessuna virgola perché ciò spezzerebbe il programma):

, 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
Rimuovi gli spazi per 71 caratteri
MilkyWay90

lol, pensavo di averli rimossi tutti ma non me ne sono accorto, grazie!
vityavv

Prova a riorganizzare le celle in modo che le celle che usi di più siano più accessibili (ad esempio, se la cella di input (quella in cui usi di ,più) viene utilizzata di più, potrebbe essere messa una cella a cui è più facile accedere rispetto a se fosse posizionata in altre cellule) o usare un bruteforcer. Non sono abile nel golf a BF, quindi questi suggerimenti potrebbero non essere utili.
MilkyWay90

Finora ho n n n A spacecome configurazione del mio cellulare, se riesci a pensare a un modo migliore ...
vityavv

Potrebbe A space n n n ...funzionare (o space A n n n...)?
MilkyWay90


4

CJam , 3 byte

{/}

Questo è un blocco anonimo che prende una matrice di numeri e un numero dalla pila e li sostituisce con una matrice di matrici.

Provalo online!




4

Carbone , 1 byte

Provalo online! L'I / O predefinito di Charcoal rende difficile dimostrare l'utilizzo di qualsiasi cosa tranne le stringhe. Se si desidera un programma completo che accetta elenchi numerici e genera elenchi formattati, è possibile procedere come segue:

E⪪AN⪫ι,

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

  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 byte

<\~-

Provalo online!

Prende l'array come arg sinistro e la dimensione del blocco come arg destro.

Utilizza un hook diadico e l' avverbio infix con un argomento negativo, che fa ciò che vogliamo per definizione.

Nota: il tipo restituito deve essere inscatolato perché J consente solo tabelle di oggetti di dimensioni uguali.



3

PHP , 45 byte

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

Provalo online!


3
Sarebbe solo array_chunkuna risposta valida?
Arnauld,

@Arnauld Non lo so. Non ho mai giocato a golf in php prima, anche se lo uso al lavoro.
Luis felipe De jesus Munoz il

Non sono nemmeno sicuro al 100%, ma possiamo abusare della conversione implicita di variabili non dichiarate in una stringa e fare qualcosa del genere .
Arnauld,

(erratum: intendevo costanti indefinite )
Arnauld

3

Java 10, 106 80 byte

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

Stampa i blocchi senza delimitatore.

Provalo online.

106 byte:

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

Restituisce effettivamente un elenco di elenchi.

Provalo online.

Spiegazione:

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 byte

òÀf,r

Provalo online!

hexdump:

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

Spiegazione:

ò           " 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 byte

#(partition %)

builtin credo


Ciao benvenuto. La funzione dovrebbe assumere due argomenti: l'array da partizionare e la lunghezza del blocco. Inoltre, cosa succede se l'ultimo blocco non è "pieno" quando si utilizza la partizione?
NikoNyrh


3

PowerShell , 67 65 byte

-2 byte grazie AdmBorkBork

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

Provalo online!


2
Dovresti essere in grado di rv b(alias per Remove-Variable) invece di $b=@()salvare due byte.
AdmBorkBork

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.