Найдите самое большое и самое маленькое число в массиве


29

Задание

Задача очень простая. Учитывая массив, содержащий только целые числа и строки , выведите наибольшее число и наименьшее число.

Тестовые случаи

Input: [1, 2, 3, 4, 5, 6, 7, 8]
Output: 1, 8

Input: [5, 4, 2, 9, 1, 10, 5]
Output: 1, 10

Input: [7, 8, 10, "Hello", 5, 5]
Output: 5, 10

Числа в строках не считаются целыми числами:

Input: [1, 2, 3, 4, "5"]
Output: 1, 4

Если есть только одно целое число, оно является как наибольшим, так и наименьшим целым числом:

Input: [1]
Output: 1, 1

Input: ["1", "2", "3", "4", 5]
Output: 5, 5

правила

  • Вы можете предположить, что массив всегда будет содержать хотя бы одно целое число.
  • Все целые числа положительны (больше 0)
  • Порядок вывода не имеет значения.
  • Это , поэтому выигрывает представление с наименьшим количеством байтов!
  • Строки могут содержать все печатаемые символы ASCII ( 32 - 126) и не являются пустыми.

Как строки, содержащие кавычки, представлены во входных данных?
feersum

@feersum Разве это не зависит от вашего языка?
Мартин Эндер

@feersum Возможно, с escape-символами, но если язык не справляется, это нормально.
Аднан

@ MartinBüttner Если вход взят из стандартного ввода, это не должно зависеть от того, какой язык используется.
feersum

3
@feersum Это ново для меня. Даже из STDIN [1, 2, 3] 1 2 3и {1; 2; 3}все они являются допустимыми форматами ввода, поэтому я не понимаю, почему они должны отличаться для строковых литералов, полученных из STDIN.
Мартин Эндер

Ответы:


9

Серьезно, 9 6 байтов

,ì;M@m

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

Как это работает

,                              Read list input
 ì                             Remove everything but numbers from it
  ;                            Make a copy
   m                           Extract its min value
    @M                         Extract the other one's max value
                               Implicit output (max then min)

Ах, да, я искал такую ​​команду. Но документы не легко искать.
Quintopia

Я согласен. Документы - моя следующая большая цель.
Мего

11

JavaScript (ES6), 54 56

Редактирование 2 байт сохраненного ТНХ @Neil

Примечание: x===+xверно, если и только если xчисло

a=>[Math.max(...a=a.filter(x=>x===+x)),Math.min(...a)]

3
Почему внешние ()с?
Нил

@Neil какой внешний ()? С какой стати я должен иметь external ()?
edc65

Это возвращает функцию, вам все равно нужно вызвать ее. (или просто удалите a =>)
Майкл Териот

2
Да, это анонимная функция. Это довольно распространенный способ опубликовать ответ в JavaScript @MichaelTheriot
edc65

@MichaelTheriot По умолчанию мы разрешаем представлениям быть автономными функциями, а не всегда требовать полных программ.
Алекс А.

8

Pyth, 14 11 10 байт

hM_BS^I#1Q

Попробуйте онлайн. Тестирование.

объяснение

  • Q: оцененный вклад
  • #: filter что on:
    • I: значение остается неизменным после:
      • ^…1 поднимая его к власти 1
  • SСортировать это
  • _B: создать массив [previous, reversed(previous)]
  • hM: возьмите первый предмет каждого предмета этого

Самая сложная часть состоит в удалении струн из гольфа, которое в настоящее время занимает 4 байта. Текущий подход работает благодаря ^<str>1получению первой декартовой степени последовательности (в основном, списка символов строки), но ^<int>1является просто функцией тождества.


Хм, вы также можете использовать *#_1Qдля удаления строк, которые были бы короче, если бы переменная была инициализирована как отрицательная ...
FryAmTheEggman

7

Python 2, 42 байта

