Следующая страница > 1 < [2]

Автор Сообщение

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5159   2011-12-02 19:08 GMT+3 часа(ов)      
Всем доброго времени суток!

Прошу Вашей помощи в решении задачи... Так как, признаюсь честно, сам я не могу никак разобраться с этой задачей, и не смог нигде найти помощи, обращаюсь к Вам уважаемые знатоки ЛИСПа

Задачи звучит так:
Найти количество положительных и отрицательных элементов и нулей, в списке, который может состоять из атомов и подсписков.
Например: ( 1 (-4 0 5) 3 0 (-1 4))
Положительные: 4
Отрицательные: 2
Нули: 2

Это то, как я вижу задачу... Но я не могу придумать как реализовать данную задачу...
Надеюсь на Вашу отзывчивость и помощь!
Заранее благодарю!

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5160   2011-12-02 20:44 GMT+3 часа(ов)      
(defun F (L)
(if L
(let
((elem (car L)))
(mapcar '+
(if (atom elem)
(cond
((minusp elem) (list 1 0 0))
((zerop elem) (list 0 1 0))
((plusp elem) (list 0 0 1))
(T (list 0 0 0)))
(F elem))
(F (cdr L))))
(list 0 0 0)))

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5161   2011-12-02 20:58 GMT+3 часа(ов)      
Спасибо за отзывчивость!
Но, может я что то неправильно делаю... он у меня отказывается работать

П.С. Не знаю, важно это или нет... я использую программу LispWorks Personal Edition 6.0.1


И ещё небольшой вопросик... можно ли это всё реализовать отдельными функциями?
Например:
1 Функция находит все положительные элементы и считает их
2 Функция находит все отрицательные элементы и считает их
3 Функция находит все нули и считает их
4 Функция объединяет в список результат выполнения трех предыдущих функций...

Простите, забыл упомянуть это раньше

отредактировал(а) Jack: 2011-12-02 21:05 GMT+3 часа(ов)

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5162   2011-12-02 21:26 GMT+3 часа(ов)      
«...отказывается работать...» - какие симптомы?

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5163   2011-12-02 21:31 GMT+3 часа(ов)      
Цитата
VH :
«...отказывается работать...» - какие симптомы?



Error: Illegal argument in functor position: 1 in (1 2 3 (1 2) -1 0).
1 (continue) Evaluate 1 and ignore the rest.
2 (abort) Return to level 0.
3 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

Извините если это звучит глупо...
Но не могли бы Вы ещё обьяснить как правильно нужно запускать...
Я откомпилировал, всё хорошо... но вот как я запускаю, как Вы видите, ничего не происходит)

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5164   2011-12-02 21:38 GMT+3 часа(ов)      
(F '(1 (-4 0 5) 3 0 (-1 4))) возвращает (2 2 4)
(F '(1 2 3 (1 2) -1 0)) возвращает (1 1 5)

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5165   2011-12-02 21:46 GMT+3 часа(ов)      
Цитата
VH :
(F '(1 (-4 0 5) 3 0 (-1 4))) возвращает (2 2 4)
(F '(1 2 3 (1 2) -1 0)) возвращает (1 1 5)



Да так всё работает!!
Огромное вам спасибо!
А можно ли это реализовать в функциях как я описал выше ?

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5166   2011-12-02 22:07 GMT+3 часа(ов)      
Можно, но скучно
(defun F (L)
(mapcar
'(lambda (p) (F0 L p))
'(minusp zerop plusp)))
(defun F0 (L P)
(if L
(+
(if (atom (car L))
(if (funcall P (car L)) 1 0)
(F0 (car L) P))
(F0 (cdr L) P))
0))

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5167   2011-12-02 22:19 GMT+3 часа(ов)      
Супер! Большое Вам человеческое спасибо!
Я не покажусь слишком наглым если попрошу Вас помочь мне ешё и со второй частью этого задания?

Задание остается тем же... меняется только список который мы вводим... теперь он должен выглядеть примерно так


( (a11 a12 ... a1n)
(a21 a22 ... a2m)
...
(ak1 ak2 ... akp)), где aij это атомы.... то есть в данном случае без подсписков

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5168   2011-12-02 22:30 GMT+3 часа(ов)      
С моей точки зрения, в списке ((a11 a12 ... a1n) (a21 a22 ... a2m) ... (ak1 ak2 ... akp)) элементы (a11 a12 ... a1n), (a21 a22 ... a2m) ... (ak1 ak2 ... akp) и есть именно подсписки.
Оба варианта пригодны для такого списка (как и для любого другого).

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5169   2011-12-02 22:40 GMT+3 часа(ов)      
Тогда я то ли что то неправильно объяснил... То ли Вы меня не правильно поняли...
В общем, лучше я вам покажу задание целиком, звучит оно следующим образом:


Дан список:



Задание:
Найти количество отрицательных, положительных и нулевых элементов (aij - атомы)

Вот, как то так
Я и сам не до конца понимаю что имеется ввиду... Извините что Вас нагружаю.

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5170   2011-12-02 23:08 GMT+3 часа(ов)      
и ещё такой вопрос... мне если честно уже даже стыдно спрашивать.. просто нам необходимо сделать работу по определенному образцу, поэтому я собственно и спрашивал как сделать через отдельные функции.. примерно так:
(defun Positive(number)
(cond
((> number 0) number)
(t 0)
))
 
(defun PositiveSumm (list)
(cond
((NULL list) 0)
((ATOM (CAR list))
(+ (Positive(CAR list)) (PositiveSumm (CDR list))
)
)
(T (+ (PositiveSumm (CAR list))
(PositiveSumm (CDR list))
)
)
))
 
(defun Negative(number)
(cond
((< number 0) number)
(t 0)
))
 
(defun NegativeSumm(list)
(cond
((NULL list) 0)
((ATOM (CAR list))
(+ (Negative(CAR list)) (NegativeSumm (CDR list))
)
)
(T (+ (NegativeSumm (CAR list)) (NegativeSumm (CDR list))
)
)
))
 
(defun Null(number)
(cond
((= number 0) number)
(t 0)
))
 
(defun NullSumm(list)
(cond
((NULL list) 0)
((ATOM (CAR list))
(+ (Null(CAR list)) (NullSumm (CDR list))
)
)
(T (+ (NullSumm (CAR list)) (NullSumm (CDR list))
))))
 
(defun NullPositiveNegativeSumm(list)
(list (PositiveSumm list)
(NegativeSumm list)
(NullSumm list)
))


что мне нужно изменить в функциях NegativeSumm, PositiveSumm, NullSumm, чтобы он считал не сумму, а количество?

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5171   2011-12-02 23:11 GMT+3 часа(ов)      
Количества отрицательных, положительных и нулевых элементов функция (F) <в обоих вариантах> находит.
Величины b и c - это суммы элементов "по строкам" и "по столбцам"?

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5172   2011-12-02 23:24 GMT+3 часа(ов)      
Цитата
VH :
Количества отрицательных, положительных и нулевых элементов функция (F) <в обоих вариантах> находит.
Величины b и c - это суммы элементов "по строкам" и "по столбцам"?


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

Если эти величины b и c, не используются в задаче, то получается что вторая задача ничем не отличается от первой, как вы уже сказали...


Но пока, что вы можете сказать по первой задаче? что я выше написал? как можно преобразовать?
просто у нас действительно придираются к таким вещам
И ещё раз СПАСИБО Вам за Вашу отзывчивость!

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5173   2011-12-02 23:31 GMT+3 часа(ов)      
Ето Бейсик какой-то.
(defun Positive (number)
(if (> number 0) 1 0))

(defun Positive (number)
(cond
((> number 0) 1)
(T 0)))

и остальные аналогично
Для ознакомления с настоящей красотой LISPа - безымянная рекурсивная функция (из SICP) в данном случае для вычисления факториала:
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1) 1
(* k (ft ft (1- k)))))))
10)

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5174   2011-12-02 23:54 GMT+3 часа(ов)      
Вот так над нами издеваются...
Мало того что задачи ставят невнятно, так ещё и реализовывать заставляют так, что запутаться как пить дать... Вот собственно и опять я немного в недоумении...
Но, да ладно... буду разбираться ещё обращусь к Вам за помощью, если Вы не против


