Найдите самую высокую уникальную цифру

33

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

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

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

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

12         -> 2
0          -> 0
485902     -> 9
495902     -> 5
999999     -> Anything
999099     -> 0
1948710498 -> 7

Это поэтому побеждает меньшее количество байтов на каждом языке !

Skidsdev
источник
2
Можем ли мы взять ввод как строку вместо этого?
Kritixi Lithos
3
Учитывая последний контрольный пример, я думаю, что мы вынуждены принимать ввод как строку ... (начальные нули не могут быть представлены в целых числах)
Лев
@ Лео, который был моим плохим на самом деле, в основном, разбил цифры на моей клавиатуре, не заметил начальный ноль. Но да, входные данные могут быть приняты в виде строки
Skidsdev
25
@ Adám «неопределенное поведение» обычно означает, что вы можете делать что угодно, включая вызов безымянных ужасов из пустоты, если это спасает байты.
Мартин Эндер
22
@MartinEnder, на самом деле, я с радостью выбью 50% ваших байтов, если ваш код успешно вызовет ктулху, если не будет уникальных цифр;)
Skidsdev

Ответы:

16

05AB1E , 4 3 байта

Сохранено 1 байт благодаря г-ну Xcoder, уведомляющему, что список цифр является допустимым вводом.

¢ÏM

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

объяснение

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest
Emigna
источник
Ждать так в 05AB1E, 2это не правда; только 1? : o
HyperNeutrino
@HyperNeutrino: Правильно!
Эминья
2
Это кажется очень полезным и очень надоедливым ... Это интересно: o: D
HyperNeutrino
@HyperNeutrino: Это часто бывает удобно, но это может быть недостатком, когда в задаче говорится, возвращают истинное значение , когда многие языки могут возвращать любое положительное целое число или, возможно, даже непустую строку.
Эминья
Зачеркнутый номер не так легко увидеть!
MrZander
15

Python 3 , 40 байт

Сохранено 2 байта благодаря movatica .

lambda i:max(x*(i.count(x)<2)for x in i)

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

42 байта

Работает как для параметров типа String, так и для списка цифр. Выдает ошибку, если нет уникальных цифр.

lambda i:max(x for x in i if i.count(x)<2)

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


объяснение

  • lambda i: - Объявляет лямбда-функцию с параметром строки или списка цифр i.
  • max(...) - Находит максимальное значение генератора.
  • x for x in i- Перебирает символы / цифры i.
  • if i.count(x)<2 - Проверяет, является ли цифра уникальной.
Мистер Xcoder
источник
40 байтов:lambda i:max(x*(i.count(x)<2)for x in i)
movatica
1
@movatica Спасибо!
г-н Xcoder
8

Алиса , 15 байт

/&.sDo
\i-.tN@/

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

объяснение

/...
\.../

Это простая структура для линейного кода, которая работает полностью в обычном режиме (то есть эта программа работает полностью через обработку строк). Развернутый линейный код тогда просто:

i..DN&-sto@

Что оно делает:

i    Read all input as a string.
..   Make two copies.
D    Deduplicate the characters in the top copy.
N    Get the multiset complement of this deduplicated string in the input.
     This gives us a string that only contains repeated digits (with one
     copy less than the original, but the number of them doesn't matter).
&-   Fold string subtraction over this string, which means that each of
     the repeated digits is removed from the input.
s    Sort the remaining digits.
t    Split off the last digit.
o    Print it.
@    Terminate the program.
Мартин Эндер
источник
-1, не « вызывает безымянные ужасы из пустоты », если нет уникальных цифр. ;) (Читайте: +1, отличный ответ как всегда.)
Кевин Круйссен
1
@KevinCruijssen Я пытался, но это не спасло байты. Может быть, Dark может быть более подходящим языком ...
Мартин Эндер
7

Сетчатка , 16 байт

O`.
(.)\1+

!`.$

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

объяснение

O`.

Сортировать цифры.

(.)\1+

Удалить повторяющиеся цифры.

!`.$

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

