Finden Sie die höchste eindeutige Ziffer


33

Überraschenderweise hatten wir noch keine einfache Herausforderung, die höchste Ziffer zu finden, aber ich denke, das ist etwas zu trivial.

Bei Eingabe einer nicht negativen Ganzzahl wird die höchste eindeutige (dh nicht wiederholte) Ziffer zurückgegeben, die in der Ganzzahl gefunden wurde. Wenn es keine eindeutigen Ziffern gibt, kann Ihr Programm alles tun (undefiniertes Verhalten).

Die Eingabe kann als einzelne Ganzzahl, Zeichenfolge oder Ziffernliste erfolgen.

Testfälle

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

Dies ist so dass die wenigsten Bytes in jeder Sprache gewinnen!


2
Können wir stattdessen Eingaben als Zeichenfolge verwenden?
Kritixi Lithos

3
Angesichts des letzten Testfalls sind wir meiner Meinung nach gezwungen, Eingaben als Zeichenfolge zu verwenden ... (führende Nullen können nicht in Ganzzahlen dargestellt werden)
Leo

@Leo, das war mein schlechtes eigentlich, im Grunde die Zahlen auf meiner Tastatur gestampft, bemerkte nicht die führende Null. Aber ja, die Eingabe kann als String
interpretiert werden

25
@ Adám "undefiniertes Verhalten" bedeutet im Allgemeinen, dass Sie alles tun können, einschließlich der Beschwörung namenloser Schrecken aus der Leere, wenn dies Bytes spart.
Martin Ender

22
@MartinEnder in der Tat werde ich glücklich 50% Ihrer Bytes abschlagen, wenn Ihr Code erfolgreich Cthulhu aufruft, wenn es keine eindeutigen Ziffern gibt;)
Skidsdev

Antworten:


16

05AB1E , 4 3 Bytes

1 Byte gespeichert , da Mr. Xcoder mitteilt, dass eine Ziffernliste eine gültige Eingabe ist.

¢ÏM

Probieren Sie es online!

Erläuterung

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest

Warten Sie so in 05AB1E, 2ist nicht wahr; nur 1? : o
HyperNeutrino

@ HyperNeutrino: Richtig!
Emigna

2
Das scheint sowohl sehr nützlich als auch sehr lästig zu sein ... Das ist interessant: o: D
HyperNeutrino

@HyperNeutrino: Es ist oft nützlich, aber es kann ein Nachteil sein, wenn die Abfrage den Wert "return" angibt , wenn viele Sprachen eine positive Ganzzahl oder sogar eine nicht leere Zeichenfolge zurückgeben können.
Emigna

Ein Durchstreichen der Nummer für ist nicht leicht zu erkennen!
MrZander

15

Python 3 , 40 Bytes

2 Bytes gespart dank movatica .

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

Probieren Sie es online!

42 Bytes

Funktioniert sowohl für Zeichenfolgen- als auch für Ziffern-Parametertypen. Wirft einen Fehler für keine eindeutigen Ziffern, Art des Missbrauchs dieser Spezifikation:

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

Probieren Sie es online!


Erläuterung

  • lambda i: - Deklariert eine Lambda-Funktion mit einem String oder einer Liste von Ziffern, Parameter i.
  • max(...) - Findet den Maximalwert des Generators.
  • x for x in i- Durchläuft die Zeichen / Ziffern von i.
  • if i.count(x)<2 - Überprüft, ob die Ziffer eindeutig ist.

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

1
@movatica Danke!
Mr. Xcoder

8

Alice , 15 Bytes

/&.sDo
\i-.tN@/

Probieren Sie es online!

Erläuterung

/...
\.../

Dies ist ein einfaches Framework für linearen Code, das vollständig im Ordinal-Modus ausgeführt wird (dh, dieses Programm arbeitet vollständig mit Zeichenfolgen). Der entfaltete lineare Code ist dann einfach:

