L. Разделяй и властвуй

Напишите утилиту, которая разделяет числа, записанные в файле, на три группы:

  • числа с преобладающим количеством чётных цифр;
  • числа с преобладающим количеством нечётных цифр;
  • числа с одинаковым количеством чётных и нечётных цифр.

Формат ввода

Пользователь вводит четыре имени файла.
Первый файл содержит произвольное количество чисел, разделённых пробелами и символами перевода строки.

Формат вывода

В три другие файла выведите числа, которые подходят под требуемое условие.
Сохраните положение чисел в строках.

Пример

Ввод

# Пользовательский ввод:
numbers.txt
even.txt
odd.txt
eq.txt

# Содержимое файла numbers.txt
650975472 591084323 629700 1504180 577023
8460612246 42161437 29409368 58531725 5725268 2198001838
796451 69358 7195510 975628465 9756641
44200289 126541 979391 93479581 291170 28987042 86139603

Вывод

# Содержимое файла even.txt
629700 1504180
8460612246 29409368 5725268 2198001838
975628465
44200289 28987042

# Содержимое файла odd.txt
650975472 591084323 577023
58531725
796451 69358 7195510 9756641
979391 93479581 291170

# Содержимое файла eq.txt

42161437

126541 86139603

Решение

Основная сложность для учеников заключается в сохранении номеров строк, на которых находились числа. В остальном задачка не сильно сложная.

Читаем построчно файл. Каждую строку разбиваем на числа и любым удобным для нас способом считаем количество четных и нечетных цифр в числе. Если преобладают четные – записываем число в список четных, если нечетные – в список нечетных. Если количество четных и нечетных совпало – в список неопределившихся. По окончанию строки, все три списка дописываются каждый в свой файл.

Как вариант, можно накапливать списки строк для каждого файла отдельно, и записать все в один присест в самом конце.

Можно все содержимое каждого из файлов вообще записывать в одну результирующую строку и писать весь файл обычным write().

Посмотреть код

Решение

Python
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()

with open(input_file, encoding="UTF-8") as file:
    strings = [string for string in file.read().split("\n") if string]

even_digits = "02468"
odd_digits = "13579"

for string in strings:
    evens, odds, equals = [], [], []

    for number in string.split():
        total_evens = total_odds = 0
        for char in number:
            if char in even_digits:
                total_evens += 1
            elif char in odd_digits:
                total_odds += 1

        if total_evens > total_odds:
            evens.append(number)
        elif total_evens < total_odds:
            odds.append(number)
        else:
            equals.append(number)

    with open(evens_file, "a", encoding="UTF-8") as file:
        file.write(" ".join(evens) + "\n")
    with open(odds_file, "a", encoding="UTF-8") as file:
        file.write(" ".join(odds) + "\n")
    with open(equals_file, "a", encoding="UTF-8") as file:
        file.write(" ".join(equals) + "\n")

Решение

Python
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()

with open(input_file, encoding="UTF-8") as file:
    strings = [string for string in file.read().split("\n") if string]

even_digits = "02468"
odd_digits = "13579"
evens_strings = []
odds_strings = []
equals_strings = []

for string in strings:
    evens, odds, equals = [], [], []

    for number in string.split():
        total_evens = total_odds = 0
        for char in number:
            if char in even_digits:
                total_evens += 1
            elif char in odd_digits:
                total_odds += 1

        if total_evens > total_odds:
            evens.append(number)
        elif total_evens < total_odds:
            odds.append(number)
        else:
            equals.append(number)

    evens_strings.append(' '.join(evens) + '\n')
    odds_strings.append(' '.join(odds) + '\n')
    equals_strings.append(' '.join(equals) + '\n')

with open(evens_file, "w", encoding="UTF-8") as file:
    file.writelines(evens_strings)
with open(odds_file, "w", encoding="UTF-8") as file:
    file.writelines(odds_strings)
with open(equals_file, "w", encoding="UTF-8") as file:
    file.writelines(equals_strings)

Решение

Python
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()

