Напишіть програму, яка знаходить найбільш рядкові парні літери в рядку


20

Програма повинна вивести літеру, яка найбільше поєднується в парі. Наприклад, якщо вашій програмі був наданий такий рядок:

"Sally's friend Bobby searched for seashells."

він повинен виводитись Lчерез те, що "ll"трапляється двічі, що частіше, ніж інша пара "bb".

Правила:

  • Якщо більше по одній букві займає 1 місце за подіями, виведіть їх усі в алфавітному порядку (наприклад, "Sally's friends Jimmy and Bobby rummaged for seashells."слід виводити обидва LІ M[або, "LM"якщо вам подобається], оскільки вони обидва трапляються частіше, ніж інші пари.)
  • Літери, які втричі, вчетверо і т. Д., Вважаються однією парою (наприклад, "lll"в "willless"обчислюється лише однією парою L.)
  • Пари букв повинні бути одним словом (наприклад, "Sally's sociable friends Sammy and Bobby searched for fabulous seashells."слід виводити, Lа не Sтому, що, незважаючи на "ss"те, що більше зустрічається "ll", вони розділені пробілами.)
  • Порахуйте лише літери англійського алфавіту
  • Справа не має значення (наприклад "Ss", те саме, що "SS"або "ss", і всі рахуються як одна пара S.)

Ви можете прочитати свої дані з будь-якого місця. Найкоротший код виграє.


2
Чи можемо ми припустити, що тільки букви будуть зустрічатися парами чи може вхід містити подвійні пробіли чи подвійні 'тощо?
Мартін Ендер

1
Чи можна припустити, що принаймні одна літера з’являється двічі?
Мартін Ендер

@ MartinBüttner Так, ви можете припустити, що зустрічається хоча б одна пара букв. Однак і інші символи можуть з'являтися парами. Порахуйте лише букви.
аяне

Навіть якщо є лише одна пара, чи можу я все-таки надрукувати її в такому списку ['l']?
Мальтісен

@Maltysen Так, ви можете це зробити.
ayane

Відповіді:


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?
бета-розпад

@BetaDecay Ви можете знайти підручник про Pyth на pyth.readthedocs.org Він не охоплює всіх функцій та хитрощів, але це хороший початок. А якщо у вас є якісь питання, просто запитайте в чаті .
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

Тести:

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

Чи рахує він лише букви? (testcase: 11ss11aa-> SA)
edc65

@ edc65 Там я це виправив ;-). Власне, 11ss11aa-> AS :)
Digital Trauma

Я думаю, що у вас sort -rповинно бути, sort -rnякщо у вас є 10 і більше парних літер.
Toby Speight

@TobySpeight. Так. Виправлено.
Digital Trauma

можна скоротити AWK, а не час: awk '! n {n = $ 1}; n == $ 1' | grep -o. $
Nik O'Lai

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: коротше та набагато інтуїтивніше. Спасибі!
Денніс

4

Pyth - 23 22 21 20 байт

Використовує заміну regexp для заміни всіх двох або більше алфавіту на значення temp, і використовує .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

С, 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
Можливо, він не виконує "Літери, які втричі, вчетверо і т.
Д. Вважаються

Ти маєш рацію! я намагався це виправити. дякую, що
вказали

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

@MickyT: Я думав про це, але схоже, що ОП хоче, щоб результат був великим, тому його потрібно було б використовувати toupperдля того, щоб все одно.
Алекс А.

Це попелиця, я це пропустив, читаючи питання.
MickyT

Спробував скрипку, але, здається, працює вічно, не маючи грошей у firefox. Тестова шафа: 11ss11nn?
edc65

@ edc65 Проблема з R-Fiddle; взагалі нічого не працює. Я зв’язався з їх адміністратором, щоб повідомити про проблему. Виправлено мою регулярну виразку, і тепер ваш тест працює як очікувалося, але це коштувало мені 2 байти. Дякую за те, що вказав цей матеріал, я вдячний!
Олексій А.

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

Пітон 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_)/
_/

Спробуй це! Будь ласка! Мені знадобилося назавжди зробити кнопки навіть із полем виводу на цій сторінці ...

Ну, це було досить ... божевільно. Логіка тут наче дивна; Я напишу пояснення лише у випадку, коли хтось запитає. (Звичайно, я також сказав, що за ІНТЕРКАЛЬНУ відповідь, пояснення якої вимагали ... що я ніколи не пояснював ...;)


Мені подобається перекладач, але ви, можливо, захочете поставити прапорець налагодження на тій же лінії, що й кнопки чи щось таке. Це ніби дивно виглядає все, як їх. Ще круто! +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
Ваш точний код, впорядкований та 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 байт

Дуже схожа на рішення Алекса, але для заміни літер використовує замість, а не відповідність. Сканування використовується для отримання введення даних, а також для розділення результатів заміни на пробіли.

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
> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.