Đế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

#181 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 October 2011 - 04:42 PM

Hết sức cám ơn bác Gia Bách!
May mà tình cờ phát hiện ra lỗi này và được bác khắc phục chứ không thì toi cả 1 phần mềm, vì đôi khi không biết nó bệnh ở bộ phận nào mà uống thuốc!
  • 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.


#182 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 06 November 2011 - 10:28 PM

Theo mọi người, code nào để lấy list con từ phần tử thứ n của list ngắn nhất ?
Ngắn nhất có thể hiểu theo nghĩa ít dấu ngoặc nhất hoặc ít ký tự nhất.
Hàm (list Số_INT)

Kết quả yêu cầu :

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 0)
(4 3 2 1 0 1 2 3 4)

Command: (nthmem '(4 3 2 1 0 1 2 3 4) -1)
nil

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 1)
(3 2 1 0 1 2 3 4)

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 8)
(4)

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 9)
nil


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#183 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 06 November 2011 - 11:31 PM

Ngắn nhất thì chịu, nhưng hơi dài thì cũng chơi được:

(defun HA (lst sta / len1 len2 n lst1)
(setq len1 (length lst) len2 (- len1 sta) n (+ sta len2))
(if (<= 0 sta len1)
(repeat len2
(setq lst1 (cons (nth (setq n (1- n)) lst) lst1)))
nil))

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


#184 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 06:42 AM

Theo mọi người, code nào để lấy list con từ phần tử thứ n của list ngắn nhất ?
Ngắn nhất có thể hiểu theo nghĩa ít dấu ngoặc nhất hoặc ít ký tự nhất.
Hàm (list Số_INT)

Kết quả yêu cầu :

Bạn DVH viết dài quá. Tue_NV có đáp án ngắn đây, (chưa xét về tốc độ)
Nếu xét về tốc độ có lẽ nên viết hàm khác
(defun nthmem (lst n) (repeat n (setq lst (cdr lst))))

@DVH: Dòng (if (<= 0 sta len1)
có thể bỏ được vì Repeat n .... với n là số âm thì kết quả trả về NIL đúng với ý đồ lập trình rồi và dòng NIL ở cuối có thể bỏ được luôn
  • 1

#185 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 07 November 2011 - 08:05 AM

Bác ĐVH viết logic nhưng dài quá. Bác Tuệ làm gần đúng yêu cầu bài ra, chỉ chưa xét n = 0 như kết quả yêu cầu, nên thiếu 1 ngoặc if hoặc cond nữa.
Kiểu như :
(defun NthMem (lst i)
(if (zerop i) lst(repeat i (setq lst (cdr lst))))
)
Ngoài ra, tốc độ cdr 1 list cũng khá nhanh (không chậm như mọi người thường nghĩ đâu ạ), nên đáp án bác Tuệ đưa ra cũng chấp nhận luôn được phần tốc độ. Tks bác

Nhân tiện đề bài trên các bác thử làm luôn 1 đề bài khác,cách dùng cũng na ná (không xét tốc độ) :
- Remove phần tử thứ n trong 1 list.
- Yêu cầu tương tự bên trên: hàm (list n), phần tử đầu tiên mang số thứ tự 0, n <0 hoặc > length list thì trả về nil
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#186 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 08:54 AM

Bác ĐVH viết logic nhưng dài quá. Bác Tuệ làm gần đúng yêu cầu bài ra, chỉ chưa xét n = 0 như kết quả yêu cầu, nên thiếu 1 ngoặc if hoặc cond nữa.
Kiểu như :

(defun NthMem (lst i)
(if (zerop i) lst(repeat i (setq lst (cdr lst))))
)
Ngoài ra, tốc độ cdr 1 list cũng khá nhanh (không chậm như mọi người thường nghĩ đâu ạ), nên đáp án bác Tuệ đưa ra cũng chấp nhận luôn được phần tốc độ. Tks bác

Nhân tiện đề bài trên các bác thử làm luôn 1 đề bài khác,cách dùng cũng na ná (không xét tốc độ) :
- Remove phần tử thứ n trong 1 list.
- Yêu cầu tương tự bên trên: hàm (list n), phần tử đầu tiên mang số thứ tự 0, n <0 hoặc > length list thì trả về nil

Ừ! Đúng là mình chưa xét n=0
Tận dụng Lisp trên, giải câu đố của Ketxu


(defun nthi (L n / nthmem)
(defun NthMem (lst i)
(if (zerop i) lst(repeat i (setq lst (cdr lst))))
)
(if (< n (length L))
(append (reverse(nthmem (reverse L) (- (length L) n -1))) (NthMem L n))))

  • 0

#187 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 November 2011 - 09:03 AM

Đây xem sao:
P/S: câu đố tiếp theo

(defun HA ( n l / i )
(setq i -1)
(if (<= 0 n (length l))
(vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)))

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


#188 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 09:23 AM

Đây xem sao:


(defun HA ( n l / i )
(setq i -1)
(if (<= 0 n (length l))
(vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)))

Cái này chưa đúng yêu cầu :
phần tử đầu tiên mang số thứ tự 0, n <0 hoặc > length list thì trả về nil
  • 0

#189 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 November 2011 - 09:26 AM

Bác Tue_NV xem lại xem: khi n=len_lst thì nó trả về nguyên lst, chứ của bác thì hình như không đúng ý ket.
Cái của bác không bao giờ loại được phần tử cuối cùng ra khỏi lst, đồng thời cũng không lấy được nguyên cả lst.
  • 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.


#190 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 09:38 AM

Bác Tue_NV xem lại xem: khi n=len_lst thì nó trả về nguyên lst, chứ của bác thì hình như không đúng ý ket.
Cái của bác không bao giờ loại được phần tử cuối cùng ra khỏi lst, đồng thời cũng không lấy được nguyên cả lst.

Mình chỉ chưa xét tới n=0 thôi. Còn lại thì đúng như yêu cầu
Còn bài trích dẫn trên của ketxu thì nó ra như thế này :

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 8)
(4)
Command: (nthmem '(4 3 2 1 0 1 2 3 4) 9)
nil
  • 0

#191 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 November 2011 - 09:46 AM

Hình như bác vẫn chưa hiểu ý tôi, hay tôi có nhầm không hè:
1). Làm sao bác tạo lst mà phần tử cuối cùng bị remove?
2). Làm sao bác tạo lst mà các phần tử đều giữ nguyên? Theo đề bài thì khi n=9 nó sẽ trả về lst cũ, khi n>=10 nó mới nil bác ạ.
  • 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.


