Schreiben Sie ein Programm, das den am häufigsten vorkommenden gepaarten Buchstaben in einer Zeichenfolge findet

20

Das Programm muss den Buchstaben ausgeben, der am häufigsten gekoppelt ist. Wenn Ihr Programm beispielsweise die folgende Zeichenfolge erhalten hat:

"Sally's friend Bobby searched for seashells."

es muss ausgegeben werden, Lweil "ll"es zweimal auftritt, was häufiger ist als das andere Paar "bb".

Regeln:

  • Wenn mehr als ein Buchstabe den 1. Platz für Vorkommen hat, geben Sie alle in alphabetischer Reihenfolge aus (z. B. "Sally's friends Jimmy and Bobby rummaged for seashells."sollten beide LUND- Zeichen ausgegeben werden M(oder "LM"wenn Sie möchten), da beide häufiger vorkommen als andere Paare.)
  • Buchstaben, die verdreifacht, vervierfacht usw. werden, zählen als ein Paar (z. B. wird "lll"in "willless"als nur ein Paar gezählt L.)
  • Buchstabenpaare müssen aus einem Wort bestehen (zB "Sally's sociable friends Sammy and Bobby searched for fabulous seashells."sollten ausgegeben werden Lund nicht, Sweil sie trotz "ss"mehr Vorkommen als "ll"durch Leerzeichen getrennt sind.)
  • Zähle nur Buchstaben aus dem englischen Alphabet
  • Groß- / Kleinschreibung spielt keine Rolle (z. B. "Ss"ist das Gleiche wie "SS"oder "ss", und alle werden als ein Paar gezählt S.)

Sie können Ihre Eingaben von jedem beliebigen Ort aus lesen. Kürzester Code gewinnt.

Ayane
quelle
2
Können wir davon ausgehen, dass nur Buchstaben paarweise vorkommen, oder könnte die Eingabe doppelte Leerzeichen oder doppeltes 'usw. enthalten?
Martin Ender
1
Können wir davon ausgehen, dass mindestens ein Buchstabe zweimal vorkommt?
Martin Ender
@ MartinBüttner Ja, man kann davon ausgehen, dass mindestens ein Buchstabenpaar vorkommt. Es können jedoch auch andere Zeichen paarweise vorkommen. Zähle nur Buchstaben.
Ayane
Kann ich es trotzdem in einer Liste wie der folgenden ausdrucken, auch wenn es nur ein Paar gibt ['l']?
Maltysen
@Maltysen Ja, das darfst du.
Ayane

Antworten:

6

Pyth, 26 25 24 16 15 Bytes

.M/sfthTrrz08ZG

Probieren Sie es online aus: Demonstration

Erläuterung:

.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 ...
Jakube
quelle
1
eC-> sspart ein Byte.
Isaacg
Kennen Sie gute Ressourcen, mit denen ich Pyth lernen könnte?
Beta Decay
@BetaDecay Ein Tutorial zu Pyth finden Sie unter pyth.readthedocs.org. Es behandelt nicht alle Funktionen und Tricks, ist aber ein guter Anfang. Und wenn Sie Fragen haben, fragen Sie einfach im Chat .
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

Testfälle:

$ 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
$ 
Digitales Trauma
quelle
Zählt es nur Buchstaben? (Testfall: 11ss11aa-> SA)
edc65
@ edc65 Da habe ich es behoben ;-). Eigentlich 11ss11aa-> AS :)
Digital Trauma
Ich denke, dass Sie es sort -rbrauchen, sort -rnwenn Sie 10 oder mehr Buchstabenpaare haben.
Toby Speight
@TobySpeight. Ja. Fest.
Digital Trauma
kann es mit AWK kürzer machen als mit while: awk '! n {n = $ 1}; n == $ 1' | grep -o. $
Nik O'Lai
5

CJam, 29 27 Bytes

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

Vielen Dank an @Optimizer für das Golfen mit 2 Bytes!

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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.
Dennis
quelle
z~\)-,>sollte soweit ich sehen kann funktionieren.
Optimierer
@Optimizer: Kürzer und viel intuitiver. Vielen Dank!
Dennis
4

Pyth - 23 22 21 20 Bytes

Verwendet die reguläre Ausdrücke-Ersetzung, um alle zwei oder mehr Buchstaben durch einen temporären Wert zu ersetzen, und verwendet die .MOption "Aximal", um alle Buchstaben mit dem höchsten Vorkommen zu erhalten. Vielen Dank an @Jakube für den Hinweis auf die Redundanz beim Sortieren und Speichern eines Bytes.

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

Übernimmt Eingaben von stdin und Ausgaben ['l', 'm']von 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

Probieren Sie es hier online aus .

Maltysen
quelle
4

C 155

Etwas anderes, keine regulären Ausdrücke.

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);
}
edc65
quelle
3

Python 2, 132 143 Bytes

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

Beispiellauf:

f("Sally's friends Jimmy and Bobby rummaged for seashells.")
LM
heo
quelle
1
Wahrscheinlich erfüllt es nicht "Buchstaben, die verdreifacht, vervierfacht werden, usw. zählen als ein Paar"
Ginden
Du hast recht! Ich habe versucht, es zu beheben.
Vielen
2

