Erstellen Sie Blöcke aus einem Array

21

Ihre Aufgabe ist es, ein Programm zu schreiben, das ein Array und eine Zahl angibt. Sie müssen das Array in Blöcke aufteilen, deren Größe die Zahl ist.

Regeln

Ihr Programm erhält ein Array Asowie eine positive Ganzzahl n. Das Array sollte dann in Abschnitte mit einer Länge aufgeteilt werden n, wenn die Länge des Strings nicht durch neinen Rest am Ende teilbar ist. Dies sollte als eigener Abschnitt betrachtet werden.

  • Wenn ngrößer als die Länge des Arrays ist A, müssen Sie das Array zurückgeben A. Beispiel: Wenn n = 4und array A = [1,2,3], müssen Sie zurückgeben[1,2,3]

  • Das Array kann einen beliebigen Typ anstelle einer Zahl enthalten.

  • Sie sollten die Reihenfolge (oder Richtung) eines Elements nicht von links nach rechts ändern. Zum Beispiel if n = 2und A= [1,2,3]. Jedes Ergebnis [[1,2],[3]]ist ungültig.

Testfälle

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

Das ist , also gewinnen Sie die kürzesten Bytes jeder Sprache.

Chau Giang
quelle
4
Wenn ngrößer als die Länge ist, die Awir zurückgeben Amüssen‽ Sind Sie sicher, dass Sie das nicht meinen [A]?
Adám
9
@chaugiang Ich denke immer noch, ein zu großer nsollte zurückkehren [A], zB [[1,2,3]]. Was ist, wenn ngenau die Länge von A?
Adám
4
@ Chaugiang Adam ist richtig imo. Der Rückgabewert sollte konsistent sein.
Jonah
1
@ Chaugiang Kann n immer gleich 1 ?
DJMcMayhem
4
In einer stark typisierten Sprache ist es einfach unmöglich, zurückzukehren, Aanstatt [A] , was eine ganze Reihe von Sprachen ausschließen würde.
6.

Antworten:

9

JavaScript (ES6), 36 Byte

Übernimmt die Eingabe als (n)(array).

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

Probieren Sie es online!

Kommentiert

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
quelle
Nun, das ist eine saubere und saubere Lösung, und ich habe auch rekursive anonyme Funktionen kennengelernt!
Joe die Person
9

APL (Dyalog Unicode) , 12 Byte SBCS

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

Ein großes Dankeschön an Adám, der im Grunde genommen das ganze Golfen gemacht hat (und im Grunde genommen das ganze APL-Wissen, das ich derzeit habe> _>).

Erläuterung

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

Ausführung

Argumente 2, 1 2 3 4 5 6 7. Beachten Sie, dass APL-Arrays in der Form a b cmit optionalen umgebenden Klammern vorliegen .

             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)

Probieren Sie es online!

Nur ASCII
quelle
7
Herzlichen Glückwunsch zu Ihrer ersten APL-Antwort. Und auch schön erklärt! Hier haben Sie eine APL-Torte: 🥧
Adám
7

Prolog (SWI) , 90 84 61 Bytes

Code:

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

Das Eingabeformat mag etwas komisch sein, aber es ist:

A * n * Result.

Zum Beispiel für die Eingabe:

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

Sie müssten verwenden [1, 2, 3, 4, 5, 6] * 2 * Result..

Probieren Sie es online!


Ungolfed-Version:

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

Probieren Sie es online! .

Adnan
quelle
6

PHP, 15 Bytes

$f=array_chunk;

benötigt PHP 7. Mit aufrufen $f(ARRAY, N).

Titus
quelle
6
Ich glaube nicht, dass Sie einem eingebauten Element einen anderen Namen geben müssen. Das ergibt also nur 11, nicht wahr?
Neil
@Neil Ich dachte, das könnte eine verbotene Lücke sein ; aber du magst recht haben.
Titus
5

Python 2 , 39 Bytes

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

Probieren Sie es online!

Nimmt an, dass 1 Block pro Zeile eine akzeptable Ausgabe ist.

ElPedro
quelle
4
36 Bytes als rekursive Lambda-Funktion
ovs
@ovs - Sehr nett und auch anders genug, um als eigene Antwort zu posten, wenn Sie es wünschen.
ElPedro
5

Brainfuck, 71 Bytes

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

Keine Ahnung, ob das zählt oder nicht ... Eingabeformat:

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

Übernimmt die Eingabe und fügt bei jeder Zeichenübergabe ein Leerzeichen nein

Erklärung (keine Kommas, da dies das Programm beschädigen würde):

