Форум » Обработка символьных строк » ЕГЭ-24 задание 165 » Ответить

ЕГЭ-24 задание 165

Поляков: Татьяна Александровна пишет:[quote] посмотрите пожалуйста в ЕГЭ-24 задание 165 [pre2]abc = "" for i in range(26): abc += chr(65 + i) f = open("24-164.txt") maxi = 0 s_max = '' for s in f: count = 0 for i in range(0, len(s) - 1): if s[ i] == s[i+1]: count += 1 if count > maxi: maxi, s_max = count, s f.close() maxi = 0 for letter in abc: count = s_max.count(letter) if count > maxi: maxi, answer = count, letter count = 0 f = open("24-164.txt") for s in f: count += s.count(answer) print(answer, count, sep ='') [/pre2][/quote]Насколько я понимаю, вы считаете не длину самой длинной цепочки стоящих рядом одинаковых символов, а количество пар одинаковых соседних символов. Это не одно и то же.

Ответов - 10

Горкина: Большое спасибо, Вы правы. Добавление двух строчек всё исправило.

Андреев: Константин Юрьевич, уважаемые коллеги, добрый день! Большая просьба. Напишите решение задачи 165 на Паскале.

Поляков: Андреев пишет: Большая просьба. Напишите решение задачи 165 на Паскале. Пожалуйста:[pre2] ## var ABC := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var data := ReadLines('24-164.txt').ToArray; var maxK := 0; var letterMax := ''; foreach var s in data do begin var (k, currK) := (1, 1); for var i:=2 to length(s) do if s[ i] = s[i-1] then begin currK += 1; k := max(k, currK); end else currK := 1; if k > maxK then begin maxK := k; var ma := 0; foreach var letter in ABC do begin var cnt := s.CountOf(letter); if cnt > ma then (ma, letterMax) := (cnt, letter); end; end; end; Print( letterMax ); data.Select( s->s.Count(x->x=letterMax)).Sum.Println;[/pre2]Проверялось в последней версии PascalABC.NET (3.8).


Alex61: Если это задача №3786, то там данный код действительно выдает приведенный в задаче ответ, определяя, что самая длинная цепочка состоит из букв К. Но на деле там этих К максимум 7, в то время как можно найти цепочку из 10 букв М.

Поляков: Alex61 пишет: Если это задача №3786, то там данный код действительно выдает приведенный в задаче ответ, определяя, что самая длинная цепочка состоит из букв К. Но на деле там этих К максимум 7, в то время как можно найти цепочку из 10 букв М. В чем ошибка в решении, на ваш взгляд?

Поляков: Alex61 пишет: определяя, что самая длинная цепочка состоит из букв К Там другое условие. Но на деле там этих К максимум 7, в то время как можно найти цепочку из 10 букв М. И в той строке, где 10 подряд букв M, чаще всего встречается буква K.

Alex61: Ну если условие другое, все может быть. А 3786 решается в три строчки. Регулярка (.)\1* делает основную часть работы.

Поляков: Alex61 пишет: Ну если условие другое, все может быть. Вот условие 3786:Необходимо найти строку, содержащую самую длинную цепочку стоящих подряд одинаковых букв. Если таких строк несколько, надо взять ту, которая в файле встретилась раньше. Определите, какая буква встречается в этой строке чаще всего. То есть, самая длинная цепочка одинаковых символов может состоять из букв M, а встречается чаще всего в этой строке буква К.

Alex61: Навскидку если, можно еще вот так написать [pre2] ## var a := ReadAllLines('24-164.txt'); var n := a.Select(s -> s.MatchValues('(.)(\1)*').Select(ss -> (ss[1], ss.Length)) .MaxBy(t -> t[1])).Numerate.MaxBy(t -> t[1][1])[0]; var c := a[n-1].GroupBy(x -> x).OrderByDescending(t -> t.Count).EachCount.First.Key; Print(c, a.Select(s -> s.CountOf(c)).Sum) [/pre2]

ИннаSv: вот моё решение 165 на Паскале var n,i,k: integer; max:longint; a,b: array['A'..'Z'] of integer; c,maxc: char; s: string; f: text; begin k:=0; n:=0; for c:='A' to 'Z' do begin a[c]:=0; b[c]:=0; end; assign(f, '24-164.txt'); reset(f); while not eof(f) do begin readln(f,s); var maxLen:=1; var curLen:=1; for i:=2 to Length(s) do begin if (s = s[i-1]) then begin curLen+=1; if (maxLen<curLen)then maxLen:=curLen; end else curLen:=1; end; for i:=1 to Length(s) do begin a[s]:=a[s]+1; b[s]:=b[s]+1; end; if (maxLen>n)then begin n:=maxLen; max:=0; for c:='A' to 'Z' do if (a[c]>max)and (a[c]>0) then begin max:=a[c]; maxc:=c; end; end else for c:='A' to 'Z' do a[c]:=0; end; writeln(maxc, b[maxc]); close(f); end.



полная версия страницы