CJam, 37 Bytes

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

Probieren Sie es online aus

Ohne Unterstützung durch reguläre Ausdrücke ist es leider schwierig, mit Pyth zu konkurrieren. Dies ist das Beste, was ich mir bei einem ersten Durchgang ausgedacht habe.

Erläuterung:

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.
Reto Koradi
quelle
2

Q (66)

Relativ lesbar zum Booten:

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

R, 105 Bytes

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

Dies liest eine Textzeile aus STDIN und druckt eine durch Leerzeichen getrennte Liste der häufigsten gepaarten Buchstaben an STDOUT.

Ungolfed + Erklärung:

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

Beispiele:

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

Sie können es online ausprobieren !

Alex A.
quelle
Sie können wahrscheinlich die loswerden, toupperwenn Sie Groß - und Kleinschreibung ignorieren und Perl in Ihrem verwenden gregexpr. zBcat(substr(names(b<-table(regmatches(s<-readline(),gregexpr("(\\w)\\1+",s,T,T))))[b==max(b)],1,1))
MickyT
@MickyT: Ich hatte darüber nachgedacht, aber es sieht so aus, als würde das OP die Ausgabe in Großbuchstaben schreiben wollen, also müsste es touppersowieso dafür sorgen.
Alex A.
Das ist eine Schande, ich habe das verpasst, als ich die Frage las.
MickyT
Versuchte die Geige, aber es scheint für immer ohne outpuy in Firefox zu laufen. Testfall: 11ss11nn?
Edc65
@ edc65 Es ist ein Problem mit R-Fiddle; gar nichts geht. Ich habe den Administrator kontaktiert, um das Problem zu melden. Repariert meine Regex und jetzt funktioniert dein Test wie erwartet, aber es hat mich 2 Bytes gekostet. Vielen Dank für diesen Hinweis, ich weiß das zu schätzen!
Alex A.
2

Rubin, 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_byErstellt eine Hash (Wörterbuch) -Struktur, in der die Schlüssel die Ausgabe des Blocks sind und die Werte Buchstabenlisten sind, die zu jedem Schlüssel führen. In diesem Fall handelt es sich bei den Schlüsseln um Zählungen von mehr als 2 Buchstabenläufen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. maxvergleicht jedes [key,value]Tupel lexikografisch, sodass nur der maximale Schlüssel gefunden wird. Dann [1]gibt die Werteliste Teil des Tupels.

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

Nimmt Eingaben in Anführungszeichen.

Daniel Wakefield
quelle
2

C # 160 Bytes

Wo sist die Eingabe:

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;}
DLeh
quelle
1

Rs, 146 Bytes

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

Versuch es! Bitte! Es hat ewig gedauert, bis ich die Schaltflächen auch mit dem Ausgabefeld auf dieser Seite erstellt habe ...

Nun, das war ziemlich ... verrückt. Die Logik hier ist irgendwie komisch; Ich werde nur eine Erklärung posten, wenn jemand danach fragt. (Natürlich habe ich auch gesagt, dass ich für eine INTERCAL-Antwort, deren Erklärung angefordert wurde, nie erklärt habe ...;)

kirbyfan64sos
quelle
Ich mag den Interpreter, aber vielleicht möchten Sie das Debug-Kontrollkästchen in die gleiche Zeile wie die Schaltflächen oder so etwas setzen. Es sieht irgendwie komisch aus. Trotzdem cool! +1
Maltysen
Versuchte es (Fehler ...) i.stack.imgur.com/mTioT.png
edc65
@Maltysen Das überlege ich mir. Vielen Dank!
kirbyfan64sos
@ edc65 Verdammt ... was war die komplette Fehlermeldung? Klingt so, als könnte es sich um einen PyPy.js-Fehler handeln. Oder nur die Tatsache, dass ich das nie mit Firefox getestet habe ...
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(""))

Wolfhammer
quelle
f[s]?f[s]+1:1->-~f[s]
edc65
Es schlägt fehl mit Nicht-Buchstaben:Count only letters from the English alphabet
edc65
Vielen Dank @ edc65. Ich habe die Verknüpfung und die AZ-Prüfung hinzugefügt.
Wolfhammer
1
Ihr genauer Code, gestreamt und 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'')}(die letzten 2 '' sind wirklich Backticks, & # 96
edc65
1

Bash + Textutils (grep, sed), 111 Zeichen

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 (statt sed), 97 Zeichen

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

Um es zu testen, weisen Sie zuerst s zu

s="Sally's friends Jimmy ää and Bobby rummaged ää for seashells."
Nik O'Lai
quelle
0

R, 98 Bytes

Sehr ähnlich zu Alex 'Lösung, verwendet jedoch eher eine Substitution als eine Übereinstimmung, um aufeinanderfolgende Buchstaben zu bestimmen. Scan wird verwendet, um die Eingabe abzurufen und das Substitutionsergebnis auf Leerzeichen aufzuteilen.

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

Ein paar Tests

> 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
> 
MickyT
quelle