Задание 24
В этом блоке задач предполагается, что в файле одна строка, просто прочитаем её найдём требуемое в задаче значение.
Пример 1
Текстовый файл 24.txt состоит не более чем из символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны. Для выполнения этого задания следует написать программу.
- Java
- C++
- Python
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Example1 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/24.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если текущий символ отличается от следующего
if (s.charAt(i) != s.charAt(i + 1)) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);
}
}
#include <iostream>
#include <fstream>
// главный метод программы
int main() {
// открываем файл
std::ifstream myfile;
// бинарник собирается в отдельной папке, поэтому относительный путь такой
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
myfile.open("../problem24/24.txt");
// читаем строку файла
std::string in;
myfile >> in;
// закрываем файл
myfile.close();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < in.length() - 1; i++) {
// если текущий символ отличается от следующего
if (in[i] != in[i + 1]) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
std::cout << maxCnt << std::endl;
return 0;
}
# открываем файл, относительный путь строится от папки со скриптом
# можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
with open('24.txt') as f:
# читаем строку файла
s = f.readline()
# кол-во подряд идущих различных отличных от соседей символов
# изначально длина такой последовательности равна 1
cnt = 1
# масимальная длина тоде равна 1
maxCnt = 1
# перебираем все индексы, кроме последнего, потому что
# будем сравнивать пары
for i in range(len(s) - 1):
# если текущий символ отличается от следующего
if s[i] != s[i + 1]:
# увеличиваем количество на 1
cnt = cnt + 1
# если текущий символ такой же, как и следующий
else:
# если количество подряд идущих различных символов
# больше максимального
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# сбрасываем кол-во подряд идущих различных символов
cnt = 1
# !не забудьте проверить последнее количество различных символов
# потому что последний символ мог тоже отличаться, и тогда
# внутри цикла проверку длины его последовательности с максимальной
# выполнена не будет, ведь она срабатывает только
# если мы встречаем первый повторяющийся символ
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# выводим максимальное количество
print(maxCnt)
Вывод программы:
35
Ответ: 35
Пример 2
В текстовом файле k8.txt находится цепочка из символов, в которую могут входить заглавные
буквы латинского алфавита A
...Z
и десятичные цифры. Найдите длину самой длинной подцепочки,
состоящей из одинаковых символов. Для каждой цепочки максимальной длины выведите в отдельной
строке сначала символ, из которого строится эта цепочка, а затем через пробел –
длину этой цепочки.
Если символы одинаковые, просто замените в проверке !=
на ==
.
- Java
- C++
- Python
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Example2 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-8.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если текущий символ совпадает со следующим
if (s.charAt(i) == s.charAt(i + 1)) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);
}
}
#include <iostream>
#include <fstream>
// главный метод программы
int main() {
// открываем файл
std::ifstream myfile;
// бинарник собирается в отдельной папке, поэтому относительный путь такой
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
myfile.open("../problem24/k7-8.txt");
// читаем строку файла
std::string in;
myfile >> in;
// закрываем файл
myfile.close();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < in.length() - 1; i++) {
// если текущий символ совпадает со следующим
if (in[i] == in[i + 1]) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
std::cout << maxCnt << std::endl;
return 0;
}
# открываем файл, относительный путь строится от папки со скриптом
# можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
with open('k7-8.txt') as f:
# читаем строку файла
s = f.readline()
# кол-во подряд идущих различных отличных от соседей символов
# изначально длина такой последовательности равна 1
cnt = 1
# масимальная длина тоде равна 1
maxCnt = 1
# перебираем все индексы, кроме последнего, потому что
# будем сравнивать пары
for i in range(len(s) - 1):
# если текущий символ совпадает со следующим
if s[i] == s[i + 1]:
# увеличиваем количество на 1
cnt = cnt + 1
# если текущий символ такой же, как и следующий
else:
# если количество подряд идущих различных символов
# больше максимального
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# сбрасываем кол-во подряд идущих различных символов
cnt = 1
# !не забудьте проверить последнее количество различных символов
# потому что последний символ мог тоже отличаться, и тогда
# внутри цикла проверку длины его последовательности с максимальной
# выполнена не будет, ведь она срабатывает только
# если мы встречаем первый повторяющийся символ
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# выводим максимальное количество
print(maxCnt)
Вывод программы:
10
Ответ: 10
Пример 3
Текстовый файл 24-157.txt состоит не более чем из
106 символов и содержит только заглавные
буквы латинского алфавита A
...Z
. Определите максимальное количество идущих подряд символов,
среди которых нет сочетания стоящих рядом букв P
и R
(в любом порядке).
- Java
- C++
- Python
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Example2 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-8.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < s.length() - 1; i++) {
// если нет сочетания стоящих рядом букв `P` и `R`
if (!((s.charAt(i) == 'P' && s.charAt(i + 1) == 'R') ||
(s.charAt(i) == 'R' && s.charAt(i + 1) == 'P'))) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);
}
}
#include <iostream>
#include <fstream>
// главный метод программы
int main() {
// открываем файл
std::ifstream myfile;
// бинарник собирается в отдельной папке, поэтому относительный путь такой
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
myfile.open("../problem24/24-157.txt");
// читаем строку файла
std::string in;
myfile >> in;
// закрываем файл
myfile.close();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 1
int cnt = 1;
// масимальная длина тоде равна 1
int maxCnt = 1;
// перебираем все индексы, кроме последнего, потому что
// будем сравнивать пары
for (int i = 0; i < in.length() - 1; i++) {
// если нет сочетания стоящих рядом букв `P` и `R`
if (!((in[i] == 'P' && in[i + 1] == 'R') ||
(in[i] == 'R' && in[i + 1] == 'P'))) {
// увеличиваем количество на 1
cnt++;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 1;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
std::cout << maxCnt << std::endl;
return 0;
}
# открываем файл, относительный путь строится от папки со скриптом
# можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
with open('24-157.txt') as f:
# читаем строку файла
s = f.readline()
# кол-во подряд идущих различных отличных от соседей символов
# изначально длина такой последовательности равна 1
cnt = 1
# масимальная длина тоде равна 1
maxCnt = 1
# перебираем все индексы, кроме последнего, потому что
# будем сравнивать пары
for i in range(len(s) - 1):
# если нет сочетания стоящих рядом букв `P` и `R`
if not ((s[i] == 'P' and s[i + 1] == 'R') or
(s[i] == 'R' and s[i + 1] == 'P')):
# увеличиваем количество на 1
cnt = cnt + 1
# если текущий символ такой же, как и следующий
else:
# если количество подряд идущих различных символов
# больше максимального
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# сбрасываем кол-во подряд идущих различных символов
cnt = 1
# !не забудьте проверить последнее количество различных символов
# потому что последний символ мог тоже отличаться, и тогда
# внутри цикла проверку длины его последовательности с максимальной
# выполнена не будет, ведь она срабатывает только
# если мы встречаем первый повторяющийся символ
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# выводим максимальное количество
print(maxCnt)
Вывод программы:
2940
Ответ: 2940
Пример 4
В текстовом файле k7-9.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите максимальную длину цепочки вида ABCABC... (составленной из фрагментов ABC, последний фрагмент может быть неполным).
В этой задаче необходимо увеличивать переменную cnt
на три, т.к. искомая строка имеет длину
три, а к i
прибавляется 2
, т.к. ещё 1
прибавит сам цикл for
.
- Java
- C++
- Python
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Example4 {
// главный метод программы, не забудьте throws FileNotFoundException, иначе программа,
// работающая с файлом не запустится
public static void main(String[] args) throws FileNotFoundException {
// открываем файл, относительный путь строится от корня проекта
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
Scanner in = new Scanner(new File("src/main/java/problem24/k7-9.txt"));
// читаем строку файла
String s = in.nextLine();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 0
int cnt = 0;
// масимальная длина тоде равна 0
int maxCnt = 0;
// перебираем все индексы
for (int i = 0; i < s.length() - 2; i++) {
// если строка с позиции i начинается на ABC
if (s.charAt(i) == 'A' && s.charAt(i + 1) == 'B' && s.charAt(i + 2) == 'C') {
// смещаемся на два дополнительных знака
i += 2;
// увеличиваем количество на 3
cnt += 3;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 0;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
System.out.println(maxCnt);
}
}
#include <iostream>
#include <fstream>
// главный метод программы
int main() {
// открываем файл
std::ifstream myfile;
// бинарник собирается в отдельной папке, поэтому относительный путь такой
// можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
myfile.open("../problem24/k7-9.txt");
// читаем строку файла
std::string in;
myfile >> in;
// закрываем файл
myfile.close();
// кол-во подряд идущих различных отличных от соседей символов
// изначально длина такой последовательности равна 0
int cnt = 0;
// масимальная длина тоде равна 1
int maxCnt = 0;
// перебираем все индексы
for (int i = 0; i < in.length() - 2; i++) {
// если строка с позиции i начинается на EAB
if (in[i] == 'A' && in[i + 1] == 'B' && in[i + 2] == 'C') {
// смещаемся на два дополнительных знака
i += 2;
// увеличиваем количество на 3
cnt+=3;
} else { // если текущий символ такой же, как и следующий
// если количество подряд идущих различных символов
// больше максимального
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// сбрасываем кол-во подряд идущих различных символов
cnt = 0;
}
}
// !не забудьте проверить последнее количество различных символов
// потому что последний символ мог тоже отличаться, и тогда
// внутри цикла проверку длины его последовательности с максимальной
// выполнена не будет, ведь она срабатывает только
// если мы встречаем первый повторяющийся символ
if (cnt > maxCnt) {
// сохраняем новое максимальное количество
maxCnt = cnt;
}
// выводим максимальное количество
std::cout << maxCnt << std::endl;
return 0;
}
# открываем файл, относительный путь строится от папки со скриптом
# можно вместо этого закинуть файл куда-нибудь на диск и указать полный путь
with open('k7-9.txt') as f:
# читаем строку файла
s = f.readline()
# кол-во подряд идущих различных отличных от соседей символов
# изначально длина такой последовательности равна 0
cnt = 0
# масимальная длина тоде равна 1
maxCnt = 0
# кол-во пропусков цикла
skip_cnt = 0
# перебираем все индексы
for i in range(len(s) - 2):
# если нужно пропустить итерацию
if skip_cnt:
# уменьшаем кол-во пропусков
skip_cnt = skip_cnt - 1
# пропускаем итерацию
continue
# если нет сочетания стоящих рядом букв `P` и `R`
if s[i] == 'A' and s[i + 1] == 'B' and s[i + 2] == 'C':
# Добавляем два пропуска
skip_cnt = 2
# увеличиваем количество на 3
cnt = cnt + 3
# если текущий символ такой же, как и следующий
else:
# если количество подряд идущих различных символов
# больше максимального
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# сбрасываем кол-во подряд идущих различных символов
cnt = 0
# !не забудьте проверить последнее количество различных символов
# потому что последний символ мог тоже отличаться, и тогда
# внутри цикла проверку длины его последовательности с максимальной
# выполнена не будет, ведь она срабатывает только
# если мы встречаем первый повторяющийся символ
if cnt > maxCnt:
# сохраняем новое максимальное количество
maxCnt = cnt
# выводим максимальное количество
print(maxCnt)
Вывод программы:
30
Ответ: 30