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


33

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

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

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

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

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

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


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

Ждать так в 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 - Проверяет, является ли цифра уникальной.

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

Древесный уголь , 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.

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


Ницца! Я не ожидал, что работа с чем- 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

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


Удалить предупреждение на 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



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&

4

R, 45 43 байта

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

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

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

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


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

Благодарность! Я думаю, что «дублированная» функция не учитывает первое вхождение дублированного элемента, поэтому ваша версия не будет работать
aPaulT

ах, хорошая мысль Я почти никогда не пользуюсь, duplicatedно на самом деле я придумал другой, более короткий ответ!
Джузеппе


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


Это не работает с «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)

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


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

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Ṁ

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



@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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.