Codegolf — Получите Лучшее Из Двух Массивов

  • Автор темы Kokorinaleks2
  • Обновлено
  • 22, Oct 2024
  • #1

Вам будут предоставлены два массива чисел с плавающей запятой. Ваша задача — соединить соответствующие элементы двух массивов и получить максимум из каждой пары. Однако, если два соответствующих элемента равны, вместо этого необходимо взять их сумму.

Например, учитывая списки

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]
and [3, 3, 6.4, 2.6] , вам необходимо сделать следующее:

  • Соедините элементы (или застегните молнию): [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]] .

  • Просмотрите каждую пару и примените описанный выше процесс: [3, 1, 3.2, 2.6] .


Характеристики

  • Массивы/списки всегда будут иметь одинаковую длину. Однако они могут быть пустыми.

  • Числа, которые они содержат, всегда будут соответствовать возможностям вашего языка, если вы этим не злоупотребляете. Они могут быть положительными, нулевыми или отрицательными, необходимо обрабатывать все типы.

  • Если это поможет вам уменьшить количество байтов, вы может также возьмите длину списков в качестве входных данных.

Правила


Тестовые случаи

[1, 3, 3.2, 2.3]

#код-гольф #код-гольф #математика #число #массив

Kokorinaleks2


Рег
07 Apr, 2020

Тем
80

Постов
202

Баллов
632
  • 26, Oct 2024
  • #2

Питон 2, 45 байт

Смесь моего первоначального решения и @ovs'.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 x=>y=>         // Function literal taking 2 * Vector[Float], x and y.
x zip y        // Zip x and y into one list of pairs.
map(           // Replace every element in the list via a function.
v=>            // Function literal that takes a pair of floats.
if(v._1==v._2) // If the pair are equal.
v._1*2         // Set the element to the first member of the pair multiplied by 2.
else           // Otherwise.
v._1 max v._2) // Set it to their max.
 

Попробуйте онлайн!

Питон 2, 49 байт

x=>y=>x zip y map(v=>if(v._1==v._2)v._1*2 else v._1 max v._2)

Попробуйте онлайн!

Питон 2, 46 байт

@Mr.Xcoder предложил этот метод, чтобы сэкономить 3 байта.

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

Попробуйте онлайн!


Как?

Прежде всего, мы соединяем соответствующие элементы, используя либо -Q или ?V,È¥Y Ä *XwY . Это позволяет нам продолжать игру в гольф, работая либо с картой, либо со списком.

Крутой трюк в этом ответе заключается в следующем: f(a,b,n)float*a,*b;{for(;n--;++a,++b)printf("%f ",*a>*b?*a:*b>*a?*b:*a*2);} . Как это работает? - Ну, как большинство из вас уже знает, Python автоматически преобразует логические значения в целые числа, когда они используются в арифметических операциях. Следовательно, var k:[Double] = [1,2,3,4,5,5,7,8,9,10] gets evaluated as Double , если условие выполнено. Однако, если два значения не равны, он возвращает Double instead. Then, the bitwise operation func n(a:[Double],b:[Double]){for(x,y)in zip(a,b){print((x==y) ?x+y:max(x,y))}} увеличивает значение, возвращаемое из bool, на {map {.max*2/set $_},[Z] $_} , giving us either 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;} or x=>y=>x.Zip(y,(a,b)=>a>b?a:b>a?b:b+a).ToArray() . lambda a,b:a*(a>=b)+b*(b>=a) дает максимальное значение пары и (mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read)) multiplies it by the value returned above (so it gets multiplied by ms.MZdC только если они равны, и в этом случае @(a,b)a.*(a>b)+b.*(b>a)+2.*a.*(a==b) returns the value of both).

Это основано на том факте, что сумма двух равных чисел на самом деле удваивается, и это своего рода «злоупотребление» классом Python bool, являющимся подклассом int.

 

Casper_laim


Рег
01 Nov, 2019

Тем
73

Постов
195

Баллов
570
  • 26, Oct 2024
  • #3

Котлин, 78 75 71 66 65 59 байт

Это моя первая попытка, будь крут :D

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

TIO не работает с этим решением (и я не знаю почему), исходный код для тестирования ниже

->a,b{a.zip(b).map{|x,y|[x+y,x,y][x<=>y]}}

РЕДАКТИРОВАТЬ:

