Créer des morceaux à partir d'un tableau


21

Votre tâche consiste à écrire un programme qui, étant donné un tableau et un numéro, vous devez diviser le tableau en morceaux dont la taille est le numéro.

Règles

Votre programme recevra un tableau A, ainsi qu'un entier positif n. Le tableau doit ensuite être divisé en morceaux de longueur n, si la longueur de la chaîne n'est pas divisible par un nreste à la fin doit être considérée comme son propre morceau.

  • Si nest supérieur à la longueur du tableau A, vous devrez renvoyer le tableau A, par exemple: si n = 4et array A = [1,2,3], vous devez retourner[1,2,3]

  • Le tableau peut contenir n'importe quel type plutôt que nombre.

  • Vous ne devez pas changer l'ordre (ou la direction) d'un article de gauche à droite. Par exemple if n = 2et A= [1,2,3]. Tout résultat plutôt que [[1,2],[3]]sera invalide.

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

Il s'agit de , vous serez donc le gagnant des octets les plus courts de chaque langue.


4
Si nest supérieur à la durée du Aretour, nous Adevons‽ Êtes-vous sûr de ne pas vouloir dire [A]?
Adám

9
@chaugiang Je pense toujours qu'un trop grand ndevrait revenir [A], par exemple [[1,2,3]]. Et si nest exactement la longueur de A?
Adám

4
@chaugiang Adam est imo correct. La valeur de retour doit être cohérente.
Jonah

1
@chaugiang N peut-il jamais égaler 1 ?
DJMcMayhem

4
Dans une langue fortement typée, il est tout simplement impossible de retourner Aplutôt que [A] , ce qui exclurait énormément de langues.
dfeuer

Réponses:



9

JavaScript (ES6), 36 octets

Prend l'entrée comme (n)(array).

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

Essayez-le en ligne!

Commenté

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)

Maintenant, c'est une solution propre et nette, et j'ai aussi appris les fonctions anonymes récursives!
Joe la personne

9

APL (Dyalog Unicode) , 12 octets SBCS

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

Un grand merci à Adám pour avoir fait pratiquement tout le golf (et pour pratiquement toutes les connaissances APL que j'ai actuellement> _>).

Explication

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

Exécution

Arguments 2, 1 2 3 4 5 6 7. Notez que les tableaux APL sont de la forme a b c, avec des parenthèses environnantes facultatives.

             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)

Essayez-le en ligne!


7
Félicitations pour votre première réponse APL. Et bien expliqué aussi! Ici, prenez une tarte APL: 🥧
Adám


7

Prolog (SWI) , 90 84 61 octets

Code:

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

Le format d'entrée peut être un peu bizarre, mais c'est:

A * n * Result.

Par exemple, pour l'entrée:

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

Vous auriez besoin d'utiliser [1, 2, 3, 4, 5, 6] * 2 * Result..

Essayez-le en ligne!


Version non golfée:

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

Essayez-le en ligne! .


6

PHP, 15 octets

$f=array_chunk;

nécessite PHP 7. Appelez avec $f(ARRAY, N).


6
Je ne pense pas que vous soyez obligé de donner un autre nom à un objet intégré, donc cela ne vaut que 11, n'est-ce pas?
Neil

@Neil J'ai pensé que cela pourrait être une échappatoire interdite ; Mais tu as peut-être raison.
Titus



5

Python 2 , 39 octets

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

Essayez-le en ligne!

Suppose que 1 bloc par ligne est une sortie acceptable.


4
36 octets en tant que fonction lambda récursive
ovs

@ovs - Très agréable et suffisamment différent pour que vous puissiez poster votre propre réponse si vous le souhaitez.
ElPedro

5

Brainfuck, 71 octets

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

Ne sais pas si cela compte ou non ... format d'entrée:

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

Prend l'entrée et place un espace à chaque fois que les npersonnages passent

Explication (pas de virgule car cela casserait le programme):

, 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
Supprimez les espaces pour 71 caractères
MilkyWay90

lol, je pensais les avoir tous retirés mais je ne les ai pas remarqués, merci!
vityavv

Essayez de réorganiser les cellules de manière à ce que les cellules que vous utilisez le plus soient plus accessibles (par exemple, si la cellule d'entrée (celle où vous en utilisez le ,plus) est plus utilisée, elle pourrait être placée dans une cellule plus facile d'accès que si elle était placée dans d'autres cellules) ou utilisez un bruteforcer. Je ne suis pas qualifié pour jouer au golf à BF, donc ces suggestions peuvent ne pas être utiles.
MilkyWay90

Jusqu'à présent, j'ai n n n A spacema configuration de cellule, si vous pouvez penser à une meilleure façon ...
vityavv

Pourrait A space n n n ...fonctionner (ou space A n n n...)?
MilkyWay90





4

Fusain , 1 octet

Essayez-le en ligne! Les E / S par défaut de Charcoal rendent difficile la démonstration de l'utilisation de tout sauf des chaînes. Si vous voulez un programme complet qui prend des listes numériques et génère des listes formatées, cela peut être fait comme suit:

E⪪AN⪫ι,

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

  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 octets

<\~-

Essayez-le en ligne!

Prend le tableau comme argument gauche et la taille de bloc comme argument droit.

Utilise un crochet dyadique et l' adverbe infixe avec un argument négatif, ce qui fait ce que nous voulons par définition.

Remarque: Le type de retour doit être encadré car J n'autorise que les tables d'éléments de taille égale.



3

PHP , 45 octets

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

Essayez-le en ligne!


3
Serait-ce juste array_chunkune réponse valable?
Arnauld

@Arnauld je ne sais pas. Je n'ai jamais joué au php avant même si je l'utilise au travail.
Luis felipe De jesus Munoz

Je ne suis pas sûr à 100% non plus, mais nous pouvons abuser de la conversion implicite de variables non déclarées en chaîne et faire quelque chose comme ça .
Arnauld

(erratum: je voulais dire des constantes non définies )
Arnauld

3

Java 10, 106 80 octets

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

Imprime les morceaux sans délimiteur.

Essayez-le en ligne.

106 octets:

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

Retourne en fait une liste de listes.

Essayez-le en ligne.

Explication:

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 octets

òÀf,r

Essayez-le en ligne!

Hexdump:

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

Explication:

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

#(partition %)

builtins je suppose


Salut, bienvenue. La fonction doit prendre deux arguments: le tableau à partitionner et la longueur du bloc. Que se passe-t-il également si le dernier morceau n'est pas "plein" lors de l'utilisation de la partition?
NikoNyrh



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.