Найти минимальное и максимальное целые числа в массиве, без использования встроенных

15

Вызов

Имеется массив целых чисел, полученный из stdin, аргументы функции, аргументы программы или какой-либо другой метод:

Выведите только минимальные и максимальные числа в массиве через возвращаемое значение, стандартный вывод или другие методы подбора.

Пример сеанса

> minmax( {0, 15, 2, 3, 7, 18, -2, 9, 6, -5, 3, 8, 9, -14} )
-14 18

Ссылочная реализация

// C++14

void minmax(std::vector<int> v) {
    int min = v[0]; int max = v[0];
    for(auto it : v) {
        if (*it < min)
            min = *it;
        if (*it > max)
            max = *it;
    }
    std::cout << min << ' ' << max << std::endl;
}

правила

  • Вы не можете использовать встроенную функцию для вычисления значений.
  • Стандартные лазейки запрещены.
  • Творческие реализации поощряются.
  • Это , самый короткий ответ выигрывает, но не будет выбран.

Разъяснения

  • Если массив содержит 1 элемент, вам нужно вывести его дважды.
  • Если минимальное и максимальное значения совпадают, вам необходимо вывести их оба.
dkudriavtsev
источник
12
Это задача «делай икс без Y» , которая не особенно интересна.
Мего
5
@DmitryKudriavtsev Попробуй в песочнице в следующий раз.
Мего
5
Серьезно, используйте Песочницу . Ваши изменения в задаче аннулировали каждый ответ.
Мего
1
Я поощрял творческие методы. Нет, вы поощряли короткие решения, отмечая ихcode golf
Луис Мендо
1
Как сказал Луис Мендо: «Да, все просто пишут:« Я сортирую ваш массив с помощью встроенного и беру первый и последний », на разных языках, не очень креативно: x
Walfrat

Ответы:

29

Желе , 3 байта

Ṣ.ị

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

Сортировать массив, а затем взять 0,5-й элемент.

Jelly использует 1-индексирование, а средства индексации с плавающей запятой занимают свое место и свою позицию.

Таким образом, 0,5-й элемент даст вам 0-й элемент и 1-й элемент.

0-й элемент является последним элементом.

Дрянная Монахиня
источник
2
Довольно умно, я жду этого .... Желе!
Рохан Джунджхунвала
О, так это сделало бы поиск медианы тривиальным.
Адам
1
@KonradRudolph Это .
Утренняя монахиня
1
Разве вам не нужны первые и последние элементы, а не первые два элемента? Или я неправильно понял ваше объяснение?
Тоби Спейт
1
@TobySpeight При индексировании на основе 1 0-й элемент является последним элементом.
Утренняя монахиня
12

Python, 61 49 37 36 34 31 байт

lambda s:s.sort()or[s[0],s[-1]]

-12 байт благодаря RootTwo

Еще -12 байт благодаря чепнеру

-2 байта благодаря johnLate

-3 байта благодаря johnLate

акролит
источник
1
Я изменил заголовок на Python, потому что он работает и в Python 3.
Утренняя монахиня
1
Вы можете играть в гольф с дюжины байтов: используйте [::(len(s)-1)or 1]для первого индекса. И второй срок можно сократить до s[:len(s)<2].
RootTwo
Цена сортировки списка дважды, вы можете сбрить еще 12 байт: lambda s:sorted(s)[:1]+sorted(s)[-1:].
chepner
сохранить 6 байтовlambda s:sorted(s)[::len(s)-1]
Аарон
Текущая версия ( lambda s:sorted(s)[::len(s)-1]) не работает для массивов с одним элементом ( ValueError: slice step cannot be zero). Возможное исправление будет lambda s:sorted(s*2)[::len(s*2)-1](34 байта).
johnLate
8

Brain-Flak 220 218 байт

(({}))([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}({}<((())){{}{}([][()])}{}>)

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

объяснение

Сначала он удваивает верхнее значение (в списке приведен только один длинный)

(({}))

Затем он использует мой алгоритм сортировки пузырьков:

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}

Затем он выбирает верхнее значение стека (т.е. минимальное)

({}<...>)

Затем он появляется до тех пор, пока высота стека не станет равной единице:

((())){{}{}([][()])}{}
Пост Рок Гарф Хантер
источник
8

JavaScript (ES6), 34 байта

a=>[a.sort((x,y)=>x-y)[0],a.pop()]

sortсортирует на месте, так что я могу просто сослаться на индекс [0] для самого низкого значения и popсамого высокого значения из массива, однако он выполняет сортировку строк по умолчанию, поэтому я должен передать компаратор.

Нил
источник
Я не думаю, что вам нужна (x,y)=>x-yчасть, если только использование sort()с алгоритмом по умолчанию считается встроенным.
Скотт
1
@ Скотт Но я не хочу лексической сортировки ...
Нил
Правильно ... Я не проверял это с числами> 10 или <0. Я не знал, что sort()внутренне рассматривает все как строки - извините!
Скотт
5

Mathematica, 18 байт

Sort[#][[{1,-1}]]&

Сортирует массив и извлекает первое и последнее значения.

Мартин Эндер
источник
5

R, 31 байт

l=sort(scan());l[c(1,sum(l|1))]

Не , что оригинал, но эй!

Фредерик
источник
5

Машинный код ARM, 26 байтов

Шестнадцатеричный дамп (little endian):

6810 4601 f852 cb04 4560 bfc8 4660 4561 bfb8 4661 3b01 d8f5 4770

Это функция без системного вызова или зависимости от библиотеки. Кодировка Thumb-2, переменная (2 или 4 байта) кодировка для 32-битного ARM. Как можно себе представить, здесь нет простого способа сортировки и выбора первого и последнего элементов. В целом, здесь нет ничего особенного, это более или менее похоже на эталонную реализацию.

Неуправляемая сборка (синтаксис GNU):

.syntax unified
.text
.global minmax
.thumb_func
minmax:
    @Input: @r0 and r1 are dummy parameters (they don't do anything)
    @r2 - Pointer to list of integers (int*)
    @r3 - Number of integers to sort (size_t)
    @Output:
    @Minimum of the list in r0 (int)
    @Maximum in r1 (int)
    ldr r0,[r2] @min=r2[0]
    mov r1,r0 @max=min
    loop:
        @ip is intra-procedure call register, a.k.a. r12
        ldr ip,[r2],#4 @ip=*r2++
        cmp r0,ip
        it gt @if (r0>ip)
        movgt r0,ip @r0=ip
        cmp r1,ip
        it lt @if (r1<ip)
        movlt r1,ip @r1=ip
        subs r3,r3,#1
        bhi loop @while (--r3>0)
    bx lr @Return

Проверено на Raspberry Pi 3; Вот тестовый скрипт (C99, ввод через argv):

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//First 2 arguments are dummies.
uint64_t minmax(int,int,int* array,size_t size);

int main(int argc,char** argv) {
    int i;
    int array[argc-1];
    for (i=1;i<argc;i++) {
        array[i-1]=atoi(argv[i]);
    }
    uint64_t result = minmax(0,0,array,argc-1);
    printf("Minimum is %d, maximum is %d.\n",(unsigned)result,(unsigned)(result>>32));
}
Ян Чу
источник
4

Haskell, 27 байт

f x=(`foldl1`x)<$>[min,max]

В Haskell minи maxприведите минимум и максимум двух аргументов, а не списка. Я не мог сказать, запрещено ли это (кажется, что только вместо этого minimumи maximumбудет запрещено), поэтому, пожалуйста, дайте мне знать, если они есть, и я немедленно удалю этот ответ.

Майкл Кляйн
источник
@nimi Эффект FGITW, к сожалению ...
ThreeFx
3

Октава, 20 байт

@(n)sort(n)([1,end])

Это сортирует входной вектор и выводит первое и последнее значение.

flawr
источник
3

MATL , 4 байта

S5L)

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

объяснение

S    % Implicitly input the array. Sort
5L   % Push [1 0]. When used as a (modular, 1-based) index, this means "first and last"
)    % Apply as an indexing vector into the sorted array. Implicitly display
Луис Мендо
источник
3

Python, 29 байт

lambda s:s[s.sort():1]+s[-1:]

Проверьте это на Ideone .

Деннис
источник
3

C 83 81 79 байт

m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;pr‌​intf("%i %i",m,M);}
NoSeatbelts
источник
1
декларация может превратиться ...f(a,s)int*a{...в этом
кот
1
Вы можете объединить троичные выражения, чтобы получить еще 2 байта:m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;printf("%i %i",m,M);}
gastropner
В gccвы можете заменить *a>M?M=*a:0с*a<M?:M=*a
ceilingcat
2

V , 12 байт

:sor
ò2Gjkd

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

Кредит DJMcMayhem для этого.

Rɪᴋᴇʀ
источник
1
\o/Да, я больше не единственный человек, который когда-либо использовал этот язык!
DJMcMayhem
1
Если вход представляет собой одно число, то это число все равно должно быть выведено дважды
Луис Мендо
@ LuisMendo хм, будет работать над этим.
Rɪᴋᴇʀ
2

CJam, 10 9 байтов

q~$_(p;W>

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

Я действительно не очень хорош в CJam.

q~          e# eval input
  $         e# sort
   _        e# duplicate
    (       e# pop first
     p      e# print
      ;     e# remove array
       W>   e# get last element
PurkkaKoodari
источник
Обычный способ получить первый элемент списка - это 0=(но, к сожалению, это не сохраняет байты). Два других 9-байтовых решения: 0W]q~$f=pили безымянный блок {$2*_,(%}.
Мартин Эндер
8 байт: q~$(p)p;. Вы можете использовать, )чтобы получить последний элемент, как вы используете, (чтобы получить первый.
Бизнес-кошка
@BusinessCat Это то, что у меня изначально было, но оно не подходит для одноэлементного ввода.
PurkkaKoodari
@ Pietu1998: О, ты прав. Я этого не заметил.
Деловая кошка
2

Python 2, 34 байта

x=sorted(input());print x[0],x[-1]
синий
источник
2

PHP, 44 байта

function a($a){sort($a);echo $a[0].end($a);}
Dexa
источник
2

Обработка 59 52 байта

void m(int[]x){x=sort(x);print(x[0],x[x.length-1]);}

Обработка фактически не позволяет мне читать из стандартного ввода, который я смог найти, и я не знаю, поддерживает ли его внутренний Java-компилятор лямбды (и это было так давно, когда мне приходилось писать серьезную Java, что я надеваю не помню как).

Cody
источник
Вы можете сохранить байты, удалив пробелы послеint[]
Kritixi Lithos
1

Perl 6 13 байт

*.sort[0,*-1]

Тестовое задание:

my &min-max = *.sort[0,*-1];

say min-max 1;
# (1 1)
say min-max (0, 15, 2, 3, 7, 18, -2, 9, 6, -5, 3, 8, 9, -14)
# (-14 18)
Брэд Гилберт b2gills
источник
Черт, ты меня там побил!
BB94
1

C #, 60 байтов

n=>{System.Array.Sort(n);return new[]{n[0],n[n.Length-1]};};

Наивный метод на 93 байта:

n=>{var r=new[]{n[0],n[0]};foreach(int i in n){if(i<r[0])r[0]=i;if(i>r[1])r[1]=i;}return r;};
TheLethalCoder
источник
1

POSIX Awk, 44 байта

awk '{for(;NF-1;NF--)if($1>$NF)$1=$NF}1' RS=
Стивен Пенни
источник
1

Октава , 35 байт

@(x)[x(all(t=x<=x')) x(sum(t)==1)]

Это анонимная функция. Попробуйте в Ideone .

Код избегает использования сортировки. А именно, он выполняет все попарные сравнения «меньше или равно» между элементами ввода. Минимум - это элемент, для которого все сравнения верны. Максимум - это то, для которого верно только одно сравнение.

Луис Мендо
источник
1

Python, 35 34 байта

lambda s:sorted(s+s[:1])[::len(s)]

Альтернативная версия:

lambda s:sorted(s+s)[::len(s)*2-1]

Старая версия, 35 байт.

lambda s:sorted(s+[s[0]])[::len(s)]

Довольно просто: взять входной список, добавить первый элемент, отсортировать его, затем взять первый и (длинный) элемент в результирующем списке. Поскольку длина ввода после добавления элемента равна длине + 1, это заканчивается тем, что он берет первый и последний элемент указанного списка, которые являются минимальным и максимальным элементами.

TLW
источник
1
Хотя это и не самый короткий ответ в Python, он очень креативный! +1
mbomb007
34-байтовый не работает в Python 3; это работает и в 2 и 3. Кроме того, это было отправлено после этого.
TLW
@ mbomb007 - отлично, игра в гольф. Теперь это связано с самой короткой реализацией Python, и в качестве бонуса она работает как во 2, так и в 3.
TLW
1

zsh, 22 байта

(){echo $1 $_} ${(n)@}

определяет лямбда-функцию, которая печатает свой первый arg ( $1) и последний аргумент предыдущей команде ( $_) и передает ее $@после сортировки, чтобы предыдущая команда стала вызовом этой лямбды


зш, 21 байт

это работает нормально только если есть более 1 аргумент :(

<<<"${${(n)@}/ * / }"

сортирует $@, делает его строкой и заменяет все от первого пробела до последнего одним пробелом, а затем передает его в качестве входных данных для<<<


использование:

$ ./minmax 23 342 21 10
10 342
izabera
источник
1

Скала, 55 байт

val s=args.map(_.toInt).sorted
print(s.head+" "+s.last)

Выполнить:

$ scala minmax.scala 1 2 3 4 5 6 7 8 9

AmazingDreams
источник
1

Bash + coreutils, 30 байт

tr \  \\n|sort -n|sed '$p;1!d'

Скрипт sed печатает после сортировки ввода первое и последнее целые числа.

seshoumara
источник
1

постоянный ток, 110 байт

?ddsMsmzdsAsa[z1-:az0<S]dsSx[>R]s?[la;asM]sR[lM]sQ[lQxla1-dsa;al?xla0<N]dsNxlAsa[<R]s?[la;asm]sR[lm]sQlNxlmlMf

Помоги мне, dcэрс! Ты моя единственная надежда!

Спасибо @seshoumara за то, что нашли эту ошибку!

Я добавлю объяснение позже. Здесь это немного разбито:

?dd sM sm
zd sA sa
[z 1- :a z0<S]dsSx
 [>R]s?
 [la;asM]sR
 [lM]sQ
[lQx la 1- dsa ;a l?x la0<N]dsNx
lA sa
 [<R]s?
 [la;a sm]sR
 [lm]sQ
lNx
lm lM f
Джо
источник
Я не записал, как вызвать это, и теперь я не могу вспомнить. Что бы я ни делал сейчас, я делаю это неправильно, потому что это всегда возвращает 0 как наименьший элемент.
Джо
1
Pfew! На это потребовалось несколько главных ролей, но вы нашли ошибку в вашем коде. Это первый символ (0), который вы дублируете и инициализируете регистры Mи m. Но если в списке ввода ни одно число не меньше m=0или нет больше, чем M=0, то вы получите неправильный результат, потому что вы искусственно добавили 0 к номерам выборки. Решение состоит в том, чтобы заменить этот первый 0 на ?d, который считывает числа и инициализирует, Mи mна последний номер, что делает его частью выборки. Затем запустите код следующим образом: echo "8 _2 5" | dc -e "? DdsMsm ....".
Сешумара
Вау, спасибо, @seshoumara! Я бы никогда этого не заметил! (Я тоже забыл все об этом вопросе: P)
Джо
1

Java, 115 байт

String f(int[]i){int t=i[0],a=t,b=t;for(int c=0;c<i.length;c++){a=i[c]<a?i[c]:a;b=i[c]>b?i[c]:b;}return""+a+" "+b;}

Ungolfed:

String f(int[] i) {
    int t=i[0], a=t, b=t; // assigns a and b to i[0]
    for (int c=0; c < i.length; c++) { // loop through the array
        a=(i[c]<a) ? i[c] : a;
        b=(i[c]>b) ? i[c] : b; // assignment with ternary operator
    }
    return ""+a+" "+b; // returns a string
}

Мое первое в истории решение для игры в гольф.

AMACB
источник