Bir dizede en çok bulunan eşlenmiş harfi bulan bir program yazın


20

Program en çok eşleştirilen harfi çıkarmalıdır. Örneğin, programınıza aşağıdaki dize verildiyse:

"Sally's friend Bobby searched for seashells."

çıktı almalıdır , Lçünkü "ll"diğer çiftten daha sık olan iki kez oluşur "bb".

Kurallar:

  • Birden fazla harf, tekrarlar için 1. sıraya sahipse, bunların hepsini alfabetik sırayla çıktılayın (örneğin "Sally's friends Jimmy and Bobby rummaged for seashells.", her ikisi de diğer çiftlerden daha sık ortaya çıktığı için hem LAND M[ya "LM"da lütfen isterseniz] çıktısı almalısınız .)
  • Vb, üç kat dört katına harfler (örneğin, bir çift olarak değerlendirilir "lll"olarak "willless"yalnızca bir çift olarak sayılır L.)
  • Harf çiftleri tek bir kelimede "Sally's sociable friends Sammy and Bobby searched for fabulous seashells."olmalıdır (örneğin , çıktılar Lolmamalıdır, Sçünkü "ss"daha fazla tekrar olmasına rağmen "ll"boşluklarla ayrılmıştır.)
  • Yalnızca İngilizce alfabedeki harfleri sayın
  • Durum önemli değil (örneğin veya ile "Ss"aynıdır ve tümü bir çift olarak sayılır .)"SS""ss"S

Girişinizi dilediğiniz yerden okuyabilirsiniz. En kısa kod kazanır.


2
Yalnızca harflerin çift olarak olacağını varsayabilir miyiz veya giriş çift boşluk veya çift 'vb içerebilir mi?
Martin Ender

1
En az bir harfin iki kez göründüğünü varsayabilir miyiz?
Martin Ender

@ MartinBüttner Evet, en az bir harf çifti oluştuğunu varsayabilirsiniz. Ancak, diğer karakterler de çift olarak görünebilir. Yalnızca harfleri sayın.
ayane

Sadece bir çift olsa bile, yine de benzer bir listede yazdırabilir miyim ['l']?
Maltysen

@Maltysen Evet, bunu yapabilirsiniz.
ayane

Yanıtlar:


6

Pyth, 26 25 24 16 15 bayt

.M/sfthTrrz08ZG

Çevrimiçi deneyin: Gösteri

Açıklama:

.M/sfthTrrz08ZG   implicit: z = input string
         rz0      convert z to lower-char
        r   8     run-length-encoding (into tuples [count, char])
    f             filter for tuples T, which satisfy:
     thT            T[0]-1 != 0 (count > 1)
   s              join to a string
.M            G   find the elements Z of "abcd...z", which produce the highest value:
  /...........Z       count of Z in ...

1
eC-> sbir bayt kaydeder.
isaacg

Pyth öğrenmek için kullanabileceğim iyi kaynakları biliyor musun?
Beta Çürümesi

@BetaDecay Pyth hakkında bir öğretici bulabilirsiniz pyth.readthedocs.org Tüm işlevsellikleri ve püf noktalarını kapsamaz, ancak iyi bir başlangıçtır. Ve herhangi bir sorunuz varsa, sohbette sorun .
Jakube

7

Bash + GNU coreutils, 133

grep -Eo '([A-Z])\1+'<<<"${1^^}"|cut -c1|sort|uniq -c|sort -rn|while read n l
do((a-n&&a-0))&&exit||echo $l&&a=$n
done|sort|tr -d \\n

testcases:

$ for t in "Sally's friend Bobby searched for seashells." \
> "Sally's friends Jimmy and Bobby rummaged for seashells." \
> "willless" \
> "Sally's sociable friends Sammy and Bobby searched for fabulous seashells." \
> "11ss11aa"
> do
> ./mostpaired.sh "$t"
> echo
> done
L
LM
LS
L
AS
$ 

Sadece harfleri mi sayıyor? (testcase: 11ss11aa-> SA)
edc65

@ edc65 Orada düzelttim ;-). Aslında, 11ss11aa-> AS :)
Dijital Travma

Ben senin düşünüyorum sort -rihtiyacı olduğu sort -rn10 veya daha fazla eşleştirilmiş harfler varsa.
Toby Speight

@TobySpeight. Evet. Sabit.
Dijital Travma

