Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
1

Можно ли считать список integer без парсинга?

07.10.2015, 13:30. Показов 2915. Ответов 69
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно считать два списка интов один двуэлементный, второмй максимум 10^7 элементов. Все числа натуральные, максимальный размер числа 10^9. Нужно найти сумму элементов второго списка и вывести количество цыфр в сумме в определенной вторым элементом первого списка системе исчисления.

Есть идея ссумировать все числа, и оставить в списке(втором) только этот атом(сумма) затем перевести его в нужную систему исчисления -> coerce и вывести количество єлементов.

Набросал немного.
Lisp
1
2
3
4
5
6
7
8
9
10
(defun split-by-one-space (string)
    (loop for i = 0 then (1+ j)
          as j = (position #\Space string :start i)
          collect (subseq string i j)
          while j))
          
;;(defun arr-sum () ())
 
(setf parameters (split-by-one-space(read-line)))        
(setf arr (split-by-one-space(read-line)))
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2015, 13:30
Ответы с готовыми решениями:

Большой integer, можно ли обойтись без сторонних библиотек?
Добрый день. Нужен формат для больших целых (gfortran, f95 соответственно) - можно ли обойтись без...

Можно ли считать односвязный список стеком?
подскажите пожалуйста, можно ли считать односвязный список стеком? если да подскажите код...

Считать из файла MAC-адреса, и добавить их в список без повторов
есть файл такого типа: ...

Как можно легче всего считать список фамилий из файла?
Мне нужно считать из файла некоторое кол-во ФИО студентов и уместить в каком-нибудь массиве. Так и...

69
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.11.2015, 01:23 61
Author24 — интернет-сервис помощи студентам
Надо попробовать с буферизацией — вдруг быстрее получится. А лисп используется тот, который на сервере? Это точно sbcl?
0
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
04.11.2015, 01:29  [ТС] 62
А что бы получить 100 процентов нужно пройти все тесты, а для первых семи в ранкинге всех студентов (по времени выполнения всех 7 заданий) защитывают предмет и освобождают от экзаменов

Добавлено через 2 минуты
Да sbcl 1.0.18 и из лиспов там еще clisp 2.44.1 а так языков очень много. Есть brainfuck, ada 95, Whitespace, Pyhton, Ruby, C, c++, java...... И много всякой изотерики и нет только
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.11.2015, 01:29 63
Цитата Сообщение от Vaderkos Посмотреть сообщение
Как-то так.
А какой полный исходный код, и как он вызывается?
0
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
04.11.2015, 01:32  [ТС] 64
Есть еще два Shceme (stalin 0.11 и guile 1.8.5)

Добавлено через 56 секунд
Есть место для вставки кода, туда впихиваем,выбираем язык, submit, пошли тесты
0
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
04.11.2015, 01:33  [ТС] 65
Вот так выглядит
Миниатюры
Можно ли считать список integer без парсинга?  
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.11.2015, 01:34 66
Цитата Сообщение от Vaderkos Посмотреть сообщение
sbcl 1.0.18 и из лиспов там еще clisp 2.44.1
Ох стаааарые... Причём clisp ещё пять лет назад застыл на 2.49.

Цитата Сообщение от Vaderkos Посмотреть сообщение
Есть место для вставки кода, туда впихиваем,выбираем язык, submit, пошли тесты
То есть sbcl не через командную строку грузится, а просто выполняет какой-то файл? Но какой файл-то? А то там loop summing просвечивали, в последних сообщениях этого не было.
0
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
04.11.2015, 01:39  [ТС] 67
helter, Это я пробовал написать кое что просто. Просто показывает ошибку только если не компилится

Добавлено через 1 минуту
Мне кажется он создает для каждого языка файл, запускает с каким то time как в лиспе и считает
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.11.2015, 03:19 68
Вот, значит, немного наколенного кода. Я хотел прикрутить к потоку буфер, но даже не буду объяснять, как это делал. Надо потестить, и если работает, сравнить время.

По стандарту, потоки в лиспе слабоваты. Это: 1) потоки, связанные с терминалом; 2) потоки, связанные с файлами; 3) ввод из строки и вывод в строку; 4) комбинации вышеперечисленного. Всё. Реализации обычно предлагают потоки Грэя — расширение стандарта, в которых потоки задаются «аксиоматически». Вот я этим пользуюсь.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(defconstant +buffer-size+ 1024)
 
