Кратчайшая функция Minmod


24

Функция 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


1
Может быть, добавить столбец, сколько ответов есть на каждом языке
гордый haskeller

1
@proudhaskeller Хм, мне нравится, что две таблицы в настоящее время помещаются рядом друг с другом, не открывая весь экран фрагмента - я думаю, что было бы немного переполнено, если бы я добавил другой столбец. Если ваш комментарий получит значительно больше голосов, чем мой, я посмотрю, что я могу сделать. ;)
Мартин Эндер

1
@ Оптимизатор Я решил, что предыдущая версия правил наносила больше вреда творчеству ответов людей, чем я предполагал. Кроме того, я собирался назначить награду за ответ, который был ведущим до изменения правила, так что я не думаю, что какой-либо вред с точки зрения повторения также причинен. (Да, я согласен с тем, что изменение правил не очень хорошая идея, но я подумал, что в этом случае оно того стоит.)
Мартин Эндер,

1
@ MartinBüttner - я не вижу творчества в новых ответах сейчас. Все сводится к сокращению до парного минимума. Творчество заключалось в ответах xnor или в подходе Mig, на который влияют многие другие ответы.
Оптимизатор

2
@ Оптимизатор, не всегда возможно сказать, является ли новый ответ точно таким же креативным, как и старый, с которым он похож, или это не портит воображение.
Питер Тейлор

Ответы:


13

GolfScript, 10 9 байт

~{0]$1=}*

Предполагается ввод со стандартного ввода в формате [-4 -2 -3 -2]

При этом используется встроенная функция сортировки $, но каждый раз, когда она вызывается, она находится в массиве из 3 элементов, что разрешено.

Онлайн демо


Круто, наши ответы с интервалом менее 1 секунды, что означает, что мой ответ был самым коротким. ;)
Timtech

1
+1, это намного короче и умнее моего решения. (Ps. В случае, если кто-то сомневается в этом, да, это решение является правильным, и это довольно легко доказать по индукции. Код Питера многократно вычисляет медиану предыдущего значения minmod, следующего входного значения и ноль; проверка возможные случаи показывают, что это действительно дает новое значение minmod.)
Ilmari Karonen

Что за ... ну, всегда есть много вещей, на которые
стоит

24

Mathematica, 19 байт

Median[#~Riffle~0]&

Код и гольф благодаря Мартину Бюттнеру.

Это безымянная чистая функция, которая принимает в качестве входных данных список целых чисел. Вызвать его как

Median[#~Riffle~0]&[{-2, -3, -2, -4}]

или аналогичным образом сохраняется в переменной.

Код сначала выдает ноль между каждыми двумя элементами списка ввода, который вставляет n-1нули между nэлементами. Затем требуется медиана, чтобы получить ответ.

Это дает минимальный мод, потому что он обрабатывает каждый случай:

  1. Все числа положительны, и в этом случае нули находятся ниже них, а медиана является наименьшим положительным числом.

  2. Все числа отрицательны, и в этом случае нули находятся над ними, а медиана является наименьшим отрицательным числом.

  3. Там есть и положительное и отрицательное число, и поэтому средний элемент равен нулю.

Если Mathematica реализует свою медиану, используя алгоритм выбора линейного времени , то это также O (n).


11

Haskell, 62 61 39 38 37 байтов

f s=last[x|x<-0:s,and[x*x<=x*y|y<-s]]

используя магию сравнения, заимствованную из ответа @ 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по умолчанию.

* хотя он не использовал его по причинам, по которым я его использую, и он фактически уже избавился от него


Редко для Haskell быть таким пригодным для игры в гольф (и, по иронии судьбы, все еще читаемым). Любить это.
Исия Медоуз

10

JavaScript (ES6), 39 байт

a=>a.reduce((p,c)=>p*c>0?p*p>c*c?c:p:0)

1
Люблю это. Хорошее использование ES6.
Qix

6

Python 2, 53

lambda l:reduce(lambda a,b:sorted([a,b,0])[1],l,l[0])

Идея состоит в том, reduceчтобы превратить min-mod finder с двумя входами в n-input. Я придумал это независимо от других ответов, которые его используют. Только Python 2 поддерживает reduce.

Решение с двумя входами просто находит медиану двух чисел и ноль. Смотрите мой ответ Mathematica для более прямого способа использовать медиану.

Менее гольф:

def f(l):
 A=l[0]
 for x in l:A=sorted([a,b,0])[1]
 return A

Гипотетическая амальгама Python 2 и Python 3 будет короче, с назначением, отмеченным звездочкой, из Python 3 input()и printиз Python 2.

#Not real code!
A,*l=input()
for x in l:A=sorted([A,x,0])[1]
print A

Старый код, без сортировки:

lambda l:reduce(lambda a,b:[a,b][a*a>b*b]*(a*b>0),l,l[0])

Хм, да, я заметил этот побочный эффект тем временем, но я чувствую, что уже слишком поздно, чтобы исправить это. Mathematica имеет встроенную, Medianхотя.
Мартин Эндер

Ваш последний подход теперь также действителен.
Мартин Эндер

6

Marbelous, 210 байт

@0
00
]]\\&002
/\..//&0@0
00..02
MMMMMM//\\
:M
}0}1}0}1}0}1}0}2..}2
^7^7||||&0&1&4<3&0=2{>
EqalLteq{0{<{<<2&1--
&2..&3..}100..&2\/{>
>0&6=0&4&5&6..\/
&3..&5\/{<{0
\/..\/
:|
}000}0
&0Subt
{0&1
}0{0
^7
=0&1
&0
\/

Здесь используются три доски.

|Плата ( Abв читаемом варианте) имеет абсолютное значение мрамора (либо возвращение переданного мрамора или ноля минус переданный мрамор, так как все арифметические операции в Marbelous беззнаковые).

MДоска ( Minabsв машиночитаемой версии) находках и выходах влево первого или второй мрамор прошел ( в зависимости от того имеет меньшую абсолютную величину), и выход , если передаются другой подписан мрамор.

MСовет также выпускает мрамор он держит вниз вместо влево после того , как последний символ из STDIN забирается.

MПлата используется в основной плате , чтобы сохранить minmod всех проверяемых значений в любой момент времени, поскольку он освобождает значение , которое будет сохранено влево, который затем отклоняется обратно.

Мусорные корзины ( \/) помещались только под синхронизаторы, которые в противном случае печатали бы в STDIN.

Ввод / вывод использует STDIN / STDOUT. Оба имеют дело с 8-битными значениями (если вы хотите передать + 0x30 и + 0x38, поместите 08в STDIN).

Требуются библиотеки и цилиндрические доски. Рекомендуется просматривать выходные данные в виде десятичных чисел (обратите внимание, что здесь отображается беззнаковое значение результата minmod).

Проверьте это здесь.

Примечание: Для более понятного ввода / вывода, добавьте Dpпо последней строке на главной плате (до :M), замените ]]с Rd, и добавить следующее в нижней части :

:Rd
}0}0}0
]]]]]]{>
-O-O-O
-O-O-O
*A
Plus
\\*A
..Plus
..{0
:*A
}0}0
<<<<
<<
<<
Plus
{0

Это просто изменяет вывод на 3 десятичных знака. Аналогично, ввод с этими изменениями требует разделенного пробелами списка из 3 десятичных цифр на число.

Читаемая версия:

Изображение доски


5

Haskell, 83 40 39 байт

Вероятно, это не самое короткое из возможных решений на Haskell (и, конечно, здесь оно не побьет других), но это только начало. РЕДАКТИРОВАТЬ: Теперь более чем на 50% короче! EDIT2: на один байт меньше ...

a#b|a*b<0=0|a*a<b*b=a|1<2=b
m=foldr1(#)

Это просто просто сложить (или уменьшить, так как некоторые языки называют) бинарным оператором #, который вычисляет медиану a, bи 0. Несмотря на то, что теперь правила позволят мне сортировать небольшие списки, это требует импорта в Haskell и приводит к большему количеству байтов ( 49 байтов, но 31 без импорта):

import Data.List
a#b=sort[a,b,0]!!1
m=foldr1(#)

\a-> (signum a,a)аналогично signum>>=(,)использованию экземпляра монады функции. (см. мой пост в разделе «Советы по игре в гольф на хаскеле»)
гордый Хаскеллер

Спасибо за совет, но сейчас спорный. :)
Zgarb

@ Згарб А, ладно.
Оптимизатор

5

TIS-100, 696 526 байт

@1
MOV UP ACC
SAV
ADD 999
JEZ A
SWP
MOV 1 ANY
MOV ACC ANY
JRO -7
A:MOV 12 ANY
@5
S:JRO UP
MOV UP ACC
JLZ A
JEZ B
MOV 1 DOWN
JMP B
A:MOV 7 DOWN
NEG
B:MOV 1 RIGHT
MOV ACC RIGHT
MOV ACC RIGHT
JMP S
MOV 14 DOWN
MOV 9 RIGHT
@6
MOV 999 ACC
L:JRO LEFT
SAV
SUB ANY
JGZ A
MOV ANY NIL
SWP
JMP L
A:MOV ANY ACC
JMP L
MOV ACC ANY
@9
S:JRO UP
JEZ A
SUB 1
JEZ A
JMP X
A:MOV 1 ACC
JMP S
JEZ B
SUB 2
JEZ B
X:MOV 6 ACC
JMP S
B:MOV 2 ACC
JMP S
MOV ACC ANY
@10
MOV LEFT ACC
ADD 1
JRO ACC
JRO 6
MOV UP ANY
MOV UP ACC
NEG
MOV ACC ANY
!NOP
MOV 0 ANY

Ожидает, что последовательность будет завершена -999. TIS-100 новее, чем этот вопрос, но в любом случае это не имеет значения.

Узел 9 отслеживает, все ли мы положительные, все отрицательные или смешанные. Узлы 5 и 6 работают, чтобы найти минимум абсолютного значения всех входных чисел. Узел 10 затем выбирает минимум, минимум с отрицанием или 0 в зависимости от состояния узла 9.

введите описание изображения здесь


Я реализовал эмулятор TIS для TIO, так что теперь вы можете попробовать его онлайн!
Phlarx

4

CJam, 20 байтов (или 10 байтов)

q~{]__~z\z<=\~*0>*}*

Используя подход @ xnor, уменьшите вычисление minmod из 2 чисел за раз из массива.

Это было бы 19 байт, если :zработал


Использование нового правила использования сортировок на коротких массивах:

q~{0]$1=}*

что в точности соответствует ответу Питера


Предыдущие 26 байтов

q~_{g}%_|:+\(z\{za+_~>=}/*

Это может быть в гольфе дальше ...

Ввод (через STDIN) - это целочисленный массив, например:

[-4 -2 -3 -2]

и выходные данные являются minmod входного массива

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

Если бы только :gи :zработал, это было бы на 4 байта короче.


25 байт: q~_{g}%_|:+\{z\za+_~>=}**.
jimmy23013

Сбой для единственного массива int. Я тоже это попробовал :)
Оптимизатор

Хотя там есть 26-байтовое решение. Спасибо за это :)
Оптимизатор

4

Java, 84 байта

Это Java во всей красе. Превосходит GolfScript с коэффициентом чуть более 900%.

int f(int[]a){int b=a[0],c;for(int d:a)b=(c=d<0?-1:1)*b<0?0:d*c<b*c?d:b;return b;}

Завернуто в классе:

public class MinModGolfed{

    public static void main(String[] args){
        int[] numbers = new int[args.length];
        for (int i = 0; i < args.length; i++){
            numbers[i] = Integer.parseInt(args[i]);
        }
        System.out.println(new MinModGolfed().f(numbers));
    }

    int f(int[]a){int b=a[0],c;for(int d:a)b=(c=d<0?-1:1)*b<0?0:d*c<b*c?d:b;return b;}

}

Дополнено комментариями:

public class MinModExpandedGolfed{

    public static void main(String[] args){
        int[] numbers = new int[args.length];
        for (int i = 0; i < args.length; i++){
            numbers[i] = Integer.parseInt(args[i]);
        }
        System.out.println(new MinModExpandedGolfed().f(numbers));
    }

    int f(int[]a){                  //a is the input numbers
        int b=a[0],c;             //b is the best number found so far.
        for(int d:a)               //Iterate over a with current element as d.
            b=(c=d<0?-1:1)         //c is equal to the sign of d.
                    *b<0?
                        0:          //If b has opposite sign of d, b = 0.
                        d*c<b*c?d:b;//If the absolute value of d is less than b, b = d. 
        return b;
    }

}

Примечание. Это можно улучшить с помощью Java 8.

Примечание. Усилия по улучшению в Java 8 не удалось.


Мне еще многому нужно научиться. +1.
Родольфо Диас

4

J, 20 12 байт

Функция принимает список в качестве аргумента. Украденный из Golfscript / CJam / что угодно.

(1{0/:~@,,)/

Минимальное из xи yявляется медианой (сортировка /:~и возьмите середину 1{) в списке из трех элементов 0,x,y. Сократите список ( складывая на языке J), поместив этот minmod между смежными элементами.

Используется в REPL. (J произносит его отрицательный знак _.)

   (1{0/:~@,,)/ _4 _2 _3 _2
_2
   f =: (1{0/:~@,,)/    NB. give it a name
   f 1 1 2
1
   f 0 1 2
0
   f _1 1 2
0

Старый мусор, до того, как я заметил, разрешены короткие сортировки: 0:`<.`>.@.(*@]*0<*))/minmod of xи yравно 0 ( 0:), если 0 больше или равно произведению xи y, в противном случае это min ( <.) или max ( >.) между xи в yзависимости от знака , Сложите это по всему списку.


4

TI-BASIC, 19 байтов

Предполагается ввод в формате {-2,4,3}.

Работает аналогично ответу xnor:

Input L₁              get user input into the L1 array
dim(L₁)2-1→dim(L₁     get the length of the array; multiply by 2 and subtract 1
                      make this the new length (new elements always default to 0)
median(L₁             calculate and return (since it's the last line) median of new array

3
Интересный способ подсчета размера кода ...
Ypnypn


Мой код, равно как и median(augment(Ans,0ΔList(Ansвсего восемь байтов, не выполняется в списках первого измерения. If variance(Ans:augment(Ans,0ΔList(Ans:median(Ansдлиннее твоего. Если бы только TI-BASIC поддерживал пустые списки ...
lirtosiast

Вы правы. Похоже, это увеличивает размер моего кода от 12 до 15 байт.
Timtech

Я полагаю, вы правы. +4 байта там.
Timtech

3

Python 2, 82 79 71 69 61 байт

lambda l:reduce(lambda G,H:[H,G][(G>H)^(G>0)]*(G*H>0),l,l[0])

Это основано на моем пит-ответе, который был вдохновлен ответом Мига .


Старый ответ:

l=input()
m=l[0]
k=1-2*(m<0)
for i in l:m=[m,i][m>i*k]
print(k*m>0)*m

Это очень длинный ответ. Я чувствую, что иметь 2 переменные это пустая трата ...? Я был прав...? иш? ;п


3

KDB / Q, 43 символа для определения тела функции

Благодаря отличным идеям из предыдущих постов:

f:{$[all 1_0<(*':)x;{$[<[x*x;y*y];x;y]}/[x];0]}

Введите один номер, используя enlist

f[enlist 2]
f[enlist 0]
f[enlist -2]
f[2 4 1]
f[0 1 2]
f[1 0 2]
f[-1 1 2]
f[-4 -2 -3 -2]
f[-5 0 -1]
f[-5 -0 -1]
f[1 0 -1]

Я уверен, что некоторые Q-гуру могут придумать более короткие.


Возможно, что-то вроде {asc[0,x,y]1}/?
алгоритмическая

3

Pyth, 25 22 20 12

uhtS[0GH)QhQ

Наверное, не роман, а оригинал: P


Предварительная сортировка разрешена

u*?Gx>GH>G0H>*GHZQhQ

Pyth

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

Идея использовать reduceи троичные операторы была бесстыдно украдена из ответа Миг , но я понятия не имею, являются ли эти алгоритмы в другом случае даже похожими, так как я не могу читать троичные операторы.

Объяснение:

Q=eval(input)         : implicit
u                QhQ  : print reduce(lambda G,H: ..., Q, Q[0])
 *          >*GHZ     : ... * (G*H>0)
  ?G       H          : G if ... else H
    x>GH>G0           : G>H xor G>0

Нет необходимости tQ. Qтакже будет работать
Оптимизатор

Совершенно верно! Я также думаю, что я могу удалить один из ?для *...
FryAmTheEggman

3

C #, 101 байт

Моя первая попытка поиграть в гольф в коде, и на довольно враждебном языке. Основано на уменьшении ( Aggregateв LINQ) и очень похоже на ответ JavaScript от Mig . Можно запустить как (new System.Linq.M()).m(new[] {1, 2, 3}). Проходит все тестовые случаи, но не обрабатывает пустые входные массивы.

namespace System.Linq{class M{public int m(int[]i){return i.Aggregate((a,b)=>a*b>0?a*a<b*b?a:b:0);}}}

1
Нет необходимости обрабатывать пустой ввод, поскольку я даже не определил функцию для этого случая.
Мартин Эндер

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.

Пример:

   (=&**>&|{,)/ 5 2 6
2

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


2

Game Maker Language, 489 байтов

О Game Maker Язык

Разбрасывает массив (добавляются нули) и возвращает медиану (аналогично моему другому ответу)

i=0a=argument0
while(variable_local_array_get(a,i))i++
for(j=0;j++;j<i-1)a[j+i]=0var i,j,d,m=0d=ds_list_create()if variable_local_exists(a){if variable_local_array_get(a,0){for(i=0;i<32000;i++){if variable_local_array_get(a,i)=0break
ds_list_add(d,variable_local_array_get(a,i))}ds_list_sort(d,0)i=ds_list_find_value(d,ds_list_size(d) div 2)j=ds_list_find_value(d,(ds_list_size(d) div 2)-1)m=ds_list_find_value(ds,ds_list_size(d) mod 2)ds_list_destroy(d)}if m return (i+j)/2return i
break}

@ MartinBüttner Первые 2,5 строки выполняют риффл, а остальные находят медиану. 32000Это максимальный размер массива , как ограничено программное обеспечение.
Timtech

@ MartinBüttner Да, в средней части весь список не отсортирован.
Timtech

@ MartinBüttner это сортируется на каждой итерации ... так 3
Timtech

Ооо, я вижу. Этот код на удивление трудно читать для такого многословного языка. ^^
Мартин Эндер

@ Довольно хорошо MartinBüttner Это для игры в гольф (очень свободный синтаксис) , но он не содержит многие стандартные встроенные функции (она будет ориентирована на игровой дизайн).
Timtech

2

Java, 353 304 124 байта

Соедините худший язык для гольф-кода с худшим в мире гольфистом, и вы получите ...

int m(int[]a){int m=a[0];if(m<0)for(int i:a){m=(i>m)?i:m;m=(i>0)?0:m;}else for(int i:a){m=(i<m)?i:m;m=(i<0)?0:m;}return m;}}

Разгоняй это и получаешь:

int m(int[] a) {
    int m = a[0];
    if (m < 0) {
        for (int i : a) {
            m = (i > m) ? i : m;
            m = (i > 0) ? 0 : m;
        }
    } else {
        for (int i : a) {
            m = (i < m) ? i : m;
            m = (i < 0) ? 0 : m;
        }
    }
    return m;
}

Это функция (если это было чертовски очевидно), которая получает массив чисел и обрабатывает его значения, возвращая значение minmod.

Моя старая помощь решения также включена, как целая программа - как всегда.

class M{public static void main(String[]a){java.util.Scanner s=new java.util.Scanner(System.in);int n,m=0;try{m=s.nextInt();if(m<0)while(true){n=s.nextInt();m=(n>m)?n:m;m=(n>0)?0:m;}else while(true){n=s.nextInt();m=(n<m)?n:m;m=(n<0)?0:m;}}catch(java.util.InputMismatchException e){System.out.print(m);}}}

Разгоняй это и получаешь:

class M {

    public static void main(String[] a) {
        java.util.Scanner s = new java.util.Scanner(System.in);
        int n = 0, m = 0;
        try {
            m = s.nextInt();
            if (m < 0) {
                do {
                    n = s.nextInt();
                    m = (n > m) ? n : m;
                    m = (n > 0) ? 0 : m;
                } while (true);
            } else {
                do {
                    n = s.nextInt();
                    m = (n < m) ? n : m;
                    m = (n < 0) ? 0 : m;
                } while (true);
            }
        } catch (java.util.InputMismatchException e) {
            System.out.print(m);
        }
    }
}

Получает бесконечные числа, останавливается при вводе нечислового значения, представляя значение Minmon.


Ваш код, кажется, отбрасывает первое значение, поэтому он даст неправильные ответы, например 1 2 3. Вы также, кажется, упускаете из виду, что вы можете написать функцию, которая обрабатывает свои аргументы, а не программу, которая читает из stdin.
Питер Тейлор

@PeterTaylor Глупо, мой первый инстинкт - всегда писать полную программу, даже если заявлено, что она может быть функцией. Насчет этой ошибки, по-видимому, я ее недостаточно проверял, крысы. Попробую исправить это сейчас - и сделать версию только для функций ...
Родольфо Диас

2

R, 20 символов

R обычно не подходит для Codegolf, но я использую его для своей работы, поэтому я хотел попробовать. До того, как я попробовал, я не знал, что R готов принять такой грязный синтаксис! :-) 52 символа :

if((q=summary(x))[6]<0)q[6]else if(q[1]>0)q[1]else 0

Потом я посмотрел другие ответы, которые я попробовал, гениальный срединный трюк @xnor, и это здорово!

median(c(x-x,x)[-1])

Как работает ваша первая версия? Что делает summary? Есть q[1]и q[6]мин и макс соответственно? В этом случае это недопустимо, потому что вы не можете использовать встроенный мин / макс.
Мартин Эндер

@ MartinBüttner это в основном обеспечивает вектор квантилей и среднее значение. 1 и 6 - это 0 и 1 квантиль. Я не использовал встроенную функцию min / max согласно вашим правилам.
Томас

2

Python, 52

Я до сих пор не мог не чувствовать, что плохо иметь два lambdaс. Эта функция принимает список, а затем возвращает одноэлементный список, содержащий результат.

f=lambda a:a[1:]and[sorted([a.pop(),0]+f(a))[1]]or a

Надеемся, что это не приведет к огромному количеству оскорблений, если результат будет представлен в списке из одного элемента.


1

Матлаб / Октава, 26

Это в основном просто перевод ответа Mathematica от xnor. Это работает, добавляя один ноль меньше длины входного вектора. Обратите внимание, что добавление еще одного не будет работать, так как тогда результат будет все время 0. Спасибо MartinBüttner за -4 символа этого решения =)

@(x)median([x,0*x(2:end)])

@ MartinBüttner Вы абсолютно правы. Теперь я изменил его: программа будет добавлять только один ноль меньше, чем ввод. Таким образом гарантируется, что у нас всегда нечетное количество элементов, а медиана заботится обо всех остальных.
flawr

или вытолкните последние 0 из вашего предыдущего решения.
Оптимизатор

@ MartinBüttner Спасибо, конечно, так лучше. @ Оптимизатор Как бы вы это сделали?
flawr

Не имею представления. Я думал, что должен быть способ просто выскочить из последнего элемента, что-то вроде @(x)median([0*x,x](2:end)). Хотя кажется, что это те же байты, что и сейчас.
Оптимизатор

@Optimizer Я уже думал, что пропустил важную функцию Matlab =) Жаль, что предложенная вами запись не работает, иногда это будет очень удобно!
flawr

1

Python, 72 60 байт

Это первое решение, о котором я подумал, и оно довольно наивно. Вторая половина в основном дублирует первую половину кода, но я не был уверен, как ее уменьшить. Интересно, можно ли его сократить, используя eval...

Редактировать: Изменил лямбда на понимание.

Попробуйте их здесь

lambda l:min(l)*all(x>0for x in l)+max(l)*all(x<0for x in l)

Это только 4 символов больше, но все же стоит посмотреть, используя Sp3000 в TIP .

lambda l:eval("+m%s%s(l)*all(x%s0for x in l)"*2%tuple("ax<in>"))

1

Javascript, 63

a=>a.reduce((p,c)=>p<0?c<0?Math.max(p,c):0:c>0?Math.min(p,c):0)

Более читаемая версия:

function (arr) {
    return arr.reduce(function (p, c) {
        if (p < 0) {
            if (c < 0) {
                return Math.max(p, c);
            } else {
                return 0;
            }
        } else {
            if (c > 0) {
                return Math.min(p, c);
            } else {
                return 0;
            }
        }
    });
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.