Obtenha o melhor de duas matrizes


19

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


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]

Você diz que os números sempre se encaixam "dentro das" capacidades "do seu idioma. Contanto que você não" abuse "disso. Seria apenas um abuso abusar de números inteiros em um idioma que não possui flutuadores? A pergunta diz: ponto flutuante mas eu realmente não vejo uma razão pela qual ele tem que ser floats O mesmo processo pode ser feito em números inteiros Eu gostaria de resolver isso em Brain-Flak mas Brain-Flak suporta apenas ints...
trigo Assistente de

@WheatWizard Posso abrir uma exceção para isso. Vá em frente, poste sua resposta e mencione que eu permiti que ela evitasse confusão.

Respostas:


8

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!


Odeio ser um esporte estragado, mas alguns desses personagens não têm mais de um byte em qualquer codificação sensata?
Cedric Cavaleiro


Finalmente ganhei contra a concorrência!
Zacharý

2
@ Zachary Um Homem, 4 btytes ... ESTE VERÃO ... Você ... vai ... SER ... GELÉIA DELE ... avaliado J para Jelly .
Magic Octopus Urn

11

Kotlin, 78 75 71 66 65 59 bytes

É a minha primeira tentativa, seja legal: D

a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()

O TIO não funciona com esta solução (e não sei por que), código fonte para testes abaixo

fun main(args: Array<String>) {
    bestOfTwo(floatArrayOf(), floatArrayOf()).print()
    bestOfTwo(floatArrayOf(0F), floatArrayOf(0F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F), floatArrayOf(1F,3F,2F)).print()
    bestOfTwo(floatArrayOf(1F,3F,3.2F,2.3F), floatArrayOf(3F,1F,3.2F,2.6F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F,4F,5F,5F,7F,8F,9F,10F), floatArrayOf(10F,9F,8F,7F,6F,5F,4F,3F,2F,1F)).print()
    bestOfTwo(floatArrayOf(-3.2F,-3.2F,-2.4F,7F,-10.1F), floatArrayOf(100F,-3.2F,2.4F,-7F,-10.1F)).print()
}


fun bestOfTwo(a :FloatArray, b :FloatArray): List<Float> =
    a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()


fun List<Float>.print() {
    this.forEach { print("$it, ") }; println("")
}

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 ()


10
Bem-vindo ao PPCG! Por favor, não desanime pela downvote (é o resultado de uma ligeira peculiaridade do sistema que acontece quando primeiro post de um novo usuário é de qualidade sinalizado automaticamente e, em seguida, eles melhoram disse pós !!)
Jonathan Allan

2
O pior "recurso" de todos os tempos ... btw não se sente mal com isso.
Erik the Outgolfer

10

Python 2 , 45 bytes

Uma mistura da minha solução inicial e @ovs ' .

lambda*a:map(lambda x,y:max(x,y)*-~(x==y),*a)

Experimente online!

Python 2 , 49 bytes

lambda x,y:[max(a,b)*-~(a==b)for a,b in zip(x,y)]

Experimente online!

Python 2 , 46 bytes

@ovs sugeriu este método para economizar 3 bytes.

lambda*x:[max(a,b)*-~(a==b)for a,b in zip(*x)]

Experimente online!


Quão?

Primeiro, emparelhamos os elementos correspondentes, usando *ou zip(). 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 como 1se 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 bool 1, fornecendo-nos 2ou 1. max(a,b)fornece o valor máximo do par e o *multiplica pelo valor retornado acima (para que seja multiplicado 2apenas 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.


Uau, isso foi muito rápido!

mais direto, mesmo número de bytes:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard 28/08

@ jferard Na verdade, essa já é a solução do Luis.
Xcoder 28/08

@ Mr.Xcoder Opa! Eu não li a página inteira ...
jferard

Nunca diga "acima", como a ordenação pode mudar (eu não vejo a solução acima)
Zachary

8

JavaScript (ES6), 53 49 45 43 bytes

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • 4 bytes salvos emprestando um truque do Sr. Xcoder.
  • 2 bytes economizados graças ao Arnauld.

Tente

o.innerText=(f=

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)

)(i.value=[1,3,3.2,2.3])(j.value=[3,1,3.2,2.6]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))(j.value.split`,`.map(eval))
<input id=i><input id=j><pre id=o>


Explicação

a=>b=>

Função anônima que toma as 2 matrizes como argumentos por meio de parâmetros ae b, ao currying sintaxe (ou seja, chama comf(a)(b)

a.map((x,y)=>                      )

Mapeie a primeira matriz, passando cada elemento por uma função em que xé o elemento atual e yo índice atual.

(y=b[y])

Obtenha o elemento no índice yna segunda matriz e atribua-o como o novo valor de y.

>x?y

Verifique se yé maior que xe, em caso afirmativo, retorne y.

:y<x?x

Senão, verifique se yé menor que xe, se sim, retornex

:x+y

Senão, retorne a soma de xe y. (Multiplicar xou ypor 2 também funcionaria aqui, para o mesmo número de bytes.)


j.value.split`,`.map(eval)ou eval('['+j.value+']')? Também x+yficaria mais limpo IMHO.
Neil

@ Neil: 1) Acho o primeiro mais fácil de digitar. Além disso, tenho alguns modelos de trechos em uma das minhas máquinas; é mais fácil aderi .map(eval)-los. 2) Concordado, será editado momentaneamente.
Shaggy


7

R , 31 29 bytes

function(a,b)pmax(a,b)+a*!a-b

pmax 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-bcomo TRUE, onde a==be FALSEde outra forma, equivalente a a==b. No entanto, por qualquer motivo, R não exige parênteses, !a-bcomo isso significa a==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)


Acontece que unário "!" tem menor precedência em R de binário "-", que eu acho que é bastante incomum (e eu não tinha percebido até ler esta resposta!)
JDL

@JDL yeah Eu quase sempre tenho que abrir a página R Syntax enquanto jogava golfe em caso de peculiaridades estranhas como essa ... e também porque nunca consigo me lembrar da precedência de :interagir com aritmética.
Giuseppe


6

Dyalog APL, 5 bytes

⌈×1+=

Experimente online!

Quão?

  • , máximo em elementos dos argumentos
  • ×multiplicar por elementos
  • 1+=, 1 adicionado à igualdade entre elementos dos argumentos

Isso 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.


5

Gelatina , 6 bytes

żSṀE?€

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?

żSṀE?€ - Link: list of numbers L, list of numbers R   e.g. [1,3,3.2,2.3], [3,1,3.2,2.6]
ż      - zip - interleave L & R                       [[1,3],[3,1],[3.2,3.2],[2.3,2.6]]
     € - for each pair:
    ?  - { if:
   E   -   ...condition: equal                          0      0       1         0
 S     -   ...then: sum                                               6.4
  Ṁ    -   ...else: maximum                             3      3                2.6
       - }                                    ... ->   [3     ,3     ,6.4      ,2.6]

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!


Outgolfed! . +1 para a interpretação praticamente literal da pergunta.
Zachary

... e eu fui pego esquecendo que »vetoriza antes!
Jonathan Allan

O que mais isso faria, obter a matriz máxima de alguma maneira complicada?
Zachary

Não há necessidade de definições complicadas, o Python gerencia - por exemplo max([1,1,0],[1,0,3]) -> [1,1,0](não [1,1,3]).
Jonathan Allan

Então, basicamente com base infinita?
`` Zacharý


4

MATL , 7 bytes

X>tG=s*

Entrada é uma matriz de duas linhas, em que cada linha é uma das matrizes.

Experimente online!

Explicação

X>   % Implicit input. Maximum of each column
t    % Duplicate
G    % Push input
=    % Is equal? Element-wise with broadcast. Gives a two-row matrix
s    % Sum of each column. Gives a row vector containing 1 and 2
*    % Multiply, element-wise. Implicit display

4

Java 8, 80 69 67 66 65 64 63 bytes

(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}

Modifica 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]*2vez de a[l]+b[l].

Explicação:

Experimente aqui.

(a,b,l)->{          // Method with 2 float-array and integer parameters and no return-type
  for(;l-->0;)      //  Loop over the array
    if(a[l]>=b[l])  //   If the current value in `a` is larger or equal to `b`:
      b[l]=         //   Modify the second input-array:
       a[l]*        //    Use `a` multiplied by:
        (a[l]>b[l]? //     If the current value in `a` is larger than `b`:
          1         //      Multiply by 1
         :          //     Else (`a` is smaller of equal to `b`):
          2)        //      Multiply by 2
                    //  End of loop (implicit / single-line body)
}                   // End of method

2
"Se isso ajudar a reduzir sua contagem de bytes, você também pode usar o comprimento das listas como entrada". Definitivamente reduzirá sua contagem de bytes;)
Olivier Grégoire

11
Além disso, 2 bytes mais curtos:a->b->l->{float A,B;for(;l-->0;b[l]=(A=a[l])<B?B:A>B?A:A+B)B=b[l];}
Olivier Grégoire

E você pode salvar mais um byte colocando float A, Ba forinicialização.
Olivier Grégoire

11
Ou isto: (a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63 bytes)
Olivier Grégoire

3
@ OlivierGrégoire Lol .. com o golfe a cada byte ajuda, mas isso não significa que você precise jogar com um byte de cada vez. ; p
Kevin Cruijssen 28/08


3

05AB1E, 9 8 7 bytes

Saved a byte as Erik the Outgolfer pointed out that a list of lists is valid input.

øεMsËi·

Try it online!

Explanation

ø          # zip the lists
 ε         # apply to each pair
  M        # get max
   s       # swap the top 2 elements on the stack
    Ëi     # if all elements are equal
      ·    # double the max

Wow, that was really fast!

You can save a byte by removing the and inputting as a pair of a list and a list.
Erik the Outgolfer

@EriktheOutgolfer: True. I assumed we weren't allowed to, but I see that the challenge does specify standard I/O rules. Thanks for notifying :)
Emigna

1
@Emigna Tip: don't make rules out of your mind ;)
Erik the Outgolfer

1
@EriktheOutgolfer: Yeah I really need to stop doing that. Especially rules which make my programs longer ;)
Emigna


3

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

>.`+@.=
      =  Compare equality pairwise
    @.   If equal
   +       Sum
>.       (Else) take greater value

@. 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).


Nice job, I know I couldn't do this, even though you have beenoutgolfed by my translation of my APL. >_<
Zacharý

J really shines here
Jonah

@Zacharý rats, well-golfed nonetheless.
cole


3

TI-Basic, 23 21 bytes

Prompt A,B
(ʟA=ʟB)ʟA+max(ʟA,ʟB

Too bad lists take up two bytes each...


Você pode salvar dois bytes solicitando Xe Y, em seguida, usando ʟXe ʟYpara acessá-los, ou seja, " Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2".
Scott Milner

Além disso, isso é atualmente inválido, pois L1(L1=L2)tenta obter o elemento de L1em uma lista, o que gera um erro. Para consertar isso, troque a ordem, ou seja (L1=L2)L1.
21817 Scott Milner

@ScottMilner Obrigado por apontar os dois.
Timtech 29/08/17



2

Python 3, 49 46 45 bytes

3 bytes removed thanks to @Mr.Xcoder (splat instead of two arguments), and 1 byte thanks to @ovs (map instead of list comprehension)

lambda*x:map(lambda a,b:a*(a>=b)+b*(b>=a),*x)

Try it online!


1
46 bytes: 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 golfe
Mr. Xcoder

@ Mr.Xcoder Obrigado! Boa ideia!
Luis Mendo

45 bytes usando o mapa em vez do zip.
ovs 28/08

2

Lisp comum, 60 59 bytes

(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))

Experimente online!

-1 byte graças a @ Zacharý!


59 bytes: (mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read)).
Zacharý 29/08/19

De nada, eu não conheço lisp tão bem, acabei de traduzir minhas outras respostas para o Lisp, que acabou salvando um byte.
Zacharý 29/08/19

2

Python com numpy, 28 bytes

lambda a,b:a*(a>=b)+b*(b>=a)

Assume que a entrada é fornecida como duas matrizes numpy.


Se estamos usando numpy então aqui é o meu pior solução:lambda a,b:n.fmax(a,b)*((a==b)+1)
Erich

@Erich Eu gosto da idéia, mas para fazer isso eu precisaria import numpy as n. Fico sem ele aqui porque está implícito na entrada.

Acho que estou um pouco instável com a contagem explícita de bytes, muitas vezes as respostas python são simplesmente lambdas, quando uma implementação real de uma resposta exigiria atribuí-la a alguma coisa. por esse motivo, pergunto-me se é permitido também obter uma declaração de importação implícita.
31517 Erich

@ Erich Em geral, você só pode se referir a uma variável nse tiver definido nem 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.

11
Bem, isso só precisa de entrada como matrizes numpy, em vez de importar numpy. Mas isso funciona mesmo sem usar return?
Zachary

2

C # (.NET Core) , usando Linq 47 + 18 = 65 bytes

x=>y=>x.Zip(y,(a,b)=>a>b?a:b>a?b:b+a).ToArray()

Experimente online!

C # (.NET Core), 82 bytes

x=>y=>l=>{for(int i=0;i<l;i++)x[i]=x[i]>y[i]?x[i]:y[i]>x[i]?y[i]:y[i]*2;return x;}

Experimente online!


Você pode deixar cair a resposta LINQ por alguns bytes por mudar namespace System.Linq a usar System.Linq
jkelm

@ jkelm sim, eu estive pensando se o 'using System; `deve ser incluído ou não assim, acho que não. Eu vou limpar isso
Dennis.Verweij 28/08

System.Linq está incluído no "Visual C # Interactive Compiler". Não tenho certeza absoluta sobre o retorno Arrayvs IListvs IEnumerable, mas se todos são elegíveis, você pode obter a contagem de bytes em 37 - tio.run/##Sy7WTS7O/…
dana


1

Swift 3, 81 79 bytes

func n(a:[Double],b:[Double]){for(x,y)in zip(a,b){print((x==y) ?x+y:max(x,y))}}

O 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


Você precisa de espaços ao redor (x,y)e antes ??
Erik the Outgolfer

@EriktheOutgolfer O anterior ?é 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.

@EriktheOutgolfer - TheIOSCoder já respondeu parcialmente, mas você está certo, você não precisa dos que estão no loop for, interessante!
AnonymousReality

73 bytes: 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)
Mr. Xcoder

Ou 74 bytes:func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
Sr. Xcoder

1

C, 76 75 bytes

Agradecemos a @Kevin Cruijssen por salvar um byte!

f(a,b,n)float*a,*b;{for(;n--;++a,++b)printf("%f ",*a>*b?*a:*b>*a?*b:*a*2);}

Experimente online!


1

Japonês , 13 bytes

íV,È¥Y Ä *XwY

Experimente online! com o -Qsinalizador para formatar a matriz de saída.


Bem feito. Eu fiz duas tentativas anteriormente, com as duas saindo em 17 bytes. Eu tinha esquecido que ípoderia assumir uma função como um segundo argumento.
Shaggy

1

Ferrugem , 107 97 bytes

|a:V,b:V|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<V>();
type V=Vec<f32>;

Experimente online!

Guardado 8 bytes graças a @mgc


11
Eu acho que você pode salvar 8 bytes usando tipo de inferência sobre o coletadas Vece utilizando o maxmétodo de f32s:|a:Vec<f32>,b:Vec<f32>|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<Vec<_>>();
MGC

11
@mgc Thanks! A inferência de tipo era uma boa ideia, mas, neste caso, o alias de tipo é ainda mais curto.
jferard

1

Swift 4 , 41 bytes

{zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

Casos de teste:

let f: ([Float], [Float]) -> [Float]
    = {zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

let testcases: [(inputA: [Float], inputB: [Float], expected: [Float])] = [
    (
        inputA: [],
        inputB: [],
        expected: []
    ),
    (
        inputA: [1, 2, 3],
        inputB: [1, 3, 2],
        expected: [2, 3, 3]
    ),
    (
        inputA: [1, 3, 3.2, 2.3],
        inputB:  [3, 1, 3.2, 2.6],
        expected: [3, 3, 6.4, 2.6]
    ),
    (
        inputA: [1,2,3,4,5,5,7,8,9,10],
        inputB:  [10,9,8,7,6,5,4,3,2,1],
        expected: [10, 9, 8, 7, 6, 10, 7, 8, 9, 10]
    ),
    (
        inputA: [-3.2, -3.2, -2.4, 7, -10.1],
        inputB:  [100, -3.2, 2.4, -7, -10.1],
        expected: [100, -6.4, 2.4, 7, -20.2]
    ),
]

for (caseNumber, testcase) in testcases.enumerated() {
    let actual = f(testcase.inputA, testcase.inputB)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \((testcase.inputA, testcase.inputB)) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}
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.