(defclass buffered-input (sb-gray:fundamental-character-input-stream)
  ((buffer :initform (make-array +buffer-size+ :element-type 'base-char))
   (start :initform 0)
   (end :initform 0)
   (stream :reader buffered-input-stream :initarg :stream))) 
 
(defun fill-buffer (bi)
  (with-slots (buffer start end stream) bi
    (setf end (read-sequence buffer stream)
          start 0))
  bi)
 
(defun make-buffered-input (stream)
  (fill-buffer (make-instance 'buffered-input :stream stream)))
 
(defmethod sb-gray:stream-read-char ((bi buffered-input))
  (with-slots (buffer start end stream) bi
    (cond ((< start end)
           (prog1
             (aref buffer start)
             (incf start)))
          ((= end +buffer-size+)
           (sb-gray:stream-read-char (fill-buffer bi)))
          (t :eof))))
 
(defun get-integer (&optional (stream *standard-input*))
  (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)))
    (let ((digit (read-char stream nil))
          (number 0))
      (declare (type fixnum number))
      (if digit
          (loop
            (setf number (the fixnum (+ (the fixnum (* 10 number))
                                        (the fixnum (- (char-code digit) (char-code #\0)))))
                  digit (read-char stream nil))
            (unless (and digit (digit-char-p digit))
              (return (values number digit))))
          (values nil nil))))
 
(defvar *elem* nil)       
 
(let ((in (make-buffered-input *standard-input*)))
  (loop
    (multiple-value-bind (n c) (get-integer in)
      (cond ((null n) (return))
            ((or (null c) (eql c #\Newline)) (push n *elem*) (return))
            (t (push n *elem*))))))
    
(princ *elem*)
1
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
04.11.2015, 11:49  [ТС] 69
Помоему, стало хуже. И по ентеру не стопится, и тесты странное выдают
Миниатюры
Можно ли считать список integer без парсинга?  
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.11.2015, 16:28 70
Подтверждаю, что стало хуже даже после декларирования типов. Для тестов использую программу, пишущую через пробел числа от одного до заданного
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[])
{
    int i;
    int n = argc < 2 ? 100 : atoi(argv[1]);
 
    for(i = 0; i < n; ++i) {
        printf("%d ", i);
    }
    return 0;
}
> И по ентеру не стопится
Это бай дизайн. Ввод буферизуется, поэтому сразу хочет прочитать довольно много. При вводе вручную надо делать два раза Ctrl+D или аналог. Однако числа после перевода строки честно игнорируются.
Странное дело.

Добавлено через 13 минут
Другой вариант, не буду выкладывать, тоже хуже. Наверно, производительность без буферизации близка к оптимальной. Не очень понимаю, почему, но, выходит, так оно и есть. Тем лучше, меньше возни.
0
04.11.2015, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2015, 16:28
Помогаю со студенческими работами здесь

Нельзя преобразовать тип function(a: integer;b: integer):integer к real
unit matr1; interface type matr2=array of real; matr3=array of real; procedure sum...

Можно ли увеличить скорость парсинга в HtmlAgilityPack?
Привет всем, я написал код для парсинга одного сайт, код рабочий, но срабатывает довольно долго(от...

Первую строку считать из файла и перевести в формат Integer, а все остальные - в массивы
Народ, спасайте! Допустим, первая строка файла - натуральное число N, а последующие N строк...

Подскажите, как можно ускорить скорость парсинга
Сам код под спойлером. { WebClient Client = new WebClient(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru