Tulis program yang menemukan surat berpasangan yang paling banyak muncul dalam sebuah string


20

Program harus menampilkan surat yang paling berpasangan. Misalnya, jika program Anda diberi string berikut:

"Sally's friend Bobby searched for seashells."

itu harus keluar Lkarena "ll"terjadi dua kali, yang lebih sering daripada pasangan lainnya "bb".

Aturan:

  • Jika lebih dari satu huruf memiliki tempat pertama untuk kemunculannya, maka keluarkan semuanya dalam urutan abjad (mis. "Sally's friends Jimmy and Bobby rummaged for seashells."Harus menampilkan keduanya LDAN M[atau "LM"jika Anda] karena keduanya lebih sering terjadi daripada pasangan lain.)
  • Surat-surat yang tiga kali lipat, empat kali lipat, dll dihitung sebagai satu pasangan (misalnya "lll"dalam "willless"dihitung hanya satu pasangan L.)
  • Pasangan surat harus dalam satu kata (misalnya "Sally's sociable friends Sammy and Bobby searched for fabulous seashells."harus keluar Ldan bukan Skarena meskipun "ss"memiliki lebih banyak kejadian daripada "ll", mereka dipisahkan oleh spasi.)
  • Hitung hanya huruf dari alfabet bahasa Inggris
  • Kasus tidak masalah (mis "Ss". Sama dengan "SS"atau "ss", dan semua dihitung sebagai satu pasangan S.)

Anda dapat membaca input Anda dari mana pun Anda mau. Kode terpendek menang.


2
Bisakah kita berasumsi bahwa hanya huruf yang akan muncul berpasangan atau dapatkah input berisi spasi ganda atau ganda 'dll?
Martin Ender

1
Bisakah kita berasumsi bahwa setidaknya satu huruf muncul dua kali?
Martin Ender

@ MartinBüttner Ya, Anda dapat mengasumsikan setidaknya satu pasangan surat terjadi. Namun, karakter lain dapat muncul berpasangan juga. Hanya hitung huruf.
ayane

Bahkan jika hanya ada satu pasang, apakah saya masih dapat mencetaknya dalam daftar ['l']?
Maltysen

@Maltysen Ya, Anda dapat melakukannya.
ayane

Jawaban:


6

Pyth, 26 25 24 16 15 byte

.M/sfthTrrz08ZG

Cobalah online: Demonstrasi

Penjelasan:

.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-> smenyimpan satu byte.
isaacg

Apakah Anda tahu sumber daya bagus yang bisa saya gunakan untuk mempelajari Pyth?
Beta Decay

@BetaDecay Anda dapat menemukan tutorial tentang Pyth di pyth.readthedocs.org Tidak mencakup semua fungsi dan trik, tetapi ini merupakan awal yang baik. Dan jika Anda memiliki pertanyaan, tanyakan saja dalam obrolan .
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
$ 

Apakah hanya menghitung huruf? (testcase: 11ss11aa-> SA)
edc65

@ edc65 Di sana saya memperbaikinya ;-). Sebenarnya, 11ss11aa-> AS :)
Digital Trauma

Saya pikir Anda sort -rperlu sort -rnjika Anda memiliki 10 atau lebih surat berpasangan.
Toby Speight

@TobySpeight. Iya nih. Tetap.
Digital Trauma

dapat membuatnya lebih pendek dengan AWK alih-alih sementara: awk '! n {n = $ 1}; n == $ 1' | grep -o. $
Nik O'Lai

5

CJam, 29 27 byte

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

Terima kasih kepada @Optimizer untuk bermain golf 2 byte!

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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~\)-,>harus bekerja sejauh yang saya bisa lihat.
Pengoptimal

@Optimizer: Lebih pendek dan lebih intuitif. Terima kasih!
Dennis

4

Pyth - 23 22 21 20 bytes

Menggunakan substitusi regexp untuk mengganti semua dua atau lebih dari alfabet ke nilai temp, dan menggunakan .Msumbu untuk mendapatkan semua yang memiliki kemunculan tertinggi. Terima kasih kepada @Jakube karena menunjukkan redundansi penyortiran dan penghematan byte.

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

Mengambil input dari stdin dan output seperti ['l', 'm']ke 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

Cobalah online di sini .


4

C, 155

