ค้นหาตัวเลขที่ไม่ซ้ำกันสูงสุด


33

น่าแปลกที่เรายังไม่มีการท้าทาย "ค้นหาตัวเลขที่สูงที่สุด" ง่าย ๆ แต่ฉันคิดว่านั่นเป็นเรื่องเล็กน้อยเกินไป

รับอินพุตของจำนวนเต็มแบบไม่ลบให้คืนค่าหลักที่ไม่ซ้ำกันสูงสุด(เช่นไม่ซ้ำ) ที่พบในจำนวนเต็ม หากไม่มีตัวเลขที่ไม่ซ้ำกันโปรแกรมของคุณสามารถทำอะไรก็ได้ (พฤติกรรมที่ไม่ได้กำหนด)

อินพุตสามารถนำมาเป็นจำนวนเต็มเดียวสตริงหรือรายการตัวเลข

กรณีทดสอบ

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

นี่คือจำนวนน้อยที่สุดในแต่ละภาษาที่ชนะ!


2
เราสามารถรับอินพุตเป็นสตริงแทนได้หรือไม่?
Kritixi Lithos

3
จากกรณีทดสอบครั้งสุดท้ายฉันคิดว่าเราถูกบังคับให้รับข้อมูลเป็นสตริง ... (เลขศูนย์นำหน้าไม่สามารถแสดงเป็นจำนวนเต็ม)
Leo

@Leo ที่ไม่ดีจริง ๆ แล้วโดยทั่วไปแล้วการบดตัวเลขบนแป้นพิมพ์ของฉันไม่ได้สังเกตว่าศูนย์นำหน้า แต่ใช่อินพุตสามารถใช้เป็นสตริงได้
Skidsdev

25
@ Adám "พฤติกรรมที่ไม่ได้กำหนด" โดยทั่วไปหมายความว่าคุณสามารถทำอะไรได้รวมถึงการเรียกความน่ากลัวที่ไม่ระบุชื่อออกมาจากความว่างเปล่าหากมีการบันทึกไบต์
Martin Ender

22
@MartinEnder ในความเป็นจริงฉันจะตัด 50% ของ bytes ของคุณอย่างมีความสุขหากรหัสของคุณประสบความสำเร็จในการเรียกคธูลูเมื่อไม่มีตัวเลขที่ไม่ซ้ำกัน;)
Skidsdev

คำตอบ:


16

05AB1E , 4 3 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณMr. Xcoder ที่แจ้งว่ารายการหลักเป็นอินพุตที่ถูกต้อง

¢ÏM

ลองออนไลน์!

คำอธิบาย

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

รอใน 05AB1E 2ไม่ใช่ความจริง เท่านั้น1หรือ : o
HyperNeutrino

@HyperNeutrino: ถูกต้อง!
Emigna

2
ดูเหมือนว่าทั้งสองมีประโยชน์มากและน่ารำคาญมาก ... นั่นเป็นเรื่องที่น่าสนใจ: o: D
HyperNeutrino

@HyperNeutrino: บ่อยครั้งมันมีประโยชน์ แต่มันอาจเป็นข้อเสียเมื่อความท้าทายบอกว่าคืนค่าความจริงเมื่อภาษาจำนวนมากสามารถคืนค่าจำนวนเต็มบวกหรือแม้กระทั่งสตริงที่ไม่ว่างเปล่า
Emigna

การนัดหยุดงานผ่านหมายเลขไม่ใช่เรื่องง่ายที่จะดู!
MrZander

15

Python 3 , 40 ไบต์

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่movatica

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

ลองออนไลน์!

42 ไบต์

ใช้งานได้กับทั้งสตริงและรายการประเภทพารามิเตอร์ตัวเลข โยนข้อผิดพลาดสำหรับตัวเลขที่ไม่ซ้ำชนิดของการละเมิดของข้อกำหนดนั้น:

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

ลองออนไลน์!


คำอธิบาย

  • lambda i: - ประกาศฟังก์ชันแลมบ์ดาด้วยสตริงหรือรายการพารามิเตอร์ตัวเลข i
  • max(...) - ค้นหาค่าสูงสุดของเครื่องกำเนิดไฟฟ้า
  • x for x in i- iterates ผ่านตัวอักษร / iตัวเลขของ
  • if i.count(x)<2 - ตรวจสอบว่าตัวเลขนั้นไม่ซ้ำกัน

40 ไบต์:lambda i:max(x*(i.count(x)<2)for x in i)
movatica

1
@ moovatica ขอบคุณ!
นาย Xcoder

8

อลิซ 15 ไบต์

/&.sDo
\i-.tN@/

ลองออนไลน์!

คำอธิบาย

/...
\.../

