Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Как не считывать пробелы в файле?  (Прочитано 2143 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Как не считывать пробелы в файле?
« : 23 Февраля 2016, 01:57:52 »
Здравствуйте.
Есть такая задача:
Исходные данные
Входной поток содержит набор целых чисел Ai (0 ≤ Ai ≤ 1018), отделённых друг от друга произвольным количеством пробелов и переводов строк. Размер входного потока не превышает 256 КБ.
Результат
Для каждого числа Ai, начиная с последнего и заканчивая первым, в отдельной строке вывести его квадратный корень не менее чем с четырьмя знаками после десятичной точки.
Входные данные
Код: (python) [Выделить]
1427  0   

   876652098643267843
5276538
Выходные:
Код: (python) [Выделить]
2297.0716
936297014.1164
0.0000
37.7757
Подскажите, как считать числа, игнорируя пробелы?
Что нужно тут исправить?
Код: (python) [Выделить]
import math

f = open("1001.in", "r")
a = []
for l in f:
    a.insert(0, int(l))
# print(a)
f.close()
f1 = open("1001.out", "w")
for l in a:
    f1.write(str(round(math.sqrt(l), 4)) + "\n")

serchik

  • Гость
Re: Как не считывать пробелы в файле?
« Ответ #1 : 23 Февраля 2016, 09:45:54 »
Зачем пытаться преобразовать строку к целочисленному типу, когда это бесмысленно? Не лучше ли воспользоваться встроенным в str методом split? На выходе получите список строк, обработать в цикле каждый элемент которого уже не составит большого труда.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Как не считывать пробелы в файле?
« Ответ #2 : 23 Февраля 2016, 10:44:43 »
str.split - губоват, регуляркой - несколько более изящно решается:

Код: (python) [Выделить]
import re, math

res = re.findall(r'([0-9]+)', open("1001.in", "rt").read())

with open("1001.out", "wt") as f:
  for v in res:
    f.write(str(math.sqrt(int(v))) + '\n')
« Последнее редактирование: 23 Февраля 2016, 10:52:24 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #3 : 23 Февраля 2016, 10:56:57 »
А так еще, на всякий, без сторонних библиотек такое реализуемо?

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Как не считывать пробелы в файле?
« Ответ #4 : 23 Февраля 2016, 11:03:32 »
Можно и без сторонних, но муторно и долго.
Библиотеки они на то и есть что бы не переделывать заново работу, которую уже сделали за вас.

По идее, тут на входе простой синтаксис - для него реализуется простейший автомат синтаксического анализа: берем символ - если он пробел/перевод строки - игнорируем, а если число, начинаем писать в приемный буфер, заканчиваем когда встретится первая "не цифра", вычисляем корень и пишем в выходной буфер или сразу в файл. И тк повторяем до окончания входного файла.

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


Кстати, любителям минималистичнсти - вообще двухстрочный вариант (если считать только код, то одно-строчный):

Код: (python) [Выделить]
import re, math

open("1001.out", "wt").write(''.join(str(math.sqrt(int(v))) + '\n' for v in re.findall(r'([0-9]+)', open("1001.in", "rt").read())))
 
« Последнее редактирование: 23 Февраля 2016, 11:16:00 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #5 : 23 Февраля 2016, 11:13:45 »
Попробовал сделать через split, похоже я не понял идею вообще, не подскажете как сделать это?

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Как не считывать пробелы в файле?
« Ответ #6 : 23 Февраля 2016, 11:18:17 »
Я же предупреждал - split - это топор - им конечно можно тоже побриться... но бритвой все-же проще.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #7 : 23 Февраля 2016, 11:18:54 »
И еще, в вашем решении числа выводятся в том же порядке, что и вводятся, а согласно условию, выводиться они должны в обратном, можно ли создать изначально перевернутый массив? или только reverse? Или можно записывать в начало файла?

Пользователь решил продолжить мысль 23 Февраля 2016, 11:20:25:
Мне нравится ваше решение, просто интересно на split посмотреть, как окончательный вариант возьмем через re
« Последнее редактирование: 23 Февраля 2016, 11:20:25 от DenisVASI »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Как не считывать пробелы в файле?
« Ответ #8 : 23 Февраля 2016, 11:24:44 »
Ну порядок то просто поменять, если в первом варианте res реверсировать перед циклом записи.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

serchik

  • Гость
Re: Как не считывать пробелы в файле?
« Ответ #9 : 23 Февраля 2016, 11:26:32 »
str.split - губоват, регуляркой - несколько более изящно решается:
Ну да, ну да, а потом удивляемся почему молодежь хватается за калькулятор, когда требуется вычислить 2+2. Имею право на мнение  ;)

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #10 : 23 Февраля 2016, 11:28:03 »
serchik,
Покажите пожалуйста, как оно работает

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Как не считывать пробелы в файле?
« Ответ #11 : 23 Февраля 2016, 11:34:34 »
serchik, тут ваш подход понятен. И я с ним даже не спорю, даже более того - я расписал вариант "канонический" (с синтаксическим автоматом разбора) - он собственно наиболее "православен". Но я довольно подробно также указал в чем проблема такого решения - сопровождаемость.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Кровавый

  • Старожил
  • *
  • Сообщений: 1626
  • Логика творит чудеса!
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #12 : 23 Февраля 2016, 12:36:27 »
str.split - губоват, регуляркой - несколько более изящно решается:


То есть разворачивание в памяти недетерминированного конечного автомата, обработка которого имеет квадратичную сложность, более "изящно", нежели простой перебор элементов строк с линейной сложностью?  :)


А вообще надо считывать файл не построчно, а по 1 символу в буфер, встречая пробел, преобразовать буфер в число, затем его обнулить.
Железо: AMD FX8350 4.2Ghz + 2x4Gb Kingston HeyperX + Asus M5A97 R2.0 + HDD WD WZ10EZEX 1TB 7200 rpm + SSD 128 GB + Win 10 x64.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #13 : 23 Февраля 2016, 12:41:52 »
Я же предупреждал - split - это топор - им конечно можно тоже побриться... но бритвой все-же проще.
Чем же split так не угодил?
Код: (python) [Выделить]
from math import sqrt

with open("1001.out", "r") as f:
    result = '\n'.join((str(round(sqrt(int(x))), 4)
                        for x in reversed(r.read().split())))

with open("1001.out", "wt") as f:
    f.write(result)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #14 : 23 Февраля 2016, 13:34:07 »
if (strcasecmp (str,"\n") == 0) continue;только возвратка, я ещё маленкий.
Wars ~.o

 

Страница сгенерирована за 0.065 секунд. Запросов: 25.