В Python 2 целые числа всегда меньше строк во время сравнений, поэтому простой min(s)найдет наименьшее целое число. Однако при поиске максимума мы должны сначала отфильтровать строки. Анонимная функция принимает последовательность и возвращает кортеж с минимумом и максимумом.

lambda s:(min(s),max(x for x in s if''>x))

Пример:

[1,'77', 6, '', 4] -> (1, 6)

3
Тебе нужно lambda a:застрять перед этим.
Дверная ручка

if x>0или if''>xсохранить один байт.
grc

@ Doorknob, теперь лямбда, как предложено.
Логик Найт

1
@ Денис, я этого не знал. Я отредактировал решение, чтобы прояснить, что сравнение работает только в Python 2.
Logic Knight

1
Построение: lambda s:(min(s),-min(-1*_ for _ in s))(39 байт)
Фрэн Борчич

7

Желе, 8 байт

|f¹Ṣ0,1ị

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

Задний план

В идеальном мире достаточно было бы пересечь список со сглаженной версией самого себя. Строки - это просто списки символов в Jelly, поэтому, хотя исходный список будет содержать целые числа и строки, уплощенная версия будет содержать целые числа и символы, оставляя в пересечении только целые числа.

В реальном мире, как парсеры обоего входных и строковых литералов дают символы вместо строк длины 1. Единственным способом передать одноплодную строку в функцию будет кодировать его «вручную» , как, например, [”a], что является символ, завернутый в массив.

Это позволит сэкономить байт, в общей сложности 7 байтов ( попробуйте онлайн! ).

fFṢ0,1ị

Поскольку это, вероятно, не приемлемо, нам также нужен способ отличать символы от целых чисел.

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

Например, побитовое ИЛИ со списком [1, "2", "34", "-5", "a", "bc"]само по себе даст

[1, 2, [3, 4], [0, 5], 0, [0, 0]]

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

Как это работает

|f¹Ṣ0,1ị  Main link. Input: A (list)

|         Bitwise OR the list A with itself.
 f¹       Filter the result by presence in A.
   Ṣ      Sort the resulting list of integers.
    0,1ị  Retrieve the elements at those indexes.
          Indices are 1-based and modular in Jelly, so 0 is the last (maximum),
          and 1 is the first (minimum).

6

Mathematica, 20 байтов

MinMax@*Select[#>0&]

Контрольные примеры

MinMax@*Select[#>0&]@{1,2,3,4,"5"}
(* {1,4} *)

1
Почему там *есть? Кажется, что вы можете добраться до 19, просто порезав его.
Симмонс

1
@ASimmons Это необходимо. MinMax@Select[#>0&]не является допустимой чистой функцией.
njpipeorgan

1
@ASimmons @*- это композиция функций, а @приложение-функция.
Мартин Эндер

1
MinMax@Select[# > 0 &][{1, 2, 3, 4, "Hello", 5}]дает правильный ответ
Симмонс

1
@ASimmons Попробуйте присвоить MinMax@Select[# > 0 &]символу или просто оценить его.
njpipeorgan

6

Рубин, 57 36 29 байт

Новичок здесь, так что я не знаю, существует ли какое-либо стандартное или общепринятое место / способ вычисления используемых байтов, любая помощь будет очень признательна!

Отредактировано в соответствии с manatwork и комментариями Doorknob!

->n{(n.map(&:to_i)&n).minmax}

Тест

2.3.0 :076 > f=->n{[(n.map(&:to_i) & n).min, (n.map(&:to_i) & n).max]}
 => #<Proc:0x007ff7650ee868@(irb):76 (lambda)>
2.3.0 :077 > f[[7, 8, 10, "Hello", 5, 5]]
 => [5, 10]

1
36 символов:->n{[(x=n.map(&:to_i)&n).min,x.max]}
manatwork

2
29 байт, используя minmax:->a{(a.map(&:to_i)&a).minmax}
дверная ручка

5

CJam, 15 13 байт

{_:z&$2*_,(%}

Безымянный блок (функция), который ожидает входной массив в стеке и оставляет выходной массив на своем месте.

Запустите все тестовые случаи.

объяснение

_     e# Duplicate.
:z    e# Map over list: a) take abs() of integer elements (a no-op) or b) wrap strings
      e# in an array.
&     e# Set intersection: only the integers will appear in both arrays.
$     e# Sort.
2*    e# Repeat array twice (to make the code work with single-integer input).
_,    e# Duplicate, get length N.
(%    e# Decrement, get every (N-1)th element, i.e. the first and the last.

Я предложил e) и e (адитсу. Он этого не принял
username.ak

@ username.ak Я не думаю, что они действительно полезны. Добавление оператора из двух символов, который сохраняет только один байт по сравнению с текущим решением, вряд ли может быть реализовано aditsu, и я также думаю, что должны быть более полезные функции, чтобы использовать их.
Мартин Эндер

это сохранит 3 байта:q~_e(ae)a+
username.ak

@ username.ak Ну, это предполагает, что e(и e)будет игнорировать строки или что-то, что кажется несовместимым. И если бы он включал сравнение со строками, он, вероятно, потерпел бы неудачу так же, как $и e>не может сравнить целые числа со строками.
Мартин Эндер

5

Haskell, 41 39 байт

f x=[minimum,maximum]<*>[[i|Left i<-x]]

В Haskell все элементы списка должны быть одного типа, поэтому я не могу смешивать Integerи String. Однако есть Eitherтип для объединения двух типов в один. Таким образом, список ввода имеет тип Either Integer String1 . fфильтрует целые числа, удаляет Eitherоболочку, помещает список как отдельный элемент в новый список (например [[1,2,3]]), чтобы <*>можно было применить к нему функции, указанные в первом аргументе.

Пример использования: f [Left 1, Left 3, Right "Hello", Left 2]-> [1,3].

Редактировать: @xnor введен <*>в игру и сохранил 2 байта. Благодарность!


1 на самом деле он полностью полиморфен во втором типе, поскольку Stringсвойство никогда не используется.


Хорошая идея с матрицей. Вы можете сохранить два символа с перевернутой картой:f x=[minimum,maximum]<*>[[i|Left i<-x]]
xnor

@xnor: очень мило. Большое спасибо!
Ними


4

Mathematica, 28 байт

MinMax[#/._String->Nothing]&

Я до сих пор не понимаю твою одержимость Nothing... Это не значит ничего особенного ... Кроме того, для 23 байтов:MinMax@*Select[NumberQ]
LegionMammal978

@ LegionMammal978 Используйте "все целые числа положительны"! Смотри мой ответ.
njpipeorgan

1
Хорошие решения, ребята, я бы подумал сделать это таким образом! @ LegionMammal978, Nothingимеет особое значение. Начиная с Mathematica 10.2, он автоматически удаляется из списков.
Симмонс

@ LegionMammal978 Nothing- документированная функция в последних версиях.
Мистер Волшебник

4

PHP, 50 48 байт

<?=min($a=array_filter($a,is_int)).', '.max($a);

1
Ударь меня на 2 минуты :).
TMH

2
Это вообще запрещено полагать , что вход уже в переменной. Кстати, вы можете сохранить два байта, удалив 'вокруг is_int.
Blackhole

@ Blackhole Спасибо. Не понял. Я использовал удаление вашей цитаты :)
PaulSkinner

4

Сетчатка , 71

Спасибо (как всегда) @ MartinBüttner за помощь в игре в гольф.

Не конкурентный гольф, но интересно реализовать целочисленную сортировку пузырьков в Retina.

Предполагается, что все строки во входных данных заключены в "двойные кавычки и не содержат экранированных двойных кавычек \".

A`"
¶

\d+
$&$*a $&$*a
+`\b(a+) +\1(a+)\b
$1$2 $1
 +[a ]+ +

(a)+
$#1

Ввод разделен новой строкой.

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


Я думаю, что вы можете использовать <space>.*<space>от второго до последнего этапа из-за жадности.
FryAmTheEggman

4

Математика , 14

#&@@@MinMax@#&

Пример:

tests = {
   {1, 2, 3, 4, 5, 6, 7, 8},
   {5, 4, 2, 9, 1, 10, 5},
   {7, 8, 10, "Hello", 5, 5},
   {1, 2, 3, 4, "5"},
   {1},
   {"1", "2", "3", "4", 5}
 };

# & @@@ MinMax@# & /@ tests
{{1, 8}, {1, 10}, {5, 10}, {1, 4}, {1, 1}, {5, 5}}

Объяснение:

Когда MinMaxполучает не числовой ввод, это уменьшает проблему настолько, насколько это возможно, затем оставляет термины включенными Minи Max:

MinMax @ {7, 8, 10, "Hello", 5, 5}
{Min[5, "Hello"], Max[10, "Hello"]}

Из-за автоматического упорядочения строки следуют за целыми числами.

Applyзатем на уровне уровней {1} сокращенно @@@используется первый аргумент неатомарных элементов. Обратите внимание, что 5здесь нетронутым:

foo @@@ {5, Max[10, "Hello"]}
{5, foo[10, "Hello"]}

3

Oracle SQL 11.2, 189 байт

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i))FROM(SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i FROM DUAL CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2)WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

Un-golfed

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i)) 
FROM  (
        SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i 
        FROM   DUAL 
        CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2
      )
WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

Подзапрос анализирует массив и разделяет его, чтобы заполнить представление одним элементом на строку. Затем нечисловые элементы отфильтровываются.

Я хотел бы найти способ сделать это с LEAST и GREATEST, но не повезло с обработкой массива в качестве параметра.


Вы оставляете []массив в массиве, поэтому не выбираете max или min, если они являются первым или последним элементом массива. Вам также не нужно выражение WHERE, вы уже выбираете агрегаты, поэтому вам не нужно фильтровать. Ищите числовые символы в своих регулярных выражениях и передавайте преобразование чисел вниз к подзапросу (очень небольшая опасность толкаемых предикатов), и оно становится 126 байтов:select min(i),max(i)from(select to_number(regexp_substr(&1,'\d+',1,level))i from dual connect by level<=regexp_count(&1,'\d'))
Бен

Здесь нет необходимости +во втором регулярном выражении, так как не имеет значения, генерируете ли вы несколько дополнительных строк (сохраняет байт). Стоит также отметить, что если у вас есть строка, состоящая исключительно из цифр, вы не проигнорируете ее здесь; это требует перегруженных функций в одном пакете, так что это совсем не красиво.
Бен

3

vimscript, 25 байт

g/"/d
sort n
t.
t.
2,$-1d

Да, это верно, vimscript.

Ожидает ввода в виде

1
2
3
4
"5"

И выводы в виде

1
4

Объяснение:

g/"/d    delete all lines that contain quotes
sort n   sort numerically
t.       duplicate the first line
t.       duplicate it again
2,$-1d   delete from line 2 to line (END-1)

Первая строка должна дублироваться дважды, чтобы обработать крайний случай ввода одного числа. Это связано с тем, что последняя команда будет жаловаться, если при ее достижении будет только две строки, так как она в конечном итоге 2,1dокажется в обратном диапазоне.


3

Perl 44 39 + 3 = 41 байт

@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"

Требуются -paфлаги:

$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 5 4'
1 5
$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 4 "5"'
1 4

Спасибо @manatwork за сбривание нескольких байтов


Какая версия Perl? Для вашего второго примера я получаю другой результат: pastebin.com/judJys5g
manatwork

@manatwork Вы правы, рисунок я не могу удалитьsort{$a-$b}grep...
andlrc

В требовании не указывается, что выходные данные должны быть отформатированы точно так же, как в примерах, и в этой задаче ясно, что форматирование не имеет смысла. Многие из нас просто использовали то, что удобнее в нашем языке. В Perl я хотел бы сделать это следующим образом : $_="@a[0,-1]".
manatwork

Один символ короче фильтрации: grep!/"/.
manatwork

Это говорит, что массив будет числами и строками. Все примеры в этом вопросе со строками в двойных кавычках, но я не вижу ничего, что бы их нельзя было заключить в одинарные кавычки. Я думаю, что !/\D/нужно, чтобы !/"/, еще один байт.
msh210

3

Юлия, 35 байт

x->extrema(filter(i->isa(i,Int),x))

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

У Джулии есть встроенная функция extremaдля получения минимального и максимального элементов массива в виде кортежа. Однако, поскольку в массиве также могут быть строки, мы сначала должны отфильтровать их. Мы можем сделать это, проверив, является ли каждый элемент целочисленным isa.


3

Japt, 23 байта

[V=Uf_bZÃn@X-Y})g Vw g]

Проверьте это онлайн!

Как это работает

[V=Uf_  bZÃ n@  X-Y})g Vw g]
[V=UfZ{ZbZ} nXY{X-Y})g Vw g]

UfZ{ZbZ}   // Filter out the items Z in U where Z.b(Z) is falsy.
           // For numbers, this the original number, which is always non-0 (non-falsy).
           // For strings, this returns Z.indexOf(Z), which is always 0 (falsy).
nXY{X-Y}   // Sort by subtraction. Small items move to the front, large to the back.
V=         // Set variable V to the resulting array.
)g Vw g    // Take the first item in V, and the first in V.reverse().
[       ]  // Wrap them in an array so both are sent to output.

3

Баш, 40 31 30 байт

sort -n|sed /\"/d|sed '1p;$p;d'

Требуется разделенный строкой список:

$ echo $'5\n4\n2\n9\n1\n"10"\n5' | sort -n|sed /\"/d|sed '1p;$p;d'
1
9

Благодаря @manatwork сбрить несколько байтов


sed '1p;$p;d'сохраняет байт.
Деннис

3

PowerShell, 53 36 байт

@($args[0]|?{$_-is[int]}|sort)[0,-1]

Сохранено 17 байт благодаря @goric

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

Принимает наш ввод $args[0]и передает его в Where-Objectоператор ( ?), который будет выбирать только целые числа и передавать их по конвейеру, отбрасывая все остальное. Поскольку динамическое повторное приведение происходит для вас на лету в фоновом режиме (например, 1+"5"возвращение 6является совершенно корректным PowerShell), нам нужно использовать -isоператор для того, чтобы различать типы данных.

Оттуда мы передадим эту коллекцию Sort-Object, которая будет сортировать целые числа от наименьшего к наибольшему. Внешнее ()необходимо, чтобы мы могли ссылаться на первый и последний элементы с помощью [0,-1](т. Е. Наименьшего и наибольшего), но учтите, что нам также нужно, чтобы внешний @вызывал приведение вывода sortв виде массива, если существует только один объект (как результат ?, или только один объект был вход).


1
Посмотрите на -isоператор типа здесь . Я думаю , что вы могли бы заменить .GetType().Name-eq"Int32"с , -is[int]чтобы сэкономить 17 байт
goric

@goric Супер круто! Спасибо за массивный гольф!
AdmBorkBork

3

MATL , 23 байта

"@Y:tX%1)2\?x]N$htX<wX>

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

"       % implicitly input cell array. For loop that iterates on each cell
  @     %   push each cell
  Y:    %   cell's contents (either a number or a string)
  tX%   %   duplicate and push class. This will produce 'char'  or 'double'
  1)    %   get first letter: either 'c' or 'd'
  2\    %   is its ASCII code odd?
  ?     %   if so...
    x   %     delete (it's a string)
  ]     %   end if
  N$h   %   concatenate all stack into an array. This array will contain up to
        %   three numbers: minimum up to now, maximum up to now, new value (if any)
  tX<   %   duplicate. Push minimum
  wX>   %   swap. Push maximum.
        % implicitly end for
        % implicitly display stack contents

Ох, мой плохой. Хороший ответ, хотя :)
Аднан

@ Adnan Спасибо! Слишком долго :-)
Луис Мендо,

2

JavaScript (ES5), 105 байт

function a(b){m=Math;b=b.filter(function(c){return c===+c});alert(m.min.apply(m,b)+','+m.max.apply(m,b))}

Использование: a([1,2,3,'4'])

Просто пытаюсь :)

"Ungolfed":

function a(b){
  m=Math;
  b=b.filter(function(c){
    return c===+c
  });
  alert(m.min.apply(m,b) + ',' + m.max.apply(m,b))
}


2

Perl 6 , 25 байт

Очевидным ответом будет эта лямбда-код Wh WhisCode

*.grep(Int).minmax.bounds

Если это должна быть полная программа

put get.words».&val.grep(Int).minmax.bounds

Входные данные для этой полной программы представляют собой список значений, разделенных пробелами


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

# give it a lexical name
my &code = *.grep(Int).minmax.bounds;

say code [1, 2, 3, 4, 5, 6, 7, 8];  # (1 8)
say code [5, 4, 2, 9, 1, 10, 5];    # (1 10)
say code [7, 8, 10, "Hello", 5, 5]; # (5 10)
say code [1, 2, 3, 4, "5"];         # (1 4)
say code [1];                       # (1 1)
say code ["1", "2", "3", "4", 5];   # (5 5)

say code []; # (Inf -Inf)

2

𝔼𝕊𝕄𝕚𝕟, 16 символов / 20 байтов

[МƲ(ï⇔⒡≔=+$⸩,МƵï

Try it here (Firefox only).

Не плохо, не плохо ...

объяснение

Это выводит массив, содержащий как максимум, так и минимум. (ï⇔⒡≔=+$⸩,в основном отфильтровывает все строки на входе, МƲполучает максимум на входе и МƵполучает минимум.

Просто примечание: это первая задача, которую я использую , которая в основном превращается ï⇔в ï=ï.



2

APL (Dyalog) , 13 байт

(⌊/,⌈/)⎕AV~⍨∊

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

 enlist (flatten - все строки превращаются в символы в большом списке)

⎕AV~⍨ удалить все символы в Tomic V Ector (набор символов - листья числа)

() Применить следующую молчаливую функцию:

⌊/ минимум по

, добавлен в

⌈/ максимальный поперек


2

Java (OpenJDK 8) , 124 байта

a->{int s[]={0,0},t;for(Object i:a)try{t=(int)i;s[0]=s[0]<1|t<s[0]?t:s[0];s[1]=s[1]<t?t:s[1];}catch(Exception e){}return s;}

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

Java 8 лямбда-функция, принимает массив в качестве входных данных и выдает массив {min, max} . Не конкурирует, потому что входные данные должны быть целочисленным массивом.

Исправлено и -1 байт благодаря Кевину Круйссену


Вы можете сделать это конкурирующим, взяв список объектов и проверив, является ли элемент целым числом или строкой.
Кевин Круйссен

@KevinCruijssen сделано, спасибо
HyperNeutrino

<iтеперь выдает ошибку без целочисленного приведения. Кроме того, ваш исходный код (и этот тоже) не работает min, так как он всегда будет выводить 0для min. Вот возможное исправление. РЕДАКТИРОВАТЬ: Try-catch, кажется, на 1 байт короче, чем if(i instanceof Integer).
Кевин Круйссен

@KevinCruijssen ой не заметил этого, спасибо!
HyperNeutrino

1

Джольф, 20 байт

Я, наверное, могу сыграть в гольф ... Мне нужно реализовать более короткие решения для проверки типов.

γ fxd='nF~tH0ͺZkγZKγ
 _fx                 filter the input
    d='nF~tH0        checking for number type
γ                    call that "γ"
             ͺ       pair
              ZkγZKγ  the min and max of the array
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.