Encuentra el dígito único más alto

33

Sorprendentemente, no hemos tenido un simple "encontrar el dígito más alto" desafío todavía, pero creo que es un poco demasiado trivial.

Dada la entrada de un entero no negativo, devuelve el dígito único más alto (es decir, no repetido) encontrado en el entero. Si no hay dígitos únicos, su programa puede hacer cualquier cosa (comportamiento indefinido).

La entrada se puede tomar como un entero entero, una cadena o una lista de dígitos.

Casos de prueba

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

Este es el por lo que gana menos bytes en cada idioma .

Skidsdev
fuente
2
¿Podemos tomar la entrada como una cadena en su lugar?
Kritixi Lithos
3
Dado el último caso de prueba, creo que nos vemos obligados a tomar la entrada como una cadena ... (los ceros iniciales no se pueden representar en enteros)
Leo
@Leo, esa fue mi mala realidad, básicamente puré los números en mi teclado, no notó el cero inicial. Pero sí, la entrada se puede tomar como una cadena
Skidsdev
25
@ Adám "comportamiento indefinido" generalmente significa que puedes hacer cualquier cosa, incluso invocar horrores sin nombre desde el vacío si eso ahorra bytes.
Martin Ender
22
@MartinEnder, de hecho, felizmente eliminaré el 50% de sus bytes si su código invoca exitosamente a cthulhu si no hay dígitos únicos;)
Skidsdev

Respuestas:

16

05AB1E , 4 3 bytes

Se guardó 1 byte gracias al Sr. Xcoder que notificó que una lista de dígitos es una entrada válida.

¢ÏM

Pruébalo en línea!

Explicación

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest
Emigna
fuente
Espera así en 05AB1E, 2no es verdad; solo 1? : o
HyperNeutrino
@HyperNeutrino: ¡Correcto!
Emigna
2
Eso parece muy útil y muy molesto ... Eso es interesante: o: D
HyperNeutrino
@HyperNeutrino: a menudo resulta útil, pero puede ser una desventaja cuando el desafío dice que devuelve un valor verdadero , cuando muchos idiomas pueden devolver cualquier número entero positivo o incluso una cadena no vacía.
Emigna
¡ No es fácil ver un tachado en el número !
MrZander
15

Python 3 , 40 bytes

Guardado 2 bytes gracias a movatica .

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

Pruébalo en línea!

42 bytes

Funciona tanto para String como para tipos de parámetros de lista de dígitos. Lanza un error sin dígitos únicos, tipo de abusos de esa especificación:

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

Pruébalo en línea!


Explicación

  • lambda i: - Declara una función lambda con una cadena o una lista de dígitos parámetro i.
  • max(...) - Encuentra el valor máximo del generador.
  • x for x in i- Itera a través de los caracteres / dígitos de i.
  • if i.count(x)<2 - Comprueba si el dígito es único.
Sr. Xcoder
fuente
40 bytes:lambda i:max(x*(i.count(x)<2)for x in i)
movatica
1
@movatica ¡Gracias!
Sr. Xcoder
8

Alice , 15 bytes

/&.sDo
\i-.tN@/

Pruébalo en línea!

Explicación

/...
\.../

Este es un marco simple para código lineal que opera completamente en modo Ordinal (lo que significa que este programa funciona completamente a través del procesamiento de cadenas). El código lineal desplegado es simplemente:

i..DN&-sto@

Que hace:

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
fuente
-1, no " invoca horrores sin nombre del vacío " si no hay dígitos únicos. ;) (Lea: +1, gran respuesta como siempre.)
Kevin Cruijssen
1
@KevinCruijssen Lo intenté, pero no guardó bytes. Quizás Dark podría ser un lenguaje más apropiado ...
Martin Ender
7

Retina , 16 bytes

O`.
(.)\1+

!`.$

Pruébalo en línea!

Explicación

O`.

Ordenar los dígitos.

(.)\1+

Eliminar dígitos repetidos.

!`.$

Obtenga el último dígito (máximo).

Martin Ender
fuente
Lástima que Deduplicate no ayude aquí :(
CalculatorFeline
7

Carbón , 18 12 bytes

Fχ¿⁼№θIι¹PIι

Pruébalo en línea! (Enlace a la versión detallada)

No imprime nada si no se encuentra una solución. El truco es que el forbucle imprime cada número único en la cadena de entrada, pero sin mover el cursor, por lo tanto, el valor sigue reimprimiéndose hasta que se encuentra la solución final.

La versión anterior imprimió los caracteres de la A a la Z cuando no se encontró una solución, de ahí los comentarios:

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

Pruébalo en línea! (Enlace a la versión detallada)

Charlie
fuente
3
Ese es un comportamiento indefinido interesante :)
Emigna
Esto me suena finlandés: D
fedorqui
2
@fedorqui es bueno verte aquí! Sí, pero el carbón es más fácil de aprender que Jelly o O5AB1E, y es más divertido de usar en los juegos de arte ASCII. :-)
Charlie
7

Casco , 7 bytes

→fo¬hgO

Pruébalo en línea! (Conjunto de pruebas, se bloquea en el último caso de prueba ya que no tiene dígitos únicos)

Esta es una composición de funciones en estilo libre de puntos (los argumentos no se mencionan explícitamente en ninguna parte). Toma la entrada y devuelve la salida como una cadena, que en Husk es equivalente a una lista de caracteres.

Explicación

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"

* La verificación de la longitud 1 se realiza tomando el encabezado de la lista (todos los elementos excepto el último) y negándolo (las listas vacías son falsas, las listas no vacías son verdaderas).

León
fuente
7

Haskell, 37 bytes

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

Pruébalo en línea!

Cómo 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
fuente
7

R , 41 bytes

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

Una función anónima que toma una lista de dígitos, ya sea como enteros o cadenas de caracteres individuales. Precalcula ycomo argumento opcional para evitar el uso de llaves para el cuerpo de la función. Devuelve el dígito como una cadena. ¡Esto toma un enfoque ligeramente diferente al de la otra respuesta R y termina siendo el más pequeño! Parece que mi comentario fue incorrecto después de todo ...

tablecalcula las ocurrencias de cada elemento en la lista, con names(table(x))los valores únicos en x(como cadenas). Dado que, afortunadamente, los dígitos se ordenan de la misma forma lexicográfica que numérica, aún podemos usarlos max.

Pruébalo en línea!

Giuseppe
fuente
¡Agradable! No esperaba que hacer algo tablefuera más corto (además, nunca recuerdo cómo llegar namesal trabajo).
aPaulT
1
<2por otro byte Nunca debe haber un cero en los recuentos.
MickyT
1
y=table(scan());max(names(y[y<2]))es unos pocos bytes más corto.
JAD
6

JavaScript (ES6), 46 41 40 bytes

Toma la entrada como una cadena. Devuelve RangeError si no hay dígitos únicos.

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

-7 bytes gracias a Rick Hitchcock

-1 byte gracias a Shaggy

Casos de prueba

Oki
fuente
Retire la alerta para 39 bytes: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Puede evitar el desbordamiento de pila de 42 bytes: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Rick Hitchcock
Ahorre un byte con curry: s=>g=(i=9)=>s.split(i).length-2?g(--i):iy luego llámelo conf("12")()
Shaggy
5

Python 3, 40 bytes

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

Solo funciona para listas de dígitos. El caso de borde '990' funciona bien :)

Pruébalo en línea!

Alex Varga
fuente
Bienvenido a PPCG! Parece que tienes todo abajo :)
Stephen
4

Brachylog , 8 bytes

ọtᵒtᵍhth

Pruébalo en línea!

Explicación

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
fuente
4

Casco , 9 8 bytes

Gracias a Leo por sugerir una solución un poco más ordenada con el mismo número de bytes.

