Você receberá duas matrizes de números de ponto flutuante. Sua tarefa é emparelhar os elementos correspondentes das duas matrizes e obter o máximo de cada par. No entanto , se os dois elementos correspondentes forem iguais, você deverá obter a soma deles.
Por exemplo, dadas as listas [1, 3, 3.2, 2.3]
e [3, 1, 3.2, 2.6]
, você deve fazer o seguinte:
Emparelhar os elementos (ou ZIP):
[[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]]
.Ir através de cada par e aplicar o processo acima:
[3, 3, 6.4, 2.6]
.
Especificações
As matrizes / listas sempre terão o mesmo comprimento. No entanto, eles podem estar vazios.
Os números que eles contêm sempre se ajustam aos recursos do seu idioma, desde que você não abuse disso. Eles podem ser positivos, zero ou negativos, você deve lidar com todos os tipos.
Se isso ajudar a reduzir sua contagem de bytes, você também pode usar o comprimento das listas como entrada.
Regras
- Isso é código-golfe , então a resposta mais curta em bytes vence.
- Regras de entrada e saída padrão se aplicam. Você pode receber entrada (e saída) em qualquer formato razoável.
- As brechas padrão são proibidas.
Casos de teste
Matriz_1, Matriz_2 -> Saída [], [] -> [] [1, 2, 3], [1, 3, 2] -> [2, 3, 3] [1, 3, 3,2, 2,3], [3, 1, 3,2, 2,6] -> [3, 3, 6,4, 2,6] [1,2,3,4,5,5,7,8,9,10], [10,9,8,7,6,5,4,3,2,1] -> [10, 9, 8, 7, 6, 10, 7, 8, 9, 10] [-3,2, -3,2, -2,4, 7, -10,1], [100, -3,2, 2,4, -7, -10,1] -> [100, -6,4, 2,4, 7, -20,2]
Respostas:
Gelatina, 4 bytes
Experimente online!
Isso usa exatamente a mesma abordagem da minha resposta do APL , exceto que o Jelly tem um builtin para adicionar um a um número!
fonte
Kotlin,
787571666559 bytesÉ a minha primeira tentativa, seja legal: D
O TIO não funciona com esta solução (e não sei por que), código fonte para testes abaixo
EDITAR:
-3 substitua "a + b [i]" por "a * 2"
-4 por substituir o método "mapIndexed" por "zip" (Graças à solução @AnonymousReality Swift)
-5 substitua o método "Math.max" por quando a condição
-1 por alteração quando a ordem da condição
-6 por alteração toFloatArray () por toList ()
fonte
Python 2 , 45 bytes
Uma mistura da minha solução inicial e @ovs ' .
Experimente online!
Python 2 , 49 bytes
Experimente online!
Python 2 , 46 bytes
@ovs sugeriu este método para economizar 3 bytes.
Experimente online!
Quão?
Primeiro, emparelhamos os elementos correspondentes, usando
*
ouzip()
. Isso nos permite fazer mais golfe trabalhando com um mapa ou com uma lista de compreensão.O truque legal nesta resposta é esta parte:
max(x,y)*-~(x==y)
. Como isso funciona? - Bem, como muitos de vocês já sabem, o Python converte automaticamente valores bool em números inteiros quando são usados em operações aritméticas. Portanto,(x==y)
é avaliado como1
se a condição for atendida. No entanto, se os dois valores não forem iguais, ele retornará0
. Em seguida, a operação bit a bit-~
incrementa o valor retornado do bool1
, fornecendo-nos2
ou1
.max(a,b)
fornece o valor máximo do par e o*
multiplica pelo valor retornado acima (para que seja multiplicado2
apenas se forem iguais; nesse caso,max()
retornará o valor de ambos).Isso se baseia no fato de que a soma de dois números iguais é de fato um deles duplicado e o tipo de "abuso" da classe bool do Python é uma subclasse de int.
fonte
lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
JavaScript (ES6),
53494543 bytesTente
Explicação
Função anônima que toma as 2 matrizes como argumentos por meio de parâmetros
a
eb
, ao currying sintaxe (ou seja, chama comf(a)(b)
Mapeie a primeira matriz, passando cada elemento por uma função em que
x
é o elemento atual ey
o índice atual.Obtenha o elemento no índice
y
na segunda matriz e atribua-o como o novo valor dey
.Verifique se
y
é maior quex
e, em caso afirmativo, retorney
.Senão, verifique se
y
é menor quex
e, se sim, retornex
Senão, retorne a soma de
x
ey
. (Multiplicarx
ouy
por 2 também funcionaria aqui, para o mesmo número de bytes.)fonte
j.value.split`,`.map(eval)
oueval('['+j.value+']')
? Tambémx+y
ficaria mais limpo IMHO..map(eval)
-los. 2) Concordado, será editado momentaneamente.Haskell, 34 bytes
Experimente online.
fonte
x!y=max x y+sum[x|x==y]
.R ,
3129 bytespmax
toma o máximo paralelo das duas (ou mais) matrizes (reciclando a mais curta, conforme necessário).Eu estava olhando o comentário de Luis Mendo e, obviamente, percebi que a abordagem poderia funcionar para R também. Isso me levou a 30 bytes, mas depois comecei a brincar com diferentes formas de obtenção de índices em vez de melhorar a minha resposta original, e tropeçou em
!a-b
comoTRUE
, ondea==b
eFALSE
de outra forma, equivalente aa==b
. No entanto, por qualquer motivo, R não exige parênteses,!a-b
como isso significaa==b
, o que me salvou em dois bytes.Como mencionado por JDL nos comentários , isso funciona porque
!
(negação) tem precedência menor do que o operador binário-
em R, o que é estranho.Experimente online! (nova versão)
Experimente online! (original)
fonte
:
interagir com aritmética.Python 3 ,
484644 bytes-2 bytes graças a @nwellnhof
Experimente online!
fonte
Dyalog APL, 5 bytes
Experimente online!
Quão?
⌈
, máximo em elementos dos argumentos×
multiplicar por elementos1+=
, 1 adicionado à igualdade entre elementos dos argumentosIsso funciona porque, se os números forem desiguais,
1+=
será1
, o que, quando multiplicado pelo máximo, é o máximo. Quando os números forem iguais,1+=
retornará2
, quando multiplicado pelo máximo, obteremos o dobro do máximo ou o máximo adicionado a ele mesmo.fonte
Gelatina , 6 bytes
Um link diádico obtendo uma lista de números de cada lado e retornando a lista resultante.
Experimente online! ou veja uma suíte de testes *.
Quão?
Uma alternativa é esse link monádico, com uma lista das duas listas, também com 6 bytes :
* Acho que nunca criei um rodapé da suíte de testes quase três vezes a contagem de bytes do código antes!
fonte
»
vetoriza antes!max([1,1,0],[1,0,3]) -> [1,1,0]
(não[1,1,3]
).05AB1E , 5 bytes
Experimente online!
-1 graças a Emigna .
fonte
γ
!{γθ
é provavelmente o mais curto possível para isso.øεMÃO
?MÃ
) yay tem a liderança agora: p btwøεZÃO
iria trabalhar muitoMATL , 7 bytes
Entrada é uma matriz de duas linhas, em que cada linha é uma das matrizes.
Experimente online!
Explicação
fonte
Java 8,
80696766656463 bytesModifica a segunda matriz de entrada ou retorna uma nova matriz flutuante para salvar bytes.
-11 bytes, assumindo o comprimento como entrada inteira adicional, o que é permitido de acordo com as regras de desafio.
-5 bytes graças a @ OliverGrégoire (um byte de cada vez .. xD)
-1 byte indiretamente, graças à resposta JS de @Shaggy , usando em
a[l]*2
vez dea[l]+b[l]
.Explicação:
Experimente aqui.
fonte
a->b->l->{float A,B;for(;l-->0;b[l]=(A=a[l])<B?B:A>B?A:A+B)B=b[l];}
float A, B
afor
inicialização.(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}
(63 bytes)Pitão , 11 bytes
Experimente aqui!
Pitão , 12 bytes
Experimente aqui!
ou
Experimente aqui!
fonte
05AB1E,
987 bytesSaved a byte as Erik the Outgolfer pointed out that a list of lists is valid input.
Try it online!
Explanation
fonte
‚
and inputting as a pair of a list and a list.Mathematica, 31 bytes
fonte
J, 7 bytes
Try it online!
Takes one list as the left argument and the other as the right.
Luckily, equality is a rank zero operation.
Explanation
@.
isn't really an if statement, but in this case it functions as one (it indexes into the gerund>.`+
based on the result of its right argument and applies that to the input).fonte
Ruby, 42 bytes
Try it online!
The spaceship operator is great.
fonte
TI-Basic,
2321 bytesToo bad lists take up two bytes each...
fonte
X
eY
, em seguida, usandoʟX
eʟY
para acessá-los, ou seja, "Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2
".L1(L1=L2)
tenta obter o elemento deL1
em uma lista, o que gera um erro. Para consertar isso, troque a ordem, ou seja(L1=L2)L1
.Oitava, 36 Byte
fonte
@(a,b)max(a,b).*(1+(a==b))
@(a,b)a.*(a>=b)+b.*(b>=a)
Pyth, 7 bytes
Try it here.
fonte
Python 3,
494645 bytes3 bytes removed thanks to @Mr.Xcoder (splat instead of two arguments), and 1 byte thanks to @ovs (map instead of list comprehension)
Try it online!
fonte
lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]
. Acontece que isso é muito bom também :) - Pena que não há lugar para mais golfeLisp comum,
6059 bytesExperimente online!
-1 byte graças a @ Zacharý!
fonte
(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))
.Python com numpy, 28 bytes
Assume que a entrada é fornecida como duas matrizes numpy.
fonte
lambda a,b:n.fmax(a,b)*((a==b)+1)
import numpy as n
. Fico sem ele aqui porque está implícito na entrada.n
se tiver definidon
em seu código, portanto as importações devem ser explícitas. Por padrão, permitimos funções ou programas completos como respostas, o que inclui funções anônimas.numpy
. Mas isso funciona mesmo sem usarreturn
?C # (.NET Core) , usando Linq 47 + 18 = 65 bytes
Experimente online!
C # (.NET Core), 82 bytes
Experimente online!
fonte
Array
vsIList
vsIEnumerable
, mas se todos são elegíveis, você pode obter a contagem de bytes em 37 - tio.run/##Sy7WTS7O/…Perl 6 ,
3428 bytesExperimente online!
fonte
Swift 3,
8179 bytesO Swift tem uma propriedade interessante, pois um Int não pode ser convertido diretamente para a
Double
, então você deve especificar quaisquer matrizes como sendo matrizes deDouble
s antes de passá-las para a função.(por exemplo)
var k:[Double] = [1,2,3,4,5,5,7,8,9,10]
Edit: -2 bytes graças a @EriktheOutgolfer
fonte
(x,y)
e antes?
??
é necessário porque o Swift os trataria como tipos opcionais em vez de ternários (o que não são). Os outros não são. Além disso, isso pode ser drasticamente jogado.func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}
(as imprecisões flutuador não devem ser manuseados por padrão)func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
C,
7675 bytesAgradecemos a @Kevin Cruijssen por salvar um byte!
Experimente online!
fonte
Japonês , 13 bytes
Experimente online! com o
-Q
sinalizador para formatar a matriz de saída.fonte
í
poderia assumir uma função como um segundo argumento.Ferrugem ,
10797 bytesExperimente online!
Guardado 8 bytes graças a @mgc
fonte
Vec
e utilizando omax
método def32
s:|a:Vec<f32>,b:Vec<f32>|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<Vec<_>>();
Swift 4 , 41 bytes
Casos de teste:
fonte