Holen Sie sich das Beste aus zwei Arrays


19

Sie erhalten zwei Arrays mit Gleitkommazahlen. Ihre Aufgabe ist es, die entsprechenden Elemente der beiden Arrays zu paaren und das Maximum jedes Paares zu erhalten. Allerdings , wenn die beiden entsprechenden Elemente gleich sind, müssen Sie ihre Summe nehmen statt.

In Anbetracht der Listen [1, 3, 3.2, 2.3]und [3, 1, 3.2, 2.6]müssen Sie beispielsweise Folgendes tun:

  • Koppeln Sie die Elemente (oder zip): [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]].

  • Gehen Sie durch jedes Paar und wenden das Verfahren oben: [3, 3, 6.4, 2.6].


Technische Daten

  • Die Arrays / Listen sind immer gleich lang. Sie können jedoch leer sein.

  • Die Zahlen, die sie enthalten, passen immer zu den Fähigkeiten Ihrer Sprache, solange Sie das nicht missbrauchen. Sie können positiv, null oder negativ sein. Sie müssen alle Typen behandeln.

  • Wenn es hilft Ihnen , Ihre Byteanzahl reduzieren, Sie können auch die Länge der Listen als Eingabe.

Regeln


Testfälle

Array_1, Array_2 -> Ausgabe

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

Sie sagen, dass die Zahlen immer "in die" Fähigkeiten "Ihrer Sprache passen. Solange Sie das nicht" missbrauchen ". Würden nur Ganzzahlen in einer Sprache ohne Gleitkommazahl als Missbrauch betrachtet? Die Frage lautet" Gleitkommazahl " Aber ich sehe nicht wirklich einen Grund, warum es Floats sein müssen. Der gleiche Prozess kann mit ganzen Zahlen durchgeführt werden. Ich möchte dies in Brain-Flak lösen, aber Brain-Flak unterstützt nur Ints.
Wheat Wizard

@ WheatWizard Ich kann eine Ausnahme machen. Schreiben Sie Ihre Antwort und erwähnen Sie, dass ich es zugelassen habe, um Verwirrung zu vermeiden.

Antworten:


8

Gelee, 4 Bytes

=‘×»

Probieren Sie es online!

Dies verwendet genau den gleichen Ansatz wie meine APL-Antwort , mit der Ausnahme, dass Jelly einen integrierten Ansatz zum Hinzufügen von Eins zu einer Zahl hat!


Ich hasse es, ein Spielverderber zu sein, aber sind einige dieser Zeichen in keiner vernünftigen Codierung mehr als ein Byte groß?
Cedric Knight

Dies verwendet die Jelly-Codepage .
Zacharý

Ich habe endlich gegen die Konkurrenz gewonnen!
Zacharý

2
@ Zachary ONE MAN, 4 btytes ... In diesem Sommer ... Sie ... WILL ... WERDEN ... GELEE VON IHM ... J für Jelly bewertet .
Magic Octopus Urn

11

Kotlin, 78 75 71 66 65 59 Bytes

Es ist mein erster Versuch, sei cool: D

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

TIO funktioniert nicht mit dieser Lösung (und ich weiß nicht warum), Quellcode zum Testen weiter unten

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

BEARBEITEN:

-3 durch "a + b [i]" durch "a * 2" ersetzen

-4 durch "mapIndexed" -Methode durch "zip" ersetzen (Dank der @AnonymousReality Swift-Lösung)

-5 durch Ersetzen der "Math.max" -Methode durch when-Bedingung

-1 bei Änderung der Bedingungsreihenfolge

-6 von change toFloatArray () von toList ()


10
Willkommen bei PPCG! Bitte lassen Sie sich von der Ablehnung nicht entmutigen (dies ist das Ergebnis einer geringfügigen Beeinträchtigung des Systems, die auftritt, wenn der erste Beitrag eines neuen Benutzers für die Qualität automatisch gekennzeichnet wird und dieser Beitrag dann verbessert wird !!)
Jonathan Allan

