Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,706
Записей в блоге: 14

Еще задача из раздела "С для начинающих" - кратчайший палиндром

08.09.2013, 12:02. Показов 1142. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Списковая формулировка:

Дан список. Необходимо, добавляя начальные символы в конец списка, получить палиндром минимальной длины.

Мое решение:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun min-pal (lst)
  (labels ((is-pal (x) (equal x (reverse x))))
    (cond ((is-pal lst) lst)
          ((is-pal (cdr lst)) (append lst (list (car lst))))
          (t (append (list (car lst)) (min-pal (cdr lst)) (list (car lst)))))))
 
==> min-pal
 
(min-pal '(a b r b))
 
==> (a b r b a)
 
(min-pal '(a b a))
 
==> (a b a)
 
(min-pal '(a b r a))
 
==> (a b r a r b a)
 
(min-pal '(f l o l))
 
==> (f L o L f)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2013, 12:02
Ответы с готовыми решениями:

Еще задача из раздела "С для начинающих" - печать части квадратной матрицы
Нужно вывести (например, по строкам) часть квадратной матрицы, заданной на чертеже: ...

Еще задача из раздела "С для начинающих" - перевод из постфиксной записи в инфиксную
Дана алгебраическая формула в постфиксной записи. Получить из нее инфиксную (обычную) запись со скобками. Т.е. (a b c * +) => (b * c)...

Найти ближайший простой палиндром, больший заданного n (задача из раздела C++)
Мое решение: isPal n = s == rs where s = show n rs = reverse s isPrime n |...

2
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347
09.09.2013, 18:15
Алго норм, а вот реализация не оч. В худшем случае, надо сделать n операций разворота списка, каждая из которых работает за линию. Причем при таком подходе нельзя использовать быструю nreverse, только медленную reverse. Потом вы сравниваете 2 списка целиком, что тоже не оч кошерно, ибо вторая половина второго списка всегда будет соответствовать первой половине первого списка.
Это лучше делать на двусвязном списке, тогда можно можно обойтись без разворота, пустив 2 указателя, один с головы, другой с хвоста.
Вариант на двусвязном выглядит не так красиво и написан не в функциональном стиле, но должен быть быстрее.
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
52
53
54
55
56
57
;;; double-linked-list
(defstruct dll val prev next)
 
(defstruct dll-links first last)
 
(defun dll-add-node (val prev next)
    (let ((nd (make-dll :val val :prev prev :next next)))
        (if next
            (setf (dll-prev next) nd))
        (if prev
            (setf (dll-next prev) nd))
        nd))
 
(defun push_back(store e)
    (if (dll-links-first store)
        (setf (dll-links-last store) (dll-add-node e (dll-links-last store) nil))
        (let ((nd (dll-add-node e nil nil)))
            (setf (dll-links-first store) nd)
            (setf (dll-links-last store) nd))))
 
(defun pop_forward(store)
    (let ((hd (dll-links-first store)))
        (cond
          ((not hd) nil)
          ((not (dll-next hd))
            (setf (dll-links-first store) nil)
            (setf (dll-links-last store) nil))
          (t
            (setf (dll-links-first store) (dll-next hd))
            (setf (dll-prev (dll-next hd)) nil)))))
 
(defun simple-linked-to-double-linked(lst)
    (let ((store (make-dll-links)))
      (map nil (lambda (e) (push_back store e)) lst)
      store))
 
(defun dll-empty(l) (not (and (dll-links-first l) (dll-links-last l))))
 
;;; task
 
(defun check-pol(store)
    (let ((flag t))
      (do   ((hd (dll-links-first store) (dll-next hd)) (tl (dll-links-last store) (dll-prev tl)))
            ((or (not flag) (not hd) (not tl) (eq hd tl) (eq (dll-prev hd) tl)) flag)
            (setf flag (and flag (eql (dll-val hd) (dll-val tl)))))))
 
(defun get-pol-pos(store)
    (do ((pos 0 (1+ pos)) (check-res (check-pol store) (check-pol store)))
        ((or check-res (dll-empty store)) pos)
        (pop_forward store)))
 
 
 
(defun task(l)
    (let* ((pos (get-pol-pos (simple-linked-to-double-linked l)))
           (lt (nreverse (subseq l 0 pos))))
      (nconc l lt)))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,706
Записей в блоге: 14
09.09.2013, 18:22  [ТС]
Algiz, да, Вы, наверное правы. Но настораживает объем кода... Интересно замерить производительность.
Да и "кошерность"... у Вас setf.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2013, 18:22
Помогаю со студенческими работами здесь

Clojure Задача из раздела "С для начинающих" - выделить повторения
Из произвольного списка выделить серии стоящих подряд одинаковых элементов. Мое решение (простая рекурсия): (defun task...

Задача из раздела "С для начинающих" - обработка текстового файла
Вот такая задача была опубликована в разделе "С для начинающих": В конец каждой строки текстового файла через пробел добавляется...

Задача из раздела "С для начинающих" - матрица Вандермонда
Дан список (x y ... z). Получить из него матрицу \begin{pmatrix}x & y & ... & z \\ {x}^{2} & {y}^{2} & ... & {z}^{2}\\...

Задача из раздела "С++ для начинающих" (шифр Цезаря)
Некое сообщение закодировано шифром Цезаря (циклическая перестановка букв) с неизвестным знаменателем. Известно, что знаменатель не...

Задача на перебор вариантов (из раздела "С" для начинающих)
Во время поездки на поезде девочка заменила в названии поезда каждую букву ее номером в русском алфавите и получила запись из единиц и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru