Как найти наименьшее число символов

Студворк — интернет-сервис помощи студентам

проблема в том что я могу решать такого типа задачи, но с цепочкой символов, а тут разделение на строки.
Объясните пожалуйста как ее решать, у меня завтра экзамен))
Сам файл я вкладывать не буду, ограничения форума не позволяют. Напишите пожалуйста программу для этого задания
вот и задача:

Текстовый файл содержит строки различной длины. Общий объём файла не превышает 1 Мбайт. Строки содержат только заглавные буквы латинского алфавита (ABC…Z).

Необходимо найти строку, содержащую наименьшее количество букв G (если таких строк несколько, надо взять ту, которая находится в файле раньше), и определить, какая буква встречается в этой строке чаще всего. Если таких букв несколько, надо взять ту, которая позже стоит в алфавите.

Пример. Исходный файл:

GIGA

GABLAB

AGAAA

В этом примере в первой строке две буквы G, во второй и третьей — по одной. Берём вторую строку, т. к. она находится в файле раньше. В этой строке чаще других встречаются буквы A и B (по два раза), выбираем букву B, т. к. она позже стоит в алфавите. В ответе для этого примера надо записать B.

Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.

Как найти слово, в котором число различных символов минимально? Если таких слов несколько, найти первое из них.

Как это можно сделать?

aleksandr barakin's user avatar

задан 8 янв 2016 в 21:07

Neon's user avatar

2

Я так понял, что вам нужно в заданной строке найти слово, в котором число УНИКАЛЬНЫХ символов минимально (сколько раз они повторяются неважно)? Тогда что-то типа такого (если разделитель слов — пробелы):

def f(string):
    for i in string.split(' '):
        if (len(set(string)) > len(set(i))):
            string = i
    return string

UPD

Добавил вариант на случай ввода строки в форме NFD (спасибо @jfs):

import regex
def f1(string):

    def uniq(s):
        return regex.findall(r'X', s, regex.U)

    for i in string.split(' '):
        if (len(uniq(string)) > len(uniq(i))):
            string = i
    return string

ответ дан 8 янв 2016 в 21:55

Flowneee's user avatar

FlowneeeFlowneee

3,7991 золотой знак20 серебряных знаков31 бронзовый знак

5

Если символ это Unicode codepoint, то чтобы найти слово с минимальным кол-вом символов из списка words:

word = min(words, key=lambda w: len(set(w)))

Если символ это символ, видимый пользователю (grapheme cluster):

import regex as re # pip install regex
word = min(words, key=lambda w: len(set(re.findall(r'X', w))))

Если слова в тексте разделены символами пробелов (включая новый строки и Юникодные символы), то words = text.split().

ответ дан 12 янв 2016 в 8:40

jfs's user avatar

jfsjfs

51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков

tr -c \n 1 <testfile |   #first transform every [^n] char to a 1
grep -nF ''           |   #next get line numbers
paste -d: - testfile  |   #then paste it together with itself
sort  -t: -nk2,2          #then sort on second field

… и победитель … строка 2, казалось бы.

2:1111:4for
4:11111:five!
1:1111111:seven/7
3:11111111:8 eight?

Но проблема в том, что каждая строка должна быть более чем в два раза длиннее, чтобы она работала — поэтому LINE_MAX эффективно уменьшается вдвое. Причина в том, что он использует — что, база 1? — представлять длину линии. Подобный и, возможно, более аккуратный подход может заключаться в сжатии этой информации в потоке. Первая идея, которая приходит мне в голову, заключается в том, что я должен unexpand:

tr -c \n   <testfile    |   #transform all [^n] to <space>
unexpand -t10             |   #squeeze every series of 10 to one tab
grep -nF ''               |   #and get the line numbers
sed    's/:/!d;=;:/;h;:big    #sed compares sequential lines
$P;$!N; /(:[^ ]*)( *)n.*1.*2/!D     #newest line is shorter or...
        g;/:./!q;b big'   |   #not; quit input entirely for blank line
sed -f - -e q testfile        #print only first occurrence of shortest line

Это печатает …

2
4for

Еще один, просто sed:

sed -n '/^n/D;s/(.)(n.*)*/1/g
$p;h;   s// /g;G;x;n;//!g;H;s// /g
G;      s/^( *)(n 1 *){0,1}n//
D'      <infile >outfile

Синтаксис соответствует стандартам — но это не гарантирует, что любой старый sedсправится (reference-group){counts}правильно — многие этого не делают.

Он в основном применяет одно и то же регулярное выражение для ввода многократно — что может быть очень полезно, когда пришло время их компилировать. Этот шаблон:

(.)(n.*)*

Который по-разному соответствует различным строкам. Например:

string1nstring2nstring3

… совпадает с sin 1и ''нулевой строкой in 2.

1nstring2nstring3

… сочетается с 1в 1и nstring2nstring3в2

nstring2nstring3

… совпадает с nin 1и ''нулевой строкой in 2. Это было бы проблематично, если бы была какая-либо вероятность появления newline в начале пространства шаблонов, но для предотвращения этого используются команды /^n/D, и //!g. Я использовал, [^n]но другие потребности в этом небольшом скрипте сделали переносимость проблемой, и я не был удовлетворен многими путями, которые он часто неверно истолковывает. Плюс, .быстрее.

nstring2
string1

