Criar pedaços de uma matriz


21

Sua tarefa é escrever um programa que, dada uma matriz e um número, você precise dividir a matriz em partes com tamanho e número.

Regras

Seu programa receberá uma matriz A, bem como um número inteiro positivo n. A matriz deve então ser dividida em partes de comprimento n, se o comprimento da sequência não for divisível por nqualquer sobra no final deve ser considerado seu próprio pedaço.

  • Se nfor maior que o comprimento da matriz A, você precisará retornar a matriz A, por exemplo: se n = 4e array A = [1,2,3], deverá retornar[1,2,3]

  • A matriz pode conter qualquer tipo e não número.

  • Você não deve alterar a ordem (ou direção) de nenhum item da esquerda para a direita. Por exemplo if n = 2e A= [1,2,3]. Qualquer resultado, em vez de [[1,2],[3]]será inválido.

Casos de teste

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

Isso é , então você terá os bytes mais curtos de cada idioma.


4
Se nfor maior que o comprimento de Aque precisamos retornar‽ ATem certeza de que não está falando sério [A]?
Adám 6/03

9
@ Chaugiang Eu ainda acho que um nretorno muito grande deve retornar [A], por exemplo [[1,2,3]]. E se né exatamente o comprimento de A?
Adám 6/03

4
@chaugiang Adam está correto. O valor de retorno deve ser consistente.
Jonah

1
@chaugiang N nunca pode ser igual a 1 ?
DJMcMayhem

4
Em uma linguagem fortemente digitado, é simplesmente impossível retornar Aao invés [A] , o que excluiria uma enorme quantidade de línguas.
dfeuer 6/03

Respostas:



9

JavaScript (ES6), 36 bytes

Toma entrada como (n)(array).

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

Experimente online!

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)

Agora que é uma solução limpa e arrumada, e também aprendi sobre funções anônimas recursivas!
Joe the Person

9

APL (Dyalog Unicode) , SBCS de 12 bytes

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

Muito obrigado a Adám por basicamente fazer basicamente todo o golfe (e basicamente todo o conhecimento sobre APL que tenho atualmente> _>).

Explicação

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

Execução

Argumentos 2, 1 2 3 4 5 6 7. Observe que as matrizes APL são do formato a b c, com parênteses opcionais.

             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)

Experimente online!


7
Parabéns pela sua primeira resposta da APL. E bem explicado também! Aqui, tem uma torta de APL: 🥧
Adám


7

Prolog (SWI) , 90 84 61 bytes

Código:

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

O formato de entrada pode ser um pouco estranho, mas é:

A * n * Result.

Por exemplo, para a entrada:

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

Você precisaria usar [1, 2, 3, 4, 5, 6] * 2 * Result..

Experimente online!


Versão não destruída:

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

Experimente online! .


6

PHP, 15 bytes

$f=array_chunk;

requer PHP 7. Ligue com $f(ARRAY, N).


6
Eu não acho que você precise dar outro nome a um builtin, então isso só marca 11, não é?
Neil

@ Neil Eu pensei que poderia ser uma brecha proibida ; mas você pode estar certo.
Titus




5

Brainfuck, 71 bytes

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

Não sei se isso conta ou não ... 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

Pega a entrada e coloca um espaço toda vez que os ncaracteres passam

Explicação (sem vírgulas porque isso interromperia o 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

2
Remova os espaços para 71 caracteres
MilkyWay90

lol, eu pensei que tinha removido todos eles, mas eu não percebi isso, obrigado!
vityavv

Tente reorganizar as células para que as células que você usa mais fiquem mais acessíveis (por exemplo, se a célula de entrada (aquela em que você usa ,mais) for usada mais, poderia ser uma célula mais fácil de acessar do que se fosse colocada em outras células) ou use um bruteforcer. Eu não sou habilidoso em jogar golfe no BF, portanto, essas sugestões podem não ser úteis.
MilkyWay90 7/03

Até agora eu tenho n n n A spacecomo minha configuração de célula, se você pode pensar em uma maneira melhor ...
vityavv 08/03

Poderia A space n n n ...funcionar (ou space A n n n...)?
MilkyWay90 8/03





4

Carvão , 1 byte

Experimente online! A E / S padrão do carvão vegetal dificulta a demonstração do uso de qualquer coisa, exceto cadeias. Se você deseja um programa completo que utiliza listas numéricas e gera listas formatadas, isso pode ser feito da seguinte maneira:

E⪪AN⪫ι,

Experimente online! Link é a versão detalhada do código. Explicação:

  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

<\~-

Experimente online!

Pega a matriz como argumento à esquerda e o tamanho do bloco como argumento à direita.

Usa um gancho diádico e o infixo advérbio com um argumento negativo, que faz o que queremos por definição.

Nota: O tipo de retorno deve estar na caixa, pois J permite apenas tabelas de itens de tamanhos iguais.



3

PHP , 45 bytes

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

Experimente online!


3
Seria apenas array_chunkuma resposta válida?
Arnauld

@ Arnauld eu não sei. Nunca joguei php antes, embora eu o use no trabalho.
Luis felipe De jesus Munoz

Também não tenho 100% de certeza, mas podemos abusar da conversão implícita de variáveis ​​não declaradas em uma string e fazer algo assim .
Arnauld 6/03

(errata: eu quis dizer 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 os pedaços sem delimitador.

Experimente online.

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

Na verdade, retorna uma lista de listas.

Experimente online.

Explicação:

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

Experimente online!

Hexdump:

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

Explicação:

ò           " 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 eu acho


Oi bem vindo. A função deve receber dois argumentos: a matriz a ser particionada e o comprimento do pedaço. Além disso, o que acontece se o último pedaço não estiver "cheio" ao usar a partição?
NikoNyrh 7/03



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.