Тема: Как найти минимальное значение в списке?

Никто не подскажет, как получить "min" из списка (62370.0 62370.0 124740.0 124740.0 249480.0 249480.0 499554.0 499554.0 999949.0
858924 180900 414000.0 271350.0 208000.0 657270.0 783900.0 281600.0 645210.0
144000.0 783900.0 1.209e+006 3.015e+006) ? Спасибо

Re: Как найти минимальное значение в списке?

Если ни о чем не задумываться, то так:

(car (vl-sort '(62370.0 62370.0 124740.0 124740.0 249480.0 249480.0 499554.0 499554.0 999949.0 858924 180900 414000.0 271350.0 208000.0 657270.0 783900.0 281600.0 645210.0
144000.0 783900.0 1.209e+006 3.015e+006) '<))

Возвращает 62370.0

Re: Как найти минимальное значение в списке?

Спасибо большое !

Re: Как найти минимальное значение в списке?

Прошу прощения за наглость, но нельзя ли определить "min" подсписок из списка ((603.0 5000.0) (1300.0 930.0) (1300.0 603.0) (450.0 320.0) (1070.0 603.0)
(880.0 320.0) (603.0 1300.0) (603.0 1090.0) (650.0 320.0) (603.0 450.0) (920.0
450.0) (603 300) (594 1446) (841.0 1189.0) (841.0 594.0) (594.0 841.0) (594.0
420.0) (420.0 594.0) (420.0 297.0) (297.0 420.0) (297.0 210.0) (210.0 297.0)) ?

Re: Как найти минимальное значение в списке?

Уточню: чтобы, по возможности, и "X" и "Y" были по минимуму.

Re: Как найти минимальное значение в списке?

> kpblc
Не люблю Vlisp. И где можно просто ЛИСП
(apply 'min '(62370.0 62370.0 124740.0 124740.0 249480.0 249480.0 499554.0 499554.0 999949.0 858924 180900 414000.0 271350.0 208000.0 657270.0 783900.0 281600.0 645210.0
144000.0 783900.0 1.209e+006 3.015e+006))

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Ты не пробывал поиском? Где-то я сваи сортировал и перенумеровывал.

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
1. А минимум определять по первому или по второму значению?
2. Поиск по форуму "сорт спис":
https://www.caduser.ru/forum/topic22025.html
https://www.caduser.ru/forum/topic20673.html
https://www.caduser.ru/forum/topic14059.html
https://www.caduser.ru/forum/topic15493.html
https://www.caduser.ru/forum/topic15862.html
https://www.caduser.ru/forum/topic16293.html

Re: Как найти минимальное значение в списке?

Минимальный первый элемент:

(apply 'min (mapcar 'car l))

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Если тебе нужна точка с минимальными значениями (X Y) не разрывая списка. Определить через дистанцию.
Пример: задаёшь точку с координатами (0 0)
Дальше определяешь минимальную дистанцию и через ассоциацию выбираешь точку.
Если есть и отрицательные элементы, то сложнее.
Надо решать рекурсией.

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Вот тебе сортировка...

(defun lst-min-pt (lst / d)
  (vl-load-com)
  (setq    d (apply
        (function
          (lambda (a1 a2)
        (list
          (apply (function min) a1)
          (apply (function min) a2)
        ) ;_  list
          ) ;_  lambda
        ) ;_  function
        (apply
          (function mapcar)
          (cons
        'list
        lst
          ) ;_  cons
        ) ;_  apply
      ) ;_  apply
  ) ;_  setq
  (vl-sort lst (function (lambda (x1 x2) (< (distance d x1) (distance d x2)))))
) ;_  defun
(lst-min-pt lst)

Я не стал вытаскивать первый элемент т.к. первый и второй на одинаковом расстоянии от минимальной точки от габаритного контейнера всех точек из твоего списка.

Re: Как найти минимальное значение в списке?

Что-то эти числа очень напоминают форматы бумаги.
Если это не точки, а области - может лучше сортировать по площади?

Re: Как найти минимальное значение в списке?

Спасибо !

Re: Как найти минимальное значение в списке?

Я поясню ситуацию: необходимо срочно (как всегда) создать около 1000 файлов из формата ".dwg" в формат ".dwf" {"DWF EVIEW (OPTIMIZED FOR VIEWING)}- это если печать в R2002. Вот каким образом наиболее оптимально (X=min, Y=min) определить формат бумаги ? Это раз. Во-вторых, не во всех файлах корректно идет ф-я (command"._-plot...). Далее: как определить размеры бумаги на экране (м.б., (getvar"extmin")(getvar"extmax") ?). Ну, и "мелочи": все это нужно считать из выбранной папки и соответственно записать в ".dwf".
Вот предварительные наметки:
(defun plp1();( / dmm nf)
(vl-load-com)
(setq dm(getvar"dimscale"))
(setq dmm(strcat "1="(rtos dm 2 0)))
(setq nf(getvar"dwgname"))
;(command"_zoom""_e")
(setq a222(list'(603.00 5000.00 "(603.00 x 5000.00 MM)")'(1300.00 930.00 "(1300.00 x 930.00 MM)")'(1300.00 603.00 "(1300.00 x 603.00 MM)")'(450.00 320.00  "(450.00 x 320.00 MM)")'(1070.00 603.00 "(1070.00 x 603.00 MM)")'(880.00 320.00 "(880.00 x 320.00 MM)")'(603.00 1300.00 "(603.00 x 1300.00 MM)")'(603.00 1090.00 "(603.00 x 1090.00 MM)")
           '(650.00 320.00 "(650.00 x 320.00 MM)")'(603.00 450.00  "(603.00 x 450.00 MM)")'(920.00 450.00 "(920.00 x 450.00 MM)")'(603 300 "(603x300 MM)" )'(594 1446 "(594x1446 MM)" )'(841.00 1189.00 "ISO A0 (841.00 x 1189.00 MM)" )'(841.00 594.00 "ISO A1 (841.00 x 594.00 MM)")'(594.00 841.00  "ISO A1 (594.00 x 841.00 MM)")'(594.00 420.00 "ISO A2 (594.00 x 420.00 MM)")
           '(420.00 594.00 "ISO A2 (420.00 x 594.00 MM)")'(420.00 297.00 "ISO A3 (420.00 x 297.00 MM)")'(297.00 420.00 "ISO A3 (297.00 x 420.00 MM)")'(297.00 210.00 "ISO A4 (297.00 x 210.00 MM)")'(210.00 297.00  "ISO A4 (210.00 x 297.00 MM)")
));SETQ_A222
(setq len(length a222))
(setq id 0)(setq spis())(setq spis1())(setq spis2())
(setq Xmin1(car(getvar"extmin")))
(setq Ymin1(cadr(getvar"extmin")))
(setq XYmin1(list Xmin1 Ymin1))
(setq Xmax3(car(getvar"extmax")))
(setq Ymax3(cadr(getvar"extmax")))
(setq XYmax3(list Xmax3 Ymax3))
(setq XYmax2(list Xmin1 Ymax3))
(setq XYmin4(list Xmax3 Ymin1))
(setq dist_x(/(distance XYmin1 XYmin4)dm) )
(setq dist_y(/(distance XYmin1 XYmax2)dm) )
(while (< id len)
(setq w1(nth id a222))
(if(and (equal(car w1) dist_x 2.0)(equal (cadr w1) dist_y 2.0) )
(progn
(setq spis(cons w1 spis))
;;;;;;;(setq spis1(cons(* (car w1)(cadr w1))spis1))
(setq spis1(cons(car w1)spis1))
(setq spis2(cons(cadr w1)spis2))
   (print "OKOKOK")
);progn
);if_w1
(setq id(+ 1 id))
);while
(setq m(car(vl-sort spis1 '<)))
(setq n(car(vl-sort spis2 '<)))
;;;   (if(>= m n)(setq f1(assoc m a222))(setq f1(assoc n a222)))
   (if(>= m n)(setq f1(assoc m spis))(setq f1(assoc n spis)))
;;;;;(setq f1(car(vl-sort spis '<)))
(setq idid(nth 2 f1))
(command"._-plot"
"_y"
""
"DWF EVIEW (OPTIMIZED FOR VIEWING)";“бва®©бвў® ўлў®¤ 
idid
"M"
"L"
""
"E"
dmm
""
""
"ACAD.ctb"
""
""
""
""
"Y")
(prin1)
);end
Кто сможет - помогите,пожалуйста. Спасибо.

Re: Как найти минимальное значение в списке?

Прочитал все ответы, но, честно сказать, мало что понял. Вот список:
(setq a222(list'(603.00 5000.00 "(603.00 x 5000.00 MM)")'(1300.00 930.00 "(1300.00 x 930.00 MM)")'(1300.00 603.00 "(1300.00 x 603.00 MM)")'(450.00 320.00  "(450.00 x 320.00 MM)")'(1070.00 603.00 "(1070.00 x 603.00 MM)")'(880.00 320.00 "(880.00 x 320.00 MM)")'(603.00 1300.00 "(603.00 x 1300.00 MM)")'(603.00 1090.00 "(603.00 x 1090.00 MM)")
           '(650.00 320.00 "(650.00 x 320.00 MM)")'(603.00 450.00  "(603.00 x 450.00 MM)")'(920.00 450.00 "(920.00 x 450.00 MM)")'(603 300 "(603x300 MM)" )'(594 1446 "(594x1446 MM)" )'(841.00 1189.00 "ISO A0 (841.00 x 1189.00 MM)" )'(841.00 594.00 "ISO A1 (841.00 x 594.00 MM)")'(594.00 841.00  "ISO A1 (594.00 x 841.00 MM)")'(594.00 420.00 "ISO A2 (594.00 x 420.00 MM)")
           '(420.00 594.00 "ISO A2 (420.00 x 594.00 MM)")'(420.00 297.00 "ISO A3 (420.00 x 297.00 MM)")'(297.00 420.00 "ISO A3 (297.00 x 420.00 MM)")'(297.00 210.00 "ISO A4 (297.00 x 210.00 MM)")'(210.00 297.00  "ISO A4 (210.00 x 297.00 MM)")
));SETQ_A222
Помогите (до точки) написать функцию сортировки по "X" и "Y" (все - по убыванию). Третье значение (строка) роли не играет. (Это я пытаюсь программно печатать файлы с оптимизацией стандартных форматов бумаги). Но заклинило: никак не могу создать "цикл в цикле", или что-то иное. И еще вопрос: почему-то пользовательские форматы бумаги программно не воспринимаются. Спасибо всем за участие!

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Ты бы лучше дал еще и пример того, что должно получиться, на примере этого списка...
Сортировку можно сделать разную, и везде будет учавствовать "X" и "Y" например, что делать с одинаковым форматом, но портретным/альбомным - как они должны быть отсортированны между собой?

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Если тебе нужна сортировка по возрастанию "X" и при одинаковом "X" по возрастанию "Y" то получай.

(vl-sort
  lst
  (function
    (lambda (x1 x2)
      (or
    (< (car x1) (car x2))
    (and
      (= (car x1) (car x2))
      (< (cadr x1) (cadr x2))
    ) ;_  and
      ) ;_  <
    ) ;_  lambda
  ) ;_  function
)

Если же из меня плохой предсказатель - постарайся более конкретно описать условия сортировки!

Re: Как найти минимальное значение в списке?

Задумано было все по типу:
((1 2 "fffffa1")(2 4 "dffa)(3 5 "xc,mn")...)
То есть одновременно сортируется и "X" и "Y". Если, допустим, "X1" и "X2" одинаковы, то меняется только, естественно, "Y": ((1 5 "fgg")(1 8 "dfjnd)(3 8 "ejhje")(3 9 "x,mc,")(4 10 "daf")(4 13 "yu")(5 13 "djfhd")...). Портреты и альбомы не важны. Очень прошу помочь.

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Тогда бери мой код и используй :)

> Евгений Елпанов
Там как раз такая сортировка!

Re: Как найти минимальное значение в списке?

> Евгений Елпанов
Все бы хорошо, но с 4-го подсписка сортировка начинает плясать:
(297.0 420.0 "ISO A3 (297.00 x 420.00 MM)")-3-й
(420.0 297.0 "ISO A3 (420.00 x 297.00 MM)")- 4-ый подсписок. Почему - не пойму (т.е. "Y4" меньше "Y3", а должен быть больше).

Re: Как найти минимальное значение в списке?

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

Re: Как найти минимальное значение в списке?

Премного виноват: не учел, что в стандартных форматах бумаги далеко не все подсписки пропорционально увеличены "X" и "Y", если сортировка по "X" то:
( (210.0 297.0 "ISO A4 (210.00 x 297.00 MM)")
  (297.0 210.0 "ISO A4 (297.00 x 210.00 MM)")
  (297.0 420.0 "ISO A3 (297.00 x 420.00 MM)")
)
Вот поэтому невозможно задуманное. Но почему же не воспринимаются "пользовательские" форматы в программном вычерчивании ? (ведь если чертить из AutoCAD'а - они берутся из файлов ".pc3). Раскаиваюсь, что оторвал от дел своими проблемами: не учел элементарного. Извините. Спасибо.

Re: Как найти минимальное значение в списке?

> SRAIBIKUS
Всё таки мне кажется что эта задача больше относится к элементарной организации процесса проектирования, а не программирования. ЛИСП вещь хорошая, но предназначен для программирования.

Re: Как найти минимальное значение в списке?

Оо,  о  чём  вы)  неужели  я  ..  м.  оо)  но  мне  всеголишь  надо  функцию  нахождения  минимального  из   одноуровнего  списка))

Re: Как найти минимальное значение в списке?

ЁмаЁ..упс.  а  ведь  мне  не  нужен  тот  лисп  который  в  автокаде)..я  короч  не  туда  попала..