… матч nи sснова в, 1и оба получают'' нулевую строку 2. Пустые строки не совпадают вообще.

Когда шаблон применяется gлобально, два смещения — как крайнее левое стандартное смещение, так и меньшее правое смещение на боковой nлинии — уравновешиваются, чтобы вызвать пропуск. Несколько примеров:

s/(.)(n.*)*/1:2/g
s/(.)(n.*)*/21:/g
s/(.)(n.*)*/1: /g
s/(.)(n.*)*/ :2/g

… если все применяются (не в последовательности) к следующей строке …

string1nstring2

… превратит его в …

s:t:r:i:n:g:1:nstring2
s:t:r:i:n:g:nstring21:
s:t:r:i:n:g:1: 
 : : : : : : :nstring2

В основном я использую регулярное выражение, чтобы всегда обрабатывать только первую строку в любом шаблонном пространстве, к которому я его применяю. Это позволяет мне манипулировать двумя различными версиями как сохраненной строки с кратчайшим совпадением, так и самой последней строки, не прибегая к циклам тестирования — каждая примененная замена обрабатывает все пространство шаблона одновременно.

Различные версии необходимы для сравнения строк и строк — поэтому должна быть версия каждой строки, в которой все символы гарантированно равны. Но, конечно, если одна или другая из них на самом деле окажутся самой ранней из самых коротких строк на входе, то строка, напечатанная для вывода, вероятно, должна быть исходной версией строки, а не той, которую я санировал / гомогенизировал для сравнения. И поэтому мне нужны две версии каждого.

К сожалению, еще одной необходимостью является многократное переключение буфера для обработки одного и того же, но, по крайней мере, ни один из буферов никогда не превышает больше, чем четыре строки, необходимые для поддержания актуальности, — и поэтому, возможно, это не страшно.

Во всяком случае, для каждого цикла первое, что происходит, — это преобразование запомненной строки, потому что единственная фактически сохраненная копия — это буквальный оригинал — в …

^               nremembered line$

… и после этого nстрока ввода ext перезаписывает любой старый буфер. Если он не содержит хотя бы одного символа, он фактически игнорируется. Было бы намного проще простоq использовать первую появившуюся пустую строку, но в моих тестовых данных их было много, и я хотел обработать несколько абзацев.

И поэтому, если он содержит символ, его буквальная версия добавляется к запомненной строке, а его версия с разнесенным сравнением располагается в начале пространства шаблонов, например так:

^   n               nremembered linennew$

Последнее замещение применяется к этому образцу пространства:

s/^( *)(n 1 *){0,1}n//

Таким образом, если символ новой строки может уместиться в пределах пространства, необходимого для хранения запомненной строки, по крайней мере, с одним запасным символом, тогда первые две строки заменяются, в противном случае — только первая.

Независимо от результата, первая строка в шаблонном пространстве всегда Dвыбирается в конце цикла, прежде чем начинать снова. Это означает, что если новая строка короче последней строки …

new

… отправляется обратно к первой замене в цикле, которая всегда будет удаляться только с первого символа новой строки — и поэтому она остается целой. Но если это не так, строка …

remembered linennew

… вместо этого начнется следующий цикл, и первая замена удалит из него строку …

nnew

…каждый раз.

В самой последней строке запомненная строка выводится на стандартный вывод, поэтому для приведенных данных примера она печатает:

4for

Но, если серьезно, используйте tr.

СРОЧНО ПОМОГИТЕ!

20 БАЛЛОВ!

Какое наименьшее число символов должно быть в алфавите, чтобы с помощью всевозможных трёхбуквенных слов, состоящих из символов данного алфавита, можно было передать не менее 9 различных сообщений?

Если вам необходимо получить ответ на вопрос СРОЧНО ПОМОГИТЕ?, относящийся
к уровню подготовки учащихся 5 — 9 классов, вы открыли нужную страницу.
В категории Информатика вы также найдете ответы на похожие вопросы по
интересующей теме, с помощью автоматического «умного» поиска. Если после
ознакомления со всеми вариантами ответа у вас остались сомнения, или
полученная информация не полностью освещает тематику, создайте свой вопрос с
помощью кнопки, которая находится вверху страницы, или обсудите вопрос с
посетителями этой страницы.

Е24.11. Необходимо найти строку, содержащую наименьшее количество букв G

Необходимо найти строку, содержащую наименьшее количество букв G (если таких строк несколько, надо взять ту, которая находится в файле  раньше), и определить, какая буква встречается в этой строке чаще всего. Если таких букв несколько, надо взять ту, которая позже стоит в алфавите.

Текстовый файл содержит строки различной длины. Общий объём файла не превышает 1 Мбайт. Строки содержат только заглавные буквы латинского алфавита (ABC…Z).

Пример. Исходный файл:
GIGA
GABLAB
AGAAA
В этом примере в первой строке две буквы G, во второй и третьей – по одной.
Берём вторую строку, т. к. она находится в файле раньше. В этой строке чаще других встречаются буквы A и B (по два раза), выбираем букву B, т. к. она позже стоит в алфавите. В ответе для этого примера надо записать B.

TXT

СтатГрад 17.03.2021 Вариант ИН2010401 задания №24

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти литературу по психологии
  • Как найти статус налогоплательщика
  • Как найти длину поршня насоса
  • Как найти музыку в интернете по фрагменту
  • Как найти кто сделал фото

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии