Dapatkan yang terbaik dari dua Array


19

Anda akan diberikan dua array angka mengambang. Tugas Anda adalah memasangkan elemen yang sesuai dari dua array, dan mendapatkan maksimum masing-masing pasangan. Namun , jika kedua elemen terkait sama, Anda harus mengambil jumlah mereka sebagai gantinya.

Misalnya, diberi daftar [1, 3, 3.2, 2.3]dan [3, 1, 3.2, 2.6], Anda harus melakukan hal berikut:

  • Memasangkan elemen (atau zip): [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]].

  • Pergi melalui masing-masing pasangan dan menerapkan proses di atas: [3, 3, 6.4, 2.6].


Spesifikasi

  • Array / daftar akan selalu memiliki panjang yang sama. Namun mereka mungkin kosong.

  • Angka-angka yang dikandungnya akan selalu sesuai dengan kemampuan bahasa Anda, selama Anda tidak menyalahgunakannya. Mereka mungkin positif, nol atau negatif, Anda harus menangani semua tipe.

  • Jika ini membantu Anda mengurangi jumlah byte Anda, Anda juga dapat mengambil panjang daftar sebagai input.

Aturan


Uji Kasus

Array_1, Array_2 -> Output

[], [] -> []
[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]

Anda mengatakan bahwa angka-angka akan selalu sesuai "dalam" kemampuan "bahasa Anda. Selama Anda tidak" menyalahgunakan "itu. Apakah hanya mendukung bilangan bulat dalam bahasa yang tidak memiliki pelampung dianggap sebagai penyalahgunaan? Pertanyaannya mengatakan floating point tapi saya tidak benar-benar melihat alasan mengapa itu harus mengapung. Proses yang sama dapat dilakukan pada bilangan bulat. Saya ingin menyelesaikan ini di Brain-Flak tetapi Brain-flak hanya mendukung int.
Wheat Wizard

@WheatWizard Saya dapat membuat pengecualian untuk itu. Silakan dan kirim jawaban Anda dan sebutkan saya mengizinkannya untuk menghindari kebingungan.

Jawaban:


8

Jelly, 4 byte

=‘×»

Cobalah online!

Ini menggunakan pendekatan yang sama persis dengan jawaban APL saya , kecuali Jelly memiliki builtin untuk menambahkan satu ke nomor!


Benci menjadi rampasan, tetapi bukankah beberapa dari karakter tersebut masing-masing lebih dari satu byte dalam setiap penyandian yang masuk akal?
Cedric Knight

Ini menggunakan codepage jelly .
Zacharý

Saya akhirnya menang melawan kompetisi!
Zacharý

2
@ Zacharý ONE MAN, 4 btytes ... MUSIM PANAS INI ... Kamu ... AKAN ... MENJADI ... JELLY OF HIM ... memberi nilai J untuk Jelly .
Magic Gurita Guci

11

Kotlin, 78 75 71 66 65 59 byte

Ini upaya pertama saya, jadilah keren: D

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

TIO tidak bekerja dengan solusi ini (dan saya tidak tahu mengapa), kode sumber untuk pengujian di bawah ini

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

EDIT:

-3 dengan mengganti "a + b [i]" dengan "a * 2"

-4 dengan mengganti metode "mapIndexed" dengan "zip" (Terima kasih kepada solusi @AnonymousReality Swift)

-5 dengan mengganti metode "Math.max" dengan kondisi kapan

-1 oleh perubahan ketika kondisi pesanan

-6 dengan mengubah toFloatArray () oleh toList ()


10
Selamat datang di PPCG! Tolong jangan berkecil hati dengan downvote (itu adalah hasil dari sedikit kekhilafan sistem yang terjadi ketika posting pertama pengguna baru ditandai secara otomatis untuk kualitas dan kemudian mereka meningkatkan postingan tersebut !!)
Jonathan Allan

