Temukan digit unik tertinggi

33

Anehnya kita belum memiliki tantangan "menemukan angka tertinggi" yang sederhana, tapi saya pikir itu agak terlalu sepele.

Diberikan input integer non-negatif, kembalikan digit unik unik (yaitu tidak diulang) yang ditemukan dalam integer. Jika tidak ada angka unik, program Anda dapat melakukan apa saja (perilaku tidak terdefinisi).

Input dapat diambil sebagai integer tunggal, string, atau daftar digit.

Uji kasus

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

Ini adalah sehingga byte paling sedikit di setiap bahasa menang!

Skidsdev
sumber
2
Bisakah kita mengambil input sebagai string?
Kritixi Lithos
3
Mengingat kasus uji terakhir, saya pikir kami dipaksa untuk mengambil input sebagai string ... (angka nol di depan tidak dapat diwakili dalam bilangan bulat)
Leo
@ Leo yang sebenarnya buruk saya, pada dasarnya tumbuk angka-angka di keyboard saya, tidak melihat nol di depan. Tapi ya, input dapat diambil sebagai string
Skidsdev
25
@ Adám "perilaku tidak terdefinisi" umumnya berarti Anda dapat melakukan apa saja, termasuk memanggil kengerian tanpa nama dari kekosongan jika itu menghemat byte.
Martin Ender
22
@ MartinEnder sebenarnya saya akan dengan senang hati merobohkan 50% dari byte Anda jika kode Anda berhasil memanggil cthulhu karena tidak ada angka unik;)
Skidsdev

Jawaban:

16

05AB1E , 4 3 byte

Disimpan 1 byte berkat Tn. Xcoder yang memberitahukan bahwa daftar angka adalah input yang valid.

¢ÏM

Cobalah online!

Penjelasan

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest
Emigna
sumber
Tunggu dulu di 05AB1E, 2tidak benar; hanya 1? : o
HyperNeutrino
@HyperNeutrino: Benar!
Emigna
2
Tampaknya sangat berguna dan sangat menyusahkan ... Itu menarik: o: D
HyperNeutrino
@HyperNeutrino: Ini sering berguna, tetapi bisa merugikan ketika tantangan mengatakan mengembalikan nilai yang sebenarnya , ketika banyak bahasa dapat mengembalikan bilangan bulat positif atau bahkan mungkin string yang tidak kosong.
Emigna
Dicoret pada nomor untuk tidak mudah dilihat!
TuanZander
15

Python 3 , 40 byte

Disimpan 2 byte berkat movatica .

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

Cobalah online!

42 byte

Berfungsi untuk String dan daftar tipe parameter digit. Melempar kesalahan tanpa digit unik, jenis penyalahgunaan spec itu:

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

Cobalah online!


Penjelasan

  • lambda i: - Mendeklarasikan fungsi lambda dengan string atau daftar parameter digit i.
  • max(...) - Menemukan nilai maksimum generator.
  • x for x in i - Iterasi melalui karakter / digit i .
  • if i.count(x)<2 - Memeriksa apakah digitnya unik.
Tuan Xcoder
sumber
40 byte:lambda i:max(x*(i.count(x)<2)for x in i)
movatica
1
@movatica Terima kasih!
Tn. Xcoder
8

Alice , 15 byte

/&.sDo
\i-.tN@/

Cobalah online!

Penjelasan

/...
\.../

Ini adalah kerangka kerja sederhana untuk kode linier yang beroperasi sepenuhnya dalam mode Ordinal (artinya program ini bekerja sepenuhnya melalui pemrosesan string). Kode linear yang tidak dilipat hanyalah:

i..DN&-sto@

Apa fungsinya:

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
sumber
-1, tidak " memanggil kengerian tanpa nama dari kekosongan " jika tidak ada angka unik. ;) (Baca: +1, jawaban yang bagus seperti biasa.)
Kevin Cruijssen
1
@KevinCruijssen saya mencoba, tetapi tidak menghemat byte. Mungkin Dark mungkin bahasa yang lebih tepat ...
Martin Ender
7

Retina , 16 byte

O`.
(.)\1+

!`.$

Cobalah online!

Penjelasan

O`.

Urutkan digit.

(.)\1+

Hapus digit berulang.

!`.$

Ambil digit terakhir (maksimal).

Martin Ender
sumber
Sayang sekali, Deduplicate tidak membantu di sini :(
CalculatorFeline
7

Arang , 18 12 byte

Fχ¿⁼№θIι¹PIι

Cobalah online!(Tautan ke versi verbose)

Mencetak apa pun jika tidak ada solusi yang ditemukan. Kuncinya adalah bahwafor loop mencetak setiap nomor unik dalam string input, tetapi tanpa menggerakkan kursor, sehingga nilainya terus mencetak ulang sendiri sampai solusi akhir ditemukan.

Versi sebelumnya mencetak karakter A hingga Z ketika tidak ada solusi yang ditemukan, karenanya komentar:

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

Cobalah online! (Tautan ke versi verbose)

Charlie
sumber
3
Itu perilaku tak terdefinisi yang menarik :)
Emigna
Ini kedengarannya bagi saya orang Finlandia: D
fedorqui
2
@ fedorqui senang melihatmu di sini! Ya, tapi Charcoal lebih mudah dipelajari daripada Jelly atau O5AB1E, dan lebih lucu untuk digunakan dalam game ASCII-art. :-)
Charlie
7

Sekam , 7 byte

→fo¬hgO

Cobalah online! (Test suite, crash pada test case terakhir karena tidak memiliki digit unik)

Ini adalah komposisi fungsi dalam gaya point-free (argumen tidak disebutkan secara eksplisit di mana pun). Mengambil input dan mengembalikan output sebagai string, yang dalam Husk setara dengan daftar karakter.

Penjelasan

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"

* Pemeriksaan panjang 1 dilakukan dengan mengambil kepala daftar (semua elemen kecuali yang terakhir) dan meniadakannya (daftar kosong adalah palsu, daftar tidak kosong adalah benar).

Leo
sumber
7

Haskell, 37 byte

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

Cobalah online!

Bagaimana itu bekerja:

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

R , 41 byte

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

Fungsi anonim yang mengambil daftar digit, baik sebagai bilangan bulat atau string karakter tunggal. Ini precomputes ysebagai argumen opsional untuk menghindari menggunakan kurung kurawal untuk fungsi tubuh. Mengembalikan digit sebagai string. Ini mengambil pendekatan yang sedikit berbeda dari jawaban R lainnya dan akhirnya menjadi yang terkecil lebih pendek! Sepertinya komentar saya ada yang salah setelah semua ...

tablemenghitung kemunculan setiap elemen dalam daftar, dengan names(table(x))menjadi nilai unik dalam x(sebagai string). Karena angka-angka untungnya dipesan dengan leksikografis yang sama dengan angka, kita masih bisa menggunakan max.

Cobalah online!

Giuseppe
sumber
Bagus! Saya tidak berharap melakukan sesuatu dengan tableakan lebih pendek (ditambah saya tidak pernah ingat bagaimana untuk mulai namesbekerja).
aPaulT
1
<2untuk byte lain. Seharusnya tidak ada nol dalam hitungan.
MickyT
1
y=table(scan());max(names(y[y<2]))lebih pendek beberapa byte.
JAD
6

JavaScript (ES6), 46 41 40 byte

Mengambil input sebagai string. Mengembalikan RangeError jika tidak ada angka unik.

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

-7 byte berkat Rick Hitchcock

-1 byte terima kasih kepada Shaggy

Uji kasus

Oki
sumber
Hapus peringatan untuk 39 byte: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Anda dapat menghindari stack overflow untuk 42 byte: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Rick Hitchcock
Simpan satu byte dengan currying: s=>g=(i=9)=>s.split(i).length-2?g(--i):idan kemudian panggil denganf("12")()
Shaggy
5

Python 3, 40 byte

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

Hanya berfungsi untuk daftar digit. Kasing tepi '990' berfungsi dengan baik :)

Cobalah online!

Alex Varga
sumber
Selamat datang di PPCG! Sepertinya Anda sudah melakukan semuanya :)
Stephen
4

Brachylog , 8 byte

ọtᵒtᵍhth

Cobalah online!

Penjelasan

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
Fatalisasi
sumber
4

Sekam , 9 8 byte

Terima kasih kepada Leo karena menyarankan solusi yang sedikit lebih rapi pada jumlah byte yang sama.

▲‡ȯf=1`#

Cobalah online!

Penjelasan

  ȯ       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
sumber
1
¬←bisa jadi lebih sederhana =1, bytecount yang sama :)
Leo
1
@ Leo Ah ya, saya terlalu malas untuk menguji apakah kari akan bekerja tanpa tanda kurung. Saya perlu lebih percaya pada inferensi tipe. ;)
Martin Ender
4

Mathematica, 41 byte

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

terima kasih @Martin Ender

inilah pendekatan Martin pada jawaban saya

Mathematica, 35 byte

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

R, 45 43 byte

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

Cobalah online!

Mengambil input sebagai vektor bilangan bulat. Menemukan elemen yang digandakan, menghapusnya, dan mengambil yang maksimal. (Kembali -Infdengan peringatan jika tidak ada yang unik maksimum.)

Diedit menjadi fungsi anonim per komentar

aPaULT
sumber
max(x[!duplicated(x)])sedikit lebih pendek, tetapi ini adalah jawaban yang bagus. Saya tahu cara saya akan melakukannya tidak sebaik ini. Anda juga dapat menghapusnya f=dari awal, karena fungsi anonim adalah jawaban yang benar-benar valid. Selain itu, Anda dapat menggunakan TIO untuk menguji fungsi Anda jika Anda menggunakan format ini: Coba online!
Giuseppe
Terima kasih! Saya pikir fungsi 'duplikat' tidak menghitung kemunculan pertama elemen duplikat sehingga versi Anda tidak akan berfungsi
aPaulT
ah, poin bagus. Saya hampir tidak pernah menggunakan duplicatedtetapi saya benar-benar memikirkan jawaban lain yang lebih pendek!
Giuseppe
3

Ruby , 42 byte

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

Cobalah online!

GB
sumber
Ruby mengikat Python :)
Mr. Xcoder
Karena 42 selalu jawabannya. :-)
GB
5
@ GB Atau apakah itu:->x{x.chars.select{|r|x.count(r)<2}.max}
Martin Ender
1
Itu akan menjadi 2 byte lebih pendek dan merusak semuanya. :-)
GB
3

APL (Dyalog Unicode) , 10 karakter = 19 byte

Metode: gandakan elemen yang terjadi beberapa kali dengan nol, dan kemudian denda elemen tertinggi.

⌈/×∘(1=≢)⌸

 untuk setiap elemen unik dan indeksnya dalam argumen:

× gandakan elemen unik

∘() Dengan:

  1= Boolean untuk apakah seseorang sama dengan

   penghitungan indeks (berapa kali elemen unik terjadi)

⌈/ maks itu

Cobalah online!

APL (Dyalog Classic) , 15 byte

⌈/×∘(1=≢)⎕U2338

Cobalah online!

Identik dengan yang di atas, tetapi gunakan ⎕U2338sebagai ganti .

Adm
sumber
3

Bash + coreutils, 30 28 byte

-2 byte berkat Digital Trauma

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

Cobalah online!


Bash + coreutils, 20 byte

sort|uniq -u|tail -1

Cobalah online!

Jika input diberikan sebagai daftar digit, satu digit per baris, kita dapat melewati tahap flip. Rasanya seperti selingkuh.

Riley
sumber
Ganti grep -o .dengan fold -1untuk menyimpan 2 byte. Saya setuju bahwa bilangan bulat input yang diberikan sebagai daftar angka terlalu panjang aturannya.
Digital Trauma
+1 hanya karena bash
Anush
3

Python 2 , 39 byte

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

Cobalah online!

Tidak
sumber
Saya menikmati ini, sangat bagus!
Anush
3

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

using System.Linq;

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

Cobalah online!

Terima kasih @CarlosAlejo

kakkarot
sumber
Ini tidak bekerja dengan "1948710498" sebagai input (mengembalikan "9" alih-alih "7"), dan Anda harus menambah using System.Linq;jumlah byte.
Charlie
@CarlosAlejo Ups! Maaf! Baru saja membaca spesifikasi sepenuhnya. Akan segera mengedit solusinya.
kakkarot
Diedit. Apakah ada optimisasi yang bisa saya lakukan?
kakkarot
Tentu: coba gunakan OrderBy(...).Last()bukan .OrderByDescending(...).First(), misalnya. Atau bahkan lebih baik, ubah bagian terakhir Anda dengan .Max(i=>i.Key)setelah Whereklausa.
Charlie
@CarlosAlejo Terima kasih! Diedit.
kakkarot
2

JavaScript (ES6), 52 50 byte

Mengambil input sebagai daftar digit. Kembali 0jika tidak ada digit unik.

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

Uji kasus

Arnauld
sumber
2

Japt , 12 11 10 byte

Mengambil input sebagai array angka.

k@¬èX ÉÃrw

Menguji


Penjelasan

     :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
sumber
2

Java (OpenJDK 8) , 89 85 79 byte

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

Cobalah online!

-6 byte berkat wawasan @ KevinCruijssen!

Olivier Grégoire
sumber
1
Anda bisa menggantinya return i>0?i:0;dengan return i;. Outputnya adalah -1 untuk test case [9,9,9,9,9,9], tetapi itu tidak masalah dengan tantangan: " Jika tidak ada digit unik, program Anda dapat melakukan apa saja (perilaku tidak terdefinisi). ".
Kevin Cruijssen
Memang, saya bisa sejak revisi saat ini. Sebelumnya saya tidak bisa karena test case 0. Ini sesuatu yang saya awasi di golf sebelumnya! :)
Olivier Grégoire
2

APL (Dyalog) , 14 byte

-2 Terima kasih untukwiwi.

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

⌈/ terbesar dari

 argumen

× dikalikan dengan

1=(... ) Boolean untuk masing-masing di mana satu sama dengan

+/ jumlah baris

∘.=⍨ tabel kesetaraan mereka

Cobalah online!

Adm
sumber
Karena 0tidak pernah digit unik tertinggi kecuali untuk 0dirinya sendiri, Anda dapat menghemat 1 byte menggunakan ×alih-alih /⍨, lalu menyimpan byte lain mengonversinya menjadi kereta
TwiNight
@TwiNight Nice! Terima kasih.
Adám
2

PHP , 40 byte

<?=array_flip(count_chars($argn))[1]-48;

Cobalah online!

PHP , 42 byte

<?=chr(array_flip(count_chars($argn))[1]);

Cobalah online!

Jörg Hülsermann
sumber
1
-2 byte:<?=array_flip(count_chars($argn))[1]-48;
Titus
1

Mathematica, 42 byte

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

F # , 88 byte

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

Cobalah online!

Pendekatan yang ditingkatkan dari upaya pertama saya, menghasilkan lebih sedikit byte.

Poin yang menarik: fstdan sndkembalikan masing-masing elemen tuple pertama dan kedua.


sumber
1

Jelly , 9 byte

ṢŒrṪỊ$ÐfṀ

Cobalah online!

Erik the Outgolfer
sumber
yah
Leaky Nun
@ LeakyNun outgolfed, son
Skidsdev
@ Mayube tetapi algoritma inti adalah sama
Leaky Nun
@ LeakyNun tidak, ini sangat berbeda.
steenbergh
@ LeakyNun saya memutuskan untuk mengirim secara terpisah ... pada dasarnya perbedaan besar adalah bahwa dalam kasus saya, saya hanya memutuskan mana yang akan disimpan, sementara steenbergh mengambil beberapa kepala atau sesuatu ...
Erik the Outgolfer
1

Pyth, 6 byte

eS.m/Q

Suite uji

Penjelasan:

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
sumber