Đến nội dung


Hình ảnh
* * * * - 7 Bình chọn

[Hỏi]Đố vui với LISP


  • Please log in to reply
391 replies to this topic

#381 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 09 July 2014 - 02:58 PM

Ý kiến của người ra đề:

@Ketxu: Không hiểu phương ngữ "khoai" nên nhầm là khoai thì mềm và dễ nhai. Ai ngờ nó tương đương "xương" của miền Nam. <_<

@Gia bach: đề cho 4 điểm bất kỳ, có nghĩa thứ tự bất kỳ, vị trí bất kỳ...

@PTB: thiếu kiểm tra điều kiện 4 điểm trùng nhau (không cần kiểm tra điều kiện thẳng hàng).

@Vuvuzela: thuật toán thì không khó nhưng điều kiện là lựa chọn thuật toán nào để viết lisp có số cặp () ít nhất có thể.

@Ndtnv: nếu sắp xếp khéo thì bỏ được hàm vl-sort. Code của bác thì nhìn rất bác học nhưng chắc chắn chạy chậm, tuy nhiên vì đề ra không y/c tốc độ nên không vấn đề gì.

@All: nên dùng equal có fuzz thay cho hàm "=", vì dùng hàm "=" rất nguy hiểm. Đã test của PTB lẫn Ndtnv đều bị dính.

Dưới đây là 1 đáp án nguyên thủy HA1 và một đáp án sửa lại hàm của ndtnv là HA2.

Mọi người xem có sai sót gì không hoặc có bài giải nào gọn hơn thì post lên cho forum cùng học hỏi.

;; Dap an nguyen thuy cua DVH.
(defun HA1(p1 p2 p3 p4 fuzz / Equal1)
 (defun Equal1 (p1 p2 p3 p4 fuzz)
  (equal (distance p1 p2) (distance p3 p4) fuzz))
 (and (equal p1 p2 fuzz) (Equal1 p1 p2 p3 p4 fuzz) (Equal1 p1 p3 p2 p4 fuzz) (Equal1 p2 p3 p4 p1 fuzz)))
;; Dap an sua lai cua Ndtnv.
(defun HA2(p1 p2 p3 p4 fuzz / l1 l2 l3 l4 l5 l6)
 (mapcar 'set (list 'l1 'l2 'l3 'l4 'l5 'l6) (mapcar 'distance (list p1 p3 p1 p2 p2 p1) (list p2 p4 p3 p4 p3 p4)))
 (and (> l1 0) (equal l1 l2 fuzz) (equal l3 l4 fuzz) (equal l5 l6 fuzz)))
 


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#382 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 09 July 2014 - 04:18 PM

Hình như bạn DVH nhầm chỗ

(equal p1 p2 fuzz)


  • 1

#383 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 09 July 2014 - 04:30 PM

Ồ, (not (equal p1 p2 fuzz)). Srr.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#384 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 09 July 2014 - 09:00 PM

Ý kiến của người ra đề:

@Ketxu: Không hiểu phương ngữ "khoai" nên nhầm là khoai thì mềm và dễ nhai. Ai ngờ nó tương đương "xương" của miền Nam. <_<

@Gia bach: đề cho 4 điểm bất kỳ, có nghĩa thứ tự bất kỳ, vị trí bất kỳ...

@PTB: thiếu kiểm tra điều kiện 4 điểm trùng nhau (không cần kiểm tra điều kiện thẳng hàng).

@Vuvuzela: thuật toán thì không khó nhưng điều kiện là lựa chọn thuật toán nào để viết lisp có số cặp () ít nhất có thể.

@Ndtnv: nếu sắp xếp khéo thì bỏ được hàm vl-sort. Code của bác thì nhìn rất bác học nhưng chắc chắn chạy chậm, tuy nhiên vì đề ra không y/c tốc độ nên không vấn đề gì.

@All: nên dùng equal có fuzz thay cho hàm "=", vì dùng hàm "=" rất nguy hiểm. Đã test của PTB lẫn Ndtnv đều bị dính.

Dưới đây là 1 đáp án nguyên thủy HA1 và một đáp án sửa lại hàm của ndtnv là HA2.

Mọi người xem có sai sót gì không hoặc có bài giải nào gọn hơn thì post lên cho forum cùng học hỏi.

;; Dap an nguyen thuy cua DVH.
(defun HA1(p1 p2 p3 p4 fuzz / Equal1)
 (defun Equal1 (p1 p2 p3 p4 fuzz)
  (equal (distance p1 p2) (distance p3 p4) fuzz))
 (and (equal p1 p2 fuzz) (Equal1 p1 p2 p3 p4 fuzz) (Equal1 p1 p3 p2 p4 fuzz) (Equal1 p2 p3 p4 p1 fuzz)))
;; Dap an sua lai cua Ndtnv.
(defun HA2(p1 p2 p3 p4 fuzz / l1 l2 l3 l4 l5 l6)
 (mapcar 'set (list 'l1 'l2 'l3 'l4 'l5 'l6) (mapcar 'distance (list p1 p3 p1 p2 p2 p1) (list p2 p4 p3 p4 p3 p4)))
 (and (> l1 0) (equal l1 l2 fuzz) (equal l3 l4 fuzz) (equal l5 l6 fuzz)))
 

Hề hề hề,

Nếu 4 điểm trùng nhau có thể coi là trường hợp HCN bị suy biến thành một điểm. Và như vậy có nhẽ cũng không có gì là bất hợp lý bởi nó cũng tương tự với hình tròn suy biến thành một điểm khi r=0.

Vì lẽ đó code của mình đã sửa chắc cũng không phải là quá tệ.

Hề hề hề,....


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#385 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 10 July 2014 - 09:36 AM

............

Dưới đây là 1 đáp án nguyên thủy HA1 và một đáp án sửa lại hàm của ndtnv là HA2.

Mọi người xem có sai sót gì không hoặc có bài giải nào gọn hơn thì post lên cho forum cùng học hỏi.

;; Dap an nguyen thuy cua DVH.
(defun HA1(p1 p2 p3 p4 fuzz / Equal1)
 (defun Equal1 (p1 p2 p3 p4 fuzz)
  (equal (distance p1 p2) (distance p3 p4) fuzz))
 (and (equal p1 p2 fuzz) (Equal1 p1 p2 p3 p4 fuzz) (Equal1 p1 p3 p2 p4 fuzz) (Equal1 p2 p3 p4 p1 fuzz)))
;; Dap an sua lai cua Ndtnv.
(defun HA2(p1 p2 p3 p4 fuzz / l1 l2 l3 l4 l5 l6)
 (mapcar 'set (list 'l1 'l2 'l3 'l4 'l5 'l6) (mapcar 'distance (list p1 p3 p1 p2 p2 p1) (list p2 p4 p3 p4 p3 p4)))
 (and (> l1 0) (equal l1 l2 fuzz) (equal l3 l4 fuzz) (equal l5 l6 fuzz)))
 

Thêm 1 giải pháp : Tứ giác có 2 đường chéo bằng nhau và cắt nhau tại trung điểm mỗi đường là hình chữ nhật.

- cho phép 4 điểm trong không gian, khi 4 điểm là đỉnh của tam diện đều, Lisp HA1 và HA2 trả về T.

- xét t/h các điểm trùng nhau.

- có xét đến thứ tự của các đỉnh.

(defun HCN(p1 p2 p3 p4 fuzz / r1 r2 r3 r4 oo)
  (and
    (setq oo (inters p1 p3 p2 p4))
    (setq r1 (distance oo p1)
	  r2 (distance oo p2)
	  r3 (distance oo p3)
	  r4 (distance oo p4))
    (equal r1 r2 fuzz) (equal r3 r4 fuzz) (equal r1 r3 fuzz)) )

  • 0

#386 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 July 2014 - 09:56 AM

- Xét thứ tự các điểm nghĩa là p1, p2, p3, p4 sắp xếp như thế nào?

- Khi oo nil >> lỗi


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#387 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 10 July 2014 - 10:11 AM

- Xét thứ tự các điểm nghĩa là p1, p2, p3, p4 sắp xếp như thế nào?

- Khi oo nil >> lỗi

- xét theo thứ tự :so với tâm đường tròn ngoại tiếp HCN

 

- oo nil : sorry! vậy là phải thêm 1 dấu ngoặc. (FIX ở bài trên)


  • 0

#388 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 July 2014 - 10:18 AM

- xét theo thứ tự :so với tâm đường tròn ngoại tiếp HCN

 

- oo nil : sorry! vậy là phải thêm 1 dấu ngoặc. (FIX ở bài trên)

- Càng không ổn: khi chưa biết 4 điểm là hình gì thì lấy đâu tâm đường tròn ngoại tiếp HCN mà xét?

- Thuật toán này nhiều hơn các thuật toán trên 1 yếu tố là tìm giao điểm >> gần như chắc chắn sẽ dài hơn.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#389 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 10 July 2014 - 10:54 AM

Thông thường tôi không lập trình kiểu như vậy nhưng vì bài này yêu cầu là: càng ít cặp () càng có giá trị.

2 Hàm của bạn DVH vẫn còn xét thiếu trường hợp p1 trùng p3 hoặc p4.

Vì vậy

 - Hàm HA1 phải đưa (not (equal p1 p2 fuzz)) vào hàm con

 - Hàm HA2 phải sửa thành (> (min l1 l3 l5) 0)

Nếu xét thứ tự thì code sau ngắn và ít cặp () hơn so với của bạn gia_bach

 

(and
    (inters p1 p3 p2 p4)
 (equal  (mapcar '- p1 p2) (mapcar '- p4 p3) fuzz)
 (equal  (distance p1 p3) (distance p2 p4) fuzz))

  • 2

#390 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 10 July 2014 - 11:11 AM

Thông thường tôi không lập trình kiểu như vậy nhưng vì bài này yêu cầu là: càng ít cặp () càng có giá trị.

2 Hàm của bạn DVH vẫn còn xét thiếu trường hợp p1 trùng p3 hoặc p4.

Vì vậy

 - Hàm HA1 phải đưa (not (equal p1 p2 fuzz)) vào hàm con

 - Hàm HA2 phải sửa thành (> (min l1 l3 l5) 0)

Nếu xét thứ tự thì code sau ngắn và ít cặp () hơn so với của bạn gia_bach

 

(and
    (inters p1 p3 p2 p4)
 (equal  (mapcar '- p1 p2) (mapcar '- p4 p3) fuzz)
 (equal  (distance p1 p3) (distance p2 p4) fuzz))

Tks bác. 

Vậy là phải ôn lai Đại số Vectơ.


  • 0

#391 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 July 2014 - 11:13 AM

Chỉ cần xét p1 không trùng p2 là đủ (điều kiện này là đại diện cho 4 điểm trùng nhau).

Mọi người cứ kiểm chứng xem, liệu có trường hợp sai không nhé?


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#392 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 10 July 2014 - 11:45 AM

Chỉ cần xét p1 không trùng p2 là đủ (điều kiện này là đại diện cho 4 điểm trùng nhau).

Mọi người cứ kiểm chứng xem, liệu có trường hợp sai không nhé?

 

4 điểm không trùng nhau thì đúng, nhưng 2 cặp điểm trùng nhau thì sai

Test trên code đã sửa (not (equal p1 p2 fuzz))

 

(setq p1 '(0 0) p2 '(1 1) p3 p1 p4 p2)
(HA1 p1 p2 p3 p4 fuzz) ; => T
(HA1 p1 p3 p2 p4 fuzz) ; => nil

Nếu hình 3D thì xét điều kiện :

(or (inters p1 p2 p3 p4) (inters p1 p3 p2 p4) (inters p1 p4 p2 p3))


  • 1