-3, заменив «a+b[i]» на «a*2»

-4 путем замены метода «mapIndexed» на «zip» (Спасибо @AnonymousReality

Быстрое решение)

-5 путем замены метода Math.max на условие if

-1 при изменении порядка условия

-6 при изменении toFloatArray() на toList()

>.`+

 

Hxh2310


Рег
11 Dec, 2014

Тем
86

Постов
200

Баллов
660
  • 26, Oct 2024
  • #4

Желе, 4 байта Попробуйте онлайн!Здесь используется тот же подход, что и

мой ответ APL

, за исключением того, что в Jelly есть встроенная функция добавления единицы к числу!

@.
 

Graver_robot


Рег
10 Dec, 2023

Тем
86

Постов
203

Баллов
643
  • 26, Oct 2024
  • #5
  • JavaScript (ES6), 53 49 45 43 байта

  • 4 байта сэкономлены благодаря трюку мистера Xcoder.

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

    2 байта сэкономлены благодаря Арно.

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

    Попробуйте это MapThread[If[#==#2,2#,Max@##]&] and ø # 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 Объяснение øεMsËi·

    m*eSdh!tl{dC

    Анонимная функция, принимающая два массива в качестве аргументов через параметры. m*eSdhqhdedC is the current element and m*eSdhnd{dC , в синтаксисе каррирования (т. е. вызов с помощью

    (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

    Сопоставьте первый массив, передав каждый элемент через функцию, где a[l]+b[l] in the second array and assign that as the new value of a[l]*2 .

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

    это текущий индекс. 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 is greater than X>tG=s* Получить элемент по индексу øεMÃ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] is less than żSṀE?€ и если да, то верните 2

    1+=

    В противном случае проверьте, 1 and 1+= и если да, то верните 1+= or × В противном случае верните сумму

    . (Умножение

    на 2 здесь также будет работать для того же количества байтов.)

     

    Matrix2


    Рег
    27 Apr, 2006

    Тем
    64

    Постов
    187

    Баллов
    517
    • 26, Oct 2024
    • #8
    -

    ! takes the parallel maximum of the two (or more) arrays (recycling the shorter as needed).

    Р , 31 29 байт я смотрел на a==b as !a-b Комментарий Луиса Мендо a==b and FALSE и, очевидно, я понял, что этот подход может работать и для R. Это привело меня к 30 байтам, но затем я начал экспериментировать с различными способами получения индексов, чтобы улучшить свой первоначальный ответ, и наткнулся на a==b . However, for whatever reason, R doesn't require parentheses around TRUE где !a-b , which saved me two bytes.

    в противном случае эквивалентно как это происходит дляКак упоминал pmax (negation) has lower precedence than the binary operator function(a,b)pmax(a,b)+a*!a-b ЛДЛ в комментариях

    , это работает, потому что

    в R, что странно.

    Попробуйте онлайн! (новая версия)

    Попробуйте онлайн! (оригинал)

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

     

    Bashi2buzuk


    Рег
    15 Dec, 2011

    Тем
    59

    Постов
    204

    Баллов
    529
    • 26, Oct 2024
    • #9

    Диалог APL, 5 байт

    • lambda*a:map(lambda*x:max(x)*2/len({*x}),*a) , element-wise maximum of the arguments
    • y , element-wise multiply
    • x , 1 added to the element-wise equality of the arguments

    Попробуйте онлайн! y will be x Как? :x+y will return x Это работает, потому что, если числа неравны,

    , который при умножении на максимум и есть максимум. Когда числа равны,

    , когда это умножается на максимум, мы получаем двойной максимум или максимум, добавленный к самому себе., 6

     

    Conaerord44


    Рег
    25 Oct, 2024

    Тем
    88

    Постов
    176

    Баллов
    656
    • 26, Oct 2024
    • #10
    x

    Желе

    байты Диадическая ссылка, принимающая список чисел с каждой стороны и возвращающая полученный список. Попробуйте онлайн!*.

    или увидеть

    y

    набор тестов Как? Альтернативой является эта монадическая ссылка:

    :y<x?x

    взяв список из двух списков, а также

    6 байт

    * Я не думаю, что когда-либо раньше создавал нижний колонтитул набора тестов, почти в три раза превышающий количество байтов кода!

     

    KSM- OKS


    Рег
    21 Oct, 2011

    Тем
    65

    Постов
    172

    Баллов
    507
    • 26, Oct 2024
    • #12
    x

    МАТЛ

    , 7 байт

    Входные данные представляют собой двухстрочную матрицу, где каждая строка представляет собой один из массивов.

    y ||answer||

    Попробуйте онлайн!

    >x?y

    Объяснение

    Java 8, 80 69 67 66 65 64 63 байта
    Вместо этого изменяет второй входной массив или возвращает новый массив с плавающей запятой для сохранения байтов. -11 байт, принимая длину в качестве дополнительного целочисленного ввода, что разрешено в соответствии с правилами вызова. -5 байт благодаря
    @ОливерГрегойр (по одному байту за раз. xD)-1 байт косвенно благодаря@Шэгги y instead of y .

    ответ JS

    , используя

    (y=b[y]) ||answer||

    Объяснение:Попробуйте здесь.

    y

    Пиф

    , 11 байтПопробуйте здесь!

    x

    Пиф

    , 12 байт

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

    Попробуйте здесь!

    или

    05AB1E

     

    Дмитрий1989


    Рег
    01 Sep, 2011

    Тем
    64

    Постов
    200

    Баллов
    540
    • 26, Oct 2024
    • #13

    05AB1E , 9 8 7 байт Сохранил байт как

    f(a)(b)

    Эрик Аутгольфист

    отметил, что список списков является допустимым вводом.

    b ||answer||

    Попробуйте онлайн!

    a ||answer||

    ОбъяснениеМатематика, 31 байт

    Питон 3 , 49 46 45 байт 3 байта удалены благодаря @ovs (знак вместо двух аргументов) и 1 байт благодаря

    a=>b=>

    @ovs

    (карта вместо понимания списка)

    Попробуйте онлайн!

    <input id=i><input id=j><pre id=o>

     

    AspilaWobiorb3


    Рег
    25 Oct, 2024

    Тем
    71

    Постов
    202

    Баллов
    577
    • 26, Oct 2024
    • #14

    Дж, 7 байт

    Попробуйте онлайн!

    Принимает один список в качестве левого аргумента, а другой — в качестве правого.

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

    a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y) isn't К счастью, равенство — это операция нулевого ранга. Объяснение =‘×» based on the result of its right argument and applies that to the input).

    Действительно

    оператор if, но в данном случае он функционирует как единое целое (он индексируется в герундий

     

    Парол


    Рег
    28 Oct, 2008

    Тем
    79

    Постов
    191

    Баллов
    626
    • 26, Oct 2024
    • #15
    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("") }

    Руби

    , 42 байта

    Попробуйте онлайн!

    Оператор космического корабля великолепен.

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

     

    Ibartshuk2013


    Рег
    08 May, 2020

    Тем
    63

    Постов
    206

    Баллов
    551
    • 26, Oct 2024
    • #16

    TI-Basic, 23 21 байт

    Жаль, что списки занимают по два байта каждый...

    max() ||answer||

     

    Etelfibia83


    Рег
    13 Mar, 2011

    Тем
    80

    Постов
    185

    Баллов
    595
    • 26, Oct 2024
    • #18

    Common Lisp, 60 59 байт

    Попробуйте онлайн!

    -1 байт спасибо @Zacharý!

    max(a,b)

     

    Asyx


    Рег
    04 Feb, 2009

    Тем
    67

    Постов
    178

    Баллов
    563
    • 26, Oct 2024
    • #22

    Swift 3, 81 79 байт

    -~

    У Swift есть интересное свойство: Int нельзя напрямую привести к 0 , so you have to specify any arrays as being arrays of 1 s перед передачей их в функцию.

    (например.) (x==y)

    Изменить: -2 байта благодаря @EriktheOutgolfer.

     

    Acihuyo


    Рег
    13 Mar, 2014

    Тем
    72

    Постов
    190

    Баллов
    590
    • 26, Oct 2024
    • #26

    Скала, 61 байт

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

    Вышеупомянутый литерал функции в Scala. Вот объяснение.

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

    Валентин 41


    Рег
    13 Jan, 2012

    Тем
    64

    Постов
    201

    Баллов
    541
    Тем
    403,760
    Комментарии
    400,028
    Опыт
    2,418,908

    Интересно