Получите лучшее из двух массивов


19

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

Например, учитывая списки [1, 3, 3.2, 2.3]и [3, 1, 3.2, 2.6], вы должны сделать следующее:

  • Пара элементов (или ZIP): [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]].

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


Спекуляции

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

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

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

правила


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

Array_1, Array_2 -> Выход

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

Вы говорите, что числа всегда будут соответствовать «возможностям» вашего языка. Если вы не «злоупотребляете» этим, будет ли считаться злоупотреблением только поддержка целых чисел в языке, в котором нет чисел с плавающей запятой? но я на самом деле не вижу причины, по которой это должны быть числа с плавающей точкой. Тот же самый процесс может быть выполнен для целых чисел. Я хотел бы решить эту проблему в Brain-Flak, но Brain-flak поддерживает только целые числа.
Wheat Wizard

@WheatWizard Я могу сделать исключение для этого. Идите вперед, опубликуйте свой ответ и упомяните, что я позволил избежать путаницы.

Ответы:


8

Желе, 4 байта

=‘×»

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

При этом используется тот же подход, что и в моем ответе на APL , за исключением того, что у Jelly есть встроенная функция для добавления одного к номеру!


Ненавижу быть порчей, но разве некоторые из этих символов не содержат больше одного байта в любой разумной кодировке?
Седрик Найт


Я наконец выиграл у конкурентов!
Захари

2
@ Захари один человек, 4 btytes ... ЭТИМ ЛЕТОМ ... Вы ... ВОЛЯ ... БЫТЬ ... ЖЕЛЕ ИЗ НЕГО ... рейтинг J для желе .
Волшебная Осьминог Урна

11

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

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

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

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

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

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

-3 заменить "a + b [i]" на "a * 2"

-4 путем замены метода «mapIndexed» на «zip» (благодаря решению @AnonymousReality Swift)

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

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

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


10
Добро пожаловать в PPCG! Пожалуйста, не расстраивайтесь из-за отрицательного мнения (это результат небольшой странности системы, которая случается, когда первый пост нового пользователя автоматически помечается для качества, а затем они улучшают указанный пост !!)
Джонатан Аллан

2
Худшая "особенность" когда-либо ... кстати, не расстраивайся из-за этого.
Эрик Outgolfer

10

Python 2 , 45 байт

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

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

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

Python 2 , 49 байт

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

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

Python 2 , 46 байт

@ovs предложил этот метод для экономии 3 байтов.

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

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


Как?

Во- первых, мы пару соответствующих элементов, либо с помощью *или zip(). Это позволяет нам продолжать играть в гольф, работая с картой или списком.

Крутой трюк в этом ответе заключается в следующем max(x,y)*-~(x==y). Как это работает? - Ну, как многие из вас уже знают, Python автоматически преобразует значения bool в целые числа, когда они используются в арифметических операциях. Следовательно, (x==y)оценивается как 1, если условие выполнено. Однако, если эти два значения не равны, он возвращает 0вместо этого. Затем операция побитовые -~приращения значения , возвращаемые из BOOL путем 1, давая нам либо 2или 1. max(a,b)дает максимальное значение пары и *умножает его на значение, возвращенное выше (таким образом, оно умножается, 2только если они равны, и в этом случае max()возвращает значение обоих).

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


Вау, это было действительно быстро!

более просто, то же самое количество байтов:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@jferard На самом деле, это решение Луиса.
г-н Xcoder

@ Mr.Xcoder Ой! Я не прочитал всю страницу ...
Jferard

Никогда не говорите «выше», так как порядок может измениться (я не вижу вашего решения выше)
Zacharý

8

JavaScript (ES6), 53 49 45 43 байта

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • 4 байта сохранены, позаимствовав трюк у мистера Xcoder.
  • 2 байта сохранены благодаря Арно.

Попытайся

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=>b=>

Анонимная функция, принимающая 2 массива в качестве аргументов через параметры aи bв синтаксисе каррирования (то есть вызов сf(a)(b)

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

Сопоставьте первый массив, передавая каждый элемент через функцию, в которой xнаходится текущий элемент и yтекущий индекс.

(y=b[y])

Получите элемент по индексу yво втором массиве и присвойте ему новое значение y.

>x?y

Проверьте, yбольше ли, xи если да, верните y.

:y<x?x

Иначе, проверьте, если yменьше чем xи, если так, возвратитеx

:x+y

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


j.value.split`,`.map(eval)или eval('['+j.value+']')? И x+yвыглядел бы аккуратнее ИМХО.
Нил

@Neil: 1) Я считаю, что первое легче набрать. Кроме того, у меня есть пара шаблонов Snippet на одной из моих машин; легче просто прикрепить .map(eval)их. 2) Согласился, отредактирую на мгновение
Лохматый


7

R , 31 29 байт

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

pmax берет параллельный максимум двух (или более) массивов (рециркулируя более короткий по мере необходимости).

Я смотрел на комментарий Луиса Мендо и, очевидно, понял, что этот подход может сработать и для R. Это заставило меня до 30 байт, но потом я начал играть с различными способами получения индексов вместо того, чтобы улучшить мой первоначальный ответ, и наткнулся , !a-bкак , TRUEгде a==bи в FALSEпротивном случае, что эквивалентно a==b. Однако, по какой-то причине, R не требует круглых скобок, !a-bкак это было a==b, что позволило мне сэкономить два байта.

Как упомянуто JDL в комментариях , это работает, потому что !(отрицание) имеет более низкий приоритет, чем бинарный оператор -в R, что странно.

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

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


Оказывается, одинарное "!" имеет более низкий приоритет в R, чем двоичный "-", что, на мой взгляд, довольно необычно (и я не понял, пока не прочитал этот ответ!)
JDL

@JDL да, мне почти всегда приходится открывать страницу синтаксиса R во время игры в гольф в случае таких странных причуд, как это ... а также потому, что я никогда не могу вспомнить приоритет :при взаимодействии с арифметикой.
Джузеппе


6

Дьялог АПЛ, 5 байт

⌈×1+=

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

Как?

  • поэлементный максимум аргументов
  • ×поэлементное умножение
  • 1+=1 добавлено к поэлементному равенству аргументов

Это работает, потому что, если числа неравны, 1+=будет 1, который при умножении на максимум является максимумом. Когда числа равны, 1+=вернется 2, когда это умножится на максимум, мы получим вдвое больше максимума, или максимум, добавленный к себе.


5

Желе , 6 байт

żSṀE?€

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

Попробуйте онлайн! или посмотрите набор тестов *.

Как?

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

Альтернативой является эта монадическая ссылка , содержащая список из двух списков, также по 6 байтов :

+»⁼?"/

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


Outgolfed! , +1 за практически дословную интерпретацию вопроса.
Захари

... и я был пойман, забывая, что »векторизация раньше!
Джонатан Аллан

Что еще это сделало бы, взять максимальный массив каким-то запутанным способом?
Захари

Python управляет, например, нет max([1,1,0],[1,0,3]) -> [1,1,0](нет [1,1,3]).
Джонатан Аллан

Итак, в основном бесконечность базы?
Захари

5

05AB1E , 5 байтов

øεMÃO

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

-1 спасибо Эмигне .


Хорошая идея, используя γ!
Emigna

@Emigna Я действительно хотел "максимальные элементы", и {γθ, вероятно, самый короткий, который я могу получить для этого.
Эрик Outgolfer

Как насчет øεMÃO?
Emigna

@ Emigna Круто, спасибо! (Дух почему я не думаю о ) яй получил ведущую роль в настоящее время: р кстати øεZÃOбудет работать тоже
Эрик Outgolfer

4

MATL , 7 байт

X>tG=s*

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

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

объяснение

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 байта

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

Вместо этого изменяет второй массив ввода или возвращает новый массив float для сохранения байтов.

-11 байт, принимая длину в качестве дополнительного целочисленного ввода, что разрешено в соответствии с правилами вызова.
-5 байт благодаря @ OliverGrégoire (по одному байту за раз .. xD)
-1 байт косвенно благодаря ответу @Shaggy 's JS с использованием a[l]*2вместо a[l]+b[l].

Объяснение:

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

(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
«Если это поможет вам уменьшить количество байтов, вы также можете взять длину списков в качестве входных данных». Это определенно уменьшит ваш счетчик байтов;)
Оливье Грегуар

1
Также на 2 байта короче:a->b->l->{float A,B;for(;l-->0;b[l]=(A=a[l])<B?B:A>B?A:A+B)B=b[l];}
Оливье Грегуар,

И вы можете сохранить один байт, помещая float A, Bв forинициализации.
Оливье Грегуар

1
Или это: (a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63 байта)
Оливье Грегуар,

3
@ OlivierGrégoire Lol .. с игрой в гольф каждый байт помогает, но это не значит, что вам нужно играть в гольф по одному байту за раз. ; p
Кевин Круйссен


3

05AB1E , 9 8 7 байт

Сохраненный байт, как Эрик Outgolfer указал, что список списков является допустимым вводом.

øεMsËi·

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

объяснение

ø          # 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

Вау, это было действительно быстро!

Вы можете сохранить байт, удалив и введя в качестве пары список и список.
Эрик Outgolfer

@EriktheOutgolfer: правда. Я предполагал, что нам не разрешили, но я вижу, что проблема определяет стандартные правила ввода / вывода. Спасибо за уведомление :)
Emigna

1
Совет @Emigna: не делайте правила из головы;)
Эрик Outgolfer

1
@EriktheOutgolfer: Да, мне действительно нужно прекратить это делать. Особенно правила, которые делают мои программы длиннее;)
Emigna


3

J 7 байт

>.`+@.=

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

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

К счастью, равенство является операцией ранга ноль.

объяснение

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

@.на самом деле это не оператор if, но в этом случае он функционирует как единое целое (он индексирует в gerund >.`+на основе результата своего правильного аргумента и применяет его к входным данным).


Хорошая работа, я знаю, что не смогу этого сделать, даже несмотря на то, что ты переиграл мой перевод моего APL. > _ <
Захари

J действительно сияет здесь
Иона

@ Zacharý крысы, тем не менее, хорошо играли в гольф.
Коул


3

TI-Basic, 23 21 байт

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

Слишком плохие списки занимают два байта каждый ...


Вы можете сохранить два байта, запрашивая Xи Y, затем используя ʟXи ʟYдля доступа к ним, то есть " Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2".
Скотт Милнер

Кроме того, это в настоящее время недопустимо, так как L1(L1=L2)пытается получить элемент L1списка, который выдает ошибку. Чтобы исправить это, поменять порядок, то есть (L1=L2)L1.
Скотт Милнер

@ScottMilner Спасибо за указание на оба из них.
Timtech



2

Python 3 , 49 46 45 байт

3 байта удалены благодаря @ Mr.Xcoder (вместо двух аргументов) и 1 байт благодаря @ovs (карта вместо понимания списка)

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

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


1
46 байт: lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]. Оказывается, это довольно хорошо тоже :) - Жаль , что нет места для дальнейшего гольфа
Г -

@ Mr.Xcoder Спасибо! Хорошая идея!
Луис Мендо

45 байт , используя карту вместо zip.
овс

2

Common Lisp, 60 59 байт

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

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

-1 байт благодаря @ Zacharý!


59 байт: (mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read)).
Захари

Не за что, я не очень хорошо знаю lisp, я просто перевел остальные свои ответы на Lisp, который в итоге сохранил байт.
Захари

2

Питон с NumPy, 28 байт

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

Предполагается, что входные данные представлены в виде двух массивов.


Если мы используем NumPy, то вот мое худшее решение:lambda a,b:n.fmax(a,b)*((a==b)+1)
Эрих

@ Богатая идея мне нравится, но для этого мне нужно import numpy as n. Мне здесь без этого уходит, потому что это неявно во входных данных.

Полагаю, я немного шокирован явным подсчетом байтов, часто ответы на python - это просто лямбды, когда фактическая реализация ответа потребует присвоения его чему-либо. по этой причине я задаюсь вопросом, допустимо ли также избежать неявного оператора импорта?
Эрих

@Erich В общем, вы можете ссылаться на переменную, только nесли вы определили ее nв своем коде, поэтому импорт должен быть явным. По умолчанию мы разрешаем функции или полные программы в качестве ответов, включая анонимные функции.

1
Что ж, для этого нужен только ввод в виде массивов, а не импорт numpy. Но это даже работает без использования return?
Захари

2

C # (.NET Core) , используя Linq 47 + 18 = 65 байт

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

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

C # (.NET Core), 82 байта

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

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


Вы можете отбросить ответ LINQ на несколько байтов, изменив пространство имен System.LINQ на использование System.LINQ
jkelm

@jkelm Да, мне было интересно, должно ли быть включено 'using System; `или нет, наверное, нет. Я
уберу

System.Linq включен в «Интерактивный компилятор Visual C #». Я не совсем уверен в том, что возвращать Arrayпротив IListпротив IEnumerable, но если все имеют право, то вы можете получить количество байтов до 37 - tio.run/##Sy7WTS7O/…
dana


1

Swift 3, 81 79 байт

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

У Swift есть интересное свойство, заключающееся в том, что Int не может быть напрямую преобразовано в a Double, поэтому вы должны указать любые массивы как массивы Doubles, прежде чем передавать их в функцию.

(например) var k:[Double] = [1,2,3,4,5,5,7,8,9,10]

Редактировать: -2 байта благодаря @EriktheOutgolfer


Вам нужно пространство вокруг (x,y)и раньше ??
Эрик Outgolfer

@EriktheOutgolfer Требуется предыдущий, ?потому что Swift будет обрабатывать их как необязательные типы вместо троичных (а это не так). Другие нет. Кроме того, это может быть радикальным.

@EriktheOutgolfer - TheIOSCoder уже частично ответил вам, но вы правы, вам не нужны те, что в цикле for, интересно!
AnonymousReality

73 байта: func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}(неточности поплавка не должны обрабатываться по умолчанию)
г-н Xcoder

Или 74 байта:func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
г-н Xcoder



1

Ржавчина , 107 97 байт

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

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

Сохранено 8 байт благодаря @mgc


1
Я предполагаю, что вы можете сохранить 8 байтов, используя вывод типа на собранный Vecи используя maxметод 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 Спасибо! Вывод типа был хорошей идеей, но в этом случае псевдоним типа еще короче.
Jferard

1

Swift 4 , 41 байт

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

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

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!")
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.