Nesse simples desafio, você recebe uma matriz L
de números inteiros não negativos e um número de posições b
maior que 0, mas não maior que o comprimento de L
. Seu código deve retornar uma nova matriz M
cujo comprimento seja b
e que tenha colocado na matriz L
. Isso é mais fácil explicado com exemplos.
L = [1,0,5,1]
e b = 2
retorna M = [1,6]
.
L = [0,3,7,2,5,1]
e b = 3
retorna M = [3,9,6]
.
Até agora, tão simples. No entanto, nesta questão b
não precisa necessariamente se dividir len(L)
. Nesse caso, o último compartimento terá apenas menos números para compensar.
Cada compartimento, exceto possivelmente o último, deve ter o mesmo número de números contribuindo para o total. O último compartimento não deve ter mais números contribuindo para ele do que os outros compartimentos. O último compartimento deve ter o maior número possível de contribuintes, sujeito a outras regras.
L = [0,3,7,2,5,1]
e b = 4
retorna M = [3,9,6,0]
. M = [10,8,0,0]
não é uma saída aceitável, pois o terceiro compartimento não possui o número de nome de números que contribuem para ele como compartimentos 1
e 2
.
L = [0,3,7,2,5]
e b = 2
retorna M = [10,7]
. M = [3, 14]
não é uma saída aceitável, pois o último compartimento terá 3
elementos que contribuem para ele, mas o primeiro possui apenas 2
.
L = [1,1,1,1,1,1,1]
e b = 3
retorna M = [3,3,1]
.
Como regra final, seu código deve ser executado em tempo linear.
Você pode usar qualquer idioma ou biblioteca que desejar e pode assumir que a entrada é fornecida da maneira que achar conveniente.
Acontece que existem algumas entradas que não podem ser resolvidas. Por exemplo [1,1,1,1,1]
e b=4
. Seu código pode gerar o que quiser para essas entradas.
your code must run in linear time
- Eu encontraria qualquer algoritmo que não siga isso naturalmente bem estranhoRespostas:
APL (Dyalog) , 19 bytes
Experimente online!
Anexamos b zeros à matriz antes de remodelá- la em partes iguais de
⌈⍺÷⍨≢⍵
( ⌈ comprimento de L ÷ b ⌉ ) e somatá- las, como representado em,⍺⍴0
, uma vez que qualquer quantidade de pontos em branco (que não fazem parte da matriz original) é maior que b - 1 seria preenchido com pelo menos elementos b - 1 de outros pedaços, o que torna o ponto de equilíbrio do último grupo na diferença máxima de b - 1 do resto. Usamos b> b - 1 porque é um código de golfe.Por exemplo, L com 15 elementos eb = 3 não seria agrupado como
mas sim como (observe como os 2
x
s mais à direita "preenchem" os zeros mais à esquerda)enquanto uma matriz de 16 elementos seria preenchida com 2 ( 3 - 1 ) pontos em branco, como
fonte
Python 2 , 65 bytes
Experimente online!
fonte
R ,
75717063 bytesExperimente online!
Este almofadas
L
comNA
até que o comprimento é um múltiplo deb
, em seguida, leva as somas de colunaL
como uma matriz comb
colunas, a remoção deNA
valores.Explicando como um idioma baseado em pilha:
fonte
function(L,b)colSums(matrix("length<-"(L,ceiling(length(L)/b)*b),,b),T)
no bytes saved for less readability
é provavelmente o lema do golfe R ... embora eu suponha quesum(L|1)
seja um byte salvolength(L)
!MATL , 6 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Considere a entrada
4
,[0,3,7,2,5,1]
como um exemplo.fonte
Ruby ,
5453 bytesGuardou um byte graças a @Kirill L.
Experimente online!
fonte
[0]*b
por1..b
C (gcc) , 107 bytes
Experimente online!
fonte
Haskell , 61 bytes
Experimente online!
fonte
[1, 2, 3, 4, 5, 6] # 3
.Java 10,
968986 bytesExperimente online aqui .
Encontrou uma maneira mais curta de escrever
i/(n/b+(n%b==0?0:1)
aqui:i/((n+b-1)/b)
Agradecimentos a Olivier Grégoire por jogar 3 bytes.
Versão não destruída:
fonte
Elixir , 98 bytes
Experimente online!
O melhor Elixir é dividir em partes com um comprimento de n . E não pode limitar muito bem a divisão como número inteiro; portanto, fazemos a divisão flutuante, arredondando-a para cima. Infelizmente, a única maneira de fazer isso resulta em um float, então o arredondamos novamente para um número inteiro.
fonte
Perl 6 ,
52 5150 bytes52 bytes: teste
51 bytes: teste
50 bytes: Experimente
47 bytes não concorrentes Testá-lo
Não é competitivo, pois
».sum
é permitido fazer os cálculos em paralelo. Portanto, pode ou não ser em tempo linear.Expandido:
fonte
Carvão , 22 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Entrada
b
.Entrada
L
.Pressione a
0
paraL
até queL
o comprimento seja divisível porb
.Divida
L
o comprimento porb
e divida-oL
em seções desse comprimento; em seguida, somar cada seção e converter em string para saída implícita em linhas separadas.fonte
JavaScript (Node.js) , 71 bytes
Experimente online!
fonte
C (clang) , 58 bytes
Experimente online!
f()
usa os parâmetros da seguinte maneira::L
ponteiro para a matriz de entradal
: comprimento da matriz de entradab
: número de posiçõesm
: ponteiro para o buffer que recebe nova matrizA seguir, é apresentada uma versão reentrante a 60 bytes:
fonte
PHP, 88 bytes
função anônima, pega array e número inteiro, retorna array
O potencial só jogar golfe este tinha estava substituindo
ceil(count($a)/$b))
com(count($a)-1)/$b+1
e abreviar(count($a)-1)
com~-count($a)
. O float resultante é convertido implicitamente em número inteiro naarray_chunk
chamada.Experimente online .
fonte