Tìm chữ số duy nhất cao nhất


33

Đáng ngạc nhiên là chúng ta chưa có một đơn giản "tìm chữ số cao nhất" thách thức nào, nhưng tôi nghĩ đó là một chút quá tầm thường.

Cho đầu vào của một số nguyên không âm, trả về chữ số duy nhất cao nhất (nghĩa là không lặp lại) được tìm thấy trong số nguyên. Nếu không có chữ số duy nhất, chương trình của bạn có thể làm bất cứ điều gì (hành vi không xác định).

Đầu vào có thể được lấy dưới dạng một số nguyên, một chuỗi hoặc một danh sách các chữ số.

Các trường hợp thử nghiệm

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

Đây là để có ít byte nhất trong mỗi ngôn ngữ !


2
Chúng ta có thể lấy đầu vào như một chuỗi thay thế?
Kritixi Lithos

3
Với trường hợp thử nghiệm cuối cùng, tôi nghĩ rằng chúng ta buộc phải lấy đầu vào dưới dạng một chuỗi ... (các số 0 đứng đầu không thể được biểu thị bằng số nguyên)
Leo

@Leo đó thực sự là xấu của tôi, về cơ bản đã nghiền các số trên bàn phím của tôi, không nhận thấy số 0 đứng đầu. Nhưng vâng, đầu vào có thể được lấy dưới dạng một chuỗi
Skidsdev

25
@ Adám "hành vi không xác định" thường có nghĩa là bạn có thể làm bất cứ điều gì, kể cả triệu tập nỗi kinh hoàng không tên từ khoảng trống nếu điều đó tiết kiệm byte.
Martin Ender

22
@MartinEnder trên thực tế tôi sẽ vui vẻ loại bỏ 50% số byte của mình nếu mã của bạn triệu tập thành công cthulhu khi không có chữ số duy nhất;)
Skidsdev

Câu trả lời:


16

05AB1E , 4 3 byte

Đã lưu 1 byte nhờ ông Xcoder thông báo rằng danh sách chữ số là đầu vào hợp lệ.

¢ÏM

Hãy thử trực tuyến!

Giải trình

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

Đợi như vậy trong 05AB1E, 2không phải là sự thật; chỉ 1? : o
HyperNeutrino

@HyperNeutrino: Đúng vậy!
Emigna

2
Điều đó có vẻ vừa hữu ích vừa rất phiền phức ... Thật thú vị: o: D
HyperNeutrino

@HyperNeutrino: Nó thường có ích, nhưng nó có thể là một bất lợi khi thách thức nói trả về một giá trị trung thực , khi rất nhiều ngôn ngữ có thể trả về bất kỳ số nguyên dương nào hoặc thậm chí là một chuỗi không trống.
Emigna

Một cuộc tấn công vào số cho không dễ thấy!
MrZander

15

Python 3 , 40 byte

Đã lưu 2 byte nhờ Movatica .

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

Hãy thử trực tuyến!

42 byte

Hoạt động cho cả Chuỗi và danh sách các loại tham số chữ số. Ném một lỗi không có chữ số duy nhất, loại lạm dụng thông số đó:

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

Hãy thử trực tuyến!


Giải trình

  • lambda i: - Khai báo hàm lambda với một chuỗi hoặc danh sách các tham số chữ số i.
  • max(...) - Tìm giá trị tối đa của máy phát.
  • x for x in i- Lặp lại thông qua các ký tự / chữ số của i.
  • if i.count(x)<2 - Kiểm tra nếu chữ số là duy nhất.

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

1
@movatica Cảm ơn!
Ông Xcoder

8

Alice , 15 byte

/&.sDo
\i-.tN@/

Hãy thử trực tuyến!

Giải trình

/...
\.../

Đây là một khung đơn giản cho mã tuyến tính hoạt động hoàn toàn trong chế độ Ordinal (có nghĩa là chương trình này hoạt động hoàn toàn thông qua xử lý chuỗi). Mã tuyến tính mở ra sau đó chỉ là:

i..DN&-sto@

