Crear fragmentos a partir de una matriz

21

Su tarea es escribir un programa que, dado un conjunto y un número, necesita dividir el conjunto en trozos con el tamaño es número.

Reglas

Su programa recibirá una matriz A, así como un número entero positivo n. La matriz se debe dividir en trozos de longitud n, si la longitud de la cadena no es divisible por nlas sobras al final debe considerarse su propio fragmento.

  • Si nes mayor que la longitud de la matriz A, deberá devolver la matriz A, por ejemplo: si n = 4y array A = [1,2,3], debe devolver[1,2,3]

  • La matriz puede contener cualquier tipo en lugar de número.

  • No debe cambiar el orden (o dirección) de ningún artículo de izquierda a derecha. Por ejemplo if n = 2y A= [1,2,3]. Cualquier resultado en lugar de [[1,2],[3]]será inválido.

Casos de prueba

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

Este es el , por lo que los bytes más cortos de cada idioma serán los ganadores.

chau giang
fuente
44
Si nes mayor que la longitud de la Aque necesitamos regresar‽ A¿Estás seguro de que no quieres decir [A]?
Adám
99
@chaugiang Sigo pensando que ndebería volver un demasiado grande [A], por ejemplo [[1,2,3]]. ¿Qué pasa si nes exactamente la longitud de A?
Adám
44
@chaugiang Adam tiene razón imo. El valor de retorno debe ser consistente.
Jonás
1
@chaugiang ¿Puede n ser igual a 1 ?
DJMcMayhem
44
En un lenguaje fuertemente tipado, es simplemente imposible regresar en Alugar de [A] , lo que excluiría una gran cantidad de idiomas.
dfeuer

Respuestas:

9

JavaScript (ES6), 36 bytes

Toma entrada como (n)(array).

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

Pruébalo en línea!

Comentado

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
fuente
Ahora que es una solución ordenada y limpia, ¡también aprendí sobre las funciones anónimas recursivas!
Joe la persona
9

APL (Dyalog Unicode) , SBCS de 12 bytes

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

Muchas gracias a Adám por hacer básicamente todo el golf (y básicamente por todos los conocimientos de APL que tengo actualmente> _>).

Explicación

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

Ejecución

Argumentos 2, 1 2 3 4 5 6 7. Tenga en cuenta que las matrices APL son de la forma a b c, con paréntesis opcionales circundantes.

             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)

Pruébalo en línea!

Solo ASCII
fuente
77
Felicitaciones por su primera respuesta APL. Y muy bien explicado también! Aquí, tenga un pastel APL: 🥧
Adám
7

Prólogo (SWI) , 90 84 61 bytes

Código:

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

El formato de entrada puede ser un poco extraño, pero es:

A * n * Result.

Por ejemplo, para la entrada:

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

Tendría que usar [1, 2, 3, 4, 5, 6] * 2 * Result..

Pruébalo en línea!


Versión sin golf:

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

Pruébalo en línea! .

Adnan
fuente
6

PHP, 15 bytes

$f=array_chunk;

requiere PHP 7. Llamar con $f(ARRAY, N).

Tito
fuente
66
No creo que se requiera que le des otro nombre a una construcción, así que esto solo es 11, ¿no?
Neil
@Neil, pensé que podría ser una escapatoria prohibida ; Pero puede que tengas razón.
Tito
5

Python 2 , 39 bytes

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

Pruébalo en línea!

Asume que 1 fragmento por línea es una salida aceptable.

ElPedro
fuente
44
36 bytes como una función recursiva lambda
ovs
@ovs: muy agradable y también lo suficientemente diferente para que puedas publicar como tu propia respuesta si lo deseas.
ElPedro
5

Brainfuck, 71 bytes

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

No sé si esto cuenta o no ... formato de entrada:

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

Toma la entrada y pone un espacio cada vez nque pasan los personajes

Explicación (sin comas porque eso rompería el programa):