2
Das schlimmste "Feature" aller Zeiten ... Übrigens, fühlen Sie sich nicht schlecht dabei.
Erik der Outgolfer

10

Python 2 , 45 Bytes

Eine Mischung aus meiner anfänglichen Lösung und @ovs ' .

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

Probieren Sie es online!

Python 2 , 49 Bytes

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

Probieren Sie es online!

Python 2 , 46 Bytes

@ovs schlug diese Methode vor, um 3 Bytes zu sparen.

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

Probieren Sie es online!


Wie?

Zuerst paaren wir die entsprechenden Elemente, indem wir entweder *oder verwenden zip(). So können wir weiter Golf spielen, indem wir entweder mit einer Karte oder einem Listenverständnis arbeiten.

Der kühle Trick in dieser Antwort ist dieser Teil: max(x,y)*-~(x==y). Wie funktioniert das? - Nun, wie die meisten von Ihnen bereits wissen, konvertiert Python Bool-Werte automatisch in Ganzzahlen, wenn sie in arithmetischen Operationen verwendet werden. Daher (x==y)wird ausgewertet 1, ob die Bedingung erfüllt ist. Wenn die beiden Werte jedoch nicht gleich sind, wird 0stattdessen zurückgegeben. Dann -~erhöht die bitweise Operation den vom Bool zurückgegebenen Wert um 1und gibt entweder 2oder an 1. max(a,b)gibt den Maximalwert des Paares an und *multipliziert ihn mit dem oben zurückgegebenen Wert (wird also 2nur dann multipliziert, wenn sie gleich sind. In diesem Fall wird max()der Wert von beiden zurückgegeben).

Dies basiert auf der Tatsache, dass die Summe von zwei gleichen Zahlen in der Tat jeweils verdoppelt wird und die Bool-Klasse von Python eine Art "Missbrauch" darstellt, die eine Unterklasse von int ist.


Wow, das war sehr schnell!

einfacher, gleiche Anzahl von Bytes:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@jferard Tatsächlich ist das schon Luis 'Lösung.
Mr. Xcoder

@ Mr.Xcoder Ups! Ich habe nicht die ganze Seite gelesen ...
jferard

Sagen Sie niemals "oben", da sich die Reihenfolge ändern kann (ich sehe Ihre Lösung oben nicht)
Zacharý

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 Bytes gespart durch Ausleihen eines Tricks von Mr. Xcoder.
  • 2 Bytes gespart dank Arnauld.

Versuch es

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>


Erläuterung

a=>b=>

Anonyme Funktion, die die 2 Arrays als Argumente über Parameter aund bin der aktuellen Syntax (dh Aufruf mitf(a)(b)

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

Ordnen Sie das erste Array zu, indem Sie jedes Element durch eine Funktion führen, bei der xes sich um das aktuelle Element und yden aktuellen Index handelt.

(y=b[y])

Rufen Sie das Element am Index yim zweiten Array ab und weisen Sie es als neuen Wert von zu y.

>x?y

Prüfen Sie, ob ygrößer ist als xund geben Sie gegebenenfalls zurück y.

:y<x?x

Andernfalls prüfen Sie, ob ykleiner als xund kehren Sie gegebenenfalls zurückx

:x+y

Anderenfalls geben Sie die Summe von xund zurück y. (Multiplizieren xoder ymit 2 würde auch hier für die gleiche Anzahl von Bytes funktionieren.)


j.value.split`,`.map(eval)oder eval('['+j.value+']')? Auch x+ywürde sehen einfach besser IMHO.
Neil

@Neil: 1) Ich finde das erstere einfacher zu tippen. Außerdem habe ich einige Snippet-Vorlagen auf einem meiner Computer. es ist einfacher, sie einfach anzuheften .map(eval). 2) Einverstanden, wird vorübergehend bearbeitet.
Shaggy


7

R , 31 29 Bytes

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

