Uzyskaj najlepszą z dwóch tablic

19

Otrzymasz dwie tablice liczb zmiennoprzecinkowych. Twoim zadaniem jest sparowanie odpowiednich elementów dwóch tablic i uzyskanie maksimum każdej pary. Jednakże , jeśli dwa odpowiednie elementy są równe, trzeba wziąć ich sumę w zamian.

Na przykład, biorąc pod uwagę listy [1, 3, 3.2, 2.3]i [3, 1, 3.2, 2.6], musisz wykonać następujące czynności:

  • Powiązać elementy (lub ZIP): [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]].

  • Przejść przez każdą parą i zastosować proces powyżej: [3, 3, 6.4, 2.6].


Okular

  • Tablice / listy zawsze będą miały równą długość. Mogą być jednak puste.

  • Zawarte w nich liczby zawsze będą pasować do możliwości Twojego języka, o ile tego nie wykorzystasz. Mogą być dodatnie, zerowe lub ujemne, musisz obsługiwać wszystkie typy.

  • Jeśli to pomaga zmniejszyć liczbę bajtów, to może również przyjąć długość list jako wejście.

Zasady


Przypadki testowe

Array_1, Array_2 -> Dane wyjściowe

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

źródło
Mówisz, że liczby zawsze będą pasować do „możliwości” twojego języka. Dopóki tego nie „nadużyjesz”. Czy wspieranie liczb całkowitych w języku, który nie ma liczb zmiennoprzecinkowych, byłoby uważane za nadużycie? ale tak naprawdę nie widzę powodu, dla którego musiałyby to być zmiennoprzecinkowe. Ten sam proces można wykonać na liczbach całkowitych. Chciałbym rozwiązać ten problem w Brain-Flak, ale Brain-flak obsługuje tylko int.
Wheat Wizard
@WheatWizard Mogę zrobić dla tego wyjątek. Śmiało, opublikuj swoją odpowiedź i wspomnij, że pozwoliłem jej uniknąć zamieszania.

Odpowiedzi:

8

Galaretka, 4 bajty

=‘×»

Wypróbuj online!

To używa dokładnie tego samego podejścia, co moja odpowiedź APL , z tym że Jelly ma wbudowane dodawanie jednego do liczby!

Zacharý
źródło
Nienawidzisz być psującym sportem, ale czy niektóre z tych postaci nie są w więcej niż jednym bajcie w jakimkolwiek sensownym kodowaniu?
Cedric Knight
To używa strony kodowej galaretki .
Zacharý
W końcu wygrałem z konkurencją!
Zacharý
2
@ Zacharý ONE MAN, 4 bajty ... TO LATO ... Ty ... BĘDZIESZ ... JELLY Z NIEGO ... ocenił J na Galaretkę .
Magic Octopus Urn
11

Kotlin, 78 75 71 66 65 59 bajtów

To moja pierwsza próba, bądź spokojny: D

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

TIO nie działa z tym rozwiązaniem (i nie wiem dlaczego), kod źródłowy do testowania poniżej

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

EDYTOWAĆ:

-3 przez „a + b [i]” na „a * 2”

-4 przez zastąpienie metody „mapIndexed” przez „zip” (dzięki rozwiązaniu @AnonymousReality Swift)

-5 przez zastąpienie metody „Math.max” przez kiedy warunek

-1 przez zmianę przy zamówieniu warunku

-6 przez zmianę toFloatArray () przez toList ()

Valentin Michalak
źródło
10
Witamy w PPCG! Downvote nie zniechęca się (jest to wynikiem drobnego dziwactwa systemu, który ma miejsce, gdy pierwszy post nowego użytkownika jest automatycznie oznaczany jako jakość, a następnie poprawia wspomniany post !!)
Jonathan Allan
2
Najgorsza „funkcja”, jaka kiedykolwiek… btw, nie czuje się z tym źle.
Erik the Outgolfer
10

Python 2 , 45 bajtów

Mieszanka mojego początkowego rozwiązania i @ovs .

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

Wypróbuj online!

Python 2 , 49 bajtów

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