, 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
quelle
2
Entfernen Sie die Leerzeichen für 71 Zeichen
MilkyWay90
lol, ich dachte, ich hätte sie alle entfernt, aber ich habe sie nicht bemerkt, danke!
Vityavv
Versuchen Sie, die Zellen so zu reorganisieren, dass auf die von Ihnen verwendeten Zellen besser zugegriffen werden kann (wenn beispielsweise die Eingabezelle (die, in der Sie ,mehr verwenden) häufiger verwendet wird, wird möglicherweise eine Zelle platziert, auf die leichter zugegriffen werden kann als wenn sie platziert wurde in anderen Zellen) oder verwenden Sie einen Bruteforcer. Ich habe keine Erfahrung mit Golfspielen in BF, daher sind diese Vorschläge möglicherweise nicht hilfreich.
MilkyWay90
Bisher habe ich n n n A spaceals meine Zelle Setup, wenn Sie sich einen besseren Weg
vorstellen
Könnte A space n n n ...funktionieren (oder space A n n n...)?
MilkyWay90
4

CJam , 3 Bytes

{/}

Dies ist ein anonymer Block, der ein Array von Zahlen und eine Zahl aus dem Stapel entnimmt und durch ein Array von Arrays ersetzt.

Probieren Sie es online!

Luis Mendo
quelle
4

Holzkohle , 1 Byte

Probieren Sie es online! Die Standard-E / A von Charcoal macht es schwierig, nur Zeichenfolgen zu verwenden. Wenn Sie ein vollständiges Programm wünschen, das numerische Listen aufnimmt und formatierte Listen ausgibt, können Sie dies wie folgt tun:

E⪪AN⪫ι,

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

  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
quelle
4

C # (Visual C # Interactive Compiler) , 78 77 43 Byte

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

Probieren Sie es online!

Ich denke, wir sollten einfach schreiben können, int i;weil 0 der Standardwert von int ist. Ich lasse es den Fehler zu vermeiden: error CS0165: Use of unassigned local variable 'i'.

aloisdg sagt Reinstate Monica
quelle
4

J , 4 Bytes

<\~-

Probieren Sie es online!

Nimmt das Array als linkes Argument und die Blockgröße als rechtes Argument.

Verwendet einen dyadischen Hook und das Infix-Adverb mit einem negativen Argument, das per Definition das tut, was wir wollen.

Hinweis: Der Rückgabetyp muss mit einem Kästchen versehen werden, da J nur Tabellen mit gleichen Größen zulässt.

Jona
quelle
3

PHP , 45 Bytes

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

Probieren Sie es online!

Luis Felipe De Jesus Munoz
quelle
3
Wäre nur array_chunkeine gültige Antwort?
Arnauld
@ Arnauld Ich weiß es nicht. Ich habe noch nie in PHP Golf gespielt, obwohl ich es bei der Arbeit benutze.
Luis Felipe De Jesus Munoz
Ich bin mir auch nicht 100% sicher, aber wir können die implizite Konvertierung nicht deklarierter Variablen in einen String missbrauchen und so etwas tun .
Arnauld
(Erratum: Ich meinte undefinierte Konstanten )
Arnauld
3

Java 10, 106 80 Bytes

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

Druckt die Blöcke ohne Trennzeichen.

Probieren Sie es online aus.

106 Bytes:

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

Gibt tatsächlich eine Liste von Listen zurück.

Probieren Sie es online aus.

Erläuterung:

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
quelle
3

V , 6 Bytes

òÀf,r

Probieren Sie es online!

Hexdump:

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

Erläuterung:

ò           " 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
quelle
3

Clojure, 14 Bytes

#(partition %)

Builtins, denke ich

Nihilazo
quelle
Hallo, willkommen. Die Funktion sollte zwei Argumente annehmen: das zu partitionierende Array und die Länge des Chunks. Was passiert auch, wenn der letzte Block bei Verwendung der Partition nicht "voll" ist?
NikoNyrh
3

Haskell , 26 Bytes

import Data.Lists
chunksOf

Hier ist eine interessantere Version mit nur ein paar weiteren Bytes (danke an nimi für fünf Bytes in jeder Lösung):

Haskell , 31 Bytes

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

Probieren Sie es online!

dfeuer
quelle
Ich denke, Sie können
Aloisdg sagt Reinstate Monica
1
n!x=take n x:n!drop n x. Data.Listsbietet auch chunksOf.
nimi
3

PowerShell , 67 65 Byte

-2 Bytes danke AdmBorkBork

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

Probieren Sie es online!

mazzy
quelle
2
Sie sollten in der Lage sein rv b(Alias ​​für Remove-Variable), anstatt $b=@()zwei Bytes zu speichern.
AdmBorkBork
3

Gelee , 1 Byte

s

Probieren Sie es online!

Der Drucker sieht zwar so aus, als würden Einzelelement-Splits nicht in Listen eingeschlossen, aber tatsächlich.

Ven
quelle
1
Diese Nacht liefert eine bessere Ausgabe, um zu zeigen, dass Einzelelement-Arrays tatsächlich noch Arrays sind.
Nick Kennedy
Ist die Ablehnung, weil ich @ Nick Kennedys Link nicht hinzugefügt habe?
Ven
schon gar nicht von mir
Nick Kennedy