pmax Nimmt das parallele Maximum der zwei (oder mehr) Arrays (Recycling der kürzeren je nach Bedarf).

Ich habe mir Luis Mendos Kommentar angesehen und festgestellt, dass der Ansatz auch für R funktionieren kann. Das hat mich zu 30 Bytes, aber dann begann ich mit verschiedenen Wegen, um Indizes zu spielen um stattdessen meine ursprüngliche Antwort zu verbessern, und eher zufällig auf , !a-bwie , TRUEwo a==bund FALSEansonsten entsprechen a==b. Doch aus irgendeinem Grund hat R keine Klammern benötigt um , !a-bwie es tut , für a==b, die mir zwei Bytes gespeichert.

Wie von JDL in den Kommentaren erwähnt , funktioniert dies, weil !(Negation) eine niedrigere Priorität hat als der Binäroperator -in R, was seltsam ist.

Probieren Sie es online! (neue Version)

Probieren Sie es online! (Original)


Es stellt sich heraus, dass unary "!" hat eine niedrigere Priorität in R als binäres "-", was ich ziemlich ungewöhnlich finde (und ich hatte es erst bemerkt, als ich diese Antwort gelesen habe!)
JDL

@JDL Ja, ich muss fast immer die R-Syntax-Seite öffnen, während ich Golf spiele, wenn komische Macken wie diese auftreten :.
Giuseppe


6

Dyalog APL, 5 Bytes

⌈×1+=

Probieren Sie es online!

Wie?

  • Elementweise Maximum der Argumente
  • ×elementweise multiplizieren
  • 1+=, 1 zur elementweisen Gleichheit der Argumente hinzugefügt

Dies funktioniert, weil, wenn die Zahlen ungleich sind, 1+=dies 1, wenn es mit dem Maximum multipliziert wird, das Maximum ist. Wenn die Zahlen gleich sind, 1+=wird zurückgegeben 2, wenn dies mit dem Maximum multipliziert wird, erhalten wir das Doppelte des Maximums oder das Maximum, das zu sich selbst addiert wird.


5

Gelee , 6 Bytes

żSṀE?€

Ein dyadischer Link, der eine Liste von Zahlen auf jeder Seite aufnimmt und die resultierende Liste zurückgibt.

Probieren Sie es online! oder sehen Sie sich eine Testsuite * an.

Wie?

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

Eine Alternative ist dieser monadische Link , der eine Liste der beiden Listen mit ebenfalls 6 Bytes erstellt :

+»⁼?"/

* Ich glaube nicht, dass ich jemals eine Fußzeile für eine Testsuite erstellt habe, die fast dreimal so viele Bytes enthält wie der Code zuvor!


Outgolfed! . +1 für die praktisch wörtliche Interpretation der Frage.
Zacharý

... und ich bin erwischt worden, wie ich diese »Vektorisierungen vorher vergessen habe!
Jonathan Allan

Was würde es sonst tun, das maximale Array auf eine verschlungene Weise zu nutzen?
Zacharý

Python benötigt keine verschachtelten Definitionen - zum Beispiel max([1,1,0],[1,0,3]) -> [1,1,0](nicht [1,1,3]).
Jonathan Allan

Also im Grunde genommen unendlich?
Zacharý


4

MATL , 7 Bytes

X>tG=s*

Die Eingabe ist eine Matrix mit zwei Zeilen, wobei jede Zeile eines der Arrays ist.

Probieren Sie es online!

Erläuterung

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);}

Ändert stattdessen das zweite Eingabearray oder gibt ein neues Float-Array zurück, um Bytes zu sparen.

-11 Bytes, indem die Länge als zusätzliche Ganzzahleingabe verwendet wird, die gemäß den Herausforderungsregeln zulässig ist.
-5 Bytes dank @ OliverGrégoire (ein Byte zu einem Zeitpunkt .. xD)
-1 Byte indirekt dank @Shaggy ‚s JS Antwort , durch die Verwendung a[l]*2statt a[l]+b[l].