Wypróbuj online!

Python 2 , 46 bajtów

@ovs zaproponował tę metodę, aby zaoszczędzić 3 bajty.

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

Wypróbuj online!


W jaki sposób?

Po pierwsze, łączymy odpowiednie elementy za pomocą *lub zip(). To pozwala nam dalej grać w golfa, pracując z mapą lub listą.

Fajne sztuczki w tej odpowiedzi jest to część: max(x,y)*-~(x==y). Jak to działa? - Cóż, jak większość z was już wie, Python automatycznie konwertuje wartości bool na liczby całkowite, gdy są używane w operacjach arytmetycznych. Stąd (x==y)jest oceniany jako 1, jeśli warunek jest spełniony. Jeśli jednak dwie wartości nie są równe, zwraca wartość 0. Następnie operacji bitowej -~przyrosty wartość zwracana z bool przez 1, dając nam albo 2albo 1. max(a,b)daje maksymalną wartość pary i *mnoży ją przez wartość zwróconą powyżej (więc zostaje pomnożona 2tylko wtedy, gdy są równe, w którym to przypadku max()zwraca wartość obu).

Opiera się to na tym, że suma dwóch równych liczb jest w rzeczywistości podwojona, a rodzaj „nadużycia” klasy bool Pythona jest podklasą int.

Pan Xcoder
źródło
Wow, to było naprawdę szybkie!
bardziej proste, ta sama liczba bajtów:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
Jferard
@jferard Faktycznie to już rozwiązanie Luisa.
Pan Xcoder
@ Mr.Xcoder Ups! Nie przeczytałem całej strony ...
Jferard
Nigdy nie mów „powyżej”, ponieważ kolejność może się zmienić (nie widzę twojego rozwiązania powyżej)
Zacharý
8

JavaScript (ES6), 53 49 45 43 bajtów

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • 4 bajty zaoszczędzone dzięki pożyczeniu sztuczki od pana Xcodera.
  • 2 bajty zapisane dzięki Arnauldowi.

Spróbuj

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>


Wyjaśnienie

a=>b=>

Anonimowa funkcja przyjmująca 2 tablice jako argumenty za pomocą parametrów aoraz bw składni curry (tj. Wywołuje za pomocąf(a)(b)

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

Odwzoruj na pierwszej tablicy, przepuszczając każdy element przez funkcję, w której xjest bieżącym elementem i ybieżącym indeksem.

(y=b[y])

Uzyskaj element o indeksie yw drugiej tablicy i przypisz go jako nową wartość y.

>x?y

Sprawdź, czy yjest większy niż, xa jeśli tak, zwróć y.

:y<x?x

W przeciwnym razie sprawdź, czy yjest mniejszy, xa jeśli tak, wróćx

:x+y

W przeciwnym razie zwróć sumę xi y. (Mnożenie xlub yprzez 2 również by działało tutaj, dla tej samej liczby bajtów.)

Kudłaty
źródło
j.value.split`,`.map(eval)czy eval('['+j.value+']')? Również x+ywyglądałby ładniej IMHO.
Neil
@ Neil: 1) Uważam, że ten pierwszy łatwiej pisać. Mam też kilka szablonów Snippet na jednym z moich komputerów; łatwiej po prostu się na nie przyczepić .map(eval). 2) Uzgodnione, za chwilę dokonam edycji.
Shaggy
7

Haskell, 34 bajty

x!y|x>y=x|x<y=y|1<2=x+y
zipWith(!)

Wypróbuj online.

Cristian Lupascu
źródło
2
Sama liczba bajtów: x!y=max x y+sum[x|x==y].
nimi
7

R , 31 29 bajtów

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

pmax przyjmuje równoległe maksimum z dwóch (lub więcej) tablic (recykling krótszy w razie potrzeby).

Szukałem w komentarzu Luis Mendo za i oczywiście ja sobie sprawę, że podejście może pracować dla R, jak również. Że mnie do 30 bajtów, ale potem zacząłem zabawy z różnych sposobów na uzyskanie wskaźników zamiast poprawić mój oryginalny odpowiedź, i natknęliśmy się !a-bjak TRUE, gdzie a==bi FALSEinaczej, równoważne a==b. Jednak z jakiegokolwiek powodu R nie wymaga nawiasów wokół, !a-bjak to robi a==b, co pozwoliło mi zaoszczędzić dwa bajty.

Jak wspomniano w komentarzach JDL , działa to, ponieważ !(negacja) ma niższy priorytet niż operator binarny -w R, co jest dziwne.

Wypróbuj online! (Nowa wersja)

Wypróbuj online! (oryginalny)

Giuseppe
źródło
Okazuje się, że jednoargumentowe „!” ma niższy priorytet w R niż binarny „-”, co moim zdaniem jest dość niezwykłe (i nie zdawałem sobie z tego sprawy, dopóki nie przeczytałem tej odpowiedzi!)
JDL
@JDL tak, prawie zawsze muszę otwierać stronę składni R podczas gry w golfa w przypadku takich dziwnych dziwactw ... a także dlatego, że nigdy nie pamiętam pierwszeństwa :interakcji z arytmetyką.
Giuseppe
6

Dyalog APL, 5 bajtów

⌈×1+=

Wypróbuj online!

W jaki sposób?

  • , elementarne maksimum argumentów
  • ×, mnożąc element
  • 1+=, 1 dodane do elementarnej równości argumentów

Działa to, ponieważ jeśli liczby są nierówne, 1+=będzie to 1, które pomnożone przez maksimum, będzie maksimum. Gdy liczby są równe, 1+=wróci 2, gdy pomnożone przez maksimum, otrzymamy dwukrotność maksimum lub maksimum dodane do siebie.

Zacharý
źródło
5

Galaretka , 6 bajtów

żSṀE?€

Dyadyczny link pobierający listę liczb z każdej strony i zwracający wynikową listę.

Wypróbuj online! lub zobacz pakiet testowy *.

W jaki sposób?

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

Alternatywą jest monadyczny link zawierający listę dwóch list, również 6 bajtów :

+»⁼?"/

* Nie sądzę, że kiedykolwiek wcześniej tworzyłem stopkę zestawu testów prawie trzy razy większą niż liczba bajtów kodu!

Jonathan Allan
źródło
Outgolfed! . +1 za praktycznie dosłowną interpretację pytania.
Zacharý
... przyłapano mnie na tym, że »wcześniej zapominam o wektoryzacji!
Jonathan Allan
Co jeszcze by zrobił, wziąć maksymalną tablicę w jakiś zawiły sposób?
Zacharý
Python nie potrzebuje żadnych skomplikowanych definicji - na przykład max([1,1,0],[1,0,3]) -> [1,1,0](nie [1,1,3]).
Jonathan Allan
Więc w zasadzie baza nieskończona?
Zacharý
5

05AB1E , 5 bajtów

øεMÃO

Wypróbuj online!

-1 dzięki Emignie .

Erik the Outgolfer
źródło
Fajny pomysł za pomocą γ!
Emigna
@Emigna Naprawdę chciałem mieć „maksymalne elementy” i {γθjest to prawdopodobnie najkrótszy możliwy do tego sposób.
Erik the Outgolfer
Jak o øεMÃO?
Emigna
@Emigna Cool, dzięki! (duh dlaczego nie pomyślałem o tym ) yay dostał teraz prowadzenie: p btw też øεZÃOby działało
Erik the Outgolfer
4

MATL , 7 bajtów

X>tG=s*

Dane wejściowe to macierz dwurzędowa, gdzie każdy wiersz jest jedną z tablic.

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
4

Java 8, 80 69 67 66 65 64 63 bajty

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

Zamiast tego modyfikuje drugą tablicę wejściową lub zwraca nową tablicę zmiennoprzecinkową, aby zapisać bajty.

-11 bajtów, przyjmując długość jako dodatkowe wejście liczb całkowitych, co jest dozwolone zgodnie z regułami wyzwania.
-5 bajty dzięki @ OliverGrégoire (jeden bajt w czasie .. xD)
-1 bajt pośrednio dzięki @Shaggy jest JS odpowiedzi przez zastosowanie a[l]*2zamiast a[l]+b[l].

Wyjaśnienie:

Wypróbuj tutaj.

(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
Kevin Cruijssen
źródło
2
„Jeśli to pomoże ci zmniejszyć liczbę bajtów, możesz również wziąć długość list jako dane wejściowe.” Z pewnością zmniejszy to liczbę bajtów;)
Olivier Grégoire
1
Ponadto o 2 bajty krótsze: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
I można zapisać jeden bajt umieszczając float A, Bw forinicjalizacji.
Olivier Grégoire
1
Lub to: (a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63 bajty)
Olivier Grégoire
3
@ OlivierGrégoire Lol .. z golfem pomaga każdy bajt, ale to nie znaczy, że musisz grać w golfa jeden bajt na raz. ; p
Kevin Cruijssen
3

05AB1E , 9 8 7 bajtów

Zapisany bajt, ponieważ Erik the Outgolfer wskazał, że lista list jest poprawnym wejściem.

øεMsËi·

Wypróbuj online!

Wyjaśnienie

ø          # 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
Emigna
źródło
Wow, to było naprawdę szybkie!
Możesz zapisać bajt, usuwając i wprowadzając jako parę listy i listy.
Erik the Outgolfer
@EriktheOutgolfer: True. Zakładałem, że nie wolno nam, ale widzę, że wyzwanie określa standardowe reguły we / wy. Dziękujemy za powiadomienie :)
Emigna
1
@Emigna Wskazówka: nie wymyślaj reguł;)
Erik the Outgolfer
1
@EriktheOutgolfer: Tak, naprawdę muszę przestać to robić. Zwłaszcza zasady, które
wydłużają
3

Mathematica, 31 bajtów

MapThread[If[#==#2,2#,Max@##]&]
alephalpha
źródło
3

J, 7 bajtów

>.`+@.=

Wypróbuj online!

Traktuje jedną listę jako lewy argument, a drugą jako prawy.

Na szczęście równość jest operacją na poziomie zero.

Wyjaśnienie

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

@.tak naprawdę nie jest instrukcją if, ale w tym przypadku działa jako jedna (indeksuje do gerunda >.`+na podstawie wyniku jego właściwego argumentu i stosuje to do danych wejściowych).

kapusta
źródło
Dobra robota, wiem, że nie mogłem tego zrobić, mimo że moje tłumaczenie APL-a cię przeraziło . > _ <
Zacharý
J naprawdę świeci tutaj
Jonah
@ Zachary szczury, mimo to dobrze gra w golfa.
cole
3

TI-Basic, 23 21 bajtów

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

Szkoda, że ​​listy zajmują po dwa bajty ...

Timtech
źródło
Można zapisać dwa bajty przez monitowania Xi Y, a następnie przy użyciu ʟXi ʟYdostęp do nich, czyli „ Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2”.
Scott Milner,
Ponadto jest to obecnie nieprawidłowe, ponieważ L1(L1=L2)próbuje uzyskać element z L1listy, co powoduje błąd. Aby to naprawić, zamień kolejność, tj (L1=L2)L1.
Scott Milner,
@ScottMilner Dzięki za wskazanie obu z nich.
Timtech
2

Common Lisp, 60 59 bajtów

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

Wypróbuj online!

-1 bajt dzięki @ Zacharý!

Renzo
źródło
59 bajtów: (mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read)).
Zacharý
Nie ma za dobrze lisp, nie znam się tak dobrze, po prostu przetłumaczyłem moje inne odpowiedzi na Lisp, co ostatecznie uratowało bajt.
Zacharý
2

Python z numpy, 28 bajtów

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

Zakłada, że ​​dane wejściowe są podawane jako dwie tablice numpy.


źródło
Jeśli używamy numpy, oto moje najgorsze rozwiązanie:lambda a,b:n.fmax(a,b)*((a==b)+1)
Erich
@Erich Podoba mi się ten pomysł, ale aby to zrobić, musiałbym to zrobić import numpy as n. Uciekam tutaj bez niego, ponieważ jest to ukryte w danych wejściowych.
Wydaje mi się, że jestem trochę niepewny w jawnym zliczaniu bajtów, często odpowiedzi python są po prostu lambdami, kiedy rzeczywista implementacja odpowiedzi wymagałaby przypisania jej do czegoś. z tego powodu zastanawiam się, czy dopuszcza się również ucieczkę z domniemanym wyciągiem z importu?
Erich
@Erich Zasadniczo możesz odwoływać się do zmiennej tylko nwtedy, gdy zdefiniowałeś nw swoim kodzie, więc import musi być jawny. Domyślnie dopuszczamy funkcje lub pełne programy jako odpowiedzi, w tym funkcje anonimowe.
1
Cóż, to wymaga jedynie wprowadzania liczb jako tablic numpy, a nie importowania numpy. Ale czy to działa nawet bez użycia return?
Zacharý
2

C # (.NET Core) , używając Linq 47 + 18 = 65 bajtów

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

Wypróbuj online!

C # (.NET Core), 82 bajty

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

Wypróbuj online!

Dennis.Verweij
źródło
Możesz usunąć odpowiedź LINQ o kilka bajtów, zmieniając przestrzeń nazw System.LINQ na system.LINQ
jkelm
@jkelm tak, zastanawiałem się, czy należy włączyć „using System;”, czy nie, chyba nie. Posprzątam to
Dennis.Verweij
System.Linq jest zawarty w „Kompilatorze interaktywnym Visual C #”. Nie jestem całkowicie pewna powrotuArray , czy powrócimy przeciwko IListvs IEnumerable, ale jeśli wszystkie są odpowiednie, możesz uzyskać liczbę bajtów na 37 - tio.run/##Sy7WTS7O/…
dana
1

Swift 3, 81 79 bajtów

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

Swift ma interesującą właściwość polegającą na tym, że Int nie może być bezpośrednio rzucany na a Double, więc musisz podać dowolne tablice jako tablice Doubles przed przekazaniem ich do funkcji.

(na przykład) var k:[Double] = [1,2,3,4,5,5,7,8,9,10]

Edycja: -2 bajty dzięki @EriktheOutgolfer

AnonymousReality
źródło
Czy potrzebujesz miejsca wokół (x,y)i wcześniej ??
Erik the Outgolfer
@EriktheOutgolfer Poprzednia ?jest potrzebna, ponieważ Swift traktowałby je jako opcjonalne typy zamiast trójskładników (którymi nie są). Inni nie są. Poza tym można drastycznie grać w golfa.
@EriktheOutgolfer - The IOSCoder już częściowo odpowiedział, ale masz rację, nie potrzebujesz tych w pętli for, ciekawe!
AnonymousReality
73 bajty: func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}(niedokładności typu float nie muszą być domyślnie obsługiwane)
Mr. Xcoder
Lub 74 bajty:func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
Pan Xcoder
1

DO, 76 75 bajtów

Dzięki @Kevin Cruijssen za uratowanie bajtu!

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

Wypróbuj online!

Steadybox
źródło
1

Japt , 13 bajtów

íV,È¥Y Ä *XwY

Wypróbuj online! z -Qflagą, aby sformatować tablicę wyjściową.

Justin Mariner
źródło
Ładnie wykonane. Wcześniej podjąłem 2 próby, oba wychodzące na 17 bajtów. Zapomniałem, że ímógłbym wziąć funkcję jako drugi argument.
Shaggy
1

Rdza , 107 97 bajtów

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

Wypróbuj online!

Zaoszczędź 8 bajtów dzięki @mgc

Jferard
źródło
1
Wydaje mi się, że można zapisać 8 bajtów, korzystając z wnioskowania typu na zebranych Veci stosując maxmetodę 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 Dzięki! Wnioskowanie typu było dobrym pomysłem, ale w tym przypadku alias typu jest jeszcze krótszy.
jferard
1

Swift 4 , 41 bajtów

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

Przypadki testowe:

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!")
}
Alexander - Przywróć Monikę
źródło