นี่เป็นกรอบง่าย ๆ สำหรับรหัสเชิงเส้นที่ทำงานทั้งหมดในโหมด Ordinal (หมายถึงโปรแกรมนี้ทำงานได้อย่างสมบูรณ์ผ่านการประมวลผลสตริง) โค้ดเชิงเส้นที่กางออกนั้นเป็นเพียง:

i..DN&-sto@

มันทำอะไร:

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, ไม่ " เรียกความน่ากลัวนิรนามจากความว่างเปล่า " หากไม่มีตัวเลขที่ไม่ซ้ำกัน ;) (อ่าน: +1, คำตอบที่ยอดเยี่ยมเช่นเคย)
Kevin Cruijssen

1
@KevinCruijssen ฉันลองแล้ว แต่มันไม่ได้ช่วยประหยัดไบต์ บางทีความมืดอาจจะเป็นภาษาที่เหมาะสมมากขึ้น ...
มาร์ตินเอนเดอร์

7

เรติน่า 16 ไบต์

O`.
(.)\1+

!`.$

ลองออนไลน์!

คำอธิบาย

O`.

จัดเรียงตัวเลข

(.)\1+

ลบตัวเลขที่ซ้ำกัน

!`.$

ดึงตัวเลข (สูงสุด) หลักสุดท้าย


Deduplicate ที่เลวร้ายเกินไปไม่ได้ช่วยที่นี่ :(
เครื่องคิดเลข

7

ถ่าน , 18 12 ไบต์

Fχ¿⁼№θIι¹PIι

ลองออนไลน์! (ลิงก์ไปยังรุ่น verbose)

พิมพ์อะไรถ้าไม่พบวิธีแก้ปัญหา เคล็ดลับคือการforวนซ้ำพิมพ์หมายเลขเฉพาะทุกตัวในสตริงอินพุต แต่ไม่มีการเลื่อนเคอร์เซอร์ดังนั้นค่าจะพิมพ์ซ้ำตัวเองจนกว่าจะพบโซลูชันสุดท้าย

รุ่นก่อนหน้าพิมพ์อักขระ A ถึง Z เมื่อไม่พบวิธีแก้ไขดังนั้นความคิดเห็น:

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

ลองออนไลน์! (ลิงก์ไปยังรุ่น verbose)


3
นั่นเป็นพฤติกรรมที่ไม่ได้กำหนดที่น่าสนใจ :)
Emigna

นี่ฟังดูฟินแลนด์สำหรับฉัน: D
fedorqui

2
@fedorqui ดีใจที่ได้พบคุณที่นี่! ใช่ แต่ Charcoal นั้นเรียนรู้ได้ง่ายกว่า Jelly หรือ O5AB1E และสนุกกว่าที่จะใช้ในเกม ASCII-art :-)
Charlie

7

Husk , 7 ไบต์

→fo¬hgO

ลองออนไลน์! (ชุดทดสอบล้มเหลวในกรณีทดสอบล่าสุดเนื่องจากไม่มีตัวเลขที่ไม่ซ้ำกัน)

นี่คือการจัดองค์ประกอบของฟังก์ชั่นในรูปแบบที่ไม่มีจุด (อาร์กิวเมนต์จะไม่กล่าวถึงอย่างชัดเจนทุกที่) รับอินพุตและส่งคืนเอาต์พุตเป็นสตริงซึ่งใน Husk เทียบเท่ากับรายการของอักขระ

คำอธิบาย

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"

* การตรวจสอบความยาว 1 ทำได้โดยนำส่วนหัวของรายการ (องค์ประกอบทั้งหมดยกเว้นอันสุดท้าย) และลบล้างมัน (รายการว่างเปล่าเป็นเท็จรายการที่ไม่ว่างเปล่าเป็นความจริง)


7

