Encontre o dígito único mais alto

33

Surpreendentemente, ainda não tivemos um desafio simples de "encontrar o dígito mais alto", mas acho que isso é um pouco trivial demais.

Dada a entrada de um número inteiro não negativo, retorne o dígito único mais alto (isto é, não repetido) encontrado no número inteiro. Se não houver dígitos únicos, seu programa poderá fazer qualquer coisa (comportamento indefinido).

A entrada pode ser tomada como um único número inteiro, uma sequência ou uma lista de dígitos.

Casos de teste

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

Isso é e o menor número de bytes em cada idioma vence!

Skidsdev
fonte
2
Podemos usar a entrada como uma string?
Kritixi Lithos
3
Dado o último caso de teste, acho que somos forçados a receber a entrada como uma string ... (os zeros à esquerda não podem ser representados em números inteiros) #
292
@Leo que era ruim de verdade, basicamente misturou os números no meu teclado, não percebeu o zero inicial. Mas sim, a entrada pode ser tomada como uma cadeia de caracteres
Skidsdev 28/06/19
25
@ Adám "comportamento indefinido" geralmente significa que você pode fazer qualquer coisa, incluindo convocar horrores sem nome do vazio, se isso salvar bytes.
Martin Ender
22
@MartinEnder na verdade eu vou alegremente derrubar 50% de seus bytes se o seu código com sucesso convocação Cthulhu sobre não haver dígitos únicos;)
Skidsdev

Respostas:

16

05AB1E , 4 3 bytes

Economizou 1 byte graças ao Sr. Xcoder notificando que uma lista de dígitos é uma entrada válida.

¢ÏM

Experimente online!

Explicação

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest
Emigna
fonte
Espere assim em 05AB1E, 2não é verdade; somente 1? : o
HyperNeutrino
@HyperNeutrino: Correto!
Emigna
2
Isso parece muito útil e muito incômodo ... Isso é interessante: o: D
HyperNeutrino 29/17/17
@HyperNeutrino: geralmente é útil, mas pode ser uma desvantagem quando o desafio diz retornar um valor verdadeiro , quando muitos idiomas podem retornar qualquer número inteiro positivo ou talvez uma string não vazia.
Emigna
Não é fácil ver um tachado no número de !
MrZander
15

Python 3 , 40 bytes

Economizou 2 bytes graças à movatica .

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

Experimente online!

42 bytes

Funciona para os tipos de parâmetros String e lista de dígitos. Lança um erro sem dígitos únicos, tipo de abuso dessa especificação:

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

Experimente online!


Explicação

  • lambda i: - Declara uma função lambda com uma sequência de caracteres ou lista de dígitos i.
  • max(...) - Encontra o valor máximo do gerador.
  • x for x in i- Repete os caracteres / dígitos de i.
  • if i.count(x)<2 - Verifica se o dígito é único.
Mr. Xcoder
fonte
40 bytes:lambda i:max(x*(i.count(x)<2)for x in i)
movatica
1
@movatica Thanks!
Sr. Xcoder
8

Alice , 15 bytes

/&.sDo
\i-.tN@/

Experimente online!

Explicação

/...
\.../

Essa é uma estrutura simples para código linear que opera inteiramente no modo Ordinal (o que significa que este programa funciona completamente através do processamento de cadeias). O código linear desdobrado é então apenas:

i..DN&-sto@

O que faz:

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.
Martin Ender
fonte
-1, não " invoca horrores sem nome do vazio " se não houver dígitos únicos. ;) (Leia: +1, grande resposta como sempre).
Kevin Cruijssen
1
@KevinCruijssen Eu tentei, mas não salvou bytes. Talvez escuro pode ser uma linguagem mais adequada ...
Martin Ender
7

Retina , 16 bytes

O`.
(.)\1+

!`.$

Experimente online!

Explicação

O`.

Classifique os dígitos.

(.)\1+

Remova os dígitos repetidos.

!`.$

Busque o último dígito (máximo).

Martin Ender
fonte
Pena que a desduplicação não ajuda aqui :(
CalculatorFeline
7

Carvão , 18 12 bytes

Fχ¿⁼№θIι¹PIι

Experimente online! (Link para a versão detalhada)

Não imprime nada se nenhuma solução for encontrada. O truque é que o forloop imprime todos os números únicos na string de entrada, mas sem mover o cursor, o valor continua sendo impresso novamente até que a solução final seja encontrada.

A versão anterior imprimiu os caracteres de A a Z quando nenhuma solução foi encontrada, daí os comentários:

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

Experimente online! (Link para a versão detalhada)

Charlie
fonte
3
Isso é um comportamento indefinido interessante :)
Emigna
Isso me parece finlandês: D
fedorqui 28/06
2
@fedorqui prazer em vê-lo aqui! Sim, mas o carvão é mais fácil de aprender do que o Jelly ou o O5AB1E, e é mais divertido de usar em jogos de arte ASCII. :-)
Charlie
7

Casca , 7 bytes

→fo¬hgO

Experimente online! (Conjunto de testes, falha no último caso de teste, pois não possui dígitos únicos)

Essa é uma composição de funções no estilo sem ponto (os argumentos não são mencionados explicitamente em nenhum lugar). Recebe e retorna a saída como uma string, que em Husk é equivalente a uma lista de caracteres.

Explicação

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"

* A verificação do comprimento 1 é feita pegando o cabeçalho da lista (todos os elementos, exceto o último) e negando-o (listas vazias são falsas, listas não vazias são verdadeiras).

Leo
fonte
7

Haskell, 37 bytes

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

Experimente online!

Como funciona:

  [  |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
nimi
fonte
7

R , 41 bytes

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

Uma função anônima que recebe uma lista de dígitos, como números inteiros ou seqüências de caracteres únicas. Ele precomputa ycomo argumento opcional para evitar o uso de chaves para o corpo da função. Retorna o dígito como uma sequência. Isso leva uma abordagem um pouco diferente da outra resposta R e acaba sendo um pouquinho menor! parece que meu comentário estava errado, afinal ...

tablecalcula as ocorrências de cada elemento na lista, com names(table(x))os valores exclusivos em x(como seqüências de caracteres). Felizmente, como os dígitos são ordenados da mesma forma lexicograficamente e numericamente, ainda podemos usá-lo max.

Experimente online!

Giuseppe
fonte
Agradável! Eu não esperava que algo tablefosse mais curto (e nunca me lembro de como começar namesa trabalhar).
aPaulT
1
<2por outro byte. Nunca deve haver um zero nas contagens.
MickyT
1
y=table(scan());max(names(y[y<2]))é alguns bytes mais curto.
JAD
6

JavaScript (ES6), 46 41 40 bytes

Recebe a entrada como uma sequência. Retorna RangeError se não houver dígitos únicos.

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

-7 bytes graças a Rick Hitchcock

-1 byte graças a Shaggy

Casos de teste

Tudo bem eu
fonte
Remova o alerta para 39 bytes: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Você pode evitar o estouro de pilha para 42 bytes: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
21717 Rick
Salvar um byte com currying: s=>g=(i=9)=>s.split(i).length-2?g(--i):ie, em seguida, chamá-lo comf("12")()
Shaggy
5

Python 3, 40 bytes

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

Funciona apenas para listas de dígitos. O case '990' da borda funciona bem :)

Experimente online!

Alex Varga
fonte
Bem-vindo ao PPCG! Parece que você tem tudo para baixo :)
Stephen
4

Braquilog , 8 bytes

ọtᵒtᵍhth

Experimente online!

Explicação

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
Fatalizar
fonte
4

Casca , 9 8 bytes

Agradecemos a Leo por sugerir uma solução um pouco mais limpa na mesma contagem de bytes.

▲‡ȯf=1`#

Experimente online!

Explicação

  ȯ       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.  
Martin Ender
fonte
1
¬←poderia ser mais simples =1, o mesmo bytecount embora :) #
288
1
@ Leo Ah, sim, eu estava com preguiça de testar se o curry funcionaria sem parênteses. Eu preciso confiar mais na inferência de tipo. ;)
Martin Ender
4

Mathematica, 41 bytes

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

obrigado @Martin Ender

aqui está a abordagem de Martin na minha resposta

Mathematica, 35 bytes

9//.d_/;DigitCount[#][[d]]!=1:>d-1&
J42161217
fonte
4

R, 45 43 bytes

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

Experimente online!

Recebe entrada como um vetor de números inteiros. Localiza os elementos duplicados, remove-os e utiliza o máximo. (Retorna -Infcom um aviso se não houver um máximo exclusivo.)

Editado em uma função anônima por comentário

aPaulT
fonte
max(x[!duplicated(x)])é um pouco mais curto, mas esta é uma ótima resposta. Eu sabia que o jeito que eu ia fazer não era tão bom. Além disso, você pode remover o arquivo f=desde o início, pois funções anônimas são respostas perfeitamente válidas. Além disso, você pode usar o TIO para testar suas funções se usar este formato: Experimente online!
Giuseppe
Obrigado! Eu acho que a função 'duplicado' não conta a primeira ocorrência de um elemento de segunda via assim a sua versão não teria bastante trabalho
aPaulT
ah, bom ponto. Eu quase nunca uso, duplicatedmas na verdade pensei em outra resposta mais curta!
Giuseppe
3

Ruby , 42 bytes

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

Experimente online!

GB
fonte
O Ruby amarra o Python :)
Sr. Xcoder
Porque 42 é sempre a resposta. :-)
GB
5
@GB Ou é:->x{x.chars.select{|r|x.count(r)<2}.max}
Martin Ender
1
Isso seria 2 bytes mais curto e arruinaria a coisa toda. :-)
GB
3

APL (Dyalog Unicode) , 10 caracteres = 19 bytes

Método: multiplique elementos que ocorrem várias vezes por zero e depois ajuste o elemento mais alto.

⌈/×∘(1=≢)⌸

 para cada elemento exclusivo e seus índices no argumento:

× multiplique o elemento único

∘() Com:

  1= o booleano para saber se um é igual a

   a contagem de índices (quantas vezes o elemento único ocorre)

⌈/ o máximo disso

Experimente online!

APL (Dyalog Classic) , 15 bytes

⌈/×∘(1=≢)⎕U2338

Experimente online!

Idêntico ao anterior, mas usa em ⎕U2338vez de .

Adão
fonte
3

Bash + coreutils, 30 28 bytes

-2 bytes graças ao Digital Trauma

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

Experimente online!


Bash + coreutils, 20 bytes

sort|uniq -u|tail -1

Experimente online!

Se a entrada for dada como uma lista de dígitos, um por linha, podemos pular o estágio de dobra. Isso parece trapaça.

Riley
fonte
Substitua grep -o .por fold -1para salvar 2 bytes. Concordo que um número inteiro de entrada fornecido como uma lista de dígitos está estendendo muito as regras.
Digital Trauma
+1 apenas porque é festança
Anush
3

Python 2 , 39 bytes

lambda l:max(1/l.count(n)*n for n in l)

Experimente online!

xnor
fonte
Eu gostei disso, é ótimo!
Anush
3

C # (.NET Core) , 27 97 86 58 57 75 bytes

using System.Linq;

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

Experimente online!

Obrigado @CarlosAlejo

kakkarot
fonte
Isso não funciona com "1948710498" como entrada (retorna "9" em vez de "7") e você deve adicionar using System.Linq;à contagem de bytes.
Charlie
@CarlosAlejo Oops! Desculpe! Agora, leia as especificações completamente. Editará a solução em breve.
kakkarot
Editado. Existem otimizações que posso fazer?
kakkarot
Claro: tente usar em OrderBy(...).Last()vez de .OrderByDescending(...).First(), por exemplo. Ou melhor ainda, altere sua última parte .Max(i=>i.Key)após a Wherecláusula.
Charlie
@CarlosAlejo Thanks! Editado.
kakkarot
2

JavaScript (ES6), 52 50 bytes

Recebe a entrada como uma lista de dígitos. Retorna 0se não houver dígitos únicos.

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

Casos de teste

Arnauld
fonte
2

Japonês , 12 11 10 bytes

Recebe a entrada como uma matriz de dígitos.

k@¬èX ÉÃrw

Teste-o


Explicação

     :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.
Shaggy
fonte
2

Java (OpenJDK 8) , 89 85 79 bytes

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

Experimente online!

-6 bytes graças à visão de @ KevinCruijssen!

Olivier Grégoire
fonte
1
Você pode substituir return i>0?i:0;por return i;. A saída será -1 para o caso de teste [9,9,9,9,9,9], mas está bem com o desafio: " Se não houver dígitos únicos, seu programa poderá fazer qualquer coisa (comportamento indefinido). ".
Kevin Cruijssen
Na verdade, eu posso desde a revisão atual. Antes eu não podia por causa do caso de teste 0. É algo que eu supervisionei no golfe anterior! :)
Olivier Grégoire
2

APL (Dyalog) , 14 bytes

-2 graças aTwiNight.

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

⌈/ o maior de

 os argumentos

× multiplicado por

1=() O booleano para cada um onde é igual

+/ a linha soma de

∘.=⍨ sua tabela de igualdade

Experimente online!

Adão
fonte
Desde 0nunca é o maior dígito único, exceto para 0si mesmo, você pode economizar 1 byte usando ×em vez de /⍨, em seguida, salvar outro byte converter isso em um trem
TwiNight
@TwiNight Nice! Obrigado.
Adám
1

Mathematica, 42 bytes

Max@Position[RotateRight@DigitCount@#,1]-1&
J42161217
fonte
1

F # , 88 bytes

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

Experimente online!

Uma abordagem aprimorada do meu primeiro esforço resulta em menos bytes.

Pontos de interesse: fste sndretorne o primeiro e o segundo elementos de uma tupla, respectivamente.


fonte
1

Geléia , 9 bytes

ṢŒrṪỊ$ÐfṀ

Experimente online!

Erik, o Outgolfer
fonte
bem
Leaky Nun
@LeakyNun superou, filho
Skidsdev 28/06
@ Mayay, mas o algoritmo do núcleo é o mesmo #
Leaky Nun
@LeakyNun não, é bem diferente.
steenbergh
@LeakyNun resolvi postar separadamente ... basicamente uma grande diferença é que no meu caso eu simplesmente decidir que para manter, enquanto steenbergh leva algumas cabeças ou algo assim ...
Erik o Outgolfer
1

Pitão, 6 bytes

eS.m/Q

Suíte de teste

Explicação:

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
fonte