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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Как не считывать пробелы в файле?
« : 23 Февраль 2016, 01:57:52 »
Здравствуйте.
Есть такая задача:
Исходные данные
Входной поток содержит набор целых чисел Ai (0 ≤ Ai ≤ 1018), отделённых друг от друга произвольным количеством пробелов и переводов строк. Размер входного потока не превышает 256 КБ.
Результат
Для каждого числа Ai, начиная с последнего и заканчивая первым, в отдельной строке вывести его квадратный корень не менее чем с четырьмя знаками после десятичной точки.
Входные данные
Код: Python
  1. 1427  0  
  2.  
  3.    876652098643267843
  4. 5276538
  5.  
Выходные:
Код: Python
  1. 2297.0716
  2. 936297014.1164
  3. 0.0000
  4. 37.7757
  5.  
Подскажите, как считать числа, игнорируя пробелы?
Что нужно тут исправить?
Код: Python
  1. import math
  2.  
  3. f = open("1001.in", "r")
  4. a = []
  5. for l in f:
  6.     a.insert(0, int(l))
  7. # print(a)
  8. f.close()
  9. f1 = open("1001.out", "w")
  10. for l in a:
  11.     f1.write(str(round(math.sqrt(l), 4)) + "\n")
  12.  

serchik

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

Оффлайн Sly_tom_cat

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

Код: Python
  1. import re, math
  2.  
  3. res = re.findall(r'([0-9]+)', open("1001.in", "rt").read())
  4.  
  5. with open("1001.out", "wt") as f:
  6.   for v in res:
  7.     f.write(str(math.sqrt(int(v))) + '\n')
  8.  
« Последнее редактирование: 23 Февраль 2016, 10:52:24 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

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

Оффлайн Sly_tom_cat

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

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

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


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

Код: Python
  1. import re, math
  2.  
  3. 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())))
  4.  
 
« Последнее редактирование: 23 Февраль 2016, 11:16:00 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 11895
  • Xubuntu 18.04 (64bit)
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #6 : 23 Февраль 2016, 11:18:17 »
Я же предупреждал - split - это топор - им конечно можно тоже побриться... но бритвой все-же проще.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://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!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 11895
  • Xubuntu 18.04 (64bit)
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #8 : 23 Февраль 2016, 11:24:44 »
Ну порядок то просто поменять, если в первом варианте res реверсировать перед циклом записи.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://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!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 11895
  • Xubuntu 18.04 (64bit)
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #11 : 23 Февраль 2016, 11:34:34 »
serchik, тут ваш подход понятен. И я с ним даже не спорю, даже более того - я расписал вариант "канонический" (с синтаксическим автоматом разбора) - он собственно наиболее "православен". Но я довольно подробно также указал в чем проблема такого решения - сопровождаемость.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5664
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Как не считывать пробелы в файле?
« Ответ #13 : 23 Февраль 2016, 12:41:52 »
Я же предупреждал - split - это топор - им конечно можно тоже побриться... но бритвой все-же проще.
Чем же split так не угодил?
Код: Python
  1. from math import sqrt
  2.  
  3. with open("1001.out", "r") as f:
  4.     result = '\n'.join((str(round(sqrt(int(x))), 4)
  5.                         for x in reversed(r.read().split())))
  6.  
  7. with open("1001.out", "wt") as f:
  8.     f.write(result)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

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

 

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