Esse desafio está relacionado a alguns dos recursos da linguagem MATL, como parte do evento de linguagem do mês de maio de 2018 .
Introdução
No MATL, muitas funções de duas entradas funcionam em elementos com transmissão . Isso significa o seguinte:
Em termos de elementos (ou vetorizados ): a função aceita como entradas duas matrizes com tamanhos correspondentes. A operação definida pela função é aplicada a cada par de entradas correspondentes. Por exemplo, usando a notação pós-correção:
[2 4 6] [10 20 30] +
dá a saída
[12 24 36]
Isso também funciona com matrizes multidimensionais. A notação
[1 2 3; 4 5 6]
representa a matriz2
×3
(matriz)1 2 3 4 5 6
que tem tamanho
2
ao longo da primeira dimensão (vertical) e3
ao longo da segunda (horizontal). Então por exemplo[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Transmissão ou ( expansão singleton ): as duas matrizes de entrada não têm tamanhos correspondentes, mas em cada dimensão não correspondente, uma das matrizes possui tamanho
1
. Essa matriz é replicada implicitamente ao longo das outras dimensões para fazer corresponder os tamanhos; e então a operação é aplicada elemento a elemento como acima. Por exemplo, considere duas matrizes de entrada com os tamanhos1
×2
e3
×1
:[10 20] [1; 2; 5] /
Graças à transmissão, isso é equivalente a
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
e assim dá
[10 20; 5 10; 2 4]
Da mesma forma, com tamanhos
3
×2
e3
×1
(a transmissão agora atua apenas na segunda dimensão),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
O número de dimensões pode até ser diferente. Por exemplo, entradas com tamanhos 3 × 2 e 3 × 1 × 5 são compatíveis e fornecem um resultado 3 × 2 × 5. De fato, o tamanho 3 × 2 é o mesmo que 3 × 2 × 1 (existem arbitrariamente muitas dimensões singleton à direita implícitas).
Por outro lado, um par de
2
×2
e3
×1
matrizes daria um erro, porque os tamanhos ao longo da primeira dimensão são2
e3
: eles não são iguais e nenhum deles é1
.
Definição de radiodifusão modular
A transmissão modular é uma generalização da transmissão que funciona mesmo que nenhum dos tamanhos não correspondentes 1
. Considere por exemplo o seguinte 2
× 2
e 3
× 1
matrizes como entradas da função +
:
[2 4; 6 8] [10; 20; 30] +
A regra é a seguinte: para cada dimensão, a matriz menor ao longo dessa dimensão é replicada modularmente (ciclicamente) para corresponder ao tamanho da outra matriz. Isso tornaria o equivalente acima
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
com o resultado
[12 14; 26 28; 32 34]
Como um segundo exemplo,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
produziria
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Em geral, entradas com tamanhos a
× b
e c
× d
resultam em tamanho max(a,b)
× max(c,d)
.
O desafio
Implemente adição para matrizes bidimensionais com transmissão modular, conforme definido acima.
As matrizes serão retangulares (sem irregularidades), conterão apenas números inteiros não negativos e terão tamanho pelo menos1
em cada dimensão.
Regras adicionais:
A entrada e a saída podem ser obtidas por qualquer meio razoável . Seu formato é flexível, como de costume.
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas .
O menor código em bytes vence.
Casos de teste
O seguinte é usado ;
como separador de linhas (como nos exemplos acima). Cada caso de teste mostra as duas entradas e depois a saída.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
fonte
1
×n
(como[1 2 3]
) oun
×1
(como[1; 2; 3]
))Respostas:
Gelatina , 10 bytes
Pega um par de matrizes (duas matrizes de linhas) como entrada e retorna uma matriz.
Experimente online!
Como funciona
fonte
Carvão ,
2523 bytesExperimente online! Link é a versão detalhada do código. Recebe a entrada como uma matriz tridimensional. Explicação:
Coloque tudo.fonte
MATL ,
2524 bytesExperimente online!
Finalmente! Levou apenas uma semana para que o desafio inspirado no idioma do mês fosse respondido pelo idioma do mês!
Meu palpite é que não é tão curto quanto possível, mas estou feliz o suficiente porque minha versão inicial tinha mais de 40 bytes. editar: eu estava certo, Luis encontrou outro byte para espremer!
fonte
:
com a entrada vectorPython 3 ,
127126125 bytesjogou um byte mudando
sum(m)
param+n
Mais um byte graças a @ Jonathan Frech
Recebe a entrada como uma lista de duas matrizes bidimensionais.
Z
lambda recebe duas matrizes como entrada e retorna um iterador produzindo um índice e valores mesclados de ambas as matrizes, até que o índice atinja o maior comprimento da matriz. A variável index não é útil para mim e me custa bytes, mas não sei como ficar sem ela ... ( relacionada )Z
as matrizes externas e internas. Os valores mais internos são adicionados juntos.Experimente online!
Usar
itertools.cycle
parece um pouco trapaceiro, mas acho que já fui punido o suficiente pelo tamanho da declaração de importação :)Tenho certeza de que isso poderia ser um pouco mais praticado, especialmente o método de iteração que deixa essas variáveis
i
e inúteisj
. Eu ficaria grato por qualquer dica sobre como jogar isso, provavelmente estou perdendo algo óbvio.fonte
zip
os argumentos de sua pessoa, reverterf
a tarefa de compreensão e assim remover um espaço (for i,*l
->for*l,i
)? ( 125 bytes )?JavaScript (ES6), 131 bytes
Não é a ferramenta certa para o trabalho, e provavelmente também não é a abordagem certa. Oh bem ... ¯ \ _ (ツ) _ / ¯
Experimente online!
Quão?
A função auxiliar g () cria uma matriz do tamanho da maior matriz de entrada ( a ou b ) e chama a função de retorno de chamada c sobre ela:
A função auxiliar h () lê o array 2D a em (x, y) com transmissão modular:
O código principal agora é simplesmente lido como:
Versão recursiva, 134 bytes
Experimente online!
fonte
05AB1E , 15 bytes
Experimente online!
Versão antiga, 25 bytes
Experimente online!
Explicação
15 bytes:
25 bytes:
fonte
R ,
136 104 103 9593 bytesJogou golfe com
3335 bytes, seguindo o conselho de Giuseppe. Conseguiu obter menos de 100 bytes usando um operador como um nome de função. Veja o histórico para obter um código mais legível.Experimente online!
fonte
apply
erep.len
é o que eu havia considerado, embora não tivesse conseguido codificá-lo.dim
, muito mais limpo e abre a porta para uma generalização multi-dimensional com chamadas recursivas parar
outer(x,y,"+")
que contém todas as somas certas, e em um padrão claro. Não consigo descobrir como extraí-los com eficiência.K (ngn / k) , 23 bytes
Experimente online!
fonte
05AB1E , 18 bytes
Experimente online!
Explicação
fonte
Pitão, 24 bytes
Experimente aqui
Explicação
fonte
Java 8, 172 bytes
Experimente online.
Explicação:
fonte
APL (Dyalog Classic) ,
2321 bytesExperimente online!
esta pode ser a única vez que tenho a chance de usar
|[0]
fonte
Python 2 ,
124116 bytesExperimente online!
Explicação:
Leva a lista de duas listas 2-d como entrada.
fonte
Python 2 ,
10197105 bytesEdit: Obrigado (novamente!) Ao Dead Possum por salvar 4 bytes
Edit 2: perdeu 8 bytes, alguns casos de teste não estavam passando
Uma mistura entre a solução anterior do Dead Possum (graças a ele!) E minha própria solução Python 3 .
Experimente online!
A mesma entrada da minha solução Python 3 (um par de listas bidimensionais).
Código comentado:
fonte
Julia 0.6 ,
8583 bytesExperimente online!
(Substitua
⧻
por\
agradecimentos a Jo King )Funciona repetindo cada matriz horizontal e verticalmente para que ambos tenham o mesmo tamanho (produto de tamanhos de linha x produto de tamanhos de coluna), somando-os e extraindo a região correta a partir disso. (As entradas de vetor de linha ou de vetor de coluna precisam que uma
reshape
chamada seja convertida como matrizes bidimensionais, o que suponho que seja bom, pois a pergunta especifica "Implementar adição para matrizes bidimensionais" e "Entrada e saída podem ser atendidas por qualquer razoáveis. Seu formato é flexível como de costume. ")fonte