Sesuatu yang berbeda, tidak ada 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())]))

Contoh dijalankan:

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

1
Mungkin itu tidak memenuhi "Surat-surat yang tiga kali lipat, empat kali lipat, dll dihitung sebagai satu pasangan"
Ginden

Kamu benar! saya sudah mencoba memperbaikinya. terima kasih telah menunjukkan itu :)
heo

2

CJam, 37 byte

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

Cobalah online

Tanpa dukungan ekspresi reguler, saya khawatir akan sulit untuk bersaing dengan Pyth. Ini adalah yang terbaik yang saya dapatkan pada pass pertama.

Penjelasan:

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)

Dapat terbaca untuk di-boot:

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

Ini membaca satu baris teks dari STDIN dan mencetak daftar terbatas ruang dari surat berpasangan yang paling umum untuk STDOUT.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

Anda dapat mencobanya secara online !


Anda mungkin dapat menyingkirkan toupperjika Anda mengabaikan case dan menggunakan perl di komputer Anda gregexpr. misalnyacat(substr(names(b<-table(regmatches(s<-readline(),gregexpr("(\\w)\\1+",s,T,T))))[b==max(b)],1,1))
MickyT

@MickyT: Saya sudah memikirkan hal itu, tetapi sepertinya OP ingin output menjadi huruf besar, jadi itu harus digunakan toupperuntuk memastikannya.
Alex A.

Itu ashame, saya melewatkan itu ketika saya membaca pertanyaan.
MickyT

Mencoba biola, tetapi tampaknya berjalan selamanya tanpa outpuy di firefox. Testcase: 11ss11nn?
edc65

@ edc65 Ini masalah dengan R-Fiddle; tidak ada yang berhasil. Saya menghubungi admin mereka untuk melaporkan masalah ini. Memperbaiki regex saya dan sekarang tes Anda berfungsi seperti yang diharapkan, tetapi harganya 2 byte. Terima kasih telah menunjukkan hal ini, saya menghargainya!
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_bymenciptakan struktur hash (kamus) di mana kunci adalah output dari blok dan nilainya adalah daftar huruf yang menghasilkan setiap kunci. Dalam hal ini, kuncinya adalah hitungan 2+ run dari huruf, tidak sensitif huruf. maxmembandingkan setiap [key,value]tuple secara leksikografis, sehingga hanya menemukan kunci maksimum. Kemudian [1]mengembalikan daftar nilai bagian dari tuple.


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

Mengambil input sebagai string yang dikutip.


2

C # 160 Bytes

Di mana sinput:

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_)/
_/

Cobalah! Silahkan! Saya butuh selamanya untuk membuat tombol bahkan dengan kotak output pada halaman itu ...

Yah, ini cukup ... gila. Logikanya di sini agak aneh; Saya hanya akan memposting penjelasan jika seseorang bertanya. (Tentu saja, saya juga mengatakan bahwa untuk jawaban INTERCAL yang penjelasannya diminta ... yang tidak pernah saya jelaskan ...;)


Saya suka penerjemah, tetapi Anda mungkin ingin meletakkan kotak centang debug pada baris yang sama dengan tombol atau sesuatu. Agak terlihat aneh sepanjang jalan mereka. Masih keren! +1
Maltysen

Mencoba (kesalahan ...) i.stack.imgur.com/mTioT.png
edc65

@Maltysen saya akan mempertimbangkan itu. Terima kasih!
kirbyfan64sos

@ edc65 Sial ... apa pesan kesalahan lengkapnya? Kedengarannya seperti itu adalah bug PyPy.js. Atau hanya fakta saya tidak pernah menguji ini di 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

Gagal dengan non-huruf:Count only letters from the English alphabet
edc65

Terima kasih @ edc65. Saya telah menambahkan pintasan dan pengecekan AZ.
wolfhammer

1
Kode persis Anda, streamlned, dan 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 'terakhir benar-benar 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 (bukannya sed), 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

untuk mengujinya, tetapkan dulu s

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

0

R, 98 byte

Sangat mirip dengan solusi Alex, tetapi menggunakan subtitusi daripada pertandingan untuk menentukan huruf berturut-turut. Scan digunakan untuk mendapatkan input dan juga untuk membagi hasil substitusi pada spasi.

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

Beberapa tes

> 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
> 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.