, 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
fuente
2
Eliminar los espacios para 71 caracteres
MilkyWay90
jajaja, pensé que los había eliminado a todos, pero no me di cuenta de eso, gracias
vityavv
Intente reorganizar las celdas de modo que las celdas que usa más sean más accesibles (por ejemplo, si la celda de entrada (la que usa ,más) se usa más, se podría colocar una celda que sea más fácil de acceder que si se colocara en otras células) o use un bruteforcer. No soy experto en golf en BF, por lo que estas sugerencias pueden no ser útiles.
MilkyWay90
Hasta ahora tengo n n n A spacecomo configuración de mi celda, si se te ocurre una mejor manera ...
vityavv
¿Podría A space n n n ...funcionar (o space A n n n...)?
MilkyWay90
4

CJam , 3 bytes

{/}

Este es un bloque anónimo que toma una matriz de números y un número de la pila, y los reemplaza por una matriz de matrices.

Pruébalo en línea!

Luis Mendo
fuente
4

Carbón , 1 byte

Pruébalo en línea! La E / S predeterminada de Charcoal dificulta la demostración utilizando cualquier cosa excepto cadenas. Si desea un programa completo que tome listas numéricas y genere listas formateadas, puede hacerlo de la siguiente manera:

E⪪AN⪫ι,

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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

C # (compilador interactivo de Visual C #) , 78 77 43 bytes

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

Pruébalo en línea!

Creo que deberíamos poder escribir simplemente int i;porque 0 es el valor predeterminado de int. Lo dejo para evitar el error: error CS0165: Use of unassigned local variable 'i'.

aloisdg dice Reinstate Monica
fuente
4

J , 4 bytes

<\~-

Pruébalo en línea!

Toma la matriz como argumento izquierdo y el tamaño del fragmento como argumento derecho.

Utiliza un gancho diádico y el adverbio infijo con un argumento negativo, que hace lo que queremos por definición.

Nota: El tipo de retorno debe estar encuadrado porque J solo permite tablas de elementos de igual tamaño.

Jonás
fuente
3

PHP , 45 bytes

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

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
3
¿ array_chunkSería una respuesta válida?
Arnauld
@Arnauld no lo sé. Nunca jugué golf en PHP antes, aunque lo uso en el trabajo.
Luis felipe De jesus Munoz
Tampoco estoy 100% seguro, pero podemos abusar de la conversión implícita de variables no declaradas en una cadena y hacer algo así .
Arnauld
(erratum: quise decir constantes indefinidas )
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));}

Imprime los trozos sin delimitador.

Pruébalo en línea.

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

En realidad, devuelve una lista de listas.

Pruébalo en línea.

Explicación:

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

V , 6 bytes

òÀf,r

Pruébalo en línea!

Hexdump:

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

Explicación:

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

Clojure, 14 bytes

#(partition %)

construcciones supongo

nihilazo
fuente
Hola bienvenido. La función debe tomar dos argumentos: la matriz que se va a particionar y la longitud del fragmento. Además, ¿qué sucede si el último fragmento no está "lleno" cuando se usa la partición?
NikoNyrh
3

Haskell , 26 bytes

import Data.Lists
chunksOf

Aquí hay una versión más interesante, con solo unos pocos bytes más (gracias a nimi por cinco bytes en cada solución):

Haskell , 31 bytes

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

Pruébalo en línea!

dfeuer
fuente
Creo que puedes
aloisdg dice Reinstate Monica
1
n!x=take n x:n!drop n x. Data.Listsproporciona también chunksOf.
nimi
3

PowerShell , 67 65 bytes

-2 bytes gracias AdmBorkBork

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

Pruébalo en línea!

mazzy
fuente
2
Debería poder rv b(alias para Remove-Variable) en lugar de $b=@()guardar dos bytes.
AdmBorkBork
3

Gelatina , 1 byte

s

Pruébalo en línea!

Si bien la impresora hace que parezca que las divisiones de un solo elemento no están incluidas en listas, en realidad lo están.

Ven
fuente
1
Esta noche da una mejor salida en cuanto a mostrar que las matrices de elementos individuales todavía son matrices.
Nick Kennedy
Er, ¿es el voto negativo porque no agregué el enlace de @Nicky Kennedy?
Ven
ciertamente no de mí
Nick Kennedy