Вдохновленный вопросом о переполнении стека. Название здесь полностью моя вина.
Соревнование
Учитывая список натуральных чисел, содержащий как минимум две записи, замените каждое число на минимум всех записей, исключая себя.
Контрольные примеры
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
правила
Алгоритм теоретически должен работать для любого входного размера (больше единицы) и значений (натуральных чисел). Это допустимо, если программа ограничена временем, памятью или типами данных и поэтому работает только для чисел до заданного значения или для размера ввода до заданного значения.
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
Вклад может быть сделан любым разумным способом ; и с любым форматом. То же самое для вывода. Форматы ввода и вывода могут быть разными.
Самый короткий код в байтах побеждает.
источник
[4 3 2 2 5]
выводить?[4 3 2 2 5]
вывод будет[2 2 2 2 2]
(это похоже на второй контрольный пример)Ответы:
Желе ,
965 байтПопробуйте онлайн!
Проверьте все из них сразу! (слегка модифицированный)
Я почти уверен, что Деннис может обыграть это.
Как это работает
Алгоритм довольно запутанный. Давайте посмотрим, что это значит
[4,2,2,5]
.Во-первых, мы используем
J
для получения[1,2,3,4]
. Обратите внимание, что Jelly использует 1-индексирование.Затем мы видим
ṙ
. Он принимает два аргумента: массив и целое число. Он поворачивает массив влево на величину, указанную целым числом. Здесь можноṙ
было бы увидеть[4,2,2,5]
его слева и[1,2,3,4]
справа (больше о том, как это работает, можно найти в руководстве ). В Jelly команды неявно векторизуются. Следовательно, эта команда будет выполняться над каждым отдельным элементом справа, поэтому мы должны создать двумерный массив:Следовательно,
[4,2,2,5]ṙ[1,2,3,4]
становится[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, что становится:Обратите внимание, что исходные элементы находятся в последней строке, поскольку в этой строке мы повернули влево на величину, равную длине массива, поэтому мы используем
Ṗ
next для удаления этой строки, чтобы столбцы были коллекциями элементы массива, которых нет в текущем индексе:Следующая операция,
«/
также довольно запутанная. Во-первых,«
возвращает минимум двух чисел, которые он видит слева и справа. Например,5«3
возвращает3
. Теперь, если два аргумента являются массивами, то он будет векторизован, как я сказал выше. Что это значит,[1,5,2,3]«[4,1,5,2]
что станет тем,[1«4,5«1,2«5,3«2]
что есть[1,1,2,2]
. Теперь,/
этоreduce
означает, что мы делаем операцию над каждой строкой до конца. Например,[1,2,3,4]+/
стал бы((1+2)+3)+4
, который является суммой массива[1,2,3,4]
.Итак, если мы применим
«/
к только что полученному 2D-массиву, мы получим:который из-за векторизации будет эквивалентен:
который вычисляет минимум каждого массива без элемента в индексе.
источник
Python 2 , 41 байт
Попробуйте онлайн!
Для каждого элемента
x
мы проверяем, есть лиx==min(l)
. Если нет, то это такFalse
, как0
если бы он использовался как индекс спискаsorted(l)
, давая наименьший элемент. В противном случае это,True
иначе говоря1
, дает второй наименьший элемент, так как сам этот элемент наименьший и должен игнорироваться.источник
False
преобразуется в0
иTrue
преобразуется в1
действительно круто и стоит похвастаться ^ W ^ WexplainedЖеле , 5 байт
Попробуйте онлайн!
Как?
источник
Haskell ,
424139 байтРЕДАКТИРОВАТЬ:
f
берет список целых чисел (или любогоOrd
типа) и возвращает список.Попробуйте онлайн!
f
повторяется при вращении списка.x
это первый элемент списка, аy
остальные. Поскольку рекурсия бесконечна, список результатов должен быть обрезан:fst<$>zip...y
это более короткий способ сказатьtake(length y)...
.источник
@
и переворачивать списки быть Молнии:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Октава, 26 байт
Подобный подход, используемый в этом ответе , который совпадает с этим .
Я на самом деле не фанат портирования других ответов, поэтому я хотел бы отметить, что у меня была похожая идея, прежде чем я увидел другие.
Объяснение:
Джонатан Аллан уже предоставил хорошее объяснение Jelly-кода, поэтому он охватывает октавный бит и почему он работает (и не будет работать в MATLAB).
Это не работает в MATLAB, так как встроенные назначения и прямая индексация не работают.
sort(x)(1)
выдает ошибку в MATLAB, а не первый элемент в отсортированном векторе.источник
Haskell, 41 байт
Пример использования:
([]#) [4,3,2,5]
->[2,2,3,2]
. Попробуйте онлайн!Начните с пустого аккумулятора
a
и запустите список ввода. Следующим элементом в списке вывода является минимум аккумулятораa
и все, кроме первого элемента списка ввода (->c
), за которым следует рекурсивный вызов с первым элементом,b
добавленным в аккумулятор иc
. Остановитесь, когда достигнете конца списка ввода.источник
JavaScript (ES6),
5046 байтРедактировать: 4 байта сохранены благодаря @Arnauld.
источник
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
для 43 байтов.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
для 46.Брахилог ,
1312 байтПопробуйте онлайн!
Сохранено один байт благодаря @ ais523.
объяснение
Мы используем тот факт, что
⊇
объединяет подмножества от самых больших до самых маленьких. Например , для[1,2,3]
, подмножества , которые мы получаем в следующем порядке:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Мы можем видеть, что подмножества
[1,2], [1,3], [2,3]
- это те, от которых мы хотим получить минимум, но в обратном порядке по сравнению со списком ввода (отсюда и↔
). Мы можем выбрать эти подмножества только найдя первыеlength(Input) + 1
подмножества, которые будут содержать все из них + весь список в первую очередь. Мы отбрасываем весь этот список сb
.источник
На самом деле , 13 байтов
Использует ту же технику, что и xnor .
Попробуйте онлайн!
Объяснение:
источник
R,
4631 байтреализует решение Stewie Griffin в R, увы, моя оригинальная идея на 50% длиннее! все еще читает список из стандартного ввода, но теперь возвращает гораздо более читаемый числовой вектор.
Попробуйте онлайн!
старая реализация:
читает в списке со стандартного ввода. Отрицательный индекс
l[-x]
исключает элемент из списка иmatch(l,l)
возвращает индекс первого вхождения каждого элемента списка. Возвращает список.источник
Python 2, 51 байт
Я знаю, что уже есть лучшее решение Python, но я все еще хочу опубликовать мое.
Попробуйте онлайн
источник
Mathematica 34 байта
источник
PowerShell ,
6859 байтПопробуйте онлайн!
Я довольно уверен, что это может быть сокращено, я буду продолжать смотреть на это
источник
C 85 байт
Первый аргумент - это входной целочисленный массив. Второй аргумент - это выходной целочисленный массив. Третий аргумент - это количество элементов для обоих массивов.
Посмотрите, как это работает онлайн .
источник
Perl 6 ,
26 2419 байт26
Обратите внимание, что это
∖
U + 2216, а не\
U + 5CПопытайся
Попытайся
24
Попытайся
19
Попытайся
26
Я использовал "причудливые" операторы Юникода а не эквиваленты ascii, потому что им потребовался бы пробел перед ними, чтобы они не анализировались как часть
.Bag
вызова метода.24
19
(24- и 19-байтовые гольфы были вдохновлены реализацией Jelly )
источник
Clojure,
36816271 байтНовейшие (не следует отправлять их на скорую руку):
Попробуйте онлайн .
Кроме того, у этого есть ошибка (62 байта), zipmap создает неупорядоченную карту, поэтому это не даст правильную последовательность на больших входах.
v
на самом деле не используется ни для чего, но это короче, чемi (keys c)
.Предыдущая на 81 байт:
Попробуйте онлайн .
Попробуйте онлайн .
О черт, оригинал (36 байт) не работает, когда минимальное число повторяется, в
[4 2 2 5]
результате[2 4 4 2]
оба2
s удаляются :(#{i}
это набор, который содержит толькоi
, он возвращает truei
и false для других, что означает, что минимум вычисляется из всех других чисел в списке ввода.Попробуйте онлайн .
источник
Pyth,
87 байтов-1 байт благодаря @isaacg
Попытайся!
источник
d
в конце - это неявно заполнено.PHP, 72 байта
Онлайн версия
источник
PHP, 47 байт
источник
Скала, 37 байт
l
это любая коллекция Int.Тестовые случаи:
Это, вероятно, все еще может быть в гольфе, я не мог найти более короткий способ удалить элемент из списка, чем
l diff Seq(l(i))
источник
C #, 36 байт
Принимает элементы (i) и ищет в элементах без текущего элемента минимальное значение.
Грустно, что некоторые другие попытки не работают, так как мы работаем с примитивными типами, и поэтому не имеем списков со ссылками для сравнения элементов.
источник
PowerShell ,
4938 байт-11 байт благодаря маззи
Попробуйте онлайн!
Улучшение прекрасного ответа Синусоиды . Сохраняет 10 байтов, используя явный вывод вместо построения массива. Индексирует в отсортированном массиве либо точку 0 (т. Е. Наименьшее значение), либо точку 1, если условие истинно.
источник
Perl 5, 43 байта
Эквивалент решения Python. К
sort
сожалению, в Perl неверное значение по умолчанию для чисел (требующее явного компаратора), иmin
оно не является встроенным, но почти компенсирует это тем,sub
что оно корочеlambda
,map$_,
корочеx for x in
и неявностью списков return и args.источник
Рубин, 30 байтов
Для каждого элемента отсортируйте массив, удалите текущий элемент и возьмите первый элемент оставшегося массива.
Это анонимная функция, которую можно использовать так:
источник
CJam, 15 байтов
По сути это перевод алгоритма xnor на CJam.
Это безымянный блок, который берет массив из стека и оставляет результат в стеке.
Объяснение:
источник
05AB1E , 5 байтов
Порт ответа @xnor 's Python 2 .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Java 8, 119 байт
Порт @xnor 's Python 2 ответа .
Изменяет массив ввода вместо того, чтобы возвращать новый для сохранения байтов.
Попробуйте онлайн.
Объяснение:
источник
APL (Dyalog Extended) , 7 байтов
Порт xnor Python 2 ответ. Требуется
⎕IO←0
:Попробуйте онлайн!
Объяснение:
источник
Haskell , 76 байт
Это значительно дольше, чем в предыдущих записях на Haskell, но это первое, которое выполняет только линейное число сравнений и линейный объем дополнительной работы.
Попробуйте онлайн!
объяснение
!
принимает два аргумента: текущий минимум и непустой список. Возвращает минимальное значение в списке и результат обработки данного списка с использованием текущего минимума.источник
MathGolf ,
97 байтПопробуйте онлайн!
объяснение
В основном это порт ответа Кевина Круйссена на 05AB1E, но я теряю 2 байта из-за необходимости делать что-то явно.
источник