with open(input_file, encoding="UTF-8") as file:
    strings = [string for string in file.read().split("\n") if string]

even_digits = "02468"
odd_digits = "13579"
evens_string = ''
odds_string = ''
equals_string = ''

for string in strings:
    evens, odds, equals = [], [], []

    for number in string.split():
        total_evens = total_odds = 0
        for char in number:
            if char in even_digits:
                total_evens += 1
            elif char in odd_digits:
                total_odds += 1

        if total_evens > total_odds:
            evens.append(number)
        elif total_evens < total_odds:
            odds.append(number)
        else:
            equals.append(number)

    evens_string += ' '.join(evens) + '\n'
    odds_string += ' '.join(odds) + '\n'
    equals_string += ' '.join(equals) + '\n'

with open(evens_file, "w", encoding="UTF-8") as file:
    file.write(evens_string)
with open(odds_file, "w", encoding="UTF-8") as file:
    file.write(odds_string)
with open(equals_file, "w", encoding="UTF-8") as file:
    file.write(equals_string)
Подписаться
Уведомить о
guest
7 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
nmalkam
13.12.2023 11:33


file_in = input().strip()
evens_file = input().strip()
odds_file = input().strip()
equals_file = input().strip()

with open(file_in, encoding='UTF-8') as file:
enter = '\n'
even_nums, odd_nums, eq_nums = '', '', ''
for line in file.readlines():
for number in line.split():
count_even = len([num for num in number if int(num) % 2 == 0])
if count_even > len(number) / 2:
even_nums += f'{number} '
elif count_even < len(number) / 2:
odd_nums += f'{number} '
else:
eq_nums += f'{number} '
even_nums += enter
odd_nums += enter
eq_nums += enter

with open(evens_file, 'w', encoding='UTF-8') as even:
even.write(even_nums)
with open(odds_file, 'w', encoding='UTF-8') as odd:
odd.write(odd_nums)
with open(equals_file, 'w', encoding='UTF-8') as eq:
eq.write(eq_nums)

скажите, пожалуйста, можно ли создать файл с разделением на строки другим способом??
что можно использовать вместо

even_nums += ‘\n’
??

Последний раз редактировалось 11 месяцев назад Сергей Клочко ем
nmalkam
Ответить на  Сергей Клочко
14.12.2023 06:24

Вариации тут только на этапе формирования строк для записи и организации их хранения.

Сохранил. Буду использовать как алгоритм.

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

nmalkam
19.12.2023 08:41
round(sum(odds) / len(odds), 2)

в начале ознакомления с задачей я еще помнил, но ближе к реализации функции уже догадался только на импорт библиотеки)))

Иван
Иван
16.07.2024 12:53

with open(input(), encoding=”UTF-8″) as file_in:
    with open(input(), “w”, encoding=”UTF-8″) as evenf:
        with open(input(), “w”, encoding=”UTF-8″) as oddf:
            with open(input(), “w”, encoding=”UTF-8″) as eqf:
                for line in file_in:
                    for num in line.split():
                        even = 0
                        odd = 0
                        for digit in num:
                            if int(digit) % 2 == 0:
                                even += 1
                            else:
                                odd += 1
                        if even > odd:
                            evenf.write(num + ‘ ‘)
                        elif even < odd:
                            oddf.write(num + ‘ ‘)
                        else:
                            eqf.write(num + ‘ ‘)
                    evenf.write(‘\n’)
                    oddf.write(‘\n’)
                    eqf.write(‘\n’)

Иван
Иван
28.07.2024 18:59

Думаю, в вашем верхнем решении:
data = []
odds = []
evens = []

def enter_results(*numbers):
global data, odds, evens
data.extend(list(numbers))
odds = data[::2]
evens = data[1::2]

Можно обойтись без data :
odds = []
evens = []

def enter_results(*numbers):
  global odds, evens
  odds.extend(list(numbers[::2]))
  evens.extend(list(numbers[1::2]))

А, поскольку, по условию задачи, количество добавляемых чисел всегда чётное, то во втором решении вероятно можно убрать переменную
is_even = True