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


18

Вступ

Друг сьогодні поставив це питання дещо по-іншому - "Чи може одна команда [Python] визначити найбільше з деяких цілих чисел І що вони не рівні?".

Хоча ми не знайшли способу зробити це в розумних визначеннях "єдиної команди", я подумав, що це може бути цікавою проблемою для гольфу.

 Виклик

" Поверніть найбільше зі списку цілих чисел, якщо-і-тільки-якщо вони не всі рівні. "

Більш конкретно:

Дано рядок, що містить лише розділений комою список цілих чисел:

  • Якщо всі вони рівні, повернути / вивести нічого
  • В іншому випадку, повернення / вихід найбільший

Правила

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

Записи можуть бути повноцінною програмою або просто функцією, якщо ви надаєте певний спосіб перевірити їх!

Припущення

  • Припустимо, що елементи списку вводу можуть бути більше однієї цифри, але не більше (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 елементи? Чи можемо ми вивести послідовне нечислове значення замість нічого, якщо всі цілі числа рівні?
Shaggy

15
Будь ласка, додайте тестовий випадок, коли максимум зустрічається більше, ніж один раз 7,3,7,2.
німі

3
Чи можемо ми мати тестовий випадок лише з одним елементом? Також, чи можемо ми включити трейлінг ,у вхід?
Джо Кінг

2
Інформація: Цей виклик був пісочницею. /// Для ОП: Хоча пісочниця досить неактивна, (я думаю) це лише незначна проблема. Проблема полягає в тому, що деякі проблеми з викликом не є очевидними, якщо людина читає лише виклик, і їх можна виявити лише тоді, коли її реально вирішити.
користувач202729

Відповіді:


8

R , 50 37 байт

-33 байти завдяки digEmAll! -13 байт завдяки rturnbull!

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

Спробуйте в Інтернеті!


Вхідний чи ( в даний час) повинен бути рядком, на жаль.
Shaggy


На жаль, я вважаю, що попереднє посилання було неправильним! Це має бути правильно, поєднуючи ідею 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, і відмова від лівого оператора нічого не роблять для порожніх списків. Ну, оператор max видаляє список і нічого не натискає на порожні списки.

Це може бути 4 байти, якщо вхід може бути сприйнятий як список.


Вхід повинен бути рядком, розділеним комою .
Кудлатий

1
@Shaggy я це пропустив. Зараз у MathGolf немає оператора "розбиття персонажів", тому для його виправлення знадобиться деяка робота. Я побачу, що я можу зробити.
maxb

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 Ні, нам потрібно перевірити, чи є в наборі більше одного елемента.
Jo King

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

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 на, >оскільки вхід ніколи не буде порожнім?
nedla2004

3

Хаскелл , 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 (Діалог Unicode) , 12 байт

Повна програма. Підказки для рядка від stdin.

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

Спробуйте в Інтернеті!

 запит на вираз та оцінку виразів (коми об'єднують числа у список)

{} Застосувати наступну анонімну лямбда ( це аргумент; список номерів):

1≠ [якщо] 1 відрізняється від ...

 підрахунок…

 унікальні цифри в…

 список

: потім

⌈/ повернути максимум поперек (літ. макс. зменшення)…

 список

 [інше: нічого не робити]


1 ≠ ≢∪ тут, здається, знаходимо лише, якщо його аргументом є список, а не повторення одного і того ж числа, тож це не 1 1 1 або 22. Тож 1 ≠ ≢∪1 1 2 3 3 повертає істину, навіть якщо 3 не є унікальним, і якщо це правда, повертається ⌈ / ⍵ макс. 3 (навіть якщо він не повинен повертати вихід). Де моя помилка? Або можливо ":" має інше значення
RosLuP

@RosLuP Навіть якщо є повторення та навіть повторення максимальної кількості, ми все одно повинні надрукувати макс. Тільки якщо в списку є рівно один унікальний номер, ми нічого не друкуємо. Подивіться останній приклад випадку в ОП.
Adám

Так, я неправильно зрозумів проблему ... спасибі
RosLuP

це працювало б? ⌈/~⌊/
ngn

@ngn Ні, він виводить новий рядок, якщо всі елементи рівні.
Adám

3

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

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

Чи вважається функція, що повертається '', як вихід? Звичайно, це можна покращити після ...

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

Спробуйте в Інтернеті!


Покращена версія за Set()допомогою Shaggy , 49 байт

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

Спробуйте в Інтернеті!


2
Дуже швидко поліпшення: tio.run / ## y0osSyxOLsosKNHNy09J / Z9m @ 7 / ...
Shaggy

@Shaggy приємно! Я почав використовувати Set, але не міг отримати його так коротко
Chris M



2

Japt, 16 байт

Це було б 9, якби не надто суворий формат введення, 7 якщо помилка передачі не вважається результатом.

Припускає, що рядок містить щонайменше 2 цілих числа.

q, mn
â ÊÉ?Urw:P

Спробуй це


2

Лист звичайний, 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]

Можна зменшити на один символ, якщо дозволити контексту прив’язати до простору імен XML-схеми коротший префікс, ніж "xs".

Пояснення: приймає рядок введення, токенізує роздільник ",", застосовується xs:int()до кожного маркера для перетворення в ціле число, обчислює макс послідовності, виводить макс за умови $t!=$tістинного предиката . Якщо A і B є послідовностями, то A!=Bправда якщо iff є пара елементів (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

Напевно, можна пограти в гольф більше, а не шанувальник необхідності використовувати таку швидку функцію max.

EDIT: Якщо коми у виході є проблемою, це можна виправити ще двома байтами:

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підраховує кількість разів, коли він з’являється в масиві, якщо це дорівнює загальній кількості елементів у масиві, тоді виводимо '' в іншому випадку виведіть максимум
ArtisticPhoenix

1
@JoKing - Ви не повинні приймати дані через заздалегідь оголошену змінну - фіксований за допомогою $argnцього береться зі stdin (це було використано у кількох відповідях на гольф). Я можу навести приклади не тільки моїх, але й інших користувачів.
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 Smart, дякую!
Кевін Кройсейсен

1

Пітон 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

Математика, 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;}

Спробуйте в Інтернеті!

Дегольф

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()
roofcat

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
}

Бонусне рішення!

Незважаючи на всі свої зусилля, я не зміг отримати це рішення, використовуючи регулярний вираз і потоки менше ніж на 105 байт, але мені дуже сподобалася його елегантність, тому довелося згадувати про це почесно;

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

100 байт , використовуючи комбінацію регулярного виразу (мінус ?) та регулярного циклу та повернення (замість потоку).
Kevin Cruijssen

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.