#192 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 10:00 AM

Hình như bác vẫn chưa hiểu ý tôi, hay tôi có nhầm không hè:
1). Làm sao bác tạo lst mà phần tử cuối cùng bị remove?
2). Làm sao bác tạo lst mà các phần tử đều giữ nguyên? Theo đề bài thì khi n=9 nó sẽ trả về lst cũ, khi n>=10 nó mới nil bác ạ.

Ơ! Cái đề của Ketxu như thế này mà!!!!

Theo mọi người, code nào để lấy list con từ phần tử thứ n của list ngắn nhất ?
Ngắn nhất có thể hiểu theo nghĩa ít dấu ngoặc nhất hoặc ít ký tự nhất.
Hàm (list Số_INT)


Kết quả yêu cầu :
......
........

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 8)
(4)

Command: (nthmem '(4 3 2 1 0 1 2 3 4) 9)
nil


  • 0

#193 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 November 2011 - 10:07 AM

Ơ! Cái đề của Ketxu như thế này mà!!!!


Chúng ta đang bàn câu đố sau cơ mà, chứ đâu phải câu đố đầu?
  • 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.


#194 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 10:09 AM


Chúng ta đang bàn câu đố sau cơ mà, chứ đâu phải câu đố đầu?

Bạn xem lại bài viết số 190 của bạn.
Bạn trả lời không trích dẫn. Ai biết bạn trả lời cho bài viết nào?
  • 0

#195 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 November 2011 - 10:12 AM

Bạn xem lại bài viết số 190 của bạn.
Bạn trả lời không trích dẫn. Ai biết bạn trả lời cho bài viết nào?


Vâng, thiếu trích dẫn, nhưng câu đố sau thì bác chưa đúng!
  • 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.


#196 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2011 - 10:21 AM

Đây xem sao:
P/S: câu đố tiếp theo


(defun HA ( n l / i )
(setq i -1)
(if (<= 0 n (length l))
(vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)))

Có code này tương đương với code trên, ngắn hơn 1 chút. Tuy nhiên, cả 2 code đều xem phần tử đầu tiên là 0, phải thêm thắt 1 chút mới đúng yêu cầu của câu đố của Ketxu được


(defun nthi (L n)
(if (<= 0 n (length L))(ACET-LIST-REMOVE-NTH n L))
)

  • 1

#197 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 07 November 2011 - 12:27 PM

Tks 2 bác. Yêu cầu của ketxu thực ra không nhất nhất phải chuẩn chỉ theo số lượng list hay phần tử đầu như thế nào, mà chỉ là để dẫn dắt 2 thủ thuật rất hay để làm code ngắn gọn, và rất tuyệt là các bác lần lượt xới nó lên rồi. Bravo !!
1. (repeat n (setq lst (cdr lst)))
2. (vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)

Ngoài ra, trong câu 1 cũng có thể sử dụng vl-member-if / vl-member-if-not thay vào đáp án của bác ĐVH.
Tks 2 bác lần nữa.
Chờ câu đố tiếp theo ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#198 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 November 2011 - 08:13 AM

Trong mặt phẳng, cho 3 điểm p1, p2, p3 tạo thành 1 tam giác đều. pt là 1 điểm nằm trong tam giác đó. Hãy lập hàm tính tổng khoảng cách từ pt đến các cạnh của tam giác, sao cho số cặp () là ít nhất, dạng hàm: FUNC(p1 p2 p3 pt).
  • 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.


#199 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 November 2011 - 08:18 AM

Trong mặt phẳng, cho 3 điểm p1, p2, p3 tạo thành 1 tam giác đều. pt là 1 điểm nằm trong tam giác đó. Hãy lập hàm tính tổng khoảng cách từ pt đến các cạnh của tam giác, sao cho số cặp () là ít nhất.


Nghĩa là .....???
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#200 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 November 2011 - 08:41 AM


Nghĩa là .....???


Số dấu ngoặc của hàm là ít nhất.
  • 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.