Haskell, 37 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร:

  [  |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 ไบต์

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

ฟังก์ชันที่ไม่ระบุชื่อที่รับรายการตัวเลขไม่ว่าจะเป็นจำนวนเต็มหรือสตริงอักขระเดี่ยว มัน precomputes yเป็นอาร์กิวเมนต์ตัวเลือกเพื่อหลีกเลี่ยงการใช้วงเล็บปีกกาสำหรับร่างกายฟังก์ชั่น ส่งคืนตัวเลขเป็นสตริง วิธีนี้ใช้วิธีที่แตกต่างเล็กน้อยกว่าคำตอบ R อื่นและจบลงด้วยการที่สั้นที่สุดเล็กน้อย! ดูเหมือนความคิดเห็นของฉันมีผิดหลังจากทั้งหมด ...

tableคำนวณการเกิดขึ้นของแต่ละองค์ประกอบในรายการโดยnames(table(x))เป็นค่าที่ไม่ซ้ำกันในx(เป็นสตริง) เนื่องจากตัวเลขมีการสั่งซื้อโชคดีเหมือนกัน lexicographically maxเป็นตัวเลขที่เรายังสามารถใช้

ลองออนไลน์!


ดี! ฉันไม่ได้คาดหวังว่าจะทำอะไรบางอย่างด้วยtableจะสั้นลง (รวมทั้งฉันจำไม่ได้ว่าจะnamesไปทำงานอย่างไร)
aPaulT

1
<2สำหรับไบต์อื่น ไม่ควรมีค่าเป็นศูนย์ในการนับ
MickyT

1
y=table(scan());max(names(y[y<2]))สั้นลงไม่กี่ไบต์
JAD

6

JavaScript (ES6), 46 41 40 ไบต์

รับอินพุตเป็นสตริง ส่งคืน RangeError ถ้าไม่มีตัวเลขที่ไม่ซ้ำกัน

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

-7 ไบต์ขอบคุณ Rick Hitchcock

-1 ไบต์ขอบคุณ Shaggy

กรณีทดสอบ


ลบการแจ้งเตือน 39 (s,i=9)=>s.split(i).length-2?f(s,--i):iไบต์: คุณสามารถหลีกเลี่ยงการกองล้น 42 (s,i=9)=>s.split(i).length-2?i&&f(s,--i):iไบต์:
Rick Hitchcock

บันทึกไบต์ด้วยการแกงs=>g=(i=9)=>s.split(i).length-2?g(--i):iแล้วเรียกมันด้วยf("12")()
Shaggy

5

Python 3, 40 ไบต์

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

ใช้ได้กับรายการตัวเลขเท่านั้น เคสขอบ '990' ใช้งานได้ดี :)

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่าคุณจะทำทุกอย่างลงไปแล้ว :)
Stephen


4

Husk , 9 8 ไบต์

ขอขอบคุณลีโอที่แนะนำวิธีแก้ปัญหาเล็กน้อยที่จำนวนไบต์เดียวกัน

▲‡ȯf=1`#

ลองออนไลน์!

คำอธิบาย

  ȯ       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
¬←อาจจะง่ายกว่าโดยจำนวน=1เดียวกัน :) :)
Leo

1
@ Leo Ah ใช่ฉันขี้เกียจเกินไปที่จะทดสอบว่าการแกงจะทำงานได้โดยไม่ต้องวงเล็บ ฉันต้องการความน่าเชื่อถือมากขึ้นในการอนุมานประเภท ;)
Martin Ender

4

Mathematica, 41 ไบต์

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

ขอบคุณ @Martin Ender

นี่คือวิธีการของ Martin ในคำตอบของฉัน

Mathematica, 35 ไบต์

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

4

R, 45 43 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นเวกเตอร์ของจำนวนเต็ม ค้นหาองค์ประกอบที่ซ้ำกันลบออกและใช้เวลาสูงสุด (ผลตอบแทน-Infพร้อมคำเตือนหากไม่มีค่าสูงสุดไม่ซ้ำกัน)

แก้ไขเป็นฟังก์ชั่นที่ไม่ระบุชื่อต่อความคิดเห็น


max(x[!duplicated(x)])ค่อนข้างสั้น แต่นี่เป็นคำตอบที่ดี ฉันรู้วิธีที่ฉันจะทำมันไม่ได้ดีขนาดนี้ นอกจากนี้คุณสามารถลบออกf=จากจุดเริ่มต้นเนื่องจากฟังก์ชั่นที่ไม่ระบุชื่อเป็นคำตอบที่ถูกต้องสมบูรณ์ นอกจากนี้คุณสามารถใช้ TIO เพื่อทดสอบฟังก์ชั่นของคุณหากคุณใช้รูปแบบนี้: ลองออนไลน์!
Giuseppe

ขอบคุณ! ผมคิดว่า 'ซ้ำ' ฟังก์ชั่นไม่นับเกิดขึ้นครั้งแรกขององค์ประกอบที่ซ้ำกันเพื่อให้รุ่นของคุณจะไม่ได้ค่อนข้างทำงาน
aPaulT

อาจุดดี ฉันแทบไม่เคยใช้duplicatedเลย แต่ฉันคิดอีกคำตอบที่สั้นกว่านี้จริง ๆ !
Giuseppe


3

APL (Dyalog Unicode) , 10 ตัวอักษร = 19 ไบต์

วิธีการ: องค์ประกอบคูณที่เกิดขึ้นหลายครั้งโดยศูนย์และจากนั้นปรับองค์ประกอบสูงสุด

⌈/×∘(1=≢)⌸

 สำหรับแต่ละองค์ประกอบที่ไม่ซ้ำกันและดัชนีของมันในการโต้แย้ง:

× คูณองค์ประกอบที่เป็นเอกลักษณ์

∘(... ) กับ:

  1= บูลีนว่ามีค่าเท่ากันหรือไม่

   tally ของดัชนี (กี่ครั้งที่องค์ประกอบที่ไม่ซ้ำกันเกิดขึ้น)

⌈/ สูงสุดของที่

ลองออนไลน์!

APL (Dyalog Classic)ขนาด 15 ไบต์

⌈/×∘(1=≢)⎕U2338

ลองออนไลน์!

เหมือนกันกับข้างต้น แต่ใช้แทน⎕U2338


3

Bash + coreutils, 30 28 ไบต์

-2 ไบต์ขอบคุณDigital Trauma

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

ลองออนไลน์!


Bash + coreutils 20 ไบต์

sort|uniq -u|tail -1

ลองออนไลน์!

หากอินพุตถูกกำหนดเป็นรายการของตัวเลขหนึ่งตัวต่อบรรทัดเราสามารถข้ามขั้นตอนการพับได้ ที่รู้สึกเหมือนโกง


แทนที่grep -o .ด้วยfold -1เพื่อบันทึก 2 ไบต์ ฉันยอมรับว่าจำนวนเต็มอินพุทที่กำหนดให้เป็นรายการของตัวเลขกำลังขยายกฏมากเกินไป
บาดเจ็บทางระบบดิจิตอล

+1 เพียงเพราะมันทุบตี
Anush


3

C # (.NET Core) , 27 97 86 58 57 75 ไบต์

using System.Linq;

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

ลองออนไลน์!

ขอบคุณ @CarlosAlejo


สิ่งนี้ไม่ทำงานกับ "1948710498" เป็นอินพุต (ส่งคืน "9" แทนที่จะเป็น "7") และคุณจะต้องเพิ่มusing System.Linq;จำนวนไบต์
Charlie

@CarlosAlejo โอ๊ะโอ! ขออภัย! เพิ่งได้อ่านข้อมูลจำเพาะทั้งหมด จะแก้ไขวิธีแก้ปัญหาในไม่ช้า
kakkarot

แก้ไข มีการเพิ่มประสิทธิภาพใด ๆ ที่ฉันสามารถทำได้หรือไม่?
kakkarot

แน่นอน: ลองใช้OrderBy(...).Last()แทน.OrderByDescending(...).First()ตัวอย่างเช่น หรือดียิ่งขึ้นเปลี่ยนส่วนสุดท้ายของคุณด้วย.Max(i=>i.Key)หลังจากWhereประโยค
Charlie

@CarlosAlejo ขอบคุณ! แก้ไข
kakkarot

2

JavaScript (ES6), 52 50 ไบต์

ใช้อินพุตเป็นรายการของตัวเลข ส่งคืน0ถ้าไม่มีตัวเลขที่ไม่ซ้ำ

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

กรณีทดสอบ


2

Japt , 12 11 10 ไบต์

รับอินพุตเป็นอาร์เรย์ของตัวเลข

k@¬èX ÉÃrw

ทดสอบมัน


คำอธิบาย

     :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 ไบต์

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

ลองออนไลน์!

-6 ไบต์ขอบคุณความเข้าใจของ @ KevinCruijssen!


1
คุณสามารถแทนที่ด้วยreturn i>0?i:0; return i;ผลลัพธ์จะเป็น -1 สำหรับกรณีทดสอบ[9,9,9,9,9,9]แต่ก็ใช้ได้กับความท้าทาย: " หากไม่มีตัวเลขที่ไม่ซ้ำกันโปรแกรมของคุณสามารถทำอะไรก็ได้ (พฤติกรรมที่ไม่ได้กำหนด) "
Kevin Cruijssen

แน่นอนฉันสามารถแก้ไขได้ตั้งแต่ปัจจุบัน 0ก่อนที่ฉันจะไม่ได้เพราะกรณีทดสอบ มันเป็นสิ่งที่ฉันตรวจสอบในสนามกอล์ฟก่อนหน้านี้! :)
Olivier Grégoire

2

APL (Dyalog)ขนาด 14 ไบต์

-2 ขอบคุณ TwiNight

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

⌈/ ที่ใหญ่ที่สุดของ

 ข้อโต้แย้ง

× คูณด้วย

1=() บูลีนสำหรับแต่ละที่ที่เท่ากับ

+/ ผลรวมของแถว

∘.=⍨ ตารางความเสมอภาคของพวกเขา

ลองออนไลน์!


เนื่องจาก0ไม่มีตัวเลขที่ไม่ซ้ำกันสูงสุดยกเว้น0ตัวเองคุณสามารถบันทึก 1 ไบต์โดยใช้×แทนจาก/⍨นั้นจึงบันทึกไบต์อื่นที่แปลงเป็นรถไฟ
TwiNight

@TwiNight Nice! ขอขอบคุณ.
Adám




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

Try it online!

An improved approach from my first effort, results in less bytes.

Points of interest: fst and snd return the first and second elements of a tuple respectively.



1

Pyth, 6 bytes

eS.m/Q

Test suite

Explanation:

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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.