En yüksek benzersiz basamağı bul


33

Şaşırtıcı bir şekilde, henüz basit bir "en yüksek rakamı bulma" zorluğu yaşamadık, ama bence bu biraz fazla önemsiz.

Negatif olmayan bir tamsayı girildiğinde, tamsayıda bulunan en yüksek benzersiz (yani tekrarlanmadı) basamağını döndürün. Benzersiz basamak yoksa, programınız her şeyi yapabilir (tanımsız davranış).

Giriş, tek bir tamsayı, bir dize veya basamak listesi olarak alınabilir.

Test durumları

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

Bu yani her dilde en az bayt kazanıyor!


2
Girdiyi dize olarak alabilir miyiz?
Kritixi Lithos

3
Son test durumu göz önüne alındığında, girdi olarak bir dize olarak girmemiz gerektiğini düşünüyorum ... (önde gelen sıfırlar tamsayılarda gösterilemez)
Leo

Aslında benim kötüyüm @Leo, temelde klavyemdeki sayıları ezdi, baştaki sıfırı fark etmedi. Ancak evet, girdi bir dize olarak alınabilir
Skidsdev

25
@ Adám "tanımsız davranış" genellikle baytları kurtarırsa, boşluktan isimsiz korkuları toplamak da dahil olmak üzere her şeyi yapabileceğiniz anlamına gelir.
Martin Ender

22
@MartinEnder, kodunuz, benzersiz bir basamak olmadığında üzerine
cthulhu'yu

Yanıtlar:


16

05AB1E , 4 3 bayt

Bay Xcoder sayesinde bir basamak listesinin geçerli bir giriş olduğunu bildiren 1 bayt kaydedildi .

¢ÏM

Çevrimiçi deneyin!

açıklama

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

Öyle bekleyin 05AB1E, 2truthy değil; Sadece 1? : o
HyperNeutrino

@HyperNeutrino: Doğru!
Emigna

2
Bu hem çok kullanışlı hem de çok can sıkıcı görünüyor ... İlginçtir: o: D
HyperNeutrino

@HyperNeutrino: Genellikle kullanışlı olur, ancak birçok dilde herhangi bir pozitif tamsayı ya da boş olmayan bir dize döndüğü zaman, zorlukların bir truthy değeri verdiğini söylediğinde dezavantaj olabilir.
Emigna

Için numaraya bir grev görmek kolay değil !
MrZander

15

Python 3 , 40 bayt

Movatica sayesinde 2 bayt kurtarıldı .

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

Çevrimiçi deneyin!

42 bayt

Dize ve basamak parametre türlerinin listesi için çalışır. Eşsiz rakamlar olmadığı için hata atar ve bu spesifikasyonun kötüye kullanımı:

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

Çevrimiçi deneyin!


açıklama

  • lambda i: - Bir dize veya basamak listesi i parametresiyle bir lambda işlevi bildirir.
  • max(...) - Jeneratörün maksimum değerini bulur.
  • x for x in i- Karakterleri / rakamlarını sırayla gösterir i.
  • if i.count(x)<2 - Rakamın benzersiz olup olmadığını kontrol eder.

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

1
@movatica Teşekkürler!
Bay Xcoder

8

Alice , 15 bayt

/&.sDo
\i-.tN@/

Çevrimiçi deneyin!

açıklama

/...
\.../

Bu, tamamen Ordinal modda çalışan doğrusal kod için basit bir çerçevedir (yani bu program tamamen dize işleme yoluyla çalışır). Açılmamış doğrusal kod daha sonra sadece:

i..DN&-sto@

Bu ne yapar:

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, benzersiz bir rakam yoksa " boşluktaki isimsiz korkuları toplamaz ". ;) (Oku: +1, her zamanki gibi harika bir cevap.)
Kevin Cruijssen

1
@KevinCruijssen Denedim, ancak bayt tasarruf etmedi. Belki Karanlık daha uygun bir dil olabilir ...
Martin Ender


7

Kömür , 18 12 bayt

Fχ¿⁼№θIι¹PIι

Çevrimiçi deneyin! (Ayrıntılı versiyona bağlantı)

Bir çözüm bulunamazsa hiçbir şey yazdırmaz. İşin püf noktası, fordöngünün giriş dizesindeki her benzersiz sayıyı basmasıdır; ancak imleci hareket ettirmeden, bu nedenle son çözüm bulunana kadar değer kendini yeniden yazdırmaya devam eder.

Önceki sürüm, hiçbir çözüm bulunamadığında A ile Z arasındaki karakterleri yazdırdı;

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

Çevrimiçi deneyin! (Ayrıntılı versiyona bağlantı)


3
Bu ilginç bir tanımsız davranış :)
Emigna

Bu bana Fince geliyor: D
fedorqui 28:17

2
@fedorqui seni burada görmek güzel! Evet, fakat Kömür öğrenmek Jelly veya O5AB1E'den daha kolaydır ve ASCII-art oyunlarında kullanımı daha eğlencelidir. :-)
Charlie

7

Kabuğu , 7 bayt

→fo¬hgO

Çevrimiçi deneyin!(Test paketi, benzersiz bir basamağı olmadığından son test vakasında çöküyor)

Bu, puansız stilde işlevlerin bir bileşimidir (argümanlar açıkça hiçbir yerde belirtilmez). Girdiyi alır ve çıktıyı Husk'ta bir karakter listesine eşdeğer olan bir dize olarak döndürür.

açıklama

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 no'lu uzunluk kontrolü, listenin başına (sonuncusu hariç tüm elementler) alınarak ve yok sayılarak (boş listeler sahtecilik, boş olmayan listeler hakikaten yapılır) yapılır.


7

Haskell, 37 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır:

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

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

Tamsayı veya tek karakterli dizgiler olarak basamakların listesini alan adsız bir işlev. yİşlev gövdesi için küme ayraçları kullanmaktan kaçınmak için isteğe bağlı bir argüman olarak önceden hesaplanır . Rakamı dizge olarak döndürür. Bu , diğer R cevabından biraz farklı bir yaklaşım izler ve en küçük bit daha kısa olur! Benim yorumum her şeyden önce yanlış olmuş gibi görünüyor ...

tableListedeki her bir elementin oluşumunu, (string olarak) names(table(x))benzersiz değerler xolarak hesaplar . Rakamlar neyse ki sayısal olarak aynı sözlüksel olarak sıralandığından hala kullanabiliriz max.

Çevrimiçi deneyin!


Güzel! Bir şey yapmanın tabledaha kısa olacağını beklemiyordum (ayrıca nasıl namesçalışacağımı asla hatırlayamıyorum ).
aPaulT

1
<2başka bir bayt için. Sayılarda asla sıfır olmamalıdır.
MickyT

1
y=table(scan());max(names(y[y<2]))bir kaç bayt daha kısa.
JAD

6

JavaScript (ES6), 46 41 40 bayt

Bir dize olarak girdi alır. Benzersiz basamak yoksa, RangeError değerini döndürür.

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

Rick Hitchcock sayesinde -7 bayt

Shaggy sayesinde -1 bayt

Test durumları


39 bayt için uyarı çıkarın: (s,i=9)=>s.split(i).length-2?f(s,--i):i. Sen 42 bayt için yığın taşması önleyebilirsiniz: (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i.
Rick Hitchcock

Currying ile bir bayt kaydedin: s=>g=(i=9)=>s.split(i).length-2?g(--i):ive sonra ile arayınf("12")()
Shaggy

5

Python 3, 40 bayt

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

Sadece rakam listelerinde çalışır. '990' uç kasası iyi çalışıyor :)

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz! Görünüşe göre her şey yolunda gidiyor :)
Stephen

4

Brachylog , 8 bayt

ọtᵒtᵍhth

Çevrimiçi deneyin!

açıklama

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

Kabuğu , 9 8 bayt

Leo'ya, aynı byte sayısında biraz daha düzgün bir çözüm önerdiği için teşekkür ederiz.

▲‡ȯf=1`#

Çevrimiçi deneyin!

açıklama

  ȯ       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
¬←daha basit olabilir =1, yine de aynı bytecount olabilir :)
Leo

1
@ Ah Ah evet, kızartmanın parantez olmadan çalışıp çalışmadığını test etmek için çok tembeldim. Tip çıkarımında daha fazla güvenmem gerekiyor. ;)
Martin Ender

4

Mathematica, 41 bayt

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

teşekkürler @Martin Ender

Martin'in cevabımdaki yaklaşımı işte

Mathematica, 35 bayt

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

4

R, 45 43 bayt

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

Çevrimiçi deneyin!

Bir tamsayı vektörü olarak girdiyi alır. Çoğaltılan öğeleri bulur, kaldırır ve en fazla sayıyı alır. ( -InfEşsiz bir maksimum olmadığında bir uyarı ile döner.)

Her yorum için anonim bir işlev olarak düzenlendi


max(x[!duplicated(x)])biraz daha kısa, ama bu harika bir cevap. Yapacağım yolun bu kadar iyi olmadığını biliyordum. Ayrıca f=, anonim işlevler tamamen geçerli cevaplar olduğu için başlangıçtan itibaren kaldırabilirsiniz . Ayrıca, eğer bu formatı kullanıyorsanız, fonksiyonlarınızı test etmek için TIO kullanabilirsiniz: Çevrimiçi deneyin!
Giuseppe

Teşekkürler! Bence 'yinelenen' işlev, yinelenen bir öğenin ilk oluşumunu saymaz, böylece sürümünüz tam olarak işe yaramaz
aPaulT

ah, iyi nokta. Neredeyse hiç kullanmam duplicatedama aslında başka, daha kısa bir cevap düşündüm!
Giuseppe


3

APL (Dyalog Unicode) , 10 karakter = 19 bayt

Yöntem: Birden çok kez ortaya çıkan öğeleri sıfır ile çarpın ve ardından en yüksek öğeyi ayarlayın.

⌈/×∘(1=≢)⌸

 Her benzersiz eleman ve argümandaki indeksleri için:

× benzersiz öğeyi çarp

∘() İle:

  1= Birinin eşit olup olmadığına ilişkin Boole

   endekslerin toplamı (benzersiz öğenin kaç kez gerçekleştiği)

⌈/ bunun maksimumu

Çevrimiçi deneyin!

APL (Dyalog Klasik) , 15 bayt

⌈/×∘(1=≢)⎕U2338

Çevrimiçi deneyin!

Yukarıdakilerle aynıdır, fakat ⎕U2338yerine kullanır .


3

Bash + coreutils, 30 28 bayt

Dijital Travma sayesinde -2 bayt

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

Çevrimiçi deneyin!


Bash + coreutils, 20 bayt

sort|uniq -u|tail -1

Çevrimiçi deneyin!

Girdi basamak listesi olarak verilirse, satır başına bir tane olursa, katlama aşamasını atlayabiliriz. Yine de hile yapmak gibi geliyor.


2 bayt kaydetmek için grep -o .ile değiştirin fold -1. Rakam listesi olarak verilen bir giriş tamsayısının kuralları çok fazla uzattığını kabul ediyorum.
Dijital Travma

+1 sadece bash olduğu için
Anush


3

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

using System.Linq;

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

Çevrimiçi deneyin!

@CarlosAlejo Teşekkürler


Bu, giriş olarak "1948710498" ile çalışmaz ("7" yerine "9" döndürür) ve using System.Linq;bayt sayımına eklemeniz gerekir .
Charlie

@CarlosAlejo Oops! Üzgünüm! Şimdi sadece spesifikasyonları tamamen okuyun. Çözümü yakında düzenleyecektir.
kakkarot

Düzenlenen. Yapabileceğim herhangi bir optimizasyon var mı?
kakkarot

Tabii: örneğin OrderBy(...).Last()yerine kullanmayı deneyin .OrderByDescending(...).First(). Hatta daha da iyisi, biriyle en son bölümünü değiştirmek .Max(i=>i.Key)sonra Wheremaddesinin.
Charlie,

@CarlosAlejo Teşekkürler! Düzenlenen.
kakkarot

2

JavaScript (ES6), 52 50 bayt

Girdiyi basamak listesi olarak alır. 0Benzersiz basamak yoksa döndürür .

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

Test durumları


2

Japt , 12 11 10 bayt

Girdiyi rakam dizisi olarak alır.

k@¬èX ÉÃrw

Dene


açıklama

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

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

Çevrimiçi deneyin!

-6 byte @ KevinCruijssen'in içgörüsü sayesinde!


1
Sen yerini alabilir return i>0?i:0;ile return i;. Çıktı, test durumu için -1 olacaktır [9,9,9,9,9,9], ancak bu sorun için iyidir: " Benzersiz basamak yoksa, programınız her şeyi yapabilir (tanımsız davranış). ".
Kevin Cruijssen

Gerçekten, şu anki revizyondan beri yapabilirim. Test davası yüzünden yapamadım 0. Bir önceki golfde gözetimde bulunduğum bir şey! :)
Olivier Grégoire

2

APL (Dyalog) , 14 bayt

-2, TwiNight'a teşekkürler.

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

⌈/ en büyüğü

 argümanlar

× çarpılır

1=() Herkes için Boole eşit

+/ satırın toplamı

∘.=⍨ eşitlik tablosu

Çevrimiçi deneyin!


Yana 0hariç en yüksek benzersiz haneli asla 0kendisi, kullanmakta 1 byte kaydedebilirsiniz ×yerine /⍨, bu bir trene dönüştürülmesi başka byte kaydetmek
TwiNight

@TwiNight Güzel! Teşekkür ederim.
Adám



1

Mathematica, 42 bayt

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

1

F # , 88 bayt

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

Çevrimiçi deneyin!

İlk çabamdan geliştirilmiş bir yaklaşım, daha az baytla sonuçlanır.

İlgi çekici yerler: fstve sndsırasıyla ilk ve ikinci elemanın geri döndürülmesi.



1

Pyth, 6 bayt

eS.m/Q

Test odası

Açıklama:

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.