Функция minmod - это вариант знакомой min , который появляется в схемах с высоким разрешением, ограничивающих наклон, для дифференциальных уравнений в частных производных. Учитывая количество склонов, он выбирает самый ровный склон, заботясь об относительных знаках между склонами.
Функция принимает произвольное количество параметров. Тогда minmod (x 1 , x 2 , ..., x n ) определяется как:
- min (x 1 , x 2 , ..., x n ) , если все x i строго положительны
- max (x 1 , x 2 , ..., x n ) , если все x i строго отрицательны
- 0 , иначе.
Мы будем рассматривать только целочисленные входные данные, потому что это не влияет на реализацию и должно быть более инклюзивным для некоторых (эзотерических) языков.
Напишите программу или функцию, которая принимает n целых чисел со знаком (для n> 0 ) через STDIN, ARGV или аргумент функции (вы можете использовать массив, если это более удобно, чем переменную функцию), и возвращает или печатает (в STDOUT) результат из minmod (а, б) .
Вы не должны использовать встроенные функции min или max (и, очевидно, также не использовать встроенные minmod , если вы действительно можете это найти). Кроме того, вы не должны использовать какие-либо встроенные функции сортировки, кроме как для сортировки фиксированного небольшого количества элементов (менее 5).
Если ваш язык не имеет подписанных типов, вы можете использовать неподписанный тип и интерпретировать его как дополнение к двум. Например , если ваш язык использует только беззнаковых байтов, вы можете использовать , 255
чтобы стоять за -1
и 128
стоять в течение -128
, и т.д.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
Input Output
2 2
-3 -3
0 0
3 -5 0
2 4 1 1
0 1 2 0
-1 1 2 0
-4 -2 -3 -2 -2
-5 0 -1 0
1 0 -1 0
Leaderboards
Следующий фрагмент стека генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. Поэтому, даже если ваш предпочтительный язык не позволяет вам выиграть весь вызов, почему бы не попытаться занять место во втором списке?
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=42079;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Ответы:
GolfScript,
109 байтПредполагается ввод со стандартного ввода в формате
[-4 -2 -3 -2]
При этом используется встроенная функция сортировки
$
, но каждый раз, когда она вызывается, она находится в массиве из 3 элементов, что разрешено.Онлайн демо
источник
Mathematica, 19 байт
Код и гольф благодаря Мартину Бюттнеру.
Это безымянная чистая функция, которая принимает в качестве входных данных список целых чисел. Вызвать его как
или аналогичным образом сохраняется в переменной.
Код сначала выдает ноль между каждыми двумя элементами списка ввода, который вставляет
n-1
нули междуn
элементами. Затем требуется медиана, чтобы получить ответ.Это дает минимальный мод, потому что он обрабатывает каждый случай:
Все числа положительны, и в этом случае нули находятся ниже них, а медиана является наименьшим положительным числом.
Все числа отрицательны, и в этом случае нули находятся над ними, а медиана является наименьшим отрицательным числом.
Там есть и положительное и отрицательное число, и поэтому средний элемент равен нулю.
Если Mathematica реализует свою медиану, используя алгоритм выбора линейного времени , то это также O (n).
источник
Haskell,
6261393837 байтовиспользуя магию сравнения, заимствованную из ответа @ Zgarb *, а именно
x*x<=x*y
.x*x<=x*y
верно только тогда, когдаx
иy
имеют одинаковый знак иy
абсолютное значение больше. обратите внимание , что , когдаx
это0
всегда верно.мы определяем , что
x
является результатом тогда и только тогда он содержится вs
, и что всеy
вs
x
тот же знак , какy
и меньше по абсолютной величине. если никакое значение в неs
удовлетворяет этому определению, то0
это результат.f
затем работает, ищаs
элемент, чтобы удовлетворить это, и использует0
по умолчанию.* хотя он не использовал его по причинам, по которым я его использую, и он фактически уже избавился от него
источник
JavaScript (ES6), 39 байт
источник
Python 2, 53
Идея состоит в том,
reduce
чтобы превратить min-mod finder с двумя входами вn
-input. Я придумал это независимо от других ответов, которые его используют. Только Python 2 поддерживаетreduce
.Решение с двумя входами просто находит медиану двух чисел и ноль. Смотрите мой ответ Mathematica для более прямого способа использовать медиану.
Менее гольф:
Гипотетическая амальгама Python 2 и Python 3 будет короче, с назначением, отмеченным звездочкой, из Python 3
input()
иprint
из Python 2.Старый код, без сортировки:
источник
Median
хотя.Marbelous, 210 байт
Здесь используются три доски.
|
Плата (Ab
в читаемом варианте) имеет абсолютное значение мрамора (либо возвращение переданного мрамора или ноля минус переданный мрамор, так как все арифметические операции в Marbelous беззнаковые).M
Доска (Minabs
в машиночитаемой версии) находках и выходах влево первого или второй мрамор прошел ( в зависимости от того имеет меньшую абсолютную величину), и выход , если передаются другой подписан мрамор.M
Совет также выпускает мрамор он держит вниз вместо влево после того , как последний символ из STDIN забирается.M
Плата используется в основной плате , чтобы сохранить minmod всех проверяемых значений в любой момент времени, поскольку он освобождает значение , которое будет сохранено влево, который затем отклоняется обратно.Мусорные корзины (
\/
) помещались только под синхронизаторы, которые в противном случае печатали бы в STDIN.Ввод / вывод использует STDIN / STDOUT. Оба имеют дело с 8-битными значениями (если вы хотите передать + 0x30 и + 0x38, поместите
08
в STDIN).Требуются библиотеки и цилиндрические доски. Рекомендуется просматривать выходные данные в виде десятичных чисел (обратите внимание, что здесь отображается беззнаковое значение результата minmod).
Проверьте это здесь.
Примечание: Для более понятного ввода / вывода, добавьте
Dp
по последней строке на главной плате (до:M
), замените]]
сRd
, и добавить следующее в нижней части :Это просто изменяет вывод на 3 десятичных знака. Аналогично, ввод с этими изменениями требует разделенного пробелами списка из 3 десятичных цифр на число.
Читаемая версия:
источник
Haskell,
834039 байтВероятно, это не самое короткое из возможных решений на Haskell (и, конечно, здесь оно не побьет других), но это только начало. РЕДАКТИРОВАТЬ: Теперь более чем на 50% короче! EDIT2: на один байт меньше ...
Это просто просто сложить (или уменьшить, так как некоторые языки называют) бинарным оператором
#
, который вычисляет медиануa
,b
и0
. Несмотря на то, что теперь правила позволят мне сортировать небольшие списки, это требует импорта в Haskell и приводит к большему количеству байтов ( 49 байтов, но 31 без импорта):источник
\a-> (signum a,a)
аналогичноsignum>>=(,)
использованию экземпляра монады функции. (см. мой пост в разделе «Советы по игре в гольф на хаскеле»)TIS-100,
696526 байтОжидает, что последовательность будет завершена
-999
. TIS-100 новее, чем этот вопрос, но в любом случае это не имеет значения.Узел 9 отслеживает, все ли мы положительные, все отрицательные или смешанные. Узлы 5 и 6 работают, чтобы найти минимум абсолютного значения всех входных чисел. Узел 10 затем выбирает минимум, минимум с отрицанием или 0 в зависимости от состояния узла 9.
источник
CJam, 20 байтов (или 10 байтов)
Используя подход @ xnor, уменьшите вычисление minmod из 2 чисел за раз из массива.
Это было бы 19 байт, если
:z
работалИспользование нового правила использования сортировок на коротких массивах:
что в точности соответствует ответу Питера
Предыдущие 26 байтов
Это может быть в гольфе дальше ...
Ввод (через STDIN) - это целочисленный массив, например:
и выходные данные являются minmod входного массива
Попробуй здесь
Если бы только
:g
и:z
работал, это было бы на 4 байта короче.источник
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 байта
Это Java во всей красе. Превосходит GolfScript с коэффициентом чуть более 900%.
Завернуто в классе:
Дополнено комментариями:
Примечание. Это можно улучшить с помощью Java 8.
Примечание. Усилия по улучшению в Java 8 не удалось.
источник
J,
2012 байтФункция принимает список в качестве аргумента. Украденный из Golfscript / CJam / что угодно.
Минимальное из
x
иy
является медианой (сортировка/:~
и возьмите середину1{
) в списке из трех элементов0,x,y
. Сократите список ( складывая на языке J), поместив этот minmod между смежными элементами.Используется в REPL. (J произносит его отрицательный знак
_
.)Старый мусор, до того, как я заметил, разрешены короткие сортировки:
0:`<.`>.@.(*@]*0<*))/
minmod ofx
иy
равно 0 (0:
), если 0 больше или равно произведениюx
иy
, в противном случае это min (<.
) или max (>.
) междуx
и вy
зависимости от знака , Сложите это по всему списку.источник
TI-BASIC, 19 байтов
Предполагается ввод в формате
{-2,4,3}
.Работает аналогично ответу xnor:
источник
median(augment(Ans,0ΔList(Ans
всего восемь байтов, не выполняется в списках первого измерения.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
длиннее твоего. Если бы только TI-BASIC поддерживал пустые списки ...Python 2,
8279716961 байтЭто основано на моем пит-ответе, который был вдохновлен ответом Мига .
Старый ответ:
Это очень длинный ответ.
Я чувствую, что иметь 2 переменные это пустая трата ...?Я был прав...? иш? ;писточник
KDB / Q, 43 символа для определения тела функции
Благодаря отличным идеям из предыдущих постов:
Введите один номер, используя enlist
Я уверен, что некоторые Q-гуру могут придумать более короткие.
источник
{asc[0,x,y]1}/
?Pyth,
25222012Наверное, не роман, а оригинал: P
Предварительная сортировка разрешена
Pyth
Попробуйте онлайн.
Идея использовать
reduce
и троичные операторы была бесстыдно украдена из ответа Миг , но я понятия не имею, являются ли эти алгоритмы в другом случае даже похожими, так как я не могу читать троичные операторы.Объяснение:
источник
tQ
.Q
также будет работать?
для*
...C #, 101 байт
Моя первая попытка поиграть в гольф в коде, и на довольно враждебном языке. Основано на уменьшении (
Aggregate
в LINQ) и очень похоже на ответ JavaScript от Mig . Можно запустить как(new System.Linq.M()).m(new[] {1, 2, 3})
. Проходит все тестовые случаи, но не обрабатывает пустые входные массивы.источник
J, 12 байт
Функция сокращает список (называемый раскладыванием (
/
) в J) с помощью выражения:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
где[x,y][abs(x)>abs(y)]
этоy
еслиabs(x) > abs(y)
ещеx
.Пример:
Попробуйте это онлайн здесь.
источник
Game Maker Language, 489 байтов
О Game Maker Язык
Разбрасывает массив (добавляются нули) и возвращает медиану (аналогично моему другому ответу)
источник
32000
Это максимальный размер массива , как ограничено программное обеспечение.Java,
353304124 байтаСоедините худший язык для гольф-кода с худшим в мире гольфистом, и вы получите ...
Разгоняй это и получаешь:
Это функция (если это было чертовски очевидно), которая получает массив чисел и обрабатывает его значения, возвращая значение minmod.
Моя старая помощь решения также включена, как целая программа - как всегда.
Разгоняй это и получаешь:
Получает бесконечные числа, останавливается при вводе нечислового значения, представляя значение Minmon.
источник
1 2 3
. Вы также, кажется, упускаете из виду, что вы можете написать функцию, которая обрабатывает свои аргументы, а не программу, которая читает из stdin.R, 20 символов
R обычно не подходит для Codegolf, но я использую его для своей работы, поэтому я хотел попробовать. До того, как я попробовал, я не знал, что R готов принять такой грязный синтаксис! :-) 52 символа :
Потом я посмотрел другие ответы, которые я попробовал, гениальный срединный трюк @xnor, и это здорово!
источник
summary
? Естьq[1]
иq[6]
мин и макс соответственно? В этом случае это недопустимо, потому что вы не можете использовать встроенный мин / макс.Python, 52
Я до сих пор не мог не чувствовать, что плохо иметь два
lambda
с. Эта функция принимает список, а затем возвращает одноэлементный список, содержащий результат.Надеемся, что это не приведет к огромному количеству оскорблений, если результат будет представлен в списке из одного элемента.
источник
Матлаб / Октава, 26
Это в основном просто перевод ответа Mathematica от xnor. Это работает, добавляя один ноль меньше длины входного вектора. Обратите внимание, что добавление еще одного не будет работать, так как тогда результат будет все время 0. Спасибо MartinBüttner за -4 символа этого решения =)
источник
@(x)median([0*x,x](2:end))
. Хотя кажется, что это те же байты, что и сейчас.Python,
7260 байтЭто первое решение, о котором я подумал, и оно довольно наивно. Вторая половина в основном дублирует первую половину кода, но я не был уверен, как ее уменьшить. Интересно, можно ли его сократить, используя
eval
...Редактировать: Изменил лямбда на понимание.
Попробуйте их здесь
Это только 4 символов больше, но все же стоит посмотреть, используя Sp3000 в TIP .
источник
Javascript, 63
Более читаемая версия:
источник