Что то я никак не пойму, что Вы в последнем сообшении написали, и как это применить к моей задаче..?

отредактировал(а) Jack: 2011-12-02 23:59 GMT+3 часа(ов)

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5175   2011-12-03 00:06 GMT+3 часа(ов)      
Вы спросили, что нужно изменить. Как изменить функции (Positive) и остальные такие же, и показано выше.

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5176   2011-12-03 00:17 GMT+3 часа(ов)      
Прошу прощения за мою глупость, это значит я что то не правильно делаю... компилируется он хорошо, но вот когда пытаюсь запустить, выдает ошибку снова... можете проверить пожалуйста?
(defun Positive (number)
 
(if (> number 0) 1 0))
 
(defun Positive (number)
 
(cond
 
((> number 0) 1)
 
(T 0)))
 
(defun Negative (number)
 
(if (< number 0) 1 0))
 
(defun Negative (number)
 
(cond
 
((> number 0) 1)
 
(T 0)))
 
(defun PositiveNegative(list)
(list (Positive list)
(Negative list)
)
)



CL-USER 13 > (POSITIVENEGATIVE '(1 2 3 -1 -2 0))

Error: In > of ((1 2 3 -1 -2 0) 0) arguments should be of type REAL.
1 (continue) Return a value to use.
2 Supply a new first argument.
3 (abort) Return to level 0.
4 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.


что это значит и как это исправить? метод научного тыка не помог... пробовал

Или нужно как то иначе прописать эту последнюю функцию?)

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5177   2011-12-03 00:29 GMT+3 часа(ов)      
В сообщении #5173 два ВАРИАНТА функции (Positive).
В определении Вашей функции (PositiveNegative) следует выполнять вызовы функций (PositiveSumm) и (NegativeSumm).

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5178   2011-12-03 00:40 GMT+3 часа(ов)      
Цитата
VH :
В сообщении #5173 два ВАРИАНТА функции (Positive).
В определении Вашей функции (PositiveNegative) следует выполнять вызовы функций (PositiveSumm) и (NegativeSumm).



Да, Вы правы... это моя ошибка по не внимательности, или по не знанию...
Огромное Вам человеческое СПАСИБО за помощь!

По поводу второй части задания, я к Вам обращусь попозже, если Вы не против конечно?

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5188   2011-12-03 16:38 GMT+3 часа(ов)      
И снова Доброе Утро!

Я уточнил у преподавателя суть второго задания... Смысл второй задачи такой:

Найти количество положительных, отрицательных и нулевых элементов в каждой строке и столбце. Реализовать это необходимо при помощи двух функций:
1. Считает по строкам, и выдает ответ в виде списка состоящего из подсписков
2. Считает по столбцам, и выдает ответ в виде списка состоящего из подсписков.
В результате у нас должно получиться два списка (b и c).

Пример:

(( 1 2 -1 0 3)
(-1 0 -3 2)
( 2 1 0 -1)
(0 -1 2))

В данном случае:
По строкам: b1=(3 1 1), b2=(1 1 2), b3=(2 1 1), b4=(1 1 1), общий ответ список ((3 1 1) (1 1 2) (2 1 1) (1 1 1))
По столбцам: c1=(2 1 1), c2=(2 1 1), c3=(1 1 2), c4=(1 1 1), c5=(1 0 0), общий ответ список ((2 1 1) (2 1 1) (1 1 2) (1 1 1) (1 0 0))

В конечном результате, должно получится два списка как показано выше...

((3 1 1) (1 1 2) (2 1 1) (1 1 1))
((2 1 1) (2 1 1) (1 1 2) (1 1 1) (1 0 0))

З.Ы. Первое число - кол-во положительных элементов, второе число - кол-во нулевых элементов, третье число - кол-во отрицательных элементов.

Надеюсь я правильно понял задачу, и корректно её преподнес
Спасибо за Вашу отзывчивость и помощь!

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5197   2011-12-04 00:10 GMT+3 часа(ов)      
Количества элементов "по столбцам":
(defun F (L)
((lambda (trim)
(if trim
(cons
(F0 (mapcar #'car trim))
(F (mapcar #'cdr trim)))))
(remove nil L)))

(defun F0 (L)
(if L
((lambda (elem)
(mapcar #'+
(cond
((minusp elem) (list 0 0 1))
((zerop elem) (list 0 1 0))
((plusp elem) (list 1 0 0))
(T (list 0 0 0)))
(F0 (cdr L))))
(car L))
(list 0 0 0)))

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5201   2011-12-04 02:12 GMT+3 часа(ов)      
Количества элементов "по строкам":
(defun F (L)
(mapcar #'F0 L))

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5224   2011-12-04 18:11 GMT+3 часа(ов)      
Добрый день!

У меня снова возникла проблема с этим заданием... скажите я что то не так делаю?


CL-USER 17 > (F0 '((1 2 3) (0 1 0) (-1 -1 0)))

Error: In MINUSP of ((1 2 3)) arguments should be of type REAL.



И вопрос... можно ли каким то более простым языком написать эти функции? используя скажем, только какие то базовые знания?

Подскажите пожалуйста что не так... и ещё раз спасибо за помощь!

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5225   2011-12-04 18:50 GMT+3 часа(ов)      
Давайте определимся: мы решаем задание номер 2 - то есть подсчитываем количества положительных, нулевых и отрицательных элементов "по строкам" и "по столбцам" данного списка-«матрицы».
Так как элементами исходного(данного) списка являются списки из чисел <или атомов других типов - но БЕЗ подсписков>, то функция подсчета, которая называется теперь (F0), упрощена - и аргументом её вызова должен быть список БЕЗ подсписков. То есть вызывать ее должна либо функция (F) из сообщения #5197, приготовившая очередной "столбец" исходного списка, либо функция (F) из сообщения #5201 ("строки" в исходном списке и «готовить» не надо).
«...более простым языком написать...» - мы снова <и в который уже раз> должны учитывать "уровень некомпетенции" препода? А что Вас пугает в этих определениях функций?

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5226   2011-12-04 19:22 GMT+3 часа(ов)      
Извините меня за мою глупость или непонимание...

Мне кажется что мы с Вами просто не допоняли друг друга, или я просто не понимаю как правильно вызывать эти функции...

Давайте разберемся... Задача состоит в следующем:

У нас дан список-"матрица", состоящий из n-ного количества подсписков (как на картинке в сообщении выше), которые в свою очередь могут состоять только из атомов!.
Нам необходимо посчитать кол-во положительных, отрицательных и нулевых элементов, в каждой строке "матрицы" (получается в каждом подсписке), и в каждом столбце "матрицы".
В результате у нас должно получится два списка:
1. Список для строк - состоящий из подсписков (каждый подсписок соответствует одной строке)
2. Список для столбцов - состоящий также, из подсписков (каждый подсписок соответствует одному столбцу)

На примере это выглядит примерно следующим образом:

(( 1 2 -1 0 3)
(-1 0 -3 2)
( 2 1 0 -1)
(0 -1 2))

В данном случае:
По строкам: b1=(3 1 1), b2=(1 1 2), b3=(2 1 1), b4=(1 1 1), общий ответ список ((3 1 1) (1 1 2) (2 1 1) (1 1 1))
По столбцам: c1=(2 1 1), c2=(2 1 1), c3=(1 1 2), c4=(1 1 1), c5=(1 0 0), общий ответ список ((2 1 1) (2 1 1) (1 1 2) (1 1 1) (1 0 0))

В конечном результате, должно получится два списка как показано выше...

((3 1 1) (1 1 2) (2 1 1) (1 1 1))
((2 1 1) (2 1 1) (1 1 2) (1 1 1) (1 0 0))



Или я просто не правильно понял как нужно вызывать эту функцию, и это привело к недопониманию между нами...
Потому как, если допустим я ввожу
(F0 '(1 2 3
0 1 0
0 -1 -1))

Он считает полностью всё... и выдает следующий результат (4 3 2)

Простите меня за нервотрепку, просто мне действительно необходимо разобраться, что к чему и как...

И да, вы правы, скорее всего не стоит ничего "упрощать" (что в конечном итоге может все наоборот усложнить)...

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5229   2011-12-04 20:10 GMT+3 часа(ов)      
Вы наш диалог считаете «нервотрепкой»?
Мое стремление во всех определениях именованных функций использовать имя F (или F_с_номером) именно для того, чтобы Вы могли свободно переименовывать их по своему желанию (и канечна для борьбы с преподавательским розыском в Интернете), в данном случае внесло некоторую неразбериху.
Функция подсчета количеств в одноуровневом списке:
(defun ONELEVELCOUNT (L)
(if L
((lambda (elem)
(mapcar #'+
(cond
((minusp elem) (list 0 0 1))
((zerop elem) (list 0 1 0))
((plusp elem) (list 1 0 0))
(T (list 0 0 0)))
(ONELEVELCOUNT (cdr L))))
(car L))
(list 0 0 0)))

Функция подсчета количеств в моногоуровневом списке "по столбцам":
(defun COLUMNCOUNT (L)
((lambda (trim)
(if trim
(cons
(ONELEVELCOUNT (mapcar #'car trim))
(COLUMNCOUNT (mapcar #'cdr trim)))))
(remove nil L)))

Функция подсчета количеств в моногоуровневом списке "по строкам":
(defun ROWCOUNT (L)
(mapcar #'ONELEVELCOUNT L))

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5236   2011-12-04 22:57 GMT+3 часа(ов)      
Да, действительно, теперь всё встало на свои места
Я наверное просто запутался в трех деревьях как говорится....

Спасибо Вам огромное за Вашу отзывчивость и помощь!
Вы мне действительно безумно помогли... буквально жизнь спасли!

З.Ы. О нервотрепке я говорил к тому, что меня бы на Вашем месте наверно уже достало бы вдалбливать кому то, что и как работает и что по чем... да ещё при этом и делать все за другого...

Если бы я мог Вас как то отблагодарить?

З.Ы.Ы. Хоть у меня ещё есть и третье задание, но с ним я уже постыжусь к Вам обращаться, Вы на меня итак слишком много времени потратили. на мой взгляд

Премного благодарен за помощь и понимание!

Jack

Members


Статус

17 сообщений

Где: Latvia
Род занятий:
Возраст:

#5349   2011-12-17 00:45 GMT+3 часа(ов)      
Доброго времени суток!
Помогите пожалуйста снова с задачей...
Задача состоит в следующем:
"Из списка, состоящего из атомов и подсписков, удалить все повторяющиеся элементы, оставив при этом только последние из них."

Пример: (1 2 (6 5) 2 3 (5 4))
Ожидаемый ответ: (1 (6) 2 3 (5 4))

Буду очень благодарен, если у Вас была бы возможность помочь мне и с данной задачей тоже
Заранее благодарю!

P.S. есть некоторые наработки, но в общем, хотелось бы посмотреть решение опытного человека

отредактировал(а) Jack: 2011-12-17 00:55 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#5352   2011-12-17 02:07 GMT+3 часа(ов)      
(defun foo(L)
(let ((C (make-hash-table)))
(labels ((ret (L)
(cond
((null L) nil)
((null (car L)) (cons '() (ret (cdr L))))
((listp (car L))
(let ((ret-car-l (ret (car L))))
(if (null ret-car-l)
(ret (cdr L))
(cons ret-car-l (ret (cdr L))))))
(T (if (gethash (car L) C)
(ret (cdr L))
(progn
(setf (gethash (car L) C) 1)
(cons (car L)(ret (cdr L)))))))))
(reverse (ret (reverse L))))))

отредактировал(а) megamanx: 2011-12-17 16:42 GMT+3 часа(ов)
I wish I'd made you angry earlier


Онлайн :

0 пользователь(ей), 42 гость(ей) :