Знайдіть найвищу унікальну цифру


33

Несподівано у нас не було просто «знайти найвищу цифру» виклик, але я думаю , що це трохи занадто тривіальним.

З огляду на введення невід'ємного цілого числа, поверніть найвищу унікальну (тобто не повторну) цифру, знайдену в цілому. Якщо немає унікальних цифр, ваша програма може зробити що завгодно (невизначена поведінка).

Введення можна сприймати як одне ціле число, рядок або список цифр.

Тестові справи

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

Це тому виграє найменше байтів на кожній мові !


2
Чи можемо ми замість цього взяти введення як рядок?
Kritixi Lithos

3
Враховуючи останній тестовий випадок, я думаю, що ми змушені сприймати введення як рядок ... (провідні нулі не можуть бути представлені цілими числами)
Лев,

@Leo, це було моє погано насправді, в основному пюре цифри на моїй клавіатурі, не помітив провідний нуль. Але так, введення можна сприймати як рядок
Skidsdev

25
@ Adám "невизначена поведінка", як правило, означає, що ви можете робити все, включаючи виклик безіменних жахів з порожнечі, якщо це економить байти.
Мартін Ендер

22
@MartinEnder насправді я з задоволенням збиватиму 50% ваших байтів, якщо ваш код успішно викликає cthulhu на те, що немає унікальних цифр;)
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 байти

Працює як для рядка, так і для списку типів параметрів цифр. Здається помилка за відсутність унікальних цифр, таких зловживань щодо цієї характеристики:

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 Я спробував, але байт не врятував. Можливо, Темний може бути більш підходящою мовою ...
Мартін Ендер


7

Вугілля деревне , 18 12 байт

Fχ¿⁼№θIι¹PIι

Спробуйте в Інтернеті! (Посилання на багатослівну версію)

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

У попередній версії надруковано символи від A до Z, коли рішення не знайдено, звідси коментарі:

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

Спробуйте в Інтернеті! (Посилання на багатослівну версію)


3
Це цікава невизначена поведінка :)
Emigna

Для мене це звучить фінською мовою: D
fedorqui

2
@fedorqui приємно бачити вас тут! Так, але вугілля легше вивчити, ніж 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

Хаскелл, 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 байт завдяки Шаггі

Тестові справи


Видалити попередження на 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, той же самий рахунок, хоча :)
Лев,

1
@Leo Ага так, мені було дуже ліно перевіряти, чи спрацює каррінг без дужок. Мені потрібно більше довіряти виводу типу. ;)
Мартін Ендер

4

Математика, 41 байт

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

дякую @Martin Ender

ось підхід Мартіна щодо моєї відповіді

Математика, 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], але це добре з викликом: " Якщо немає унікальних цифр, ваша програма може зробити що завгодно (невизначена поведінка). ".
Kevin Cruijssen

Дійсно, я можу з моменту поточної редакції. До цього я не міг через тестовий випадок 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 перевершив, син
Скидсдев

@Mayube, але основний алгоритм той самий
Leaky Nun

@LeakyNun ні, це зовсім інше.
steenbergh

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