Viết chương trình tìm thấy chữ cái được ghép nhiều nhất trong một chuỗi


20

Chương trình phải xuất ra chữ cái được ghép nhiều nhất. Ví dụ: nếu chương trình của bạn được cung cấp chuỗi sau:

"Sally's friend Bobby searched for seashells."

nó phải xuất ra L"ll"xảy ra hai lần, thường xuyên hơn các cặp khác "bb".

Quy tắc:

  • Nếu có nhiều hơn một chữ cái có vị trí số 1 cho các lần xuất hiện, thì hãy xuất tất cả chúng theo thứ tự bảng chữ cái (ví dụ: "Sally's friends Jimmy and Bobby rummaged for seashells."nên xuất cả LAND M[hoặc "LM"nếu bạn vui lòng] vì cả hai đều xuất hiện thường xuyên hơn các cặp khác.)
  • Chữ được tăng gấp ba, gấp bốn lần, vv được tính là một cặp (ví dụ "lll""willless"được tính là chỉ có một cặp L.)
  • Các cặp chữ cái phải nằm trong một từ (ví dụ: "Sally's sociable friends Sammy and Bobby searched for fabulous seashells."nên xuất ra Lvà không phải Svì mặc dù "ss"có nhiều lần xuất hiện hơn "ll", chúng được phân tách bằng khoảng trắng.)
  • Chỉ đếm các chữ cái trong bảng chữ cái tiếng Anh
  • Trường hợp không quan trọng (ví dụ như "Ss"giống "SS"hoặc "ss", và tất cả được tính là một cặp S.)

Bạn có thể đọc đầu vào của bạn từ bất cứ nơi nào bạn muốn. Mã ngắn nhất sẽ thắng.


2
Chúng ta có thể giả sử rằng chỉ các chữ cái sẽ xuất hiện theo cặp hoặc đầu vào có thể chứa khoảng trắng kép hoặc gấp đôi 'không?
Martin Ender

1
Chúng ta có thể cho rằng ít nhất một chữ cái xuất hiện hai lần?
Martin Ender

@ MartinBüttner Có, bạn có thể giả sử ít nhất một cặp chữ cái xảy ra. Tuy nhiên, các nhân vật khác cũng có thể xuất hiện theo cặp. Chỉ đếm chữ.
ayane

Ngay cả khi chỉ có một cặp, tôi vẫn có thể in nó trong một danh sách như thế ['l']nào?
Maltysen

@Maltysen Có, bạn có thể làm như vậy.
ayane

Câu trả lời:


6

Pyth, 26 25 24 16 15 byte

.M/sfthTrrz08ZG

Dùng thử trực tuyến: Trình diễn

Giải trình:

.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-> slưu một byte.
isaacg

Bạn có biết tài nguyên tốt nào tôi có thể sử dụng để học Pyth không?
Beta Decay

@BetaDecay Bạn có thể tìm thấy một hướng dẫn về Pyth tại pyth.readthedocs.org Nó không bao gồm tất cả các chức năng và thủ thuật, nhưng đó là một khởi đầu tốt. Và nếu bạn có bất kỳ câu hỏi nào, chỉ cần hỏi trong cuộc trò chuyện .
Jakube

7

Lõi cốt lõi Bash + GNU, 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

Testcase:

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

Có phải nó chỉ đếm chữ? (testcase: 11ss11aa-> SA)
edc65

@ edc65 Tôi đã sửa nó rồi ;-). Trên thực tế, 11ss11aa-> NHƯ :)
Chấn thương kỹ thuật số

Tôi nghĩ rằng bạn sort -rcần phải có sort -rnnếu bạn có 10 chữ cái được ghép nối trở lên.
Toby Speight

@TobySightight. Vâng. Đã sửa.
Chấn thương kỹ thuật số

có thể làm cho nó ngắn hơn bằng AWK thay vì while: awk '! n {n = $ 1}; n == $ 1' | grep -o. $
Nik O'Lai

5

CJam, 29 27 byte

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

Cảm ơn @Optimizer vì đã chơi golf 2 byte!

Hãy thử trực tuyến trong trình thông dịch CJam .

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

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~\)-,>nên làm việc xa như tôi có thể thấy.
Tối ưu hóa

@Optimizer: Ngắn gọn và trực quan hơn rất nhiều. Cảm ơn!
Dennis

4

Pyth - 23 22 21 20 byte

Sử dụng thay thế regrec để thay thế tất cả hai hoặc nhiều hơn bảng chữ cái thành giá trị tạm thời và sử dụng .Maximal để có được tất cả các lần xuất hiện cao nhất. Cảm ơn @Jakube đã chỉ ra sự dư thừa của việc sắp xếp và lưu một byte.

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

Đưa đầu vào từ stdin và đầu ra muốn ['l', 'm']vào thiết bị xuất chuẩn.

.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

Hãy thử trực tuyến tại đây .


4

C, 155

Một cái gì đó khác nhau, không có regexps.

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 byte

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

Chạy ví dụ:

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