Erläuterung:

Probieren Sie es hier aus.

(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
"Wenn es Ihnen hilft, die Anzahl der Bytes zu verringern, können Sie auch die Länge der Listen als Eingabe verwenden." Es wird definitiv Ihre Byteanzahl reduzieren;)
Olivier Grégoire

1
Auch 2 Bytes kürzer: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

Und Sie können ein weiteres Byte speichern, indem Sie float A, Bdie forInitialisierung eingeben.
Olivier Grégoire

1
Oder dies: (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 .. beim Golfen hilft jedes Byte, aber das heißt nicht, dass Sie es ein Byte nach dem anderen spielen müssen. ; p
Kevin Cruijssen


3

05AB1E , 9 8 7 Bytes

Ein Byte gespeichert, als Erik der Outgolfer darauf hinwies, dass eine Liste von Listen eine gültige Eingabe ist.

øεMsËi·

Probieren Sie es online!

Erläuterung

ø          # 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, das war sehr schnell!

Sie können ein Byte speichern, indem Sie das entfernen und als Paar aus einer Liste und einer Liste eingeben.
Erik der Outgolfer

@EriktheOutgolfer: Stimmt. Ich nahm an, dass wir das nicht durften, aber ich sehe, dass die Herausforderung Standard-E / A-Regeln festlegt. Vielen Dank für die Benachrichtigung :)
Emigna

1
@Emigna Tipp: Machen Sie keine Regeln aus Ihrem Kopf;)
Erik the Outgolfer

1
@EriktheOutgolfer: Ja, ich muss wirklich damit aufhören. Vor allem Regeln, die meine Programme verlängern;)
Emigna


3

J, 7 Bytes

>.`+@.=

Probieren Sie es online!

Nimmt eine Liste als linkes Argument und die andere als rechtes.

Glücklicherweise ist Gleichheit eine Operation mit Rang Null.

Erläuterung

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

@.Ist nicht wirklich eine if-Anweisung, funktioniert aber in diesem Fall als eine (sie indiziert das Gerundium >.`+auf der Grundlage des Ergebnisses ihres richtigen Arguments und wendet dieses auf die Eingabe an).


Gute Arbeit, ich weiß, ich konnte das nicht tun, obwohl Sie von meiner Übersetzung meiner APL überfordert waren . > _ <
Zacharý

J scheint wirklich hier
Jonah

@ Zacharý Ratten, trotzdem gut golfen.
Cole


3

TI-Basic, 23 21 Bytes

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

Schade, dass Listen jeweils zwei Bytes belegen ...


Sie können zwei Bytes speichern, indem Sie nach Xund fragen und Ydann ʟXund verwenden, ʟYum darauf zuzugreifen, dh " Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2".
Scott Milner

Dies ist derzeit auch ungültig, da L1(L1=L2)versucht wird, das Element L1einer Liste abzurufen, was einen Fehler auslöst. Um dies zu beheben, tauschen Sie die Reihenfolge aus, dh (L1=L2)L1.
Scott Milner

@ScottMilner Vielen Dank, dass Sie beide darauf hingewiesen haben.
Timtech



2

Python 3 , 49 46 45 Bytes

3 Bytes entfernt dank @ Mr.Xcoder (splat statt zwei Argumente) und 1 Byte dank @ovs (map statt Listenverständnis)

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

Probieren Sie es online!


1
46 Bytes lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]. Es stellt sich heraus, dass dies auch ganz gut ist :) - Schade, dass es keinen Platz für weiteres Golfen gibt
Mr. Xcoder

@ Mr.Xcoder Danke! Gute Idee!
Luis Mendo

45 Bytes mit map anstelle von zip.
OVS

2

Common Lisp, 60 59 Bytes

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

Probieren Sie es online!

-1 Byte danke an @ Zacharý!


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

Gern geschehen, ich kenne mich nicht so gut mit Lisp aus. Ich habe gerade meine anderen Antworten in Lisp übersetzt, wodurch ein Byte gespart wurde.
Zacharý

2

Python mit Numpy, 28 Bytes

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

Angenommen, die Eingabe erfolgt als zwei numpy-Arrays.


Wenn wir Numpy verwenden, ist hier meine schlechtere Lösung:lambda a,b:n.fmax(a,b)*((a==b)+1)
Erich

@Erich Mir gefällt die Idee, aber dazu müsste ich import numpy as n. Ich komme hier ohne davon, weil es in der Eingabe impliziert ist.

Ich denke, ich bin ein bisschen wackelig in Bezug auf die explizite Bytezählung. Oft sind Python-Antworten einfach Lambdas, wenn eine tatsächliche Implementierung einer Antwort die Zuordnung zu etwas erforderlich machen würde. Aus diesem Grund frage ich mich, ob es zulässig ist, auch mit einer impliziten Importanweisung davonzukommen.
Erich

@Erich Im Allgemeinen können Sie nur dann auf eine Variable verweisen, nwenn Sie sie nin Ihrem Code definiert haben. Daher müssen Importe explizit erfolgen. Standardmäßig erlauben wir Funktionen oder vollständige Programme als Antworten, einschließlich anonymer Funktionen.

1
Nun, dies erfordert nur Eingaben als Numpy-Arrays, anstatt sie zu importieren numpy. Aber geht das überhaupt ohne Verwendung return?
Zacharý

2

C # (.NET Core) unter Verwendung von Linq 47 + 18 = 65 Byte

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

Probieren Sie es online!

C # (.NET Core), 82 Byte

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

Probieren Sie es online!



@jkelm ja, ich habe mich gefragt, ob das "using system" so aufgenommen werden soll oder nicht, denke ich nicht. Ich werde es aufräumen
Dennis.Verweij

System.Linq ist im "Visual C # Interactive Compiler" enthalten. Ich bin mir nicht ganz sicher , ob ich Arrayvs IListvs zurückgeben soll IEnumerable, aber wenn alle berechtigt sind, können Sie die Byteanzahl
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 hat eine interessante Eigenschaft, die darin besteht, dass ein Int nicht direkt in ein umgewandelt Doublewerden kann. Daher müssen Sie alle Arrays als Arrays von Doubles angeben, bevor Sie sie an die Funktion übergeben.

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

Edit: -2 Bytes dank @EriktheOutgolfer


Benötigen Sie Räume um (x,y)und vor ??
Erik der Outgolfer

@EriktheOutgolfer Der vorherige ?wird benötigt, da Swift sie als optionale Typen anstelle von Ternären (was sie nicht sind) behandelt. Die anderen sind es nicht. Abgesehen davon kann dies drastisch golfen werden.

@EriktheOutgolfer - TheIOSCoder hat dir teilweise schon geantwortet, aber du hast recht, du brauchst nicht die in der for-Schleife, interessant!
AnonymousReality

73 Bytes: func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}(die Float-Ungenauigkeiten müssen nicht standardmäßig behandelt werden)
Mr. Xcoder

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


1

Japt , 13 Bytes

íV,È¥Y Ä *XwY

Probieren Sie es online! mit dem -QFlag, um das Ausgabearray zu formatieren.


Schön gemacht. Ich habe zuvor zwei Versuche unternommen, wobei beide mit 17 Bytes ausgegeben wurden. Ich hatte vergessen, íkönnte eine Funktion als zweites Argument nehmen.
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>;

Probieren Sie es online!

8 Bytes dank @mgc eingespart


1
Ich vermute, Sie können 8 Bytes sparen, indem Sie die gesammelte Typinferenz verwenden Vecund die maxMethode von 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<_>>();
anwenden

1
@mgc Danke! Typinferenz war eine gute Idee, aber in diesem Fall ist der Typalias noch kürzer.
jferard

1

Schnelle 4 , 41 Bytes

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

Testfälle:

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!")
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.