Это вдохновлено реальной проблемой, с которой я столкнулся. Мне любопытно посмотреть, есть ли какой-нибудь умный способ пойти по этому поводу.
Вам даны два несортированных массива, A и B, каждый из которых содержит произвольное число с плавающей точкой. A и B не обязательно имеют одинаковую длину. Напишите функцию, которая последовательно принимает элементы A и находит ближайшее значение в массиве B. Результат должен содержаться в новом массиве.
Условие выигрыша
Самый короткий код выигрывает (как обычно).
Ответы:
APL, 13
17(21 байт в UTF-8)
Если вы хотите истинную лямбду (A как левый аргумент и B как правый):
Как это работает:
{...}¨A
вызывает лямбда-функцию{...}
с каждым значением A (вместо вызова с A в качестве массива), собирая результаты в массив одинаковой формы|⍵-B
вычисляет абсолютные значения разности между аргументом ⍵ и всем в B (- вычитание, | - абс).↑⍋
принимает индекс наименьшего элемента (array сортирует массив, возвращая индексы, ↑ получает первый элемент)B[...]
просто выбирает элемент (ы) по индексу (ам).Решение довольно простое, хотя оно использует замечательную особенность функции сортировки APL, возвращающей вектор перестановки (индексы отсортированного элемента в исходном массиве), а не сам отсортированный массив.
источник
Математика - 17
Как это работает? Да, я признаю, что здесь есть немного обмана, потому что Mathematica имеет встроенную ближайшую функциональность. Все остальное просто и связано с размещением результата в одномерном массиве. Это выглядит некрасиво только из-за дополнительных усилий, чтобы сделать его коротким.
источник
C # -
1039787 байтЯ не совсем уверен, правильно ли я понял этот вопрос, но в любом случае вот мое решение.
Я использовал списки вместо массивов, потому что это позволяет мне писать более короткий код.Целочисленный массив короче целочисленного списка.
Входные данные:
Метод:
Выход:
Если мой ответ неверный, оставьте комментарий под ним.
РЕДАКТИРОВАТЬ: Как @grax указал, теперь вопрос о плавает. Поэтому я бы тоже хотел включить его ответ.
95 байт (ответ Гракс)
источник
item
вi
и вы сохраните 6 дополнительных символов;)float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 символ
Объяснение:
outer(A,B,`-`)
вычисляет для каждого элемента x разности Ax-B
и выводит результат в виде матрицы (размерной длины (A) x длины (B)).which.min
выбирает индекс минимального числа.apply(x, 1, f)
применяет функциюf
к каждой строке матрицыx
.Так
apply(abs(outer(A,B,`-`)),1,which.min)
возвращает индексы минимальной абсолютной разности между каждым элементом A и элементами вектора B.Использование:
источник
CJam - 14
Основной код находится на второй строке, остальное для использования стандартного ввода и красивого вывода.
Попробуйте это на http://cjam.aditsu.net/
Объяснение:
q~
считывает и оценивает входные данныеf{...}
выполняет блок для каждого элемента первого массива и следующего объекта (который является вторым массивом), собирая результаты в массив{...}$
сортирует второй массив с использованием блока для вычисления ключа для каждого элемента1$
копирует текущий элемент из первого массива-z
вычитает, затем принимает абсолютное значение,0=
принимает первое значение отсортированного массива (значение с минимальным ключом)\;
отбрасывает элемент из первого массива,p
печатает строковое представление результатаПримеры (вдохновленные другими ответами):
Вход:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Выход:
[10 12 12 14 10]
Вход:
[0 25 10 38] [3 22 15 49 2]
Выход:
[2 22 15 49]
источник
Javascript (E6) 54
56 59Минимизируйте расстояние. Используя квадрат вместо пресса, просто сохраните символы.
Редактировать алгебру ...
Редактировать исправление бесполезного назначения (остаток теста без определения функции)
Было
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Тестовое задание
Результат:
[10, 12, 12, 14, 10]
источник
D=
не требуется, так какmap
возвращает новый массив. Альтернативная (той же длины) функция сортировки:(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 символов
a
иb
являются входными массивами, а требуемый массив является результатом выражения.источник
Хаскелл, 55
Сначала я подумал об использовании
minimumBy
иcomparing
, но поскольку их нет в Prelude, потребовалось множество символов, чтобы их квалифицировать. Также украли идею возведения в квадрат из некоторых других ответов, чтобы сбрить персонажа.источник
PowerShell - 44
пример
С
$a
и$b
установите:Выход
источник
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Руби, 40
То же, что и в ответе на Python, но возведение в квадрат немного сложнее, чем любой другой способ получить абсолютное значение.
источник
Pyth -
1211 байтПримечание: Pyth намного моложе, чем этот вызов, поэтому этот ответ не имеет права на победу.
Простой метод, использует
o
функцию заказа, чтобы получить минимальное расстояние иm
установить его над спискомa
.Попробуйте это онлайн здесь .
источник
TI-BASIC, 24
Не приближается к APL, но использует менее мощные функции - здесь не используются функции «отсортировано по» или «индекс наименьшего». Недостатком TI-BASIC здесь является отсутствие этих функций и многомерных массивов.
Ungolfed:
Функция min (имеет два поведения: при использовании с действительными числами или списками она дает наименьшее значение; однако при использовании с комплексными числами или списками она дает значение с наименьшим абсолютным значением. Добавление
0i
или умножение наi^2
заставляет интерпретатор используйте второе поведение, поэтомуmin(1,-2)
возвращает,-2
тогда какmin(1+0i,-2+0i)
возвращает1
.источник
Фортран 90: 88
Это требует, чтобы это было
contain
отредактировано в пределах полной программы:Квадратные скобки объявляют массив, в то время как
(...,i=)
представляет подразумеваемыйdo
цикл; Затем я возвращаю значение,b
для которого элементa(i)-b
свернут.источник
Матлаб: 48
Предполагается, что
A
иB
являются одномерными матрицами в рабочей области. Окончательный результат находитсяC
в рабочей области. Это, вероятно, также будет работать в Октаве. Условное индексирование делает это довольно тривиальным.источник
С 144
163Хорошо ... Я думаю, что этот маленький код нуждается в объяснении.
Сначала я попытался выполнить работу с двумя уровнями цикла for, чтобы найти минимальную разницу, и установил текущее значение как минимум значения B. Это очень просто.
То же самое можно сделать с помощью функции qsort и функции сравнения. Я делаю это сортировать B по разнице вместо элементов B. Слишком много функций для такого маленького алгоритма. Таким образом, функция q теперь служит двум целям. Во-первых, это сам алгоритм, во-вторых (когда его вызывает qsort) компаратор. Для связи между двумя государствами я должен был объявить глобальные.
m обозначает, находится ли он в состоянии компаратора или в основном .
пример:
источник
GolfScript, 49 байт
Примечание: это частичное решение. Я работаю над тем, чтобы сделать это комплексное решение
Да. GolfScript поддерживает плавающую точку. Попробуйте это здесь . Пример:
Выход:
источник
C # 262
Программа находит минимальные различия и сохраняет наиболее близкие значения от массива B. Я скоро поработаю над игрой в гольф.
Полная программа с тестовым кодом
источник
C #: 120
Линк потрясающий:
источник