İki Diziden En İyi Şekilde Yararlanın


19

İki kayan noktalı sayı dizisi verilecektir. Göreviniz iki dizinin karşılık gelen öğelerini eşleştirmek ve her bir çiftten maksimum değeri elde etmektir. Ancak , karşılık gelen iki öğe eşitse, toplamlarını almalısınız.

Örneğin, listeleri verilmiş [1, 3, 3.2, 2.3]ve [3, 1, 3.2, 2.6]aşağıdakileri yapmanız gerekir:

  • Elemanları (ya da fermuar) eşleme: [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]].

  • Her çift üzerinden gidin ve yukarıdaki işlemi uygulayın: [3, 3, 6.4, 2.6].


gözlük

  • Diziler / listeler her zaman eşit uzunlukta olacaktır. Ancak bunlar boş olabilir.

  • İçerdikleri sayılar, bunu kötüye kullanmadığınız sürece dilinizin yeteneklerine uyacaktır. Pozitif, sıfır veya negatif olabilirler, tüm türleri ele almalısınız.

  • Eğer sizin bayt sayısını azaltmaya yardımcı oluyorsa olabilir ayrıca girdi olarak listelerin uzunluğunu alır.

kurallar


Test Durumları

Dizi_1, Dizi_2 -> Çıktı

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

Rakamların her zaman dilinizin "yetenekleri" ne uygun olacağını söylüyorsunuz. Bunu "kötüye kullanmazsanız" sadece kayan dil içermeyen bir dilde tamsayıları desteklemek kötüye kullanım olarak kabul edilir mi? ama bunun neden yüzmesi gerektiğine dair bir neden görmüyorum.Aynı işlem tamsayılarda da yapılabilir.Bunu Brain-Flak'ta çözmek istiyorum ama Brain-Flak sadece ints'i destekliyor.
Wheat Wizard

@WheatWizard Bunun için bir istisna yapabilirim. Devam edin ve cevabınızı gönderin ve karışıklıktan kaçınmasına izin verdiğimi söyleyin.

Yanıtlar:


8

Jöle, 4 bayt

=‘×»

Çevrimiçi deneyin!

Bu, APL cevabımla tamamen aynı yaklaşımı kullanır , ancak Jelly, bir sayıya bir tane eklemek için yerleşiktir!


Bir spoilsport olmaktan nefret ediyorum, ancak bu karakterlerden bazıları herhangi bir mantıklı kodlamada birden fazla bayt değil mi?
Cedric Knight

Bu, jöle kod sayfasını kullanır .
Zacharý

Sonunda rekabete karşı kazandım!
Zacharý

2
Zachary BİR MAN, 4 btytes ... BU YAZ @ ... Sen ... WILL ... BE ... ONUN jöle ... Jelly için J puan .
Sihirli Ahtapot Urn

11

Kotlin, 78 75 71 66 65 59 bayt

Bu benim ilk denemem, sakin ol: D

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

TIO bu çözüm ile çalışmıyor (ve nedenini bilmiyorum), aşağıdaki test için kaynak kodu

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

DÜZENLE:

-3 "a + b [i]" yerine "a * 2" yazarak

-4 "zip" ile "mapIndexed" yöntemini değiştirerek (@AnonymousReality Swift çözümü sayesinde)

-5 "Math.max" yöntemini koşuluna göre değiştirerek

-1 sipariş değiştiğinde değişiklik

-6 toFloatArray () ile toList () değiştirilerek


10
PPCG'ye Hoşgeldiniz! Lütfen downvote ile cesaret kırmayın (yeni bir kullanıcının ilk postası kalite için otomatik olarak işaretlendiğinde ve daha sonra bahsedilen postayı geliştirdiklerinde meydana gelen hafif bir tuhaflığın sonucudur!)
Jonathan Allan

2
Şimdiye kadarki en kötü "özellik" ... btw bu konuda kötü hissetmiyorum.
Outgolfer Erik

10

Python 2 , 45 bayt

Benim ilk çözüm ve @ovs ' bir karışımı .

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

Çevrimiçi deneyin!

Python 2 , 49 bayt

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

Çevrimiçi deneyin!

Python 2 , 46 bayt

@ovs bu yöntemi 3 bayt kaydetmek için önerdi.

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

Çevrimiçi deneyin!


Nasıl?

İlk önce, karşılık gelen öğeleri, * veyazip() . Bu, bir harita veya liste kavrayışı ile çalışarak daha fazla golf oynamamızı sağlar.

Bu cevap serin hüner bu kısmıdır: max(x,y)*-~(x==y). Bu nasıl çalışıyor? - Pek çoğunuzun zaten bildiği gibi, Python aritmetik işlemlerde kullanıldığında bool değerlerini tamsayılara otomatik olarak dönüştürür. Bu nedenle, koşulun karşılanması durumunda (x==y)değerlendirilir 1. Ancak, iki değer eşit değilse, bunun 0yerine geri döner . Daha sonra bitsel işlem , bize veya -~değerini 1vererek , bool'den döndürülen değeri artırır . çiftin maksimum değerini verir ve yukarıda döndürülen değerle çarpar (böylece21max(a,b)*2 yalnızca eşit olduklarında , bu durumda max()her ikisinin de değerini döndürür).

Bu, iki eşit sayının toplamının ya ikisinin ikiye katlanması ve Python'un bool sınıfının int'in bir alt sınıfı olması gibi bir çeşit "istismar" gerçeğine dayanmaktadır.


Vay canına, bu gerçekten hızlıydı!

daha basit, aynı sayıda bayt:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@jferard Aslında, zaten Luis'in çözümü bu.
Bay Xcoder

@ Mr.Xcoder Hata! Bütün sayfayı
okumadım

Asla "yukarıda" demeyin, çünkü sipariş değişebilir (yukarıda çözümünüzü göremiyorum)
Zacharý

8

JavaScript (ES6), 53 49 45 43 bayt

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • Bay Xcoder'dan bir numara ödünç alarak 4 bayt tasarruf etti.
  • Arnauld sayesinde 2 bayt kurtardı.

Dene

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>


açıklama

a=>b=>

Anonim işlev, 2 diziyi parametrelerle ave bsözdiziminde (örn.f(a)(b)

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

Her öğeyi xgeçerli öğe ve ygeçerli dizin olan bir işlevden geçirerek ilk dizi üzerinden eşleyin.

(y=b[y])

yİkinci dizideki dizindeki öğeyi alın ve bunu yeni değeri olarak atayın y.

>x?y

Olmadığını kontrol edin ybüyükse xeğer öyleyse, iade ve y.

:y<x?x

Başka, ydaha küçük olup olmadığını kontrol edin xve eğer öyleyse, geri dönünx

:x+y

Aksi takdirde, xve öğelerinin toplamını döndürün y. ( Aynı sayıda bayt için burada çarpma xveya y2 ile çalışma işe yarar.)


j.value.split`,`.map(eval)veya eval('['+j.value+']')? Ayrıca x+ydaha temiz IMHO görünecekti.
Neil

@Neil: 1) Yazı yazmayı daha kolay buluyorum. Ayrıca, makinelerimden birinde birkaç Snippet şablonum var; sadece .map(eval)onlara yapışmak daha kolaydır . 2) Anlaştı, anlık olarak düzenleyecek.
Shaggy


7

R , 31 29 bayt

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

pmax iki (veya daha fazla) dizinin paralel maksimumunu alır (gerekirse daha kısa geri dönüşüm).

Luis Mendo'nun yorumuna bakıyordum ve açıkça yaklaşımın R için de işe yarayabileceğini fark ettim. Bu beni 30 bayta indirdi, ama sonra orijinal cevabımı iyileştirmek için endeksleri almanın farklı yollarıyla oynamaya başladım ve nerede ve aksi halde eşdeğer !a-bolarak tökezledim . Ancak, her ne sebeple olursa olsun, R, olduğu gibi parantez gerektirmez , bu da beni iki bayt kurtardı.TRUEa==bFALSEa==b!a-ba==b

JDL'nin yorumlarda belirtildiği gibi , bu işe yarar çünkü !(olumsuzluk) -garip olan R'deki ikili operatörden daha düşük önceliğe sahiptir .

Çevrimiçi deneyin! (Yeni sürüm)

Çevrimiçi deneyin! (Orijinal)


Görünen o ki bu "!" R 'de ikili alışkanlıktan daha düşük önceliğe sahiptir, ki bu oldukça sıra dışıdır (ve bu cevabı
okuyana

@JDL evet böyle tuhaf tuhaflıklar durumunda golf yaparken neredeyse her zaman R Sözdizimi sayfasını açmak zorundayım ... ve ayrıca :aritmetik ile etkileşime girmenin önceliğini asla hatırlayamadığım için .
Giuseppe


6

Dyalog APL, 5 bayt

⌈×1+=

Çevrimiçi deneyin!

Nasıl?

  • , bağımsız değişkenler için öğe bazında maksimum
  • ×, element-wise çarpma
  • 1+=, 1 argümanların element-eşitliğine eklendi

Sayılar eşit değilse, çünkü bu işler 1+=olacak 1maksimum ile çarpılarak zaman, maksimum sayıdan. Sayılar eşit olduğunda 1+=, geri döner 2, bu maksimumla çarpıldığında, maksimumun iki katı veya maksimumun kendisine eklenir.


5

Jöle , 6 bayt

żSṀE?€

Her iki taraftaki numaraların listesini alan ve sonuçta oluşan listeyi döndüren ikili bir bağlantı.

Çevrimiçi deneyin! veya bir test takımına bakın *.

Nasıl?

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

Bir alternatif, bu iki bağlantının , ayrıca 6 baytlık bir listeyi alan monadik bağlantıdır :

+»⁼?"/

* Daha önce kodun bayt sayısının neredeyse üç katı kadar bir test paketi altbilgisi oluşturduğumu sanmıyorum!


Outgolfed! . Sorunun pratikte kelimesi kelimesine yorumlanması için +1.
Zacharý

... ve daha »önce bu vektörleri unutmuşum.
Jonathan Allan

Başka ne yapardı, maksimum diziyi kıvrımlı bir şekilde alın?
Zacharý

Kıvrımlı tanımlara gerek yoktur, Python yönetir - örneğin max([1,1,0],[1,0,3]) -> [1,1,0](değil [1,1,3]).
Jonathan Allan

Yani, temelde sonsuz temel?
Zacharý


4

MATL , 7 bayt

X>tG=s*

Girdi, her satırın dizilerden biri olduğu iki sıralı bir matristir.

Çevrimiçi deneyin!

açıklama

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 bayt

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

Modifies the second input-array instead or returning a new float-array to save bytes.

Zorluk kurallarına göre izin verilen ek tamsayı girişi olarak uzunluğu alarak -11 bayt.
-5 sayesinde bayt @ OliverGrégoire (her seferinde .. xD bir bayt)
-1 bayt dolaylı sayesinde @Shaggy sitesindeki JS yanıt kullanarak a[l]*2yerinea[l]+b[l].

Açıklama:

Burada deneyin.

(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
"Bayt sayınızı azaltmanıza yardımcı oluyorsa, listelerin uzunluğunu girdi olarak da alabilirsiniz." Kesinlikle bayt sayınızı azaltacaktır;)
Olivier Grégoire

1
Also, 2 bytes shorter: 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

And you can save one more byte by putting float A, B in the for initialization.
Olivier Grégoire

1
Or this: (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.. with golfing every byte helps, but that doesn't mean you need to golf it one byte at a time. ;p
Kevin Cruijssen


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


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!")
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.