i..DN&-sto@

Was es macht:

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, " beschwört keine namenlosen Schrecken aus der Leere ", wenn es keine eindeutigen Ziffern gibt. ;) (Gelesen: +1, tolle Antwort wie immer.)
Kevin Cruijssen

1
@ KevinCruijssen Ich habe es versucht, aber es hat keine Bytes gespeichert. Vielleicht ist Dunkel eine passendere Sprache ...
Martin Ender


7

Kohle , 18 12 Bytes

Fχ¿⁼№θIι¹PIι

Probieren Sie es online! (Link zur ausführlichen Version)

Druckt nichts, wenn keine Lösung gefunden wird. Der Trick besteht darin, dass die forSchleife jede eindeutige Zahl in der Eingabezeichenfolge ausgibt, ohne den Cursor zu bewegen. Der Wert wird also so lange selbst gedruckt, bis die endgültige Lösung gefunden ist.

In der vorherigen Version wurden die Zeichen A bis Z gedruckt, als keine Lösung gefunden wurde, daher die Kommentare:

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

Probieren Sie es online! (Link zur ausführlichen Version)


3
Das ist ein interessantes undefiniertes Verhalten :)
Emigna

Das klingt für mich finnisch: D
fedorqui

2
@fedorqui schön dich hier zu sehen! Ja, aber Charcoal ist leichter zu erlernen als Jelly oder O5AB1E, und es macht mehr Spaß, es in ASCII-Kunstspielen zu verwenden. :-)
Charlie

7

Schale , 7 Bytes

→fo¬hgO

Probieren Sie es online! (Testsuite, stürzt beim letzten Testfall ab, da sie keine eindeutigen Ziffern enthält)

Hierbei handelt es sich um eine Komposition von Funktionen in punktfreiem Stil (die Argumente werden nirgendwo explizit erwähnt). Übernimmt die Eingabe und gibt die Ausgabe als Zeichenfolge zurück, was in Husk einer Liste von Zeichen entspricht.

Erläuterung

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"

* Die Prüfung auf Länge 1 erfolgt, indem der Kopf der Liste (alle Elemente außer dem letzten) genommen und negiert wird (leere Listen sind falsch, nicht leere Listen sind wahr).


7

Haskell, 37 Bytes

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

Probieren Sie es online!

Wie es funktioniert:

  [  |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 Bytes

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

Eine anonyme Funktion, die eine Liste von Ziffern entweder als Ganzzahlen oder als einzelne Zeichenfolgen akzeptiert. Es wird yals optionales Argument vorberechnet , um die Verwendung von geschweiften Klammern für den Funktionskörper zu vermeiden. Liefert die Ziffer als String. Dies sieht ein wenig anders aus als die andere R-Antwort und ist am Ende das kleinste bisschen kürzer! sieht aus wie mein Kommentar da doch falsch war ...

tableberechnet das Vorkommen jedes Elements in der Liste, wobei names(table(x))es sich um die eindeutigen Werte in x(als Zeichenfolgen) handelt. Da die Ziffern glücklicherweise lexikografisch wie numerisch gleich geordnet sind, können wir sie weiterhin verwenden max.

Probieren Sie es online!


Nett! Ich hätte nicht erwartet, dass etwas tablekürzer wird (außerdem kann ich mich nie erinnern, wie ich nameszur Arbeit komme ).
aPaulT

1
<2für ein anderes Byte. Es sollte niemals eine Null in den Zählungen geben.
MickyT

1
y=table(scan());max(names(y[y<2]))ist ein paar Bytes kürzer.
JAD

6

JavaScript (ES6), 46 41 40 Byte

Übernimmt die Eingabe als Zeichenfolge. Gibt RangeError zurück, wenn keine eindeutigen Ziffern vorhanden sind.

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

-7 Bytes dank Rick Hitchcock

-1 Byte dank Shaggy

Testfälle


Entfernen Sie die Warnung für 39 Bytes: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Sie können den Stack - Überlauf für 42 Bytes vermeiden: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Rick Hitchcock

Speichern Sie ein Byte mit currying: s=>g=(i=9)=>s.split(i).length-2?g(--i):iund rufen Sie es dann mitf("12")()
Shaggy

5

Python 3, 40 Bytes

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

Funktioniert nur für Ziffernlisten. Das Edge-Case '990' funktioniert einwandfrei :)

Probieren Sie es online!


Willkommen bei PPCG! Sieht so aus, als hättest du alles im Griff :)
Stephen

4

Brachylog , 8 Bytes

ọtᵒtᵍhth

Probieren Sie es online!

Erläuterung

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

4

Schale , 9 8 Bytes

Vielen Dank an Leo, der eine etwas übersichtlichere Lösung bei gleicher Byteanzahl vorgeschlagen hat.

▲‡ȯf=1`#

Probieren Sie es online!

Erläuterung

  ȯ       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
¬←könnte einfacher sein =1, das gleiche bytecount obwohl :)
Leo

1
@Leo Ah ja, ich war zu faul zu testen, ob das Currying ohne Klammern funktionieren würde. Ich muss mehr auf die Typinferenz vertrauen. ;)
Martin Ender

4

Mathematica, 41 Bytes

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

danke @Martin Ender

Hier ist Martins Ansatz für meine Antwort

Mathematica, 35 Bytes

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

4

R 45 43 Bytes

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

Probieren Sie es online!

Nimmt die Eingabe als Vektor von ganzen Zahlen. Findet die duplizierten Elemente, entfernt sie und nimmt das Maximum ein. (Kehrt -Infmit einer Warnung zurück, wenn es kein eindeutiges Maximum gibt.)

Wird per Kommentar in eine anonyme Funktion umgewandelt


max(x[!duplicated(x)])ist ziemlich viel kürzer, aber das ist eine gute Antwort. Ich wusste, dass meine Vorgehensweise nicht so gut war. Auch kann man das f=von Anfang an entfernen , da anonyme Funktionen durchaus gültige Antworten sind. Sie können TIO auch zum Testen Ihrer Funktionen verwenden, wenn Sie dieses Format verwenden: Probieren Sie es online aus!
Giuseppe

Vielen Dank! Ich denke, die Funktion "dupliziert" zählt nicht das erste Auftreten eines doppelten Elements, so dass Ihre Version nicht ganz funktioniert
am

Ah, guter Punkt. Ich benutze fast nie, duplicatedaber ich habe mir tatsächlich eine andere, kürzere Antwort ausgedacht!
Giuseppe


3

APL (Dyalog Unicode) , 10 Zeichen = 19 Byte

Methode: Multiplizieren Sie Elemente, die mehrfach vorkommen, mit Null und verfeinern Sie dann das höchste Element.

⌈/×∘(1=≢)⌸

 für jedes einzelne Element und seine Indizes im Argument:

× multiplizieren Sie das einzigartige Element

∘() Mit:

  1= der Boolesche Wert, ob man gleich ist

   die Anzahl der Indizes (wie oft das eindeutige Element vorkommt)

⌈/ das Maximum davon

Probieren Sie es online!

APL (Dyalog Classic) , 15 Byte

⌈/×∘(1=≢)⎕U2338

Probieren Sie es online!

Identisch mit den oben genannten, aber verwendet ⎕U2338anstelle von .


3

Bash + Coreutils, 30 28 Bytes

-2 Bytes dank Digital Trauma

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

Probieren Sie es online!


Bash + Coreutils, 20 Bytes

sort|uniq -u|tail -1

Probieren Sie es online!

Wenn die Eingabe als Ziffernliste erfolgt, eine pro Zeile, können wir die Fold-Phase überspringen. Das fühlt sich an wie Betrug.


Ersetzen Sie grep -o .durch fold -1, um 2 Bytes zu sparen. Ich bin damit einverstanden, dass eine als Liste von Ziffern angegebene Ganzzahl die Regeln zu weit ausdehnt.
Digital Trauma

+1 nur weil es bash ist
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

Probieren Sie es online!

Vielen Dank @CarlosAlejo


Dies funktioniert nicht mit "1948710498" als Eingabe (gibt "9" anstelle von "7" zurück), und Sie müssen die Byteanzahl erhöhen using System.Linq;.
Charlie

@CarlosAlejo Hoppla! Es tut uns leid! Lesen Sie erst jetzt die technischen Daten vollständig. Wird die Lösung bald bearbeiten.
Kakkarot

Bearbeitet Gibt es Optimierungen, die ich vornehmen kann?
Kakkarot

Sicher: versuchen Sie es mit OrderBy(...).Last()statt .OrderByDescending(...).First(), zum Beispiel. Oder noch besser, ändern Sie Ihren letzten Teil mit .Max(i=>i.Key)nach der WhereKlausel.
Charlie

@ Carlos Alejo Vielen Dank! Bearbeitet
Kakkarot

2

JavaScript (ES6), 52 bis 50 Byte

Übernimmt die Eingabe als Ziffernliste. Gibt zurück, 0wenn keine eindeutigen Ziffern vorhanden sind.

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

Testfälle


2

Japt , 12 11 10 Bytes

Nimmt die Eingabe als ein Array von Ziffern.

k@¬èX ÉÃrw

Probier es aus


Erläuterung

     :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 Bytes

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

Probieren Sie es online!

-6 Bytes dank @ KevinCruijssens Einsicht!


1
Sie können ersetzen return i>0?i:0;mit return i;. Die Ausgabe ist -1 für den Testfall [9,9,9,9,9,9], aber das ist in Ordnung mit der Herausforderung: " Wenn es keine eindeutigen Ziffern gibt, kann Ihr Programm alles tun (undefiniertes Verhalten). "
Kevin Cruijssen

In der Tat kann ich seit der aktuellen Überarbeitung. Vorher konnte ich wegen des Testfalls nicht 0. Es ist etwas, das ich im vorherigen Golf beaufsichtigt habe! :)
Olivier Grégoire

2

APL (Dyalog) , 14 Bytes

-2 dank TwiNight.

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

⌈/ der größte von

 die Argumente

× multipliziert mit

1=() Der Boolesche Wert für jeden, bei dem einer gleich ist

+/ die reihensummen von

∘.=⍨ ihre Gleichheitstabelle

Probieren Sie es online!


Da 0es sich mit Ausnahme von sich 0selbst nie um die höchste eindeutige Ziffer handelt , können Sie 1 Byte speichern, indem Sie ×stattdessen ein /⍨weiteres Byte speichern und dieses in einen Zug
umwandeln

@TwiNight Schön! Vielen Dank.
Adám



1

Mathematica, 42 Bytes

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

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

Probieren Sie es online!

Ein verbesserter Ansatz von meinem ersten Versuch führt zu weniger Bytes.

Points of Interest: fstund sndgeben das erste und zweite Element eines Tupels zurück.


1

Gelee , 9 Bytes

ṢŒrṪỊ$ÐfṀ

Probieren Sie es online!



@LeakyNun outgolfed, Sohn
Skidsdev

@ Mayube, aber der Kernalgorithmus ist der gleiche
Leaky Nun

@LeakyNun nein, es ist ganz anders.
Steenbergh

@LeakyNun Ich habe mich entschieden, separat zu posten ... im Grunde ist ein großer Unterschied, dass ich in meinem Fall nur entscheide, was ich behalten soll, während steenbergh ein paar Köpfe oder so nimmt ...
Erik der Outgolfer

1

Pyth, 6 Bytes

eS.m/Q

Testsuite

Erläuterung:

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.