Макс () не достаточно


18

вступление

Друг поставил этот вопрос сегодня немного по-другому: «Может ли одна команда [Python] определить наибольшее из целых чисел И что они не равны?».

Хотя мы не нашли способ сделать это в рамках разумных определений «единой команды», я подумал, что это может быть забавной проблемой для гольфа.

 Вызов

Msgstr " Вернуть наибольшее из списка целых чисел, если-и-только-если они не все равны. "

Более конкретно:

Дана строка, содержащая только список целых чисел через запятую:

  • Если они все равны, ничего не вернуть / вывести
  • Иначе, возврат / вывод самый большой

правила

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

Записи могут быть полной программой или просто функцией, при условии, что вы предоставляете какой-то способ их проверить!

Предположения

  • Предположим, элементы входного списка могут быть более одной цифры, но не больше (2 32 - 1)
  • Предположим, что входной список содержит не более миллиона элементов
  • Предположим, что входные данные не будут содержать отрицательные значения
  • Предположим, что вход никогда не будет пустым

Во избежание сомнений, объяснение вызова, данное сразу после «Более конкретно», должно заменить замену вызова выше («Верните самое большое ...»).

 Примеры

(1) Все равны:

Input: 1,1
Output:

(2) Не похожи:

Input: 1,2
Output: 2

(3) Ноль !:

Input: 0,0,0,0,0,0,0,1,0,0
Output: 1

(4) Случайный:

Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9

(5) Большие числа, больший список:

Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887

Дополнительные примеры:

(6) Все равны, большой список:

Input: 7,7,7,7,7,7,7,7,7
Output:

(7) Все равны, большой список, большие числа:

Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:

(8) Не равно, больший список, большие числа:

Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185

счет

Это code-golfтак, поэтому код с самым коротким числом байтов выигрывает!


3
Можно ли выдавать ошибку, если список содержит все равные значения? И можем ли мы вывести нулевое значение (например, Noneв python) вместо вывода ничего? Кроме того, почему входные данные должны быть строкой, а не списком? И что вы подразумеваете под самым большим элементом на входе, представленным как он есть на входе
DJMcMayhem

15
Я бы посоветовал ослабить входные требования, чтобы учесть массив / список целых чисел. Гарантируем ли мы, что список будет содержать как минимум 2 элемента? Можем ли мы вывести непротиворечивое нечисловое значение вместо ничего, если все целые числа равны?
лохматый

15
Пожалуйста, добавьте тестовый случай, где максимум происходит более одного раза, например 7,3,7,2.
Ними

3
Можем ли мы иметь тестовый случай только с одним элементом? Кроме того, мы можем включить трейлинг ,во вход?
Джо Кинг

2
Информация: этот вызов был изолирован. /// Для OP: Хотя песочница довольно неактивна, (я думаю), это всего лишь небольшая проблема. Проблема в том, что некоторые проблемы с заданием не очевидны, если прочитать только задание, и могут быть обнаружены только тогда, когда он действительно решается.
user202729

Ответы:


8

R , 50 37 байт

-33 байта благодаря digEmAll! -13 байт благодаря rturnbull!

x=scan(se=",");if(any(diff(x)))max(x)

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


Входной ли ( в настоящее время) должен быть строкой, к сожалению.
Лохматый


К сожалению, моя предыдущая ссылка была неправильной! Это должно быть правильно, объединяя идею digEmAll с идеей, которую я намеревался публиковать ...
Джузеппе

3
37 байтов , улучшая, как мы проверяем массив на равенство.
rturnbull

5

MathGolf , 5 байтов

è▀s╞╙

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

объяснение

è      Read whole input as int array
 ▀     Get unique elements
  s    Sort list
   ╞   Discard from left of array
    ╙  Get maximum of list

Это работает, потому что оператор max и оператор discard from left ничего не делают для пустых списков. Хорошо, оператор max удаляет список и ничего не выдвигает для пустых списков.

Это может быть 4 байта, если входные данные могут быть приняты в качестве списка.


Ввод должен быть через запятую .
лохматый

1
@ Shaggy Я пропустил это. Сейчас у MathGolf нет оператора «разделить на персонажа», поэтому для его правильной работы потребуется некоторая работа. Я посмотрю что я могу сделать.
максимум

5

Perl 6 , 26 23 22 байта

-1 байт благодаря nwellnhof

{.max if .Set>1}o&EVAL

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

Возвращает пустую квитанцию, если все равно.

объяснение

                o&EVAL  # Eval the string to a list of integers
{              }         # Pass to code block
 .max            # Return the max
      if .Set>1  # If the list converted to a set has more than one element

1
EVALТрюк аккуратно , и вы можете даже сохранить байты с o&EVAL.
nwellnhof

Не if +.Setсработает?
Досточтимый

@ Ven Нет, нам нужно проверить, есть ли в наборе более одного элемента.
Джо Кинг

Mh и поразрядно ~ 2 байта в Perl 6 :(
Ven

5

Желе , 4 байта

ḟṀE?

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

(Обратите внимание, что он имеет дело с: пустой ввод, как , например , ввод с одним элементом и ввод с 7несколькими элементами, 7,8,7как того требует спецификация в настоящее время.)

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

Как?

ḟṀE? - Full program: if one argument is present it is evaluated using Python
     -                 so 7,8,7 -> [7,8,7], while 7 -> 7
ḟṀE? - Main Link: list or integer OR no argument (in which case an implicit argument of 0)
   ? - if...
  E  - ...condition: all equal? (for any integer E yields 1 since the argument is
     -                           treated as a list like [integer])
ḟ    - ...then: filter discard (since it's undefined the right argument is implicitly 
     -                          equal to the left; both are treated as lists, so this
     -                          yields an empty list)
 Ṁ   - ...else: maximum (again an integer is treated as a list)
     - implicit print (Jelly's representation of an empty list is an empty string
     -                 furthermore no newline is printed in either case)

4

APL (Dyalog Classic) , 6 байтов

⍪⌈/~⌊/

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

поезд вычисления максимума ( ⌈/) без ( ~) сурик ( ⌊/) превратился в матрицу ( )

если вход содержит только один отдельный элемент, ⌈/~⌊/будет пустым и вернет матрицу 0 × 1, которая будет отображаться как ничто

в противном случае ⌈/~⌊/это будет 1-элементный вектор, а его будет матрица 1x1 (визуально неотличимая от скаляра), которая содержит максимум




3

Python 2 , 42 41 байт

a=input();print('',max(a))[len(set(a))>1]

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


Добро пожаловать в PPCG :) Я не знаю Python, но похоже, что это требует ввода в виде списка. К сожалению (и излишне, на мой взгляд) спецификация (в настоящее время) очень явная, что входные данные должны быть строкой.
Лохматый

@ Shaggy, эта программа работает, если вход имеет форму element, element, .... то есть, это не должно быть заключено в скобки.
Арнав Борбора

1
Список делает работу, но не требуется , поскольку в Python 2, inputпо умолчанию evalс любой строкой передается из стандартного ввода.
Арнав Борбора

1
40 байтов . Я не знаю, может ли список из одного элемента иметь трейлинг ,, так как ваше решение дает ошибку, если ввод - просто одно число
Джо Кинг,

2
@JoKing Есть ли причина, по которой вы не можете изменить значение !=на a, >поскольку вход никогда не будет пустым?
Недла2004

3

Haskell , 77 75 61 байт

f.read.('[':).(++"]")    
f a=[0|any(/=a!!0+0)a]>>show(maximum a)

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

('[':).(++"]")берет строку (например "1,2,1,3") и заключает ее в скобки ( "[1,2,1,3]"). Затем readпревращает строку в список целых чисел ( [1,2,1,3]).

Функция fиспользует этот совет для более короткого условия, если одним из результатов является пустой список. any(/=a!!0+0)aпроверяет, aсодержит ли список какой-либо элемент, который не равен его первому элементу a!!0. ( +0Требуется так, чтобы readон знал, что должен искать список чисел.) Если все элементы равны, этот тест завершается Falseи возвращается пустая строка. В противном случае show(maximum a)это максимум списка, преобразованного в строку, возвращается.


@nimi Спасибо за указание!
Лайкони

3

Красный, 81 байт

x: split input","forall x[x/1: load x/1]sort x: unique x if 1 <>length? x[last x]

Как и в случае решения R, огромная часть кода обрабатывает входную строку «1,1,2,44,1». Если мы можем иметь это как блок, например:, x: [1 1 2 44 1]тогда мы можем сделать это в 41 байте:

sort x: unique x if 1 <>length? x[last x]

4
Добро пожаловать в PPCG! Обычно мы просим ссылку на переводчика, чтобы проверить решение, и Деннис, один из наших модов, настроил Попробуйте его онлайн! именно для этой цели! Он даже отформатирует ваш ответ для вас! Надеюсь, вам понравится ваше время, проведенное здесь!
Джузеппе

sort x: unique load replace/all input","" "if 1 <>length? x[last x]для 67 байтов. К сожалению input, не работает в TIO. Если вы сделаете его функциональным, он будет отлично работать в TIO: 73 байта
Гален Иванов

3

APL (Dyalog Unicode) , 12 байт

Полная программа. Запрашивает строку из стандартного ввода.

{1≠≢∪⍵:⌈/⍵}⎕

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

 запрашивать и оценивать выражение (запятые объединяют числа в список)

{} Применить следующую анонимную лямбду ( это аргумент; список чисел):

1≠ [если] 1 отличается от ...

 счет ...

 уникальные числа в ...

 список

: тогда

⌈/ вернуть максимум через (макс. уменьшение)…

 список

 [еще: ничего не делать]


1 ≢∪ ≢∪ здесь кажется, что находят, только если его аргумент является списком, а не повторением того же числа, поэтому это не 1 1 1 или 22. Таким образом, 1 ≢∪ ≢∪1 1 2 3 3 возвращает true, даже если 3 не является уникальным, и если это правда, вернет ⌈ / ⍵ максимум 3 (даже если он не должен возвращать никакого вывода). Где моя ошибка? Или возможно ':' имеет другое значение
RosLuP

@RosLuP Даже если есть повторения и даже повторения максимального числа, мы все равно должны напечатать максимальное. Только если в списке ровно один уникальный номер, мы ничего не печатаем. Посмотрите на последний пример в OP.
Адам

Да, я неправильно понял проблему ... спасибо
RosLuP

будет ли это работать? ⌈/~⌊/
NGN

@ngn Нет, выводит новую строку, если все элементы равны.
Адам

3

JavaScript (Node.js) , 49/53 байта

Моя оригинальная версия .every(), 53 байта

Функция, возвращающая '', считается отсутствием вывода? Конечно, это можно улучшить ...

s=>(a=s.split`,`).every(e=>a[0]==e)?'':Math.max(...a)

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


Улучшенная версия с использованием Set()по лохматый , 49 байт

s=>new Set(a=s.split`,`).size>1?Math.max(...a):``

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


2
Очень быстро улучшение: tio.run/##y0osSyxOLsosKNHNy09J/Z9m@7/...
Shaggy

@ Шэгги, хорошо! Я начал использовать Сет, но не смог получить его так коротко
Крис М

2

Neim , 4 байта

𝐐𝐎Ξ𝐠

Объяснение:

  Ξ   If
𝐐    all elements are equal
  𝐎  not
      then
   𝐠  get greatest element

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


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


2

Japt, 16 байт

Это было бы 9, если бы не излишне строгий формат ввода, 7, если выбрасывать ошибку, ничего не выдает.

Предполагается, что строка содержит как минимум 2 целых числа.

q, mn
â ÊÉ?Urw:P

Попытайся


2

Common Lisp, 102 байта

(lambda(x &aux(c(read-from-string(concatenate'string"#.`("x")"))))(or(apply'= c)(princ(apply'max c))))

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

Размер в основном за счет ввода данных; при вводе в качестве обычного списка длина уменьшается до 46 байт:

(lambda(x)(or(apply'= x)(princ(apply'max x))))

2

XPath 3.1, 54 байта

с входной строкой в ​​качестве элемента контекста:

let$t:=tokenize(.,',')!xs:int(.)return max($t)[$t!=$t]

Может быть уменьшен на один символ, если вы позволите контексту связать более короткий префикс, чем "xs", с пространством имен схемы XML.

Объяснение: принимает входную строку, разбивает токены на разделитель ",", применяет xs:int()к каждому токену для преобразования в целое число, вычисляет максимум последовательности, выводит максимум при условии, что предикат $t!=$tистинен. Если A и B являются последовательностями, тогда A!=Bверно, если существует пара элементов (a из A, b из B), такая что a!=b.

Если входные данные могут быть представлены в виде последовательности целых чисел $ s, а не через запятую, то решение сводится к

max($s)[$s!=$s]

(15 байтов - что может быть самым коротким решением в языке, который не предназначен специально для краткости)

ПРИМЕЧАНИЕ : это не удовлетворяет требованию «представленному на входе» - если на входе есть целое число с начальными нулями или знак плюс, они будут потеряны. Я подозреваю, что это верно и для многих других решений.


2

К4 , 38 35 байт

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}

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

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"1,2,4,4"
,4
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"4,4,4,4"
q)
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,3,8,4,8,3,9,4,6,1,3,7,5"
,9
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,7,7,7,7,7,7,7,7,7,7,7,7"
q)

Я не очень хорошо разбираюсь в любом из k вариантов, доступных на TiO, так что нет онлайн-примера, я постараюсь найти один, хотя

объяснение

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

   $[expr;`True;`False] is the conditional format

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}
               ","\:x                 //split string on commas
            7h$                       //cast strings to long
                      -48             //they'll be from ascii format, so compensate
         ?:                           //get distinct list      
       t:                             //set list to variable t        
     #:                               //get count of t
   1=                                 //check if count t = 1
                         ;;           //return nothing if true
                             t@>t  //if false, sort t descending
                           *:         //return first value

Вероятно, можно больше играть в гольф, а не фанат того, чтобы в конце использовать эту временную функцию.

РЕДАКТИРОВАТЬ: Если запятые в выходных данных являются проблемой, это может быть исправлено еще двумя байтами:

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:,/t@>t]}"1,2,4,4"
4
                                 ,/                 //joins the single element lists into one

Возьмем всего 40 37, но запятая перед числом просто означает, что это список из одного элемента, а не атома.


2

PHP (<= 5,6) 64 74 байта

 echo array_count_values($a=split(',',$argn))[$m=max($a)]==count($a)?'':$m;

Запустите как трубу с -nRили проверьте это онлайн

splitбыл удален в PHP7, но так как мне пришлось добавить 10, чтобы исправить некоторые проблемы, стоило использовать вместо того, explodeчто примерно эквивалентно в этом случае.


Also this doesn't work when there are more than one element with the max value Я missread If they are all equal, return/output nothingбыть If they are equal, return/output nothingсмысл , если есть более одного на выходе пустой. Добавление==count($a) исправляет это. Поскольку array_count_valuesподсчитывает, сколько раз он появляется в массиве, если это равно общему количеству элементов в массиве, выведите '', иначе выведите max
ArtisticPhoenix

1
@JoKing - Вы не должны принимать ввод через предварительно объявленную переменную - исправлено, если использовать $argnего, взяв его из стандартного ввода (это использовалось в нескольких ответах по гольфу). Я могу привести примеры не только моих, но и других пользователей.
ArtisticPhoenix


2

05AB1E , 9 8 байт

',¡ZsËiõ

-1 байт благодаря @Cowabunghole .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

',¡        '# Split the (implicit) input by ","
   Z        # Push the maximum (without popping the list)
    s       # Swap so the list is at the top of the stack again
     Ëi     # If all elements are equal:
       õ    #  Push an empty string ""
            # (Implicitly output the top of the stack to STDOUT as result)

1
Довольно похожее решение, но вы можете избежать всего остального ',¡ZsËiõ, сохранив 1 байт
Cowabunghole

@ Cowabunghole Смарт, спасибо!
Кевин Круйссен

1

Python 2 , 44 байта

k=eval(input())
if~-len(set(k)):print max(k)

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


Я предполагаю, что evalв Python преобразует разделенную запятыми строку в список?
Лохматый

1
Да; точнее кортеж (неизменный список). Если бы входные данные не были строкой (то есть опускали кавычки в разделе ввода TIO), то можно было бы просто использовать k=input()и получить тот же результат.
Час Браун


1

Древесный уголь , 15 байт

≔I⪪S,θ¿›⌈θ⌊θI⌈θ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔I⪪S,θ

Разделите ввод на запятые и приведите каждое значение к целому числу.

¿›⌈θ⌊θ

Проверьте, больше ли максимальное значение, чем минимальное значение.

I⌈θ

Если так, тогда приведите максимальное значение к строке и напечатайте.


1

Mathematica, 43 байта

If[!Equal@@#,Max@#]&@@#~ImportString~"CSV"&

Чистая функция. Принимает в качестве входных данных разделенную запятыми строку и возвращает либо число, либо Null. Я считаю, что это действительно, так как Nullграфически не отображается:


1

C (gcc) , 91 байт

M(s)char*s;{long m=atol(s),o,l=0;for(;s=strchr(s,44);o<0?m-=o:0)l|=o=m-atol(++s);s=l?m:-1;}

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

Degolf

M(s)char*s;{
    long m=atol(s),o,l=0; // Read the first integer from string
    for(;s=strchr(s,44); // Advance pointer to next ','
           o<0?m-=o:0) // End of loop: if difference <0, deduct from max, increasing it to new max.
        l|=o=m-atol(++s); // Read next number, and subtract it from current max. 
                          // Bitwise-OR the difference into the l-variable
    s=l?m:-1; // End of function: if l is non-zero, there were at least two different values.
              // Return -1 if l is zero, otherwise the max value.
}

Предлагаю M(char*s)вместо M(s)char*s;и index()вместоstrchr()
потолок кошка

1

Pyth, 7 байт

Itl{QeS

Попробуйте онлайн!
Все тестовые случаи (немного другой код для лучшего форматирования вывода)

Поскольку Pyth основан на Python, пользовательский ввод всегда интерпретируется как строка, которая затем может быть передана через eval() . Все программы Pyth автоматически запускаются в Q=eval(input())качестве первой инструкции.

Объяснение:
Itl{QeS  | Full code
Itl{QeSQ | with implicit variables filled
---------+-------------------------------
I        | If
 t       | one less than
  l      | the length of
   {Q    | the deduplicated input
         | is truthy (!=0),
         | print
     e   | the last element of
      SQ | the sorted input

1

Java (JDK) , 101 байт

d->{long m=0,c=-1,b;for(var s:d.split(",")){b=new Long(s);c=c<0|c==b?b:0;m=b>m?b:m;}return c>0?"":m;}

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

Разъяснения

d->{                            // Function taking a String input
    long m=0,c=-1,b;            // Initialise variables
    for(var s:d.split(",")){    // Split by comma and loop over elements
        b=new Long(s);          // Parse String to Long
        c=c<0                   // If c<0 (i.e. this is the first element)
            |c==b               // ...or c is equal to the current element
            ?b                  // Set c to the current element (all elements are the same so far
            :0;                 // Otherwise set c to zero to denote that list is not all same element  
        m=b>m?b:m;              // Set m to max of b and m
    }
    return c>0?""               // If c is not zero then all elements are the same, return nothing
                 :m;            // Else return max element
}

Бонусное решение!

Несмотря на все мои усилия, я не смог получить это решение с использованием regex и Streams до менее чем 105 байтов, но мне очень понравилась его элегантность, поэтому я должен был упомянуть его;

d->d.matches("(.+?)(,\\1)+")?"":java.util.Arrays.stream(d.split(",")).map(Long::new).reduce(0L,Long::max)

100 байтов , используя комбинацию вашего регулярного выражения (минус ?) и регулярного цикла и возврата (вместо потока).
Кевин Круйссен

1

MATL , 15 9 байт

U&=?}1MX>

Попробуйте онлайн!
Несколько тестов

Просто стараюсь, чтобы мои отбивные из MATL не становились слишком ржавыми!

редактировать : в конце концов ржавый; спасло 6 байтов, благодаря @LuisMendo.

объяснение

U     % str2num - automatically parses comma-separated strings
&=?   % Are all the values equal? 
}     % if not
1M    % Get the numeric matrix again on the stack
X>    % And find its maximum value.

1

Пип , 13 байт

a^:',MXaRMMNa

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

Использует подход из APL-решения ngn :

     MNa  Minimum of the list
  aRM     Remove it from the list
MX        Take the max of the remaining elements

Первые 5 байтов a^:', разделяют входную строку на запятые.

Альтернативные 13-байтовые решения:

I!$=Ya^',PMXy
a^:',$=a?uMXa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.