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.


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)

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!


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


6

PHP, 15 Bytes

$f=array_chunk;

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


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

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

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

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



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.



3

PHP , 45 Bytes

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

Probieren Sie es online!


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





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

3

Clojure, 14 Bytes

#(partition %)

Builtins, denke ich


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



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.