Мартин Эндер
источник
Жаль, что дедупликация здесь не помогает :(
CalculatorFeline
7

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

Fχ¿⁼№θIι¹PIι

Попробуйте онлайн! (Ссылка на подробную версию)

Ничего не печатает, если решение не найдено. Хитрость заключается в том, что forцикл печатает каждое уникальное число во входной строке, но без перемещения курсора, поэтому значение продолжает самопечатываться до тех пор, пока не будет найдено окончательное решение.

Предыдущая версия печатала символы от A до Z, когда решение не было найдено, поэтому комментарии:

AααFχA⎇⁼№θIι¹Iιααα

Попробуйте онлайн! (Ссылка на подробную версию)

Чарли
источник
3
Это интересное неопределенное поведение :)
Emigna
Это звучит по-фински для меня: D
fedorqui
2
@Fedorqui приятно видеть тебя здесь! Да, но Charcoal легче освоить, чем Jelly или O5AB1E, и его забавнее использовать в играх, написанных в стиле ASCII. :-)
Чарли
7

Шелуха , 7 байт

→fo¬hgO

Попробуйте онлайн! (Набор тестов, вылетает в последнем тестовом примере, поскольку он не имеет уникальных цифр)

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

объяснение

Test case: "1948710498"

      O    Sort:                             "0114478899"
     g     Group consecutive equal elements: ["0","11","44","7","88","99"]
 fo¬h      Keep only those with length 1*:   ["0","7"]
→          Take the last element:            "7"

* Проверка длины 1 выполняется путем взятия заголовка списка (все элементы, кроме последнего) и его отрицания (пустые списки ложные, непустые списки правдивые).

Лео
источник
7

Haskell, 37 байт

f s=maximum[x|x<-s,[x]==filter(==x)s]

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

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

  [  |x<-s   ]          -- loop x through the input string s
    x                   -- and keep the x where
     [x]==filter(==x)s  -- all x extracted from s equal a singleton list [x]
maximum                 -- take the maximum of all the x
Ними
источник
7

R , 41 байт

function(x,y=table(x))max(names(y[y==1]))

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

tableвычисляет вхождения каждого элемента в списке, names(table(x))используя уникальные значения x(в виде строк). Так как цифры, к счастью, упорядочены так же, как и численно, мы можем их использовать max.

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

Giuseppe
источник
Ницца! Я не ожидал, что работа с чем- tableто будет короче (плюс я никогда не могу вспомнить, как приступить namesк работе).
aPaulT
1
<2для другого байта. Там никогда не должно быть ноль в счетах.
MickyT
1
y=table(scan());max(names(y[y<2]))на несколько байтов короче.
JAD
6

JavaScript (ES6), 46 41 40 байт

Принимает ввод в виде строки. Возвращает RangeError, если нет уникальных цифр.

s=>f=(i=9)=>s.split(i).length-2?f(--i):i

-7 байт благодаря Рику Хичкоку

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

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

Oki
источник
Удалить предупреждение на 39 байт: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Вы можете избежать переполнения стека 42 байт: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Рик Хичкок
Сохраните байт с каррированием, s=>g=(i=9)=>s.split(i).length-2?g(--i):iа затем назовите егоf("12")()
Shaggy
5

Python 3, 40 байт

lambda i:max(x+9-9*i.count(x)for x in i)

Работает только для списков цифр. Кромка '990' отлично работает :)

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

Алекс Варга
источник
Добро пожаловать в PPCG! Похоже, у вас есть все :)
Стивен
4

Брахилог , 8 байт

ọtᵒtᵍhth

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

объяснение

Example input: 495902

ọ          Occurences:    [[4,1],[9,2],[5,1],[0,1],[2,1]]
 tᵒ        Order by tail: [[0,1],[2,1],[4,1],[5,1],[9,2]]
   tᵍ      Group by tail: [[[0,1],[2,1],[4,1],[5,1]],[[9,2]]]
     h     Head:          [[0,1],[2,1],[4,1],[5,1]]
      t    Tail:          [5,1]
       h   Head:          5
Fatalize
источник
4

Шелуха , 9 8 байт

Спасибо Лео за то, что он предложил немного более аккуратное решение с тем же количеством байтов.

▲‡ȯf=1`#

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

объяснение

  ȯ       Compose the following thre functions into one binary function.
      `#  Count the occurrences of the right argument in the left.
    =1    Check equality with 1. This gives 1 (truthy) for values that 
          appear uniquely in the right-hand argument.
   f      Select the elements from the right argument, where the function
          in the left argument is truthy.
          Due to the composition and partial function application this
          means that the first argument of the resulting function actually
          curries `# and the second argument is passed as the second
          argument to f. So what we end up with is a function which selects
          the elements from the right argument that appear uniquely in
          the left argument.
 ‡        We call this function by giving it the input for both arguments.
          So we end up selecting unique digits from the input.
▲         Find the maximum.  
Мартин Эндер
источник
1
¬←может быть проще =1, то же самое bytecount :)
Лев
1
@ Leo Ах да, мне было лень проверять, будет ли карри работать без скобок. Мне нужно больше доверять выводу типа. ;)
Мартин Эндер
4

Mathematica, 41 байт

(t=9;While[DigitCount[#][[t]]!=1,t--];t)&

спасибо @Martin Ender

вот подход Мартина к моему ответу

Mathematica, 35 байт

9//.d_/;DigitCount[#][[d]]!=1:>d-1&
J42161217
источник
4

R, 45 43 байта

function(x)max(setdiff(x,x[duplicated(x)]))

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

Принимает ввод как вектор целых чисел. Находит дублированные элементы, удаляет их и берет максимум. (Возвращается -Infс предупреждением, если не существует уникального максимума.)

Отредактировано в анонимную функцию за комментарий

aPaulT
источник
max(x[!duplicated(x)])немного короче, но это отличный ответ. Я знал, как я собираюсь сделать это не было так хорошо. Также вы можете удалить f=с самого начала, так как анонимные функции являются совершенно корректными ответами. Кроме того, вы можете использовать TIO для проверки своих функций, если вы используете этот формат: попробуйте онлайн!
Джузеппе
Благодарность! Я думаю, что «дублированная» функция не учитывает первое вхождение дублированного элемента, поэтому ваша версия не будет работать
aPaulT
ах, хорошая мысль Я почти никогда не пользуюсь, duplicatedно на самом деле я придумал другой, более короткий ответ!
Джузеппе
3

Рубин , 42 байта

->x{(?0..?9).select{|r|x.count(r)==1}[-1]}

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

гигабайт
источник
Ruby связывает Python :)
Мистер Xcoder
Потому что 42 всегда ответ. :-)
GB
5
@ GB Или это:->x{x.chars.select{|r|x.count(r)<2}.max}
Мартин Эндер
1
Это было бы на 2 байта короче и разрушило бы все это. :-)
GB
3

APL (Dyalog Unicode) , 10 символов = 19 байтов

Метод: умножить элементы, которые встречаются несколько раз, на ноль, а затем наложить самый высокий элемент.

⌈/×∘(1=≢)⌸

 для каждого уникального элемента и его индексов в аргументе:

× умножить уникальный элемент

∘(... ) с:

  1= логическое значение, равное ли

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

⌈/ максимум этого

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

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

⌈/×∘(1=≢)⎕U2338

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

Идентично вышесказанному, но использует ⎕U2338вместо .

Адам
источник
3

Bash + coreutils, 30 28 байт

-2 байта благодаря цифровой травме

fold -1|sort|uniq -u|tail -1

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


Bash + coreutils, 20 байт

sort|uniq -u|tail -1

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

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

Райли
источник
Заменить grep -o .на, fold -1чтобы сохранить 2 байта. Я согласен, что входное целое число, представленное в виде списка цифр, слишком сильно расширяет правила.
Цифровая травма
+1 только потому, что это баш
Ануш
3

C # (.NET Core) , 27 97 86 58 57 75 байт

using System.Linq;

n=>n.GroupBy(i=>i).Where(i=>i.Count()<2).Max(i=>i.Key)-48

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

Спасибо @CarlosAlejo

kakkarot
источник
Это не работает с «1948710498» в качестве входных данных (возвращает «9» вместо «7»), и вы должны добавить using System.Linq;к числу байтов.
Чарли
@CarlosAlejo Ой! Сожалею! Только сейчас прочтите спецификации полностью. Скоро отредактирую решение.
Каккарот
Ред. Могу ли я сделать какие-либо оптимизации?
Каккарот
Конечно: попробуйте использовать OrderBy(...).Last()вместо .OrderByDescending(...).First(), например. Или, что еще лучше, измените свою последнюю часть .Max(i=>i.Key)после Whereпункта.
Чарли
@CarlosAlejo Спасибо! Ред.
Каккарот
2

JavaScript (ES6), 52 50 байт

Вводит в виде списка цифр. Возвращает, 0если нет уникальных цифр.

s=>s.reduce((m,c)=>m>c|s.filter(x=>x==c)[1]?m:c,0)

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

Arnauld
источник
2

Japt , 12 11 10 байт

Принимает ввод в виде массива цифр.

k@¬èX ÉÃrw

Попробуй это


объяснение

     :Implicit input of array U.
k    :Filter the array to the elements that return false when...
@    :Passed through a function that...
¬    :Joins U to a string and...
èX   :Counts the number of times the current element (X) appears in the string...
É    :Minus 1.
     :(The count of unique digits will be 1, 1-1=0, 0=false)
à   :End function.
r    :Reduce by...
w    :Getting the greater of the current element and the current value.
     :Implicit output of resulting single digit integer.
мохнатый
источник
2

Java (OpenJDK 8) , 89 85 79 байтов

a->{int i=10,x[]=new int[i];for(int d:a)x[d]++;for(;i-->0&&x[i]!=1;);return i;}

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

-6 байт благодаря пониманию @ KevinCruijssen!

Оливье Грегуар
источник
1
Вы можете заменить return i>0?i:0;на return i;. Выходные данные будут -1 для тестового примера [9,9,9,9,9,9], но это хорошо для задачи: « Если нет уникальных цифр, ваша программа может делать все что угодно (неопределенное поведение). ».
Кевин Круйссен
Действительно, я могу с нынешней ревизии. Раньше я не мог из-за контрольного примера 0. Это то, что я наблюдал в предыдущем гольфе! :)
Оливье Грегуар
2

APL (Dyalog) , 14 байтов

-2 благодаря TwiNight.

⌈/⊢×1=(+/∘.=⍨)

⌈/ самый большой из

 аргументы

× умножается на

1=(... ) логическое значение для каждого, где один равен

+/ строки суммы

∘.=⍨ их таблица равенства

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

Адам
источник
Поскольку 0никогда не бывает самой высокой уникальной цифры, кроме 0самой себя, вы можете сохранить 1 байт, используя ×вместо /⍨, а затем сохранить другой байт, преобразовав его в поезд
TwiNight
@TwiNight Хорошо! Спасибо.
Адам
1

Mathematica, 42 байта

Max@Position[RotateRight@DigitCount@#,1]-1&
J42161217
источник
1

F # , 88 байт

let f i=Seq.countBy(fun a->a)i|>Seq.maxBy(fun a->if snd a>1 then 0 else int(fst a))|>fst

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

Улучшенный подход с моей первой попытки приводит к меньшему количеству байтов.

Интересные места: fstи sndверните первый и второй элементы кортежа соответственно.


источник
1

Желе , 9 байт

ṢŒrṪỊ$ÐfṀ

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

Эрик Outgolfer
источник
хорошо
Leaky Nun
@LeakyNun превзошел, сынок
Skidsdev
@Mayube, но основной алгоритм тот же
Leaky Nun
@ LeakyNun нет, это совсем другое.
Стинберг
@LeakyNun Я решил опубликовать отдельно ... в основном большая разница в том, что в моем случае я просто решаю, что оставить, в то время как Стинбергу нужно несколько голов или что-то в этом роде ...
Эрик Аутгольфер
1

Pyth, 6 байт

eS.m/Q

Тестирование

Объяснение:

eS.m/Q
eS.m/QbQ    Implicit variable introduction
  .m   Q    Find all minimal elements of the input by the following function:
    /Qb     Number of appearances in the input
eS          Take the maximum element remaining.
isaacg
источник