Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
ketxu

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

Các bài được khuyến nghị

gia_bach    1.442

 

Hề hề hề,

Thử tài tí chơi.

 

(defun c:chk (/ p1 p2 p3 p4)
 (and (= (distance p1 p2) (distance p3 p4)) (= (distance p1 p3) (distance p2 p4)) (= (distance p1 p4) (distance p2 p3)))
)

Code của bác Bình và ndtnv chỉ đúng khi không quan tâm đến thứ tự các điểm.

 

15454_hcn.jpg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
VUVUZELA    98

Vụ này thì thuật toán sẽ viết như sau :

- Tìm điểm giữa của 4 điểm,  giống như trọng tâm ta có được điểm tâm (pt)

- Sắp xếp thứ tự 4 điểm chọn theo góc quay từ nhở đến lớn với trục quay ở điểm tâm (pt )

- Kiểm tra góc giữa 4 điểm đã sắp xếp trên có = 90 độ hay không nếu đúng hết thì trả về T

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442

Vụ này thì thuật toán sẽ viết như sau :

- Tìm điểm giữa của 4 điểm,  giống như trọng tâm ta có được điểm tâm (pt)

- Sắp xếp thứ tự 4 điểm chọn theo góc quay từ nhở đến lớn với trục quay ở điểm tâm (pt )

- Kiểm tra góc giữa 4 điểm đã sắp xếp trên có = 90 độ hay không nếu đúng hết thì trả về T

 

Cậu này mới từ world cup Nam Phi về nên hơi bị "lơ ngơ" ..

Bây giờ đang là world cup Brazil mà, Đố vui với LISP: Điều kiện: càng ít cặp () càng có giá trị.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123

Code của bác Bình và ndtnv chỉ đúng khi không quan tâm đến thứ tự các điểm.

 

15454_hcn.jpg

Hề hề hề,

Thực ra hôm qua vì nóng xem World Cup nên mình cũng chẳng nghĩ tới việc xet 4 điểm có thẳng hàng hay không.

Nhưng nếu chấp nhận có HCN dẹp (tức chiều rộng bằng 0 thì vẫn có thể chấp nhập code phía trên.

Thuật toán của mình chỉ đơn giản là dựa trên hai định lý từ thời phổ thông là 

1/- HCN là hình bình hành có hai đường chéo bằng nhau.

2/- Hình bình hành là hình tứ giác có hai cặp cạnh đối diện bàng nhau đôi một.

 

Như vậy khi đả cho 4 điểm thì nếu phát xuất từ một điểm sẽ chỉ có 3 đoạn nối với ba điểm còn lại. Các đoạn này sẽ tương ứng với hai cạnh liền kề và đường chéo của hinh tứ giác tạo thành, bất kể vị trí tương đối của chúng trên mặt phẳng. Do đó nếu lấy các đoạn không trùng đỉnh đả chọn, ắt chúng sẽ là các cặp cạnh và đường chéo tương ứng với các định lý nêu trên.

 

Nếu nó đã đúng với trường hợp bất kể thứ tự thì có nhẽ cũng sẽ không sai nếu như có quy ước về trật tự của các đỉnh bởi trong code mình chỉ sử dụng distance mà không quan tâm tới chiều của đoạn thẳng.

 

Mong các bác đèn giời soi xét thêm. May ra có thể xếp đoạn code của mình vào tới trận chung kết.

 

Hề hề hề, .....

 

@ Bác Ketxu: Khoai thì có khoai, song cứ nhai ắt được bác ạ. Tuy có hơi ê răng nhưng mà cũng đỡ đói .....lisp bác ạ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123

Khoai chưa chắc đã dễ nhai. Như bác PTB là không ổn rồi.

Hề hề hề,

Đúng là chưa ổn thật. Vì mình không test lại nên cứ nghĩ thế là xong. Ai dè cái hám (= ....) này nó chơi mình. vậy nên xin phép sửa lại code trên như sau:

 

 

(defun c:chk ()
(and (equal (distance p1 p2) (distance p3 p4) 0.0001) (equal (distance p1 p3) (distance p2 p4) 0.0001) (equal (distance p1 p4) (distance p2 p3) 0.0001))
)

 

Ở code này mình bỏ luôn cả việc khử biến để không phải khai báo lại biến và code sẽ làm việc khi các biến p1, p2, p3, p4 này đã được xác định trước.

 

Hy vọng code lần này sẽ được vào chung kết mặc dù số cặp () không giảm so với code trước.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Doan Van Ha    2.680

Ý 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)))
 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123

Ý 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ề,....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442

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

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)) )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442

- 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)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Doan Van Ha    2.680

- 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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ndtnv    397

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))
  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442

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ơ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Doan Van Ha    2.680

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é?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ndtnv    397

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))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×