▲‡ȯf=1`#

Pruébalo en línea!

Explicación

  ȯ       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
fuente
1
¬←podría ser más simple =1, el mismo bytecount :)
Leo
1
@Leo Ah, sí, era demasiado vago para probar si el curry funcionaría sin paréntesis. Necesito confiar más en la inferencia de tipos. ;)
Martin Ender
4

Mathematica, 41 bytes

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

gracias @Martin Ender

aquí está el enfoque de Martin en mi respuesta

Mathematica, 35 bytes

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

R, 45 43 bytes

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

Pruébalo en línea!

Toma la entrada como un vector de enteros. Encuentra los elementos duplicados, los elimina y toma el máximo. (Regresa -Infcon una advertencia si no hay un máximo único).

Editado en una función anónima por comentario

aPaulT
fuente
max(x[!duplicated(x)])es bastante más corto, pero esta es una gran respuesta. Sabía que lo que iba a hacer no era tan bueno. También puede eliminar f=desde el principio, ya que las funciones anónimas son respuestas perfectamente válidas. Además, puede usar TIO para probar sus funciones si usa este formato: ¡ Pruébelo en línea!
Giuseppe
¡Gracias! Creo que la función 'duplicada' no cuenta la primera aparición de un elemento duplicado, por lo que su versión no funcionaría
aPaulT
Ah, buen punto. Casi nunca uso, ¡ duplicatedpero en realidad pensé en otra respuesta más corta!
Giuseppe
3

Ruby , 42 bytes

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

Pruébalo en línea!

GB
fuente
Ruby ata a Python :)
Sr. Xcoder
Porque 42 es siempre la respuesta. :-)
GB
55
@GB O es:->x{x.chars.select{|r|x.count(r)<2}.max}
Martin Ender
1
Eso sería 2 bytes más corto y arruinaría todo. :-)
GB
3

APL (Dyalog Unicode) , 10 caracteres = 19 bytes

Método: multiplique elementos que ocurren varias veces por cero y luego multa el elemento más alto.

⌈/×∘(1=≢)⌸

 para cada elemento único y sus índices en el argumento:

× multiplicar el elemento único

∘(... ) con:

  1= el booleano para saber si uno es igual a

   el recuento de índices (cuántas veces se produce el elemento único)

⌈/ el máximo de eso

Pruébalo en línea!

APL (Dyalog Classic) , 15 bytes

⌈/×∘(1=≢)⎕U2338

Pruébalo en línea!

Idéntico a lo anterior, pero utiliza en ⎕U2338lugar de .

Adán
fuente
3

Bash + coreutils, 30 28 bytes

-2 bytes gracias a Digital Trauma

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

Pruébalo en línea!


Bash + coreutils, 20 bytes

sort|uniq -u|tail -1

Pruébalo en línea!

Si la entrada se proporciona como una lista de dígitos, uno por línea, podemos omitir la etapa de plegado. Sin embargo, eso se siente como hacer trampa.

Riley
fuente
Reemplace grep -o .con fold -1para guardar 2 bytes. Estoy de acuerdo en que un entero de entrada dado como una lista de dígitos está estirando demasiado las reglas.
Trauma digital
+1 solo porque es bash
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

Pruébalo en línea!

Gracias @CarlosAlejo

kakkarot
fuente
Esto no funciona con "1948710498" como entrada (devuelve "9" en lugar de "7"), y debe agregar using System.Linq;al conteo de bytes.
Charlie
@CarlosAlejo ¡Vaya! ¡Lo siento! Justo ahora lea las especificaciones completamente. Editaré la solución pronto.
kakkarot
Editado ¿Hay alguna optimización que pueda hacer?
kakkarot
Claro: intente usar en OrderBy(...).Last()lugar de .OrderByDescending(...).First(), por ejemplo. O incluso mejor, cambie su última parte .Max(i=>i.Key)después de la Wherecláusula.
Charlie
@CarlosAlejo ¡Gracias! Editado
kakkarot
2

JavaScript (ES6), 52 50 bytes

Toma la entrada como una lista de dígitos. Devuelve 0si no hay dígitos únicos.

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

Casos de prueba

Arnauld
fuente
2

Japt , 12 11 10 bytes

Toma la entrada como una matriz de dígitos.

k@¬èX ÉÃrw

Pruébalo


Explicación

     :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.
Lanudo
fuente
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;}

Pruébalo en línea!

-6 bytes gracias a la idea de @ KevinCruijssen!

Olivier Grégoire
fuente
1
Se puede reemplazar return i>0?i:0;con return i;. La salida será -1 para el caso de prueba [9,9,9,9,9,9], pero eso está bien con el desafío: " Si no hay dígitos únicos, su programa puede hacer cualquier cosa (comportamiento indefinido) ".
Kevin Cruijssen
De hecho, puedo desde la revisión actual. Antes no podía por el caso de prueba 0. ¡Es algo que supervisé en el golf anterior! :)
Olivier Grégoire
2

APL (Dyalog) , 14 bytes

-2 gracias aTwiNight.

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

⌈/ el más grande de

 los argumentos

× multiplicado por

1=(... ) el booleano para cada uno donde uno es igual

+/ la fila suma de

∘.=⍨ su tabla de igualdad

Pruébalo en línea!

Adán
fuente
Como 0nunca es el dígito único más alto, excepto por 0sí mismo, puede guardar 1 byte usando en ×lugar de /⍨, luego guardar otro byte convirtiéndolo en un tren
TwiNight
@TwiNight Nice! Gracias.
Adám
1

Mathematica, 42 bytes

Max@Position[RotateRight@DigitCount@#,1]-1&
J42161217
fuente
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

Pruébalo en línea!

Un enfoque mejorado desde mi primer esfuerzo, resulta en menos bytes.

Puntos de interés: fsty snddevolver el primer y el segundo elemento de una tupla respectivamente.


fuente
1

Jalea , 9 bytes

ṢŒrṪỊ$ÐfṀ

Pruébalo en línea!

Erik el Outgolfer
fuente
bien
Leaky Nun
@LeakyNun outgolfed, hijo
Skidsdev
@Mayube pero el algoritmo central es el mismo
Leaky Nun
@LeakyNun no, es bastante diferente.
steenbergh
@LeakyNun Decidí publicar por separado ... básicamente, una gran diferencia es que en mi caso solo decido qué guardar, mientras steenbergh toma algunas cabezas o algo así ...
Erik the Outgolfer
1

Pyth, 6 bytes

eS.m/Q

Banco de pruebas

Explicación:

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
fuente