文字列の中で最も出現するペアの文字を見つけるプログラムを書く


20

プログラムは、最もペアになっている文字を出力する必要があります。たとえば、プログラムに次の文字列が与えられた場合:

"Sally's friend Bobby searched for seashells."

2回発生するLため"ll"、出力する必要があり、他のペアよりも頻繁に発生し"bb"ます。

ルール:

  • 複数の文字が出現のための第一位を持っている場合は、アルファベット順にすべてのそれらの出力(例えば"Sally's friends Jimmy and Bobby rummaged for seashells."出力すべき両方LのAND M[または"LM"あなたが喜ば場合]、彼らはより頻繁に他のペアよりも発生し、両方のため。)
  • 3倍、4倍などの文字は1つのペアとしてカウントされます(たとえば"lll"、in "willless"は1つのペアのみとしてカウントされLます)。
  • 文字のペアは1ワードである必要があります(たとえば、"Sally's sociable friends Sammy and Bobby searched for fabulous seashells."出力する必要があります。出現回数がであるにもかかわらず、スペースで区切られているためではLありません)。S"ss""ll"
  • 英語のアルファベットの文字のみを数える
  • 大文字と小文字は区別されません(たとえば"Ss""SS"or と同じ"ss"で、すべてが1つのペアとしてカウントされSます)。

どこからでも入力を読むことができます。最短のコードが優先されます。


2
文字のみがペアで発生すると想定したり、入力にダブルスペースやダブル'などを含めることはできますか?
マーティンエンダー

1
少なくとも1つの文字が2回現れると仮定できますか?
マーティンエンダー

@MartinBüttnerはい、少なくとも1つの文字ペアが発生すると想定できます。ただし、他の文字もペアで表示される場合があります。文字のみを数えます。
あやね

ペアが1つしかない場合でも、次のようなリストで印刷でき['l']ますか?
マルティセン

@Maltysenはい、できます。
あやね

回答:


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-> s1バイト節約します。
isaacg

Pythを習得するのに役立つリソースを知っていますか?
ベータ崩壊

@BetaDecay pyth.readthedocs.orgでPythに関するチュートリアルを見つけることができます。すべての機能とトリックを網羅しているわけではありませんが、良いスタートです。質問がある場合は、チャットで質問してください。
ジャクベ

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 :)
デジタルトラウマ

ペア文字が10個以上sort -rあるsort -rn場合は、その必要があると思います。
トビースパイト

@TobySpeight。はい。一定。
デジタル外傷

whileではなくAWKで短くすることができます:awk '!n {n = $ 1}; n == $ 1' | grep -o。$
Nik O'Lai

5

CJam、29 27バイト

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

2バイトのゴルフをしてくれた@Optimizerに感謝します!

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:より短く、より直感的になりました。ありがとう!
デニス

4

Pyth- 23 22 21 20バイト

正規表現の置換を使用して、2つ以上のすべてのアルファベットをtemp値に.M置き換え、aximalを使用してすべてのアルファベットの出現回数を最大にします。バイトのソートと保存の冗長性を指摘してくれた@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
おそらくそれは、「1組としてカウントなど、四倍、三倍にされている文字を」満たしていない
Ginden

あなたが正しい!私はそれを修正しようとしました。それを指摘してくれてありがとう:)
heo

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に出力します。

Ungolfed +説明:

# 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

@MickyT:私はそれについて考えていましたが、OPは出力を大文字にしたいようですのでtoupper、とにかくそれを保証するために使用する必要があります。
アレックスA.

それは恥ずかしい、私は質問を読んだときにそれを見逃した。
MickyT

バイオリンを試してみましたが、Firefoxには何の問題もなく永遠に実行されるようです。テストケース:11ss11nn?
edc65

@ edc65 R-Fiddleの問題です。何も機能しません。問題を報告するために管理者に連絡しました。正規表現を修正し、テストが期待どおりに動作するようになりましたが、2バイトかかりました。このようなものを指摘してくれてありがとう、感謝しています!
アレックスA.

2

ルビー、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
マルティセン

試しました(エラー...)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チェックを追加しました。
ウルフハンマー

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 ''は本当にバック
ティックです

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
> 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.