AWK ile süre yerine kısaltabilir: awk '! n {n = $ 1}; n == $ 1' | grep -o. $
Nik O'Lai

5

CJam, 29 27 bayt

leue`{2a>},s_el-$e`$z~\)-,>

2 bayt golf için @Optimizer teşekkürler!

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

leu    e# Read a line from STDIN and covert to uppercase.
e`     e# Perform run-length encoding.
       e# Example: "AABBBC!!" -> [[2 'A] [3 'B] [1 'C] [2 '!]]
{2a>}, e# Filter out all pairs that are less of equal to [2].
s      e# Stringify.
       e# Example: [[2 'A] [3 'B] [2 '!]] -> "2A3B2!"
_el    e# Push a copy of the string and convert to lowercase.
       e# Example: "2A3B2!" -> "2a3b2!"
-      e# Remove all character from the second string from the first.
       e# Example: "2A3B2!" "2a3b2!" - -> "AB"
$e`$   e# Sort, perform run-length encoding and sort again.
       e# Example: "ABACABDBC" -> "AAABBBCCD"
       e#                      -> [[3 'A] [3 'B] [2 'C] [1 'D]]
                               -> [[1 'D] [2 'C] [3 'A] [3 'B]]
z~     e# Zip and dump.
       e# Example: [[1 'D] [2 'C] [3 'A] [3 'B]] -> [1 2 3 3] ['D 'C 'A 'B]
\)     e# Pop out the last element from the first array.
       e# Example: [1 2 3 3] -> [1 2 3] 3
-      e# Remove all occurrences of the popped element from the array.
       e# Example: [1 2 3] 3 -> [1 2]
,      e# Compute the length of the remainder.
>      e# Skip that many elements from the character array.

z~\)-,>görebildiğim kadarıyla çalışmalı.
Doktor

@Optimizer: Daha kısa ve çok daha sezgisel. Teşekkürler!
Dennis

4

Pyth - 23 22 21 20 bayt

İki veya daha fazla alfabenin tümünü geçici bir değere değiştirmek için .Mnormal ifade ikamesi kullanır ve en yüksek oluşumun tümünü elde etmek için eksen değerini kullanır . @Jakube'e, bir baytı sıralama ve kaydetme yedekliliğine işaret ettiği için teşekkürler.

.M/:rz0+Z"{2,}"KC0KG

Stdin'den girdi alır ve ['l', 'm']stdout gibi çıktılar alır .

.M        G         Values which yield maximal amount over lowercase alphabet
 /                  Count
  :                 Regexp substitution
   rz0              Lowercased input
   +Z               String concatenate current loop var         
    "{2,}"          Regexp 2 or more of previous group
   KCZ              Inline assign null byte to K and use value
  K                 Count K which is null byte

Burada çevrimiçi deneyin .


4

C, 155

Farklı bir şey, normal ifade yok.

m=1,i=1,n[91];
main(c,a)char**a;
{
  char*t=a[1];
  for(;c=*t++;)(c&=95)>64&&c<91&&(c-(*t&95)?i=1:(c=(n[c]+=i),i=0,m=m<c?c:m));
  for(c=0;++c<91;)n[c]-m||putchar(c);
}

3

Piton 2, 132 143 bayt

def f(x):import re;x=re.findall(r'(.)\1+',x.upper());s={l:x.count(l)for l in x};print "".join(sorted([l for l in s if s[l]==max(s.values())]))

Örnek çalışma:

f("Sally's friends Jimmy and Bobby rummaged for seashells.")
LM

1
Muhtemelen "
Üçlü

Haklısın! düzeltmeye çalıştım. işaret ettiğiniz için teşekkürler :)
heo

2

CJam, 37 bayt

leue`{~_el-\(e&},1f=$e`$_W=0=f-{,1=},

Çevrimiçi deneyin

Düzenli ifade desteği olmadan, Pyth ile rekabet etmenin zor olacağından korkuyorum. İlk geçişte bulduğum en iyisi bu.

Açıklama:

l     Get input.
eu    Convert it to upper case, since case does not matter.
e`    Run length encoding, to split into groups of same characters.
{     Start of block for filtering.
  ~     Unpack the length/letter pair.
  _     Copy the letter.
  el    Change copy to lower case.
  -     Subtract to compare. If result is non-zero, this is a letter.
  \     Swap count to top.
  (     Decrement to get truthy value for count > 1.
  e&    Logical and: It's a letter, and count is > 1.
},    End of filter.
1f=   Don't need the counts anymore, filter out the letters only from the RLE pairs.
$     Sort them, so that multiples of the same letter are sequential.
e`    RLE again, to count how many multiples of each letter we had.
$     And sort again, to get the count/letter pairs in order of incrementing count.
_     Copy list.
W=0=  Pick out count of last element, which is the highest count.
f-    Remove count from pairs that have the highest count. This leaves them
      as one member lists with letter only, while others still have count/letter.
{     Start block for filter.
  ,1=   Check for list length one.
},    End filter.

2

Q (66)

Önyükleme için nispeten okunabilir:

{where g=max g:.Q.A#count each group y where not differ y:upper x}

2

R, 105 bayt

cat(substr(names(b<-table(regmatches(s<-toupper(readline()),gregexpr("([A-Z])\\1+",s))))[b==max(b)],1,1))

Bu, STDIN'den bir metin satırı okur ve en yaygın eşleştirilmiş harflerin boşlukla ayrılmış bir listesini STDOUT'a yazdırır.

Ungolfed + açıklaması:

# Read a string from STDIN, convert to uppercase
s <- toupper(readline())

# Get each match of the regex /([A-Z])\1+/
matches <- regmatches(s, gregexpr("([A-Z])\\1+", s))

# Compute the frequency of each match
freq <- table(matches)

# Get the matches with the highest frequency
highest <- names(freq)[freq == max(freq)]

# Each element of highest is the literal pair, so take the first character
first <- substr(highest, 1, 1)

# Print to STDOUT
cat(first)

Örnekler:

> (code)
Sally's friends Jimmy and Bobby rummaged for seashells.
L M

> (code)
Sally's friend Bobby searched for seashells.
L

> (code)
Sally's sociable friends Sammy and Bobby searched for fabulous seashells.
L

> (code)
11ss11nn
N S

Şunları yapabilirsiniz çevrimiçi denemek !


toupperDavayı görmezden gelirseniz ve perl'inizi kullanırsanız muhtemelen kurtulabilirsiniz gregexpr. ör.cat(substr(names(b<-table(regmatches(s<-readline(),gregexpr("(\\w)\\1+",s,T,T))))[b==max(b)],1,1))
MickyT

@MickyT: Bunu düşünmüştüm, ama OP çıktının büyük harf olmasını istiyor gibi görünüyor, bu yüzden toupperyine de bunu sağlamak için kullanmak zorunda kalacaktı .
Alex

Bu utanç verici, soruyu okuduğumda özledim.
MickyT

Kemanı denedim, ancak firefox'ta hiçbir çıkış olmadan sonsuza kadar koşuyor gibi görünüyor. Testcase: 11ss11nn?
edc65

@ edc65 R-Fiddle ile ilgili bir sorun var; hiçbir şey işe yaramaz. Sorunu bildirmek için yöneticileriyle iletişim kurdum. Normal ifademi düzelttim ve şimdi testiniz beklendiği gibi çalışıyor, ancak bana 2 bayt maliyeti. Bu şeyleri işaret ettiğiniz için teşekkür ederim, takdir ediyorum!
Alex

2

Yakut, 60

f=->s{(?a..?z).group_by{|l|s.scan(/#{l*2}+/i).size}.max[1]}

p f["Sally's friends Jimmy and Bobby rummaged for seashells."]

group_byanahtarların bloğun çıktısı olduğu ve değerlerin her anahtarla sonuçlanan harf listeler olduğu bir karma (sözlük) yapısı oluşturur. Bu durumda, anahtarlar büyük / küçük harfe duyarlı olmayan bir harfin 2'den fazla sayımıdır. maxher bir [key,value]parçayı sözlükbilimsel olarak karşılaştırır , böylece sadece maksimum anahtarı bulur. Daha sonra [1]grubun değer listesi kısmını döndürür.


2

Python 2, 185 159 153

i=input().lower()
d=sorted({l:len(i.split(l+l))for l in map(chr,range(97,123))}.items(),None,lambda x:x[1],1)
print sorted(c for c,k in d if k==d[0][1])

Girilen bir dize olarak girdi alır.


2

C # 160 Bayt

sGirdi nerede :

char? d(string s){s=s.ToUpper();return s.Select((x,i)=>new{y=x,z=i==0?(char?)null:s[i-1]}).Where(x=>x.y==x.z).GroupBy(x=>x.z).OrderBy(x=>x.Count()).Last().Key;}

1

rs, 146 bayt

[^A-Za-z]/
*(.)\1+/\1\1
*(.)(?!\1)/
$/#
+*(.)#(?!.*?\1)/#\1
+*(.)(.*)#(.*)\1/\2#\3\1\1
#/
*(.)(\1*)/\1(_)^^((^^\1\2))
([^_])(_+)(?!_)(?=.*\2_)/
_/

Dene! Lütfen! Bu sayfadaki çıkış kutusuyla bile düğmeler yapmak sonsuza dek sürdü ...

Bu oldukça ... deliydi. Buradaki mantık biraz garip; Sadece birisi sorarsa bir açıklama gönderirim. (Tabii ki, açıklamaları istenen bir INTERCAL cevabı için de ... asla açıklayamadığımı söyledim ...;)


Yorumlayıcıyı seviyorum, ancak hata ayıklama onay kutusunu düğmelerle aynı satıra koymak isteyebilirsiniz. Biraz yukarı garip görünüyor onların. Hala havalı! +1
Maltysen

Denedim (Hatalar ...) i.stack.imgur.com/mTioT.png
edc65

@Maltysen Bunu düşüneceğim. Teşekkürler!
kirbyfan64sos

@ edc65 Lanet olsun ... tam hata mesajı neydi? Bu bir PyPy.js hatası olabilir. Ya da sadece bunu Firefox'ta hiç test etmedim ...
kirbyfan64sos

1

JavaScript 156 153

var x=prompt(),f={},a=0,o
x.toUpperCase().replace(/([A-Z])\1+/g,function(m,s){m=f[s]=-~f[s]
if(a==m)o.push(s)
if(a<m)a=m,o=[s]})
alert(o.sort().join(""))


f[s]?f[s]+1:1->-~f[s]
edc65

Count only letters from the English alphabet
Harfsiz olarak

Teşekkürler @ edc65. Kısayolu ve AZ kontrolünü ekledim.
wolfhammer

1
Streamlned ve ES6'nın tam kodu: f=x=>{x.toUpperCase(f={},a=0,o).replace(/([A-Z])\1+/g,(m,s)=>a<(m=f[s]=-~f[s])?(a=m,o=[s]):a>m?0:o.push(s));alert(o.sort().join'')}(son 2 '' gerçekten backticks, & # 96
edc65

1

Bash + textutils (grep, sed), 111 karakter

fold -1<<<$s|uniq -iD|sort -f|uniq -ic|sort -rn|grep -i [A-Z]|sed -n '1h;G;s/\(\s*\S\+\s\)\(.\)\n\1./\2/p'|sort

Bash + awk (sed yerine), 97 karakter

fold -1<<<$s|uniq -iD|sort -f|uniq -ic|sort -rn|grep -i [A-Z]|awk '!n{n=$1};n==$1{print $2}'|sort

test etmek için, önce s

s="Sally's friends Jimmy ää and Bobby rummaged ää for seashells."

0

R, 98 bayt

Alex'in çözümüne çok benzer, ancak ardışık harfleri belirlemek için bir eşleşme yerine bir ikame kullanır. Tarama, girdiyi almak ve ayrıca ikame sonucunu boşluklara bölmek için kullanılır.

cat(names(a<-table(scan(,'',t=gsub('([A-z]?)(\\1?)[^A-z]*','\\U\\2 ',scan(,''),T,T))))[a==max(a)])

Birkaç test

> cat(names(a<-table(scan(,'',t=gsub('([A-z]?)(\\1?)[^A-z]*','\\U\\2 ',scan(,''),T,T))))[a==max(a)])
1: 11 was a race horse, 22 was one too. 11 won one race and 22 one won too.
19: 
Read 18 items
Read 2 items
O
> cat(names(a<-table(scan(,'',t=gsub('([A-z]?)(\\1?)[^A-z]*','\\U\\2 ',scan(,''),T,T))))[a==max(a)])
1: Sally's friends Jimmy and Bobby rummaged for seashells.
9: 
Read 8 items
Read 5 items
L M
> cat(names(a<-table(scan(,'',t=gsub('([A-z]?)(\\1?)[^A-z]*','\\U\\2 ',scan(,''),T,T))))[a==max(a)])
1: 11ss11nn
2: 
Read 1 item
Read 2 items
N S
> 
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.