Những gì nó làm:

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, không " triệu tập nỗi kinh hoàng không tên từ khoảng trống " nếu không có chữ số duy nhất. ;) (Đọc: +1, câu trả lời tuyệt vời như mọi khi.)
Kevin Cruijssen

1
@KevinCruijssen Tôi đã thử, nhưng nó không lưu byte. Có lẽ Dark có thể là một ngôn ngữ phù hợp hơn ...
Martin Ender


7

Than , 18 12 byte

Fχ¿⁼№θIι¹PIι

Hãy thử trực tuyến! (Liên kết đến phiên bản dài dòng)

Không in gì nếu không tìm thấy giải pháp. Thủ thuật là forvòng lặp in ra mỗi số duy nhất trong chuỗi đầu vào, nhưng không di chuyển con trỏ, do đó giá trị sẽ tự in lại cho đến khi tìm thấy giải pháp cuối cùng.

Phiên bản trước đã in các ký tự từ A đến Z khi không tìm thấy giải pháp, do đó các bình luận:

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

Hãy thử trực tuyến! (Liên kết đến phiên bản dài dòng)


3
Đó là một hành vi không xác định thú vị :)
Emigna

Điều này nghe có vẻ như tiếng Phần Lan đối với tôi: D
fedorqui

2
@fedorqui rất vui được gặp bạn ở đây! Vâng, nhưng Char than dễ học hơn Jelly hoặc O5AB1E, và nó thú vị hơn khi sử dụng trong các trò chơi nghệ thuật ASCII. :-)
Charlie

7

Husk , 7 byte

→fo¬hgO

Hãy thử trực tuyến! (Bộ kiểm tra, sự cố trong trường hợp kiểm tra cuối cùng vì nó không có chữ số duy nhất)

Đây là một thành phần của các hàm theo kiểu không có điểm (các đối số không được đề cập rõ ràng ở bất cứ đâu). Lấy đầu vào và trả về đầu ra dưới dạng một chuỗi, trong Husk tương đương với một danh sách các ký tự.

Giải trình

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"

* Việc kiểm tra độ dài 1 được thực hiện bằng cách lấy phần đầu của danh sách (tất cả các phần tử trừ phần cuối cùng) và phủ định nó (danh sách trống là giả, danh sách không trống là trung thực).


7

Haskell, 37 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động:

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

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

Hàm ẩn danh nhận danh sách các chữ số, dưới dạng số nguyên hoặc chuỗi ký tự đơn. Nó tiền xử lý ynhư là một đối số tùy chọn để tránh sử dụng dấu ngoặc nhọn cho thân hàm. Trả về chữ số dưới dạng một chuỗi. Điều này có một cách tiếp cận hơi khác so với câu trả lời R khác và cuối cùng là ngắn nhất một chút! Có vẻ như bình luận của tôi đã sai sau tất cả ...

tabletính toán các lần xuất hiện của từng thành phần trong danh sách, với names(table(x))các giá trị duy nhất trong x(dưới dạng chuỗi). Vì các chữ số may mắn được sắp xếp theo thứ tự từ vựng giống như số, nên chúng ta vẫn có thể sử dụng max.

Hãy thử trực tuyến!


Tốt đẹp! Tôi không mong đợi làm một cái gì đó với tablesẽ ngắn hơn (cộng với tôi không bao giờ có thể nhớ làm thế nào namesđể làm việc).
aPaulT

1
<2cho một byte khác. Không bao giờ nên có một số không trong số đếm.
MickyT

1
y=table(scan());max(names(y[y<2]))là một vài byte ngắn hơn.
JAD

6

JavaScript (ES6), 46 41 40 byte

Đưa đầu vào dưới dạng một chuỗi. Trả về RangeError nếu không có chữ số duy nhất.

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

-7 byte nhờ Rick Hitchcock

-1 byte nhờ Shaggy

Các trường hợp thử nghiệm


Xóa cảnh báo cho 39 byte : (s,i=9)=>s.split(i).length-2?f(s,--i):i. Bạn có thể tránh tràn ngăn xếp cho 42 byte : (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Rick Hitchcock

Lưu một byte với currying: s=>g=(i=9)=>s.split(i).length-2?g(--i):ivà sau đó gọi nó bằngf("12")()
Shaggy

5

Python 3, 40 byte

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

Chỉ hoạt động cho danh sách các chữ số. Vỏ cạnh '990' hoạt động tốt :)

Hãy thử trực tuyến!


Chào mừng đến với PPCG! Có vẻ như bạn đã làm mọi thứ thất vọng :)
Stephen

4

Brachylog , 8 byte

ọtᵒtᵍhth

Hãy thử trực tuyến!

Giải trình

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

Husk , 9 8 byte

Cảm ơn Leo đã đề xuất một giải pháp gọn gàng hơn ở cùng một số byte.

▲‡ȯf=1`#

Hãy thử trực tuyến!

Giải trình

  ȯ       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
¬←có thể đơn giản hơn =1, tương tự như vậy, mặc dù vậy :)
Leo

1
@Leo Ah yeah, tôi đã quá lười biếng để kiểm tra xem món cà ri có hoạt động mà không có dấu ngoặc đơn hay không. Tôi cần tin tưởng nhiều hơn vào kiểu suy luận. ;)
Martin Ender

4

Toán học, 41 byte

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

cảm ơn @Martin Ender

Đây là cách tiếp cận của Martin về câu trả lời của tôi

Toán học, 35 byte

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

4

R, 45 43 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là một vectơ số nguyên. Tìm các phần tử trùng lặp, loại bỏ chúng và lấy tối đa. (Trả về -Infvới cảnh báo nếu không có mức tối đa duy nhất.)

Chỉnh sửa thành một chức năng ẩn danh trên mỗi bình luận


max(x[!duplicated(x)])ngắn hơn một chút, nhưng đây là một câu trả lời tuyệt vời. Tôi biết cách tôi sẽ làm nó không tốt như thế này. Ngoài ra, bạn có thể loại bỏ f=từ đầu, vì các hàm ẩn danh là câu trả lời hoàn toàn hợp lệ. Ngoài ra, bạn có thể sử dụng TIO để kiểm tra các chức năng của mình nếu bạn sử dụng định dạng này: Dùng thử trực tuyến!
Giuseppe

Cảm ơn! Tôi nghĩ rằng chức năng 'trùng lặp' không tính sự xuất hiện đầu tiên của một yếu tố trùng lặp để phiên bản của bạn sẽ không hoạt động
aPaulT

ah, điểm tốt. Tôi gần như không bao giờ sử dụng duplicatednhưng tôi thực sự nghĩ ra một câu trả lời khác, ngắn hơn!
Giuseppe


3

APL (Dyalog Unicode) , 10 ký tự = 19 byte

Phương pháp: nhân các phần tử xảy ra nhiều lần bằng 0, và sau đó phạt phần tử cao nhất.

⌈/×∘(1=≢)⌸

 cho mỗi phần tử duy nhất và các chỉ số của nó trong đối số:

× nhân các yếu tố độc đáo

∘(Sàng ) với:

  1= Boolean cho dù một người có bằng

   kiểm đếm các chỉ số (bao nhiêu lần phần tử duy nhất xảy ra)

⌈/ tối đa của điều đó

Hãy thử trực tuyến!

APL (Dyalog Classic) , 15 byte

⌈/×∘(1=≢)⎕U2338

Hãy thử trực tuyến!

Giống hệt như trên, nhưng sử dụng ⎕U2338thay vì .


3

Bash + coreutils, 30 28 byte

-2 byte nhờ Chấn thương kỹ thuật số

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

Hãy thử trực tuyến!


Bash + coreutils, 20 byte

sort|uniq -u|tail -1

Hãy thử trực tuyến!

Nếu đầu vào được đưa ra dưới dạng danh sách các chữ số, mỗi chữ số, chúng ta có thể bỏ qua giai đoạn gấp. Điều đó cảm thấy như gian lận mặc dù.


Thay thế grep -o .bằng fold -1để tiết kiệm 2 byte. Tôi đồng ý rằng một số nguyên đầu vào được đưa ra dưới dạng danh sách các chữ số đang kéo dài quá mức.
Chấn thương kỹ thuật số

+1 chỉ vì nó là bash
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

Hãy thử trực tuyến!

Cảm ơn @CarlosAlejo


Điều này không hoạt động với "1948710498" làm đầu vào (trả về "9" thay vì "7") và bạn phải thêm using System.Linq;vào số byte.
Charlie

@CarlosAlejo Rất tiếc! Lấy làm tiếc! Chỉ cần đọc các thông số kỹ thuật đầy đủ. Sẽ chỉnh sửa giải pháp sớm.
kakkarot

Đã chỉnh sửa. Có bất kỳ tối ưu hóa tôi có thể thực hiện?
kakkarot

Chắc chắn: thử sử dụng OrderBy(...).Last()thay vì .OrderByDescending(...).First(), ví dụ. Hoặc thậm chí tốt hơn, thay đổi phần cuối cùng của bạn với .Max(i=>i.Key)sau Wheremệnh đề.
Charlie

@CarlosAlejo Cảm ơn! Đã chỉnh sửa.
kakkarot

2

JavaScript (ES6), 52 50 byte

Lấy đầu vào là một danh sách các chữ số. Trả về 0nếu không có chữ số duy nhất.

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

Các trường hợp thử nghiệm


2

Japt , 12 11 10 byte

Lấy đầu vào là một mảng các chữ số.

k@¬èX ÉÃrw

Kiểm tra nó


Giải trình

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

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

Hãy thử trực tuyến!

-6 byte nhờ vào cái nhìn sâu sắc của @ KevinCruijssen!


1
Bạn có thể thay thế return i>0?i:0;bằng return i;. Đầu ra sẽ là -1 cho trường hợp thử nghiệm [9,9,9,9,9,9], nhưng điều đó cũng ổn với thử thách: " Nếu không có chữ số duy nhất, chương trình của bạn có thể làm bất cứ điều gì (hành vi không xác định). ".
Kevin Cruijssen

Thật vậy, tôi có thể kể từ khi sửa đổi hiện tại. Trước khi tôi không thể vì trường hợp thử nghiệm 0. Đó là thứ tôi giám sát trong golf trước đây! :)
Olivier Grégoire

2

APL (Dyalog) , 14 byte

-2 cảm ơnTwiNight.

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

⌈/ lớn nhất trong số

 các đối số

× nhân với

1=(... ) Boolean cho mỗi nơi một bình đẳng

+/ các khoản tiền của

∘.=⍨ bảng bình đẳng của họ

Hãy thử trực tuyến!


0không bao giờ là chữ số duy nhất cao nhất ngoại trừ 0chính nó, bạn có thể lưu 1 byte bằng cách sử dụng ×thay vì /⍨sau đó lưu một byte khác chuyển đổi thành một chuyến tàu
TwiNight

@TwiNight Đẹp! Cảm ơn bạn.
Adám



1

Toán học, 42 byte

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

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

Hãy thử trực tuyến!

Một cách tiếp cận được cải thiện từ nỗ lực đầu tiên của tôi, kết quả là ít byte hơn.

Điểm quan tâm: fstsndtrả lại các phần tử thứ nhất và thứ hai của một tuple tương ứng.


1

Thạch , 9 byte

ṢŒrṪỊ$ÐfṀ

Hãy thử trực tuyến!



@LeakyNun hết hồn, con trai
Skidsdev

@Mayube nhưng thuật toán cốt lõi là như nhau
Nữ tu bị rò rỉ

@LeakyNun không, nó khá khác biệt.
steenbergh

@LeakyNun Tôi quyết định đăng riêng ... về cơ bản, một sự khác biệt lớn là trong trường hợp của tôi, tôi chỉ quyết định giữ cái gì, trong khi steenbergh mất một số đầu hoặc một cái gì đó ...
Erik the Outgolfer

1

Bình thường, 6 byte

eS.m/Q

Bộ kiểm tra

Giải trình:

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.