1
Có lẽ nó không hoàn thành "Các chữ cái được nhân ba, tăng gấp bốn lần, v.v ... được tính là một cặp"
Ginden

Bạn đúng! Tôi đã cố gắng sửa nó. cảm ơn vì đã chỉ ra điều đó :)
heo

2

CJam, 37 byte

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

Dùng thử trực tuyến

Nếu không có sự hỗ trợ biểu hiện thường xuyên, tôi e rằng sẽ rất khó để cạnh tranh với Pyth. Đây là điều tốt nhất tôi nghĩ ra trong lần đầu tiên.

Giải trình:

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

Hỏi (66)

Tương đối dễ đọc để khởi động:

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

2

R, 105 byte

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

Điều này đọc một dòng văn bản từ STDIN và in một danh sách được phân tách bằng dấu cách của các chữ cái được ghép nối phổ biến nhất thành STDOUT.

Ungolfed + giải thích:

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

Ví dụ:

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

Bạn có thể thử trực tuyến !


Bạn có thể thoát khỏi touppertrường hợp nếu bạn bỏ qua trường hợp và sử dụng perl trong của bạn gregexpr. ví dụcat(substr(names(b<-table(regmatches(s<-readline(),gregexpr("(\\w)\\1+",s,T,T))))[b==max(b)],1,1))
MickyT

@MickyT: Tôi đã nghĩ về điều đó, nhưng có vẻ như OP muốn đầu ra là chữ hoa, vì vậy nó sẽ phải sử dụng toupperđể đảm bảo điều đó.
Alex A.

Đó là ashame, tôi đã bỏ lỡ điều đó khi đọc câu hỏi.
MickyT

Đã thử fiddle, nhưng nó dường như chạy mãi mãi mà không có outpuy trong firefox. Testcase: 11ss11nn?
edc65

@ edc65 Đó là một vấn đề với R-Fiddle; không có gì ở tất cả các công trình. Tôi đã liên lạc với quản trị viên của họ để báo cáo vấn đề. Đã sửa lỗi regex của tôi và bây giờ bài kiểm tra của bạn hoạt động như mong đợi, nhưng nó tiêu tốn của tôi 2 byte. Cảm ơn đã chỉ ra những thứ này, tôi đánh giá cao nó!
Alex A.

2

Hồng ngọc, 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_bytạo cấu trúc băm (từ điển) trong đó các khóa là đầu ra của khối và các giá trị là danh sách các chữ cái dẫn đến mỗi khóa. Trong trường hợp này, các khóa được tính từ hơn 2 lần chạy một chữ cái, không phân biệt chữ hoa chữ thường. maxso sánh từng [key,value]tuple theo từ vựng, vì vậy nó chỉ tìm thấy khóa tối đa. Sau đó [1]trả về phần danh sách giá trị của bộ dữ liệu.


2

Con trăn 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])

Đưa đầu vào dưới dạng một chuỗi trích dẫn.


2

C # 160 byte

Nơi slà đầu vào:

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 byte

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

Thử nó! Xin vui lòng! Tôi đã mất mãi mãi để tạo các nút ngay cả với hộp đầu ra trên trang đó ...

Chà, điều này khá ... điên rồ. Logic ở đây là loại lạ; Tôi sẽ chỉ đăng một lời giải thích nếu ai đó hỏi. (Tất nhiên, tôi cũng đã nói rằng đối với câu trả lời INTERCAL có yêu cầu giải thích ... mà tôi chưa bao giờ giải thích ...;)


Tôi thích trình thông dịch, nhưng bạn có thể muốn đặt hộp kiểm gỡ lỗi trên cùng dòng với các nút hoặc một cái gì đó. Nó trông có vẻ kỳ lạ trên đường đi của họ. Vẫn ngầu! +1
Maltysen

Đã thử nó (lỗi ...) i.stack.imgur.com/mTioT.png
edc65

@Maltysen Tôi sẽ xem xét điều đó. Cảm ơn!
kirbyfan64sos

@ edc65 Chết tiệt ... thông báo lỗi hoàn chỉnh là gì? Âm thanh như nó có thể là một lỗi PyPy.js. Hoặc thực tế là tôi chưa bao giờ thử nghiệm điều này trên 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

Nó không thành công với các chữ cái không:Count only letters from the English alphabet
edc65

Cảm ơn @ edc65. Tôi đã thêm phím tắt và kiểm tra AZ.
sói

1
Mã chính xác của bạn, được phát trực tuyến và 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 '' cuối cùng thực sự là backticks, & # 96
edc65

1

Bash + textutils (grep, sed), 111 ký tự

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 (thay vì sed), 97 ký tự

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

để kiểm tra nó, đầu tiên chỉ định s

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

0

R, 98 byte

Rất giống với giải pháp của Alex, nhưng sử dụng thay thế thay vì khớp để xác định các chữ cái liên tiếp. Quét được sử dụng để có được đầu vào và cũng để phân chia kết quả thay thế trên không gian.

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

Một vài bài kiểm tra

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