Introdução
Considere duas matrizes inteiras não vazias, digamos A = [0 3 2 2 8 4] e B = [7 8 7 2] . Para executar a adição de alinhamento neles, fazemos o seguinte:
Repita cada matriz vezes suficientes para ter comprimento total lcm (comprimento (A), comprimento (B)) . Aqui lcm representa o menor múltiplo comum.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Execute a adição por elementos nas matrizes repetidas e corte o resultado em todas as posições em que houver um corte em qualquer uma delas.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Essa matriz de matrizes é o seu resultado.
A tarefa
Suas entradas são duas matrizes não vazias de números inteiros e sua saída será o resultado da adição de alinhamento, conforme definido acima. As entradas e saídas podem estar em qualquer formato razoável. Você não precisa se preocupar com excesso de número inteiro ao executar a adição.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence.
Casos de teste
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
fonte
Respostas:
JavaScript (ES6),
10199 bytesAceita entrada como 2 matrizes. Retorna uma string.
Como funciona
Nós iteramos na primeira matriz
a
com um ponteiroi
enquanto atualizamos outro ponteiroj
na segunda matrizb
. As somasa[i] + b[j]
são anexadas à sequência de saídas
. Um separador é inserido toda vezi == 0
ouj == 0
. Repetimos esse processo até que elej
retorne exatamente no início deb
no final de uma iteração.Nota: Quando o
|
operador é aplicado,a.map(...)
é coagidoNaN
(sea
contém mais de um elemento) ou ao valor atual dej
(sea
contém exatamente um elemento). Portanto,a.map(...)|j == j
em todos os casos e é seguro usar aqui.Casos de teste
Mostrar snippet de código
fonte
Haskell,
8479 bytesMinha primeira versão foi a mesma em um layout mais legível:
Usando uma definição local para evitar a necessidade de fornecer
(%)
argumentos extras paraa
eb
. Surpreendentemente, essa é quase a mesma solução fornecida quase ao mesmo tempo que a @ nimi, de quem tomei a ideia de usar apenas uma linha para a definição local.Uso:
fonte
!
.PHP,
126120 bytesExperimente aqui!
Função anônima que retorna a matriz resultante de matrizes.
Essencialmente, percorremos o conteúdo de ambas as matrizes, modificando nosso iterador pelo comprimento da matriz para simular 'copiá-las'. Tomando cada um dos valores das matrizes, nós somá-los e adicioná-los para uma matriz em
$c
. Se chegarmos ao final de uma de nossas matrizes de entrada (uma divisão, em termos do desafio), começaremos a atribuir uma nova matriz em$c
.A razão para o
do while
loop é porque nossa condição é baseada$i
, que começa em0
. Se usarmos um loop em que a condição é verificada no início, o loop não será executadoSomente finalizamos a soma quando atingimos o final de ambas as matrizes ao mesmo tempo, o que implicaria o LCM.
fonte
$b[$i%$y]
? Você pode salvar 3 bytes passando$x=count($a)
para o primeiro uso de$x
; mesmo para$y=count($b)
e um byte com bit a bit ou nawhile
condiçãoHaskell,
8784 bytesExemplo de uso:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Recursão simples. Caso base: as duas listas estão vazias. Se apenas um deles estiver vazio, reinicie com uma versão completa e inicie um novo cluster na saída. Se nenhum estiver vazio, acrescente a soma ao elemento from.
Veja também a resposta de @Christian Sievers , que é quase idêntica e foi publicada alguns segundos antes.
fonte
Oitava, 113 bytes
esta função pode ser chamada diretamente para colocá-la entre parênteses e chamar como (@ (a, b) ...) ([1 2 3 4], [6 4 5])
fonte
CJam , 30 bytes
Experimente online!
Recebe a entrada como um par de listas.
Explicação
A idéia é inserir alguns marcadores nas matrizes de entrada (na forma de cadeias curtas) que indicam onde termina a matriz alinhada e onde precisamos inserir as quebras nas matrizes. Dessa forma, podemos evitar ter que calcular o LCM.
fonte
Geléia ,
212018 bytesExperimente online!
Como funciona
fonte
Python 3.5 - (
146137134130 + 12) = 142 bytesNão consigo descobrir como colocar o loop for inteiro em uma linha.
Edições:
fonte
gcd
função está dentrofractions
, nãomath
.3.4.3
.l*k
e colocarprint(r);r=[]
na última linha.Python 2, 119 bytes
Recebe a entrada do stdin como duas tuplas separadas por vírgula, gera as listas resultantes para o stdout. Encerra levantando a
ZeroDivisionError
exceção, pois isso parece ser permitido .Por exemplo, se a entrada for
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, o programa imprimirápara stdout e a exceção traceback para stderr.
fonte
J ,
3432 bytesExperimente online!
Explicação
fonte
Haskell, 166 bytes
Essa provavelmente não é a abordagem mais elegante: basicamente, a função
?
cria uma lista do comprimento necessário com essas somas e%
está cortando essa soma novamente.!
é a função final que mescla esses dois.fonte
ind
pork
ou algo assim, e existem alguns parênteses desnecessários ao redordrop i l
emap(+(-i))ind
. Considere também ter dois casos para%
, com a correspondência de padrões ativadal
.[PHP],
183152135 135 bytesNice version:
Saída:
fonte
$i=$j=$k=0;
é desnecessário se você usar+$i
etc. para os índices da matriz na atribuição anexa (-8 bytes).$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, duas vezes).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
não precisa de espaço (-1).$i=$j=0;
peças, pois os primeiros valores das matrizes não estarão corretos. Eu modifiquei a lógica um pouco para não ter certeza de como implementar operadores ternários neste caso. Obrigado por++$i
conselhos.unset($i);$A[+$i]
. O+
será convertidonull
para inteiro0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
->isset($A[++$i])?:$i=!++$k|!++$f;
ainda salva 5 bytes cada. Salve mais um com em$f<2
vez de$f!=2
. e outro com duaswhile($f=$f<3){...}
em vez dewhile($f<2){$f=0;...}
(inicializa e repõe$f
a 1, a menos que IT'S incrementado duas vezes)PowerShell ,
147145 bytesExperimente online!
( Sugestões de golfe são bem-vindas. Acho que provavelmente existem outros 10 a 15 bytes que podem ser extraídos disso. )
Recebe entrada como duas matrizes explícitas (com a
@(...)
sintaxe) como argumentos da linha de comando. Retorna uma hashtable das matrizes resultantes, porque matrizes multidimensionais no PowerShell podem ficar estranhas e isso é mais consistente. Define algumas variáveis iniciais e, em seguida, insere um loopdo
/until
novamente, com o estado condicional até que$i
o lcm da matriz conte .Cada iteração de loop, adicionamos os valores correspondentes
$a
e$b
os tratamos como um array,(...)
antes de adicioná-los à hashtable$o
no local apropriado$j
. O encapsulamento da matriz é necessário para evitar a adição aritmética - isso força a+=
sobrecarga à concatenação da matriz. Em seguida, um condicional em$x
e$y
(as contagens) para determinar se estamos em uma borda da matriz - nesse caso, incrementamos$j
.Finalmente, deixamos
$o
o pipeline e a produção está implícita.(NB: devido ao modo como o PowerShell enumera tabelas de hash com o padrão
Write-Output
, isso tende a ser gerado "para trás"; como em, a "0a" matriz resultante fica na "parte inferior" da saída. O próprio hash é bom e seria usado muito bem se você, por exemplo, encapsular esse código em uma variável de retorno ... parece estranho quando é impresso.)Economizou 2 bytes movendo $ xe $ y para a indexação da matriz em vez de separar (salvou dois pontos e vírgulas).
fonte
Python 2, 113 bytes
fonte
not
ser os<1
s?Python 3.5,
210176173169158 BytesPega duas listas como entrada e imprime todas as listas.
É a minha primeira resposta e ainda não sei jogar golfe. A idéia básica que usei é ter dois contadores para cada lista, que indicam uma divisão e uma lista atual em que os valores adicionados são anexados; assim que uma divisão é encontrada, imprimimos a lista atual e fazemos uma nova lista vazia.
fonte
x=[];c=len(a);d=len(b);e=f=0
. Além disso,true
pode se tornar1
ex.append(a[e]+b[f])
pode se tornarx+=a[e]+b[f],
.if
ewhile
declarações não precisam de parênteses.Raquete 373 bytes
Ungolfed:
Teste:
Saída:
fonte
Clojure,
280206 bytesBem, isso faz muito mais sentido. Gerando a soma elemento a elemento, adicionando metadados posicionais, demorando enquanto ainda não repetimos e colocando o valor da soma em cada partição.
Original: Espero melhorar isso, mas este é o mais gentil que tenho por enquanto.
Ungolfed e verbose:
Começa "mesclando" um ciclo infinito de coleções
a
eb
, adiciona metadados ao índice de cada elemento dentro da coleção, leva até que as duas seqüências iniciem novamente no índice 0.Essa coleção
c
é então mesclada com os dados da partição (uma soma acumulada de uns e zeros), particionada e o último elemento (sendo soma de itens) é selecionado.Penso que para melhorias significativas é necessária uma abordagem totalmente diferente.
fonte
PHP,
150121119 bytesfunção anônima recebe entrada como matrizes.
demolir
fonte
C ++ 14, 206 bytes
Como lambda sem nome genérico, que necessitam de recipientes de entrada
P
,Q
e a saída do recipienteR
para ser assimvector<vector<int>>
.Ungolfed e uso:
fonte
Mathematica 112 Bytes
Provavelmente isso poderia ser melhorado. A idéia é criar uma matriz 2D com o segundo elemento usado para rastrear o locador do contador e modificar o comprimento de cada matriz de entrada.
Uso
fonte
JavaScript (ES6), 131 bytes
Ligeiramente não destruído:
d
ee
contiverem números, a soma do primeiro número será anexadas
e os elementos restantes serão processados recursivamentes
será anexada ao resultador
e a outra matriz será redefinida para sua matriz inicialInfelizmente, esta solução não tem a eficiência implacável da @ Arnauld's, mas pelo menos eu acho que é uma solução bonita.
fonte