2
"Fitur" terburuk yang pernah ... tapi jangan merasa buruk tentang hal itu.
Erik the Outgolfer

10

Python 2 , 45 byte

Gabungan dari solusi awal saya dan @ovs ' .

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

Cobalah online!

Python 2 , 49 byte

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

Cobalah online!

Python 2 , 46 byte

@ovs menyarankan metode ini untuk menghemat 3 byte.

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

Cobalah online!


Bagaimana?

Pertama, kami memasangkan elemen yang sesuai, dengan menggunakan salah satu *atauzip() . Itu memungkinkan kita melakukan golf lebih lanjut dengan bekerja baik dengan peta atau pemahaman daftar.

The cool trik dalam jawaban ini adalah bagian ini: max(x,y)*-~(x==y). Bagaimana cara kerjanya? - Yah, seperti yang sudah Anda ketahui, Python otomatis mengonversi nilai bool menjadi bilangan bulat ketika digunakan dalam operasi aritmatika. Oleh karena itu, (x==y)dievaluasi sebagai 1, jika kondisi terpenuhi. Namun, jika kedua nilai tersebut tidak sama, ia akan mengembalikannya 0. Kemudian, operasi bitwise -~meningkatkan nilai yang dikembalikan dari bool oleh 1, memberi kami salah satu 2atau 1. max(a,b)memberikan nilai maksimum dari pasangan dan *mengalikannya dengan nilai yang dikembalikan di atas (sehingga akan dikalikan 2hanya jika mereka sama, dalam hal ini max()mengembalikan nilai keduanya).

Ini didasarkan pada fakta bahwa jumlah dua angka yang sama sebenarnya adalah salah satu dari mereka berlipat ganda, dan jenis "penyalahgunaan" kelas bool Python menjadi subkelas int.


Wow, itu sangat cepat!

lebih mudah, jumlah byte yang sama:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@ jferard Sebenarnya, itu sudah solusi Luis.
Tn. Xcoder

@ Mr.Xcoder Ups! Saya tidak membaca seluruh halaman ...
jferard

Jangan pernah mengatakan "di atas," karena
pesanannya

8

JavaScript (ES6), 53 49 45 43 byte

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • 4 byte disimpan dengan meminjam trik dari Mr. Xcoder.
  • 2 byte disimpan berkat Arnauld.

Cobalah

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>


Penjelasan

a=>b=>

Fungsi anonim mengambil 2 array sebagai argumen melalui parameter adan b, dalam sintaks currying (yaitu, panggilan denganf(a)(b)

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

Peta di atas array pertama, melewati setiap elemen melalui fungsi di mana xelemen saat ini dan yindeks saat ini.

(y=b[y])

Dapatkan elemen di indeks ydalam array kedua dan tetapkan itu sebagai nilai baru y.

>x?y

Periksa apakah ylebih besar dari xdan, jika demikian, kembali y.

:y<x?x

Lain, periksa apakah ykurang dari xdan, jika demikian, kembalix

:x+y

Lain, kembalikan jumlah xdan y. (Mengalikan xatau ydengan 2 juga akan berfungsi di sini, untuk jumlah byte yang sama.)


j.value.split`,`.map(eval)atau eval('['+j.value+']')? Juga x+yakan terlihat IMHO lebih rapi.
Neil

@ Neil: 1) Saya menemukan yang pertama lebih mudah untuk mengetik. Selain itu, saya memiliki beberapa template Cuplikan di salah satu mesin saya; lebih mudah hanya untuk .map(eval)menempelkannya pada mereka. 2) Setuju, akan mengedit sebentar.
Shaggy


7

R , 31 29 byte

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

pmax mengambil maksimum paralel dari dua (atau lebih) array (mendaur ulang yang lebih pendek sesuai kebutuhan).

Saya melihat komentar Luis Mendo dan jelas saya menyadari bahwa pendekatan itu juga bisa berhasil untuk R. Itu membuat saya sampai 30 byte, tetapi kemudian saya mulai bermain-main dengan berbagai cara untuk mendapatkan indeks sebagai gantinya untuk meningkatkan jawaban asli saya, dan menemukan !a-bsebagai di TRUEmana a==bdan FALSEsebaliknya, setara dengan a==b. Namun, untuk alasan apa pun, R tidak memerlukan tanda kurung !a-bseperti halnya untuk a==b, yang menyelamatkan saya dua byte.

Seperti yang disebutkan oleh JDL dalam komentar , ini bekerja karena !(negasi) memiliki prioritas lebih rendah daripada operator biner -di R, yang aneh.

Cobalah online! (versi baru)

Cobalah online! (asli)


Ternyata itu unary "!" memiliki prioritas lebih rendah dalam R daripada biner "-", yang saya pikir sangat tidak biasa (dan saya tidak menyadari sampai membaca jawaban ini!)
JDL

@JDL ya saya hampir selalu harus membuka halaman R Sintaks saat bermain golf dalam kasus quirks aneh seperti ini ... dan juga karena saya tidak pernah bisa mengingat prioritas :ketika berinteraksi dengan aritmatika.
Giuseppe


6

Dyalog APL, 5 byte

⌈×1+=

Cobalah online!

Bagaimana?

  • , maksimal elemen-argumen
  • ×, elemen-bijaksana berkembang biak
  • 1+=, 1 ditambahkan ke kesetaraan unsur-bijaksana dari argumen

Ini bekerja karena jika angkanya tidak sama, 1+= akan menjadi 1, yang bila dikalikan dengan maksimum, adalah maksimum. Ketika angkanya sama, 1+=akan kembali 2, ketika itu dikalikan dengan maksimum, kita mendapatkan dua kali lipat maksimum, atau maksimum yang ditambahkan ke dirinya sendiri.


5

Jelly , 6 byte

żSṀE?€

Tautan diad mengambil daftar angka di setiap sisi dan mengembalikan daftar yang dihasilkan.

Cobalah online!atau lihat test-suite *.

Bagaimana?

ż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]

Alternatifnya adalah tautan monadik ini mengambil daftar kedua daftar, juga 6 byte :

+»⁼?"/

* Saya tidak berpikir saya pernah membuat footer test-suite hampir tiga kali jumlah byte kode sebelumnya!


Kalah besar! . +1 untuk penafsiran praktis kata demi kata dari pertanyaan tersebut.
Zacharý

... dan aku ketahuan melupakan »vektor itu sebelumnya!
Jonathan Allan

Apa lagi yang akan dilakukannya, mengambil array maksimum dalam beberapa cara yang berbelit-belit?
Zacharý

Tidak perlu untuk definisi yang berbelit-belit, Python mengelola - misalnya max([1,1,0],[1,0,3]) -> [1,1,0](tidak [1,1,3]).
Jonathan Allan

Jadi, pada dasarnya infinite-base?
Zacharý


4

MATL , 7 byte

X>tG=s*

Input adalah matriks dua baris, di mana setiap baris adalah salah satu dari array.

Cobalah online!

Penjelasan

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 byte

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

Memodifikasi input-array kedua sebagai gantinya atau mengembalikan float-array baru untuk menghemat byte.

-11 byte dengan mengambil panjang sebagai input integer tambahan, yang diizinkan sesuai dengan aturan tantangan.
-5 byte terima kasih kepada @ OliverGrégoire (satu byte pada satu waktu .. xD)
-1 byte secara tidak langsung berkat jawaban JS dari @Shaggy , dengan menggunakan a[l]*2alih-alih a[l]+b[l].

Penjelasan:

Coba di sini.

(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
"Jika itu membantu Anda mengurangi jumlah byte Anda, Anda juga dapat mengambil panjang daftar sebagai input." Ini pasti akan mengurangi byte-count Anda;)
Olivier Grégoire

1
Juga, 2 byte lebih pendek: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

Dan Anda dapat menyimpan satu byte lainnya menempatkan float A, Bdi forinisialisasi.
Olivier Grégoire

1
Atau ini: (a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63 byte)
Olivier Grégoire

3
@ OlivierGrégoire Lol .. dengan golf setiap byte membantu, tetapi itu tidak berarti Anda perlu golf satu byte setiap kali. ; p
Kevin Cruijssen


3

05AB1E , 9 8 7 byte

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


You can save two bytes by prompting for X and Y, then using ʟX and ʟY to access them, i.e. "Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2".
Scott Milner

Also, this is currently invalid, since L1(L1=L2) attempts to get the element of L1 at a list, which throws an error. To fix that, swap the order, i.e. (L1=L2)L1.
Scott Milner

@ScottMilner Thanks for pointing both of those out.
Timtech




2

Common Lisp, 60 59 bytes

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

Try it online!

-1 byte thanks to @Zacharý!


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

You're welcome, I don't know lisp that well, I just translated my other answers into Lisp which ended up saving a byte.
Zacharý

2

Python with numpy, 28 bytes

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

Assumes input is given as two numpy arrays.


If we are using numpy then here is my worse solution: lambda a,b:n.fmax(a,b)*((a==b)+1)
Erich

@Erich I like the idea, but to do that I would need to import numpy as n. I get away without it here because it's implicit in the input.

I guess i'm a bit shaky on the explicit byte counting, often python answers are simply lambdas, when an actual implementation of an answer would require assigning it to something. for this reason I wonder if it is allowable to get away with an implicit import statement as well?
Erich

@Erich In general, you can only refer to a variable n if you've defined n in your code, so imports must be explicit. By default, we allow functions or full programs as answers, which includes anonymous functions.

1
Well, this only needs input as numpy arrays, rather than importing numpy. But does this even work without using return?
Zacharý

2

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

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

Try it 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;}

Try it online!


You can drop the LINQ answer by a few bytes by changing namespace System.LINQ to using System.LINQ
jkelm

@jkelm yeah, I've been wondering if the 'using System;` is to be included or not like that, I guess not. I'll clean it up
Dennis.Verweij

System.Linq is included in the "Visual C# Interactive Compiler". I am not totally sure about returning Array vs IList vs IEnumerable, but if all are eligible then you can get the byte count to 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))}}

Swift has an interesting property in that an Int isn't directly castable to a Double, so you have to specify any arrays as being arrays of Doubles before passing them to the function.

(e.g.) var k:[Double] = [1,2,3,4,5,5,7,8,9,10]

Edit: -2 bytes thanks to @EriktheOutgolfer


Do you need spaces around (x,y) and before ??
Erik the Outgolfer

@EriktheOutgolfer The one before ? is needed because Swift would treat them as optional types instead of ternaries (which they aren't). The others aren't. Apart from that, this can be drastically golfed.

@EriktheOutgolfer - TheIOSCoder has already answered you partly, but you're right, you don't need the ones in the for loop, interesting!
AnonymousReality

73 bytes: func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})} (the float inaccuracies need not to be handled by default)
Mr. Xcoder

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

1

C, 76 75 bytes

Thanks to @Kevin Cruijssen for saving a byte!

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

Try it online!


1

Japt, 13 bytes

íV,È¥Y Ä *XwY

Try it online! with the -Q flag to format the output array.


Nicely done. I made 2 attempts at this earlier with both coming out at 17 bytes. I'd forgotten í could take a function as a second argument.
Shaggy

1

Rust, 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>;

Try it online!

Saved 8 bytes thanks to @mgc


1
I guess you can save 8 bytes by using type inference on the collected Vec and by using the max method of 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

1
@mgc Thanks! Type inference was a good idea, but in this case type alias is even shorter.
jferard

1

Swift 4, 41 bytes

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

Test cases:

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!")
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.