Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 06.10.2013
Сообщений: 97
1

Упорядочивание цифр

12.03.2014, 11:28. Показов 1348. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте мне необходимо упорядочить цифры в каждом атоме списка (a53r2 должно быть a23r5)
я что-то накидала, но не знаю правильно вообще это сделано. Лисп начали только изучать поэтому функции должны быть простые. У меня менется регистр цифр. Может кто-то обьяснить почему.
Lisp
1
2
3
4
5
6
7
8
 (defun f (l)
           (let* ((only-num (sort (loop for a in l
                                     if (numberp (read-from-string (string a)))
                                     collect a) #'char<))
                  (brr (loop for a in l if (numberp (read-from-string (string 
 
a)))
                          collect (pop only-num) else collect a))) brr))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2014, 11:28
Ответы с готовыми решениями:

Упорядочивание чисел
Задана последовательность из трех чисел. Если последовательность упорядочена по возрастанию, то...

Упорядочивание
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Упорядочивание
Даны три числа.Упорядочить их в порядке возрастания. Перестановку двух чисел оформить в виде...

Упорядочивание
Здраствуйте. Есть БД там таблица в ней допустим поля &quot;date&quot; и &quot;name&quot;. Запрос такой ...

17
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
12.03.2014, 12:42 2
Лучший ответ Сообщение было отмечено как решение

Решение

Регистр цифр измениться не может. Меняется регистр букв. Потому, что в CL принято, что буквы, составляющие символ, при выводе меняются на заглавные. Хуже другое - программа не упорядочивает цифры.

Добавлено через 39 минут
Я бы рекомендовал начать с преобразования одного атома. Потом эту функцию можно будет применить стандартными средствами Лиспа к каждому атому списка.

В HomeLisp обработка одного атома может быть выполнена так (идея Ваша):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun acc-atom (a)
  (let* ((k 0)
         (r nil)
         (al (explode a))
         (diglist (qsort (remove-if-not #'numberp al))))
        (iter (for s in al)
         (cond ((numberp s) (collecting (nth k diglist) into r) (setq k (+ k 1)))
               (t (collecting s into r))))
        (implode r)))
 
==> acc-atom
 
(acc-atom 'ghj7dr4534)
 
==> ghj3dr4457
В HomeLisp есть пара функций explode/implode. Первая превращает атом в список составляющих его имя символов, а вторая делает обратное.
4
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
12.03.2014, 13:22 3
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun main (list)
  (loop :for symbol :in list
        :collect (intern (sort-digits (string symbol)))))
 
(defun sort-digits (string)
  (let ((digits (sort (select-digits string) #'char<)))
    (loop :for i :upfrom 0
          :for c :across string
          :when (digit-char-p c)
          :do (setf (elt string i) (pop digits)))
    string))
 
(defun select-digits (string)
  (loop :for c :across string
        :when (digit-char-p c)
        :collect c))
=>
Lisp
1
2
(main '(a53r2 1b0gh9rt55))
; (A23R5 0B1GH5RT59)
5
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.03.2014, 14:16 4
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
(defun f (atom)
            (let ((dl (sort (delete-if-not #'digit-char-p 
                                     (coerce atom 'list))
                            #'< :key #'digit-char-p)))
              (intern
               (coerce
                (loop for a across atom with n = dl
                   if (digit-char-p a) collect (pop n)
                   else collect a) 'string))))
Добавлено через 38 минут
Цитата Сообщение от transformator.t Посмотреть сообщение
(coerce atom 'list)
=> (coerce (string atom) 'list)
Цитата Сообщение от transformator.t Посмотреть сообщение
across atom
=> across (string atom)
5
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
12.03.2014, 14:41 5
Лучший ответ Сообщение было отмечено как решение

Решение

А вот обработка атома без сортировки:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun acc-atom (a &optional (r nil) (al (explode a)) (nu (remove-if-not 'numberp al)))
  (cond ((null al) (implode (reverse r)))
        ((numberp (car al)) (let ((mi (apply 'min nu)))
                                  (acc-atom a (cons mi r) (cdr al) (removef mi nu))))
        (t (acc-atom a (cons (car al) r) (cdr al) nu))))
 
==> acc-atom
 
(acc-atom 'ghr563ss)
 
==> ghr356ss
Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
8
(defun task (lst)
  (mapcar #'acc-atom lst))
 
==> task
 
(task '(a v c sd416k k83b3 231))
 
==> (a v c sd146k k33b8 123)
4
1050 / 944 / 107
Регистрация: 04.11.2012
Сообщений: 974
Записей в блоге: 3
12.03.2014, 14:53 6
Лучший ответ Сообщение было отмечено как решение

Решение

По простому не получилось.
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
(defun Atom-to-List (a)
  (do* ((a (string a))
        (b (length a) (1- b))
        acc)
       ((zerop b) acc)
     (push (read-from-string (subseq a (1- b) b)) acc)))
 
(defun Replace-Number (x y)
  (cond
    ((null x) ())
    ((numberp (car x)) (cons (car y) (Replace-Number (cdr x) (cdr y))))
    (t (cons (car x) (Replace-Number (cdr x) y)))))
 
(defun List-to-String (lst &optional (acc ""))
  (if lst
      (List-to-String (cdr lst) (concatenate 'string acc (write-to-string (car lst))))
      acc))
 
(defun Sort-Numbers-by-Atom (a)
  (let* ((b (Atom-to-List a))
         (c (sort (copy-list (remove-if-not #'numberp b)) #'<)))
    (values (read-from-string (List-to-String (Replace-Number b c))))))
 
> (Sort-Numbers-by-Atom 'a5bc32)
A2BC35
4
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
12.03.2014, 15:25 7
Лучший ответ Сообщение было отмечено как решение

Решение

Все решения сортируют список цифр. А мне кажется, что рациональнее так:
1) выделить список цифр
2) встретив цифру при просмотре всех символов, брать минимум из текущего набора цифр и исключать этот минимум из набора (своеобразная сортировка выбором "на лету"). Используя рекурсию, можно при этом обойтись без setq/setf.
3
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.03.2014, 19:45 8
Цитата Сообщение от Catstail Посмотреть сообщение
Все решения сортируют список цифр.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; SLIME 2013-09-30
INSOMNIA> (defparameter
              lst
            (loop repeat 10000000
               collect (random 10)))
LST
INSOMNIA> (time 
           (prog1 ()
             (sort lst #'<)))
Evaluation took:
  6.999 seconds of real time
  6.952000 seconds of total run time (6.952000 user, 0.000000 system)
  99.33% CPU
  16,755,140,317 processor cycles
  34,160 bytes consed
  
NIL
довольно быстро)

Добавлено через 51 секунду
Цитата Сообщение от Catstail Посмотреть сообщение
можно при этом обойтись без setq/setf
а зачем?
1
1 / 1 / 0
Регистрация: 06.10.2013
Сообщений: 97
12.03.2014, 19:47  [ТС] 9
спасибо большое. Правдо как для новичка это совсем все сложно. функции очень большие

Добавлено через 1 минуту
спасибо, к сожалению у меня не работает эта прога. ошибка на explode
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
12.03.2014, 20:08 10
Цитата Сообщение от transformator.t Посмотреть сообщение
а зачем?
- затем, что ФП должно избегать явного присвоения значений переменным. Хотя я не "пурист" и полагаю, что хорошая программа - это в первую очередь работающая программа.

Добавлено через 1 минуту
Цитата Сообщение от elik2011 Посмотреть сообщение
спасибо, к сожалению у меня не работает эта прога. ошибка на explode
- этой функции нет в CL. Можете взять другие решения. А я тем временем подгоню свое решение к CL.
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.03.2014, 20:09 11
Цитата Сообщение от Catstail Посмотреть сообщение
что ФП должно избегать явного присвоения значений переменным
серьёзно, что ли? это кто так сказал?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
12.03.2014, 20:59 12
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от transformator.t Посмотреть сообщение
это кто так сказал?
- общеизвестный факт...

Добавлено через 13 минут
Вот подгонка моего решения к Common Lisp:


Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun explode (a)
 (mapcar #'(lambda (x) (read-from-string (coerce (list x) 'string))) (coerce  (string a) 'list)))
 
(defun implode (l)
 (read-from-string 
    (coerce (mapcar #'(lambda (x) (if (numberp x) (code-char (+ 48 x)) (coerce x 'character))) l) 
            'string)))
        
(defun acc-atom (a &optional (r nil) (al (explode a)) (nu (remove-if-not 'numberp al)))
  (cond ((null al) (implode (reverse r)))
        ((numberp (car al)) (let ((mi (apply 'min nu)))
                                  (acc-atom a (cons mi r) (cdr al) (remove mi nu :count 1))))
        (t (acc-atom a (cons (car al) r) (cdr al) nu))))
 
(defun task (l)
  (mapcar #'acc-atom l))
 
;; Проверка:
 
(task '(a2c3 ghj 90da7))
 
(A2C3 GHJ 07DA9) ;; верно!
2
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
12.03.2014, 21:16 13
Цитата Сообщение от transformator.t Посмотреть сообщение
серьёзно, что ли?
Совершенно серьёзно.

Цитата Сообщение от transformator.t Посмотреть сообщение
это кто так сказал?
Определение ФП.

Другое дело, что CL не (чистый) ФЯП.
1
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.03.2014, 21:26 14
Цитата Сообщение от korvin_ Посмотреть сообщение
Другое дело, что CL не (чистый) ФЯП.
вот с этого и стоило начинать.
0
493 / 426 / 56
Регистрация: 29.04.2011
Сообщений: 443
12.03.2014, 21:50 15
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun F (l &optional   (lst (explode l)) 
                        (nums (qsort (remove-if #'symbolp (explode l))))
                         res)
    (cond
        ((null lst) (implode res))
        ((numberp (car lst)) (F l (cdr lst) (cdr nums) (append res (list (car nums)))))
        (t (F l (cdr lst) nums (append res (list (car lst)))))))
        
 
(f 'ghj7dr4534) ==> ghj3dr4457
    
(f 'a53r2) ==> a23r5
2
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
12.03.2014, 23:26 16
Вообще, атомы курочить - это хак какой-то. Атом значит "неделимый" elik2011, скажите преподу своему, что задания даёт дебильные.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
13.03.2014, 09:44 17
Цитата Сообщение от helter Посмотреть сообщение
Атом значит "неделимый" elik2011, скажите преподу своему, что задания даёт дебильные
- не могу не отметить "искреннюю доброту совета"

Но, если серьезно, то во многих современных языках строки - тоже неделимы. И это нисколько не мешает брать подстроки ("курочить"). Просто при необходимости создается новая строка. Так же, как и при "раскурочивании" атома в Лиспе. Атом остается неделимым, просто создается другой...
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.03.2014, 17:07 18
Если в языке строки играют роль и строк, и символов, то куда деваться? В иных языках и чисел нет, одни строки - живут люди. А в лиспе, слава богу, для операций с последовательностями букв есть массивы букв (строки), а символы имеют к ним весьма опосредованное отношение.

Я не говорю, что оперировать символами как строками совсем не нужно, но нужно редко. Например, в макросах типа defstruct, которые работают с символами make-символ и т. п. Для новичка это довольно эзотерично.
1
13.03.2014, 17:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2014, 17:07
Помогаю со студенческими работами здесь

Упорядочивание точек
Упорядочить три данные точки на плоскости А(ах, ау), B(bх, bу), А(cх, cу) по неубыванию расстояния...

Упорядочивание массива
Что не так?((( #include &lt;iostream&gt; using namespace std; int main() { int n,i,j,c;...

Упорядочивание матрицы
Здравствуйте! Помогите, пожалуйста решить задачу: Задан массив А размерами N*M и вектор В размером...

Упорядочивание матрицы
Ввести с клавиатуры квадратную матрицу из целых чисел размером M X M (M также вводится с...


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

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