powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Common Lisp (бывший коварный ктото)
25 сообщений из 132, страница 2 из 6
Common Lisp (бывший коварный ктото)
    #35805877
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zloy denПо-моему, синтаксис у него страшнее чем в лиспе
Это и есть преобразованный лисп. Конечно многое потерялось по ходу, но зато процедурно-функциональный.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35805977
любитель_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_модzloy denПо-моему, синтаксис у него страшнее чем в лиспе
Это и есть преобразованный лисп. Конечно многое потерялось по ходу, но зато процедурно-функциональный.
"Многое"?))
Да подумаешь, единство кода и данных, всего навсего)) Собственно, самый главный плюс лиспа и потерялся, по-моему, без этого он и не привлекателен ничем (кроме смайликов, конечно))).

Мое быдлоподелие (вроде работает):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
(defun up-to (n)
	(if (<= n  0 )
		NIL
		(cons n (up-to (- n  1 )))))

(defun fires (n position)
	(if position
		(cons (car position)
			(cons (- (car position) n)
				(cons (+ (car position) n)
					(fires (+ n  1 ) (cdr position)))))
		NIL))
		
(defun free (position n)
	(let ((f (fires  1  position)))
		(delete-if #'(lambda (x) (find x f)) (up-to n))))

(defun solve-a (position n)
	(if (eq (length position) n)
		(format T "~{~a ~}~%" position)
		(dolist (new (free position n))
			(solve-a (cons new position) n))))
	
(defun solve (n)
	(solve-a '() n))
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35806050
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любитель_Да подумаешь, единство кода и данных, всего навсего))
Это да, это уникально. Но фактически это нужно только для метапрограммирования. А если оно не нужно, то код=данные только мешает.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35806072
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любитель_Мое быдлоподелие (вроде работает):
Кстати, на этом примерчике видно, что введение массивов вместо списков и итераций вместо рекурсии может быть полезно (об этом еще Дейкстра писал)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35806548
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_мод пишет:

> Кстати, на этом примерчике видно, что введение массивов вместо списков и
> итераций вместо рекурсии может быть полезно (об этом еще Дейкстра писал)

А где там проверки что ферзя никто не бъёт ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35806580
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, программа почти в 2.5 раза меньше моей:( И работает вроде побыстрее
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35806926
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy den пишет:

> Эх, программа почти в 2.5 раза меньше моей:( И работает вроде побыстрее

Ты и на лиспе такую же шнягу наваять можешь.
Только я что-то не вижу там ни поиска с возвратом, ни определения,
что поле небъётся другими ферзями. Я правда смотрел поверхностно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35807350
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я думаю что надо привыкнуть просто. Это была моя первая программа на лиспе. Выбрал эту задачу, т.к. в универе было лень делать это задание и сдал чужую. Совесть меня мучала, видите ли :)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35807562
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Только я что-то не вижу там ни поиска с возвратом, ни определения,
что поле небъётся другими ферзями. Я правда смотрел поверхностно.

проверяет можно ли ставить ферзя на строку lin столбец col при условии что предидущие уже стоят
при ответе .f. - переход на след. строку т.е. все варианты не перебираются
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
func f1(lin,col)
  local i
  for i= 1  to col- 1 
    if pos[i]=lin .or. abs(lin-pos[i])=abs(col-i); return .f.; end
  end
  pos[col]=lin
  return .t.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35808065
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy denЯ вот сдуру засиделся до 4х утра в выходные. Писал программу расстановки ферзей. Честно говоря код не шибко нравится, но для первого раза сойдет. Может у кого есть идеи насчет оптимизации?
Код: plaintext
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.
(defun test-queen(place previous-lst)
  (let ((cur-row (+  1  (length previous-lst))) (counter  1 ))
       (dolist (i previous-lst)
         (if (or
                  (= place i)
                  (= place (+ i (- cur-row counter)))
                  (= place (- i (- cur-row counter))))
             (return)
             (setf counter (+  1  counter))))
       (if (= counter cur-row) t nil)))
(defun put-queen(start-pos max-place previous-list)
  (let ((finded)(num))
   (do ((i start-pos ( 1 + i)))
       ((> i max-place))
    (when (test-queen i previous-list)
        (setf finded t)
        (setf num i)
        (return)))
   (if finded (append previous-list (list num))  nil))))

(defun ncheck-remove(max lst)
  (let ((tmplst lst))
     (do ((i  0 ))
      ((>= max (get-last+ 1  tmplst)))
    (setf tmplst (butlast tmplst)))
  tmplst))

(defun get-last+ 1  (lst)
  (if (null lst)  0 
      (+  1  (car (last lst)))))

(defun put-queens (max-nums)
  (let ((cnt  0 ))
    (let (result-list temp-list)
      (do ((i  1 ))
          ((=  0  i))
        (setf temp-list (put-queen i max-nums result-list))
        (when (null (null temp-list))
          (setf i  1 )
          (setf result-list temp-list))
        (when (null temp-list)
          (setf result-list (ncheck-remove max-nums result-list))
          (setf i (get-last+ 1  result-list))
          (setf result-list (butlast result-list)))
        (when (= max-nums (length result-list))
          (print result-list)
          (incf cnt))))
    (print cnt)))


Моя:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
(define (queens columns)
  (define (check? n k s)
    (cond ((null? s) #t)
          (else (and (not (= k (car s)))
                     (not (= (abs (- k (car s))) n))
                     (check? (+ n  1 ) k (cdr s)))))
  )
  (define (iter r s k n)
    (cond ((=  0  n) (cons s r))
          (else (append (if (check?  1  (+ k  1 ) s) (iter r (cons (+ k  1 ) s)  0  (- n  1 )) '())
                        (if (< (+ k 1) columns) (iter r s (+ k 1) n) '()))))
  )        
  (iter '() '()  0  columns)
)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35808347
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Моя:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
(define (queens columns)
  (define (check? n k s)
    (cond ((null? s) #t)
          (else (and (not (= k (car s)))
                     (not (= (abs (- k (car s))) n))
                     (check? (+ n  1 ) k (cdr s)))))
  )
  (define (iter r s k n)
    (cond ((=  0  n) (cons s r))
          (else (append (if (check?  1  (+ k  1 ) s) (iter r (cons (+ k  1 ) s)  0  (- n  1 )) '())
                        (if (< (+ k 1) columns) (iter r s (+ k 1) n) '()))))
  )        
  (iter '() '()  0  columns)
)


Схема?
Блин, у всех получается код короче моего. Видимо я совсем законченный быдлокодер
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35808550
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy denGluk (Kazan)
Моя:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
(define (queens columns)
  (define (check? n k s)
    (cond ((null? s) #t)
          (else (and (not (= k (car s)))
                     (not (= (abs (- k (car s))) n))
                     (check? (+ n  1 ) k (cdr s)))))
  )
  (define (iter r s k n)
    (cond ((=  0  n) (cons s r))
          (else (append (if (check?  1  (+ k  1 ) s) (iter r (cons (+ k  1 ) s)  0  (- n  1 )) '())
                        (if (< (+ k 1) columns) (iter r s (+ k 1) n) '()))))
  )        
  (iter '() '()  0  columns)
)


Схема?
Блин, у всех получается код короче моего. Видимо я совсем законченный быдлокодер

Схема :) Не в размере счастье
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35808993
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_мод пишет:

> проверяет можно ли ставить ферзя на строку lin столбец col при условии
> что предидущие уже стоят
> при ответе .f. - переход на след. строку т.е. все варианты не перебираются

Вот. А должны перебираться. Так вы просто забили в программу одну из
стратегий решения, и ею пользуетесь. А могут быть и другие
стратегии.

Т.е. если вы поставите задачу "найти все возможные расстановки
ферзей", то с помощью вашей программы её будет не решить.

Это, кстати, и есть "поиск с возвратом", а вовсе не то, про что вы говорили.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35809389
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy denЭх, программа почти в 2.5 раза меньше моей:( И работает вроде побыстрее
Сейчас смотрю в исходник этой задачи на Паскале. Если сравнивать клиппер с Паскалем, то последний всё-таки кажется более удобным для понимания.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35809412
любитель_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonСейчас смотрю в исходник этой задачи на Паскале. Если сравнивать клиппер с Паскалем, то последний всё-таки кажется более удобным для понимания.
Большой идеологический вопрос среди педагогов: является ли это плюсом Паскаля? Удобно для понимания, но для _какого_ понимания? Понимание программы неразрывно связано с понятием семантики языка и парадигмы программирования, жесткое привязывание "понимания" человека к конкретной парадигме неизбежно в Паскале... Потому некоторые (и, кстати, одни из лучших) педагогов предпочитают паскалю - лисп, который хоть и менее "удобен для понимания", но возникающее понимание качественно иное.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35809483
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любитель_ пишет:

> парадигме неизбежно в Паскале... Потому некоторые (и, кстати, одни из
> лучших) педагогов предпочитают паскалю - лисп, который хоть и менее
> "удобен для понимания", но возникающее понимание качественно иное.

Я бы уточнил - схему, а не лисп.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35809918
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Т.е. если вы поставите задачу "найти все возможные расстановки
ферзей", то с помощью вашей программы её будет не решить.

находит все 92 возможные решения. стратегий тут всего 2: 1.найти все варианты и отобрать их них допустимые или 2 искать только допустимые. у меня 2.
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35809932
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЕсли сравнивать клиппер с Паскалем, то последний всё-таки кажется более удобным для понимания.
если бы еще и лямбды вычислял с метапрограммами :)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35810941
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут мы сравниваем разные подходы к программированию. Т.е. для обучения императивному стилю паскаль очень даже хорош, но при этом ломает все представление о программировании и после этого переучиться на функциональный стиль и метапрограммирование очень сложно(знаю по себе)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35810955
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Я бы уточнил - схему, а не лисп.


Если не секрет-то почему? Схема более академична для чистого ФП?
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35811143
любитель_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zloy denТут мы сравниваем разные подходы к программированию. Т.е. для обучения императивному стилю паскаль очень даже хорош, но при этом ломает все представление о программировании и после этого переучиться на функциональный стиль и метапрограммирование очень сложно(знаю по себе)
В том-то и дело, что в случае с обучением всё не так просто. Сравниваются не "императивная и функциональная парадигмы", а "какая-то определенная парадигма и мультипарадигменность". Например, хаскелл для обучения программированию в целом ничуть не более "удачен", чем паскаль.
В этом суть идеи педагогов, выбирающих лисп: не привязываться в ходе обучения к конкретному стилю вообще, а с испльзуемой в программе парадигмой быть на "ты", вертеть ей по собственному желанию так же свободно, как библиотеками и алгоритмами.
Минусов в этом подходе тоже немало, главный из них сложность, хоть лисп и простой язык, но начинающему всё же проще понять паскаль, и так уж человек устроен, что если хоть что-то начало получаться сразу, то интерес возрастает, а если не начало - то интерес падает...
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35811463
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zloy denТ.е. для обучения императивному стилю паскаль очень даже хорош, но при этом ломает все представление о программировании и после этого переучиться на функциональный стиль и метапрограммирование очень сложно(знаю по себе)
Тогда надо начинать с клиппера - тут тебе и мультипарадигма и метапрограммирование.
и переучиваться не надо :)
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35812028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy den пишет:

> Если не секрет-то почему? Схема более академична для чистого ФП?

Потому что CommonLisp объёмнее и сложнее.
Схему можно выучить за неделю наверное.
За пару лекций. Она очень простая.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35812033
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любитель_ пишет:


> Минусов в этом подходе тоже немало, главный из них сложность, хоть лисп
> и простой язык, но начинающему всё же проще понять паскаль, и так уж
> человек устроен, что если хоть что-то начало получаться сразу, то
> интерес возрастает, а если не начало - то интерес падает...

Если сразу учить лисп (схему точнее), то всё проще, я думаю.
А минус в другом - после мощного лиспа людям приходится потом работать
в "приземлённых" ЯП типа java.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Common Lisp (бывший коварный ктото)
    #35814705
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy den,

Вот на массиве, вроде работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
(defun position-p(board depth)
  (let ((res t))
    (dotimes (i depth)
      (if
       (or
        (= (svref board i) (svref board depth))
        (= (+ (svref board i) i) (+ (svref board depth) depth))
        (= (- (svref board i) i) (- (svref board depth) depth)))
       (progn
         (setf res nil)
         (return))))
    res))


(defun pos-search(board depth size)
  (if (= depth size)
      (format t "~a~%" board)
      (progn
        (setf (svref board depth)  0 )
        (loop
         (when (= (svref board depth) size) (return))
         (if(position-p board depth)
            (pos-search board (+ depth  1 ) size))
         (setf (svref board depth)(incf (svref board depth)))))))

Вызывать так например:
Код: plaintext
(next-variant (make-array  8  :initial-element  0 )  0   8 )

зы. Чингис, переименуй топик в "Common Lisp" не в падлу, а то я и неправильно фамилию написал, и вообще..
...
Рейтинг: 0 / 0
25 сообщений из 132, страница 2 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Common Lisp (бывший коварный ктото)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]