Вам будет дано два массива чисел с плавающей точкой. Ваша задача состоит в том, чтобы соединить соответствующие элементы двух массивов и получить максимум для каждой пары. Однако , если два соответствующих элемента равны, вы должны взять их сумму вместо.
Например, учитывая списки [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]
Ответы:
Желе, 4 байта
Попробуйте онлайн!
При этом используется тот же подход, что и в моем ответе на APL , за исключением того, что у Jelly есть встроенная функция для добавления одного к номеру!
источник
Котлин,
787571666559 байтЭто моя первая попытка, будь крут: D
TIO не работает с этим решением (и я не знаю почему), исходный код для тестирования ниже
РЕДАКТИРОВАТЬ:
-3 заменить "a + b [i]" на "a * 2"
-4 путем замены метода «mapIndexed» на «zip» (благодаря решению @AnonymousReality Swift)
-5 путем замены метода "Math.max" на условие
-1 при изменении условия заказа
-6 изменением toFloatArray () на toList ()
источник
Python 2 , 45 байт
Смесь моего первоначального решения и @ovs ' .
Попробуйте онлайн!
Python 2 , 49 байт
Попробуйте онлайн!
Python 2 , 46 байт
@ovs предложил этот метод для экономии 3 байтов.
Попробуйте онлайн!
Как?
Во- первых, мы пару соответствующих элементов, либо с помощью
*
или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)
JavaScript (ES6),
53494543 байтаПопытайся
объяснение
Анонимная функция, принимающая 2 массива в качестве аргументов через параметры
a
иb
в синтаксисе каррирования (то есть вызов сf(a)(b)
Сопоставьте первый массив, передавая каждый элемент через функцию, в которой
x
находится текущий элемент иy
текущий индекс.Получите элемент по индексу
y
во втором массиве и присвойте ему новое значениеy
.Проверьте,
y
больше ли,x
и если да, вернитеy
.Иначе, проверьте, если
y
меньше чемx
и, если так, возвратитеx
Иначе верните сумму
x
иy
. (Умножениеx
илиy
на 2 также будет работать здесь для того же количества байтов.)источник
j.value.split`,`.map(eval)
илиeval('['+j.value+']')
? Иx+y
выглядел бы аккуратнее ИМХО..map(eval)
их. 2) Согласился, отредактирую на мгновениеHaskell, 34 байта
Попробуйте онлайн.
источник
x!y=max x y+sum[x|x==y]
.R ,
3129 байтpmax
берет параллельный максимум двух (или более) массивов (рециркулируя более короткий по мере необходимости).Я смотрел на комментарий Луиса Мендо и, очевидно, понял, что этот подход может сработать и для R. Это заставило меня до 30 байт, но потом я начал играть с различными способами получения индексов вместо того, чтобы улучшить мой первоначальный ответ, и наткнулся ,
!a-b
как ,TRUE
гдеa==b
и вFALSE
противном случае, что эквивалентноa==b
. Однако, по какой-то причине, R не требует круглых скобок,!a-b
как это былоa==b
, что позволило мне сэкономить два байта.Как упомянуто JDL в комментариях , это работает, потому что
!
(отрицание) имеет более низкий приоритет, чем бинарный оператор-
в R, что странно.Попробуйте онлайн! (новая версия)
Попробуйте онлайн! (Оригинал)
источник
:
при взаимодействии с арифметикой.Python 3 ,
484644 байта-2 байта благодаря @nwellnhof
Попробуйте онлайн!
источник
Дьялог АПЛ, 5 байт
Попробуйте онлайн!
Как?
⌈
поэлементный максимум аргументов×
поэлементное умножение1+=
1 добавлено к поэлементному равенству аргументовЭто работает, потому что, если числа неравны,
1+=
будет1
, который при умножении на максимум является максимумом. Когда числа равны,1+=
вернется2
, когда это умножится на максимум, мы получим вдвое больше максимума, или максимум, добавленный к себе.источник
Желе , 6 байт
Двоичная ссылка, берущая список чисел с каждой стороны и возвращающая итоговый список.
Попробуйте онлайн! или посмотрите набор тестов *.
Как?
Альтернативой является эта монадическая ссылка , содержащая список из двух списков, также по 6 байтов :
* Я не думаю, что когда-либо создавал нижний колонтитул тестового набора, почти в три раза превышающий счетчик кода!
источник
»
векторизация раньше!max([1,1,0],[1,0,3]) -> [1,1,0]
(нет[1,1,3]
).05AB1E , 5 байтов
Попробуйте онлайн!
-1 спасибо Эмигне .
источник
γ
!{γθ
, вероятно, самый короткий, который я могу получить для этого.øεMÃO
?MÃ
) яй получил ведущую роль в настоящее время: р кстатиøεZÃO
будет работать тожеMATL , 7 байт
Ввод представляет собой матрицу из двух строк, где каждая строка является одним из массивов.
Попробуйте онлайн!
объяснение
источник
Java 8,
80696766656463 байтаВместо этого изменяет второй массив ввода или возвращает новый массив float для сохранения байтов.
-11 байт, принимая длину в качестве дополнительного целочисленного ввода, что разрешено в соответствии с правилами вызова.
-5 байт благодаря @ OliverGrégoire (по одному байту за раз .. xD)
-1 байт косвенно благодаря ответу @Shaggy 's JS с использованием
a[l]*2
вместоa[l]+b[l]
.Объяснение:
Попробуй это здесь.
источник
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
инициализации.(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}
(63 байта)Pyth , 11 байт
Попробуй это здесь!
Pyth , 12 байт
Попробуй это здесь!
или
Попробуй это здесь!
источник
05AB1E ,
987 байтСохраненный байт, как Эрик Outgolfer указал, что список списков является допустимым вводом.
Попробуйте онлайн!
объяснение
источник
‚
и введя в качестве пары список и список.Mathematica, 31 байт
источник
J 7 байт
Попробуйте онлайн!
Принимает один список в качестве левого аргумента, а другой - в качестве правого.
К счастью, равенство является операцией ранга ноль.
объяснение
@.
на самом деле это не оператор if, но в этом случае он функционирует как единое целое (он индексирует в gerund>.`+
на основе результата своего правильного аргумента и применяет его к входным данным).источник
Рубин , 42 байта
Попробуйте онлайн!
Оператор космического корабля великолепен.
источник
TI-Basic,
2321 байтСлишком плохие списки занимают два байта каждый ...
источник
X
иY
, затем используяʟX
иʟY
для доступа к ним, то есть "Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2
".L1(L1=L2)
пытается получить элементL1
списка, который выдает ошибку. Чтобы исправить это, поменять порядок, то есть(L1=L2)L1
.Октава, 36 байт
источник
@(a,b)max(a,b).*(1+(a==b))
@(a,b)a.*(a>=b)+b.*(b>=a)
Pyth, 7 байт
Попробуй это здесь.
источник
Python 3 ,
494645 байт3 байта удалены благодаря @ Mr.Xcoder (вместо двух аргументов) и 1 байт благодаря @ovs (карта вместо понимания списка)
Попробуйте онлайн!
источник
lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]
. Оказывается, это довольно хорошо тоже :) - Жаль , что нет места для дальнейшего гольфаCommon Lisp,
6059 байтПопробуйте онлайн!
-1 байт благодаря @ Zacharý!
источник
(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))
.Питон с NumPy, 28 байт
Предполагается, что входные данные представлены в виде двух массивов.
источник
lambda a,b:n.fmax(a,b)*((a==b)+1)
import numpy as n
. Мне здесь без этого уходит, потому что это неявно во входных данных.n
если вы определили ееn
в своем коде, поэтому импорт должен быть явным. По умолчанию мы разрешаем функции или полные программы в качестве ответов, включая анонимные функции.numpy
. Но это даже работает без использованияreturn
?C # (.NET Core) , используя Linq 47 + 18 = 65 байт
Попробуйте онлайн!
C # (.NET Core), 82 байта
Попробуйте онлайн!
источник
Array
противIList
противIEnumerable
, но если все имеют право, то вы можете получить количество байтов до 37 - tio.run/##Sy7WTS7O/…Perl 6 ,
3428 байтПопробуйте онлайн!
источник
Swift 3,
8179 байтУ Swift есть интересное свойство, заключающееся в том, что Int не может быть напрямую преобразовано в a
Double
, поэтому вы должны указать любые массивы как массивыDouble
s, прежде чем передавать их в функцию.(например)
var k:[Double] = [1,2,3,4,5,5,7,8,9,10]
Редактировать: -2 байта благодаря @EriktheOutgolfer
источник
(x,y)
и раньше?
??
потому что Swift будет обрабатывать их как необязательные типы вместо троичных (а это не так). Другие нет. Кроме того, это может быть радикальным.func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}
(неточности поплавка не должны обрабатываться по умолчанию)func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
C,
7675 байтовСпасибо @Kevin Cruijssen за сохранение байта!
Попробуйте онлайн!
источник
Japt , 13 байт
Попробуйте онлайн! с
-Q
флагом для форматирования выходного массива.источник
í
может взять функцию в качестве второго аргумента.Ржавчина ,
10797 байтПопробуйте онлайн!
Сохранено 8 байт благодаря @mgc
источник
Vec
и используяmax
методf32
s:|a:Vec<f32>,b:Vec<f32>|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<Vec<_>>();
Swift 4 , 41 байт
Тестовые случаи:
источник