编写一个程序,查找字符串中出现次数最多的配对字母


20

程序必须输出配对最多的字母。例如,如果为您的程序提供了以下字符串:

"Sally's friend Bobby searched for seashells."

它必须输出,L因为"ll"发生两次,这比另一对更频繁"bb"

规则:

  • 如果出现多个字母的位置排在第一位,则以字母顺序输出所有字母(例如,"Sally's friends Jimmy and Bobby rummaged for seashells."应同时输出两个LAND M(或"LM"请输出),因为它们都比其他字母对更频繁出现。)
  • 三倍,四倍等的字母算作一对(例如"lll"in中"willless"仅算作一对L。)
  • 字母对必须在一个单词中(例如,"Sally's sociable friends Sammy and Bobby searched for fabulous seashells."应该输出,L而不是S因为尽管"ss"出现的次数多于"ll",但它们之间用空格隔开。)
  • 仅计算英文字母中的字母
  • 大小写无关紧要(例如"Ss",与"SS"或相同"ss",并且全部计为一对S。)

您可以从任何地方阅读您的输入。最短的代码胜出。


2
我们是否可以假设仅字母会成对出现,或者输入中是否可以包含双精度空格或双'精度等?
Martin Ender

1
我们可以假定至少一个字母出现两次吗?
Martin Ender

@MartinBüttner是的,您可以假设至少出现一对字母。但是,其他字符也可能成对出现。只算字母。
ayane

即使只有一对,我仍可以像这样打印列表['l']吗?
Maltysen

@Maltysen是的,您可以这样做。
ayane

Answers:


6

Pyth,26 25 24 16 15字节

.M/sfthTrrz08ZG

在线尝试:演示

说明:

.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-> s保存一个字节。
isaacg

您知道我可以用来学习Pyth的任何良好资源吗?
Beta Decay

@BetaDecay您可以在pyth.readthedocs.org上找到有关Pyth的教程。虽然没有涵盖所有功能和技巧,但这是一个不错的开始。如果您有任何疑问,只需在聊天中提问。
雅库布,2015年

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

测试用例:

$ 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
$ 

它只算字母吗?(测试用例:11ss11aa-> SA)
edc65

@ edc65我在那里修好了;-)。实际上11ss11aa-> AS :)
Digital Trauma 2015年

我认为你sort -r需要的是sort -rn,如果你有10名或更多成对的字母。
Toby Speight 2015年

@TobySpeight。是。固定。
Digital Trauma 2015年

可以使用AWK而不是while缩短:awk'!n {n = $ 1}; n == $ 1'| grep -o。$
Nik O'Lai 2015年

5

CJam,29 27字节

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

感谢@Optimizer打高尔夫球2个字节!

CJam解释器中在线尝试。

怎么运行的

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~\)-,>据我所知应该可以工作。
Optimizer

@Optimizer:更短,更直观。谢谢!
丹尼斯

4

Pyth- 23 22 21 20字节

使用正则表达式替换将两个或两个以上的字母全部替换为一个临时值,并使用.Maximal来获得所有出现次数最高的字母。感谢@Jakube指出了排序和保存字节的冗余。

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

从stdin接受输入,['l', 'm']并向stdout接受输出。

.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

在这里在线尝试


4

C,155

有所不同,没有正则表达式。

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

Python 2中,132个 143字节

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())]))

示例运行:

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

1
可能无法满足“三倍,四倍等算作一对的信”
Ginden

你是对的!我试图解决它。感谢您指出:)
heo 2015年

2

CJam,37个字节

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

在线尝试

如果没有正则表达式支持,恐怕要与Pyth竞争将很困难。这是我第一遍想出的最好的结果。

说明:

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)

相对可读的启动方式:

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

2

R,105字节

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

这将从STDIN中读取一行文本,并以空格分隔的最常见的配对字母列表发送到STDOUT。

取消+说明:

# 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)

例子:

> (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

您可以在线尝试


toupper如果忽略大小写并在中使用perl,则可能可以摆脱gregexpr。例如cat(substr(names(b<-table(regmatches(s<-readline(),gregexpr("(\\w)\\1+",s,T,T))))[b==max(b)],1,1))
MickyT 2015年

@MickyT:我已经考虑过了,但是看起来OP希望输出是大写的,因此toupper无论如何都必须使用它来确保。
Alex A.

真丢脸,当我读到这个问题时,我很想念它。
MickyT 2015年

尝试了小提琴,但它似乎永远运行,并且在Firefox中没有异常。测试用例:11ss11nn?
edc65

@ edc65这是R-Fiddle的问题;什么都没有。我联系了他们的管理员以报告该问题。修复了我的正则表达式,现在您的测试按预期工作了,但是花了我2个字节。感谢您指出这些内容,我非常感谢!
Alex A.

2

Ruby,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_by创建一个哈希(字典)结构,其中键是块的输出,值是产生每个键的字母列表。在这种情况下,键是不超过2个字符的字母计数,不区分大小写。max[key,value]字典顺序比较每个元组,因此它只找到最大键。然后[1]返回元组的值列表部分。


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])

将输入作为带引号的字符串。


2

C#160字节

s输入在哪里:

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个字节

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

试试吧!请!即使在该页面上的输出框上,我也花了很多时间来制作按钮。

好吧,这真是……疯狂。这里的逻辑有点奇怪;如果有人问,我只会发布解释。(当然,我也说过,对于INTERCAL答案,要求提供解释...我从未解释过...;)


我喜欢解释器,但您可能希望将调试复选框与按钮或其他内容放在同一行。看起来一直很奇怪。还是很酷!+1
Maltysen

尝试过(错误...)i.stack.imgur.com/mTioT.png
edc65

@Maltysen我会考虑的。谢谢!
kirbyfan64sos

@ edc65该死...完整的错误消息是什么?听起来可能是PyPy.js错误。还是我从未在Firefox上测试过这一事实……
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
edc65

谢谢@ edc65。我添加了快捷方式和AZ检查。
wolfhammer

1
您的确切代码,streamlned和ES6 :(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'')}最后2个实际上是反引号,&#96
edc65

1

Bash + textutils(grep,sed),111个字符

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),97个字符

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

要测试它,首先分配s

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

0

R,98个字节

与Alex的解决方案非常相似,但是使用替代而非匹配来确定连续字母。扫描用于获取输入,也用于将替换结果分割在空格上。

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

几次测试

> 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
> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.