Chuyển đến nội dung
Diễn đàn CADViet
ketxu

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

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

Chúc mừng năm mới Giáp Ngọ 2014 !

Nhân dịp năm mới Con Ngựa 2014, xin gởi các bạn lời chúc Tết, đồng thời gởi luôn câu đố Xuân về con… Thỏ, để nhâm nhi với mứt gừng:

Ngựa thì chạy nhanh hơn Thỏ (?), nhưng Thỏ thì đẻ nhanh hơn Ngựa! Tháng nào cũng thấy chúng đẻ. Đẻ nhanh đến nỗi, bắt đầu từ tháng 3 trở đi, cứ đếm Thỏ thì thấy bằng tổng số Thỏ đếm được của tháng trước và tháng kề trước (VD: đếm ở tháng thứ 6 thì bằng đếm ở tháng thứ 5 cộng với đếm ở thàng thứ 4: 13=8+5), như dãy sau:

1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , 610 , 987 , ...

Hãy lập hàm lisp tính kết quả của số Thỏ đếm được theo tháng n và cho biết thời gian chạy chương trình.

Ví dụ gọi hàm cho tháng thứ 8: (THANG 8) >> 34 ; với thời gian chạy 12 (millisecs).

Điều kiện: hàm phải chạy nhanh cỡ như Thỏ đẻ!

Ai lập được hàm có tốc độ tương đương hoặc nhanh hơn hàm của tác giả sẽ nhận được lì xì  nhiều « Like » lấy hên đầu năm.

File Vlx đối chứng của tác giả post sẵn ở đây, sau Tết sẽ công bố cách gọi hàm:

http://www.cadviet.com/upfiles/3/67029_tho_de_con.zip

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

Chúc bác năm mới vui ^^ Ket nhìn k nhầm thì đây là dãy Fibonacci với n >= 2, có thể áp dụng đệ quy hoặc công thức Binet (sử dụng tỉ lệ vàng) để tính ? Ket k có máy nên k chuyển thành code đượ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

Chúc bác năm mới vui ^^ Ket nhìn k nhầm thì đây là dãy Fibonacci với n >= 2, có thể áp dụng đệ quy hoặc công thức Binet (sử dụng tỉ lệ vàng) để tính ? Ket k có máy nên k chuyển thành code được

Like lấy hên đầu năm. Đồng thời chúc Ket năm mới có bạn gái mới.

1). Đệ quy: đoán là chạy ì ạch.

2). Dùng công thức Binet: khi số n đủ lớn (nhưng vẫn trong giới hạn Cad tính được) thì kết quả không chính xác.

Đang mong để dòm và test cái lisp của Ket và mọi người xem có đạt 2 tiêu chí: đúngnhanh không?

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

Xin Khai bút đầu năm:

 

(defun c:fbn(/ n f)
(setq n (1+ (getint "Nhap thang thu :")))
(setq f (/ (1+ (sqrt 5)) 2))
(rtos (/ (- (expt f n) (expt (1- f) n)) (sqrt 5)) 2 0)
)
(defun c:fbn(/ n f)
(setq n (1+ (getint "Nhap thang thu :")))
(setq f (/ (1+ (sqrt 5)) 2))
(rtos (/ (- (expt f n) (expt (1- f) n)) (sqrt 5)) 2 0)
)
(defun c:fbn(/ n f)
(setq n (1+ (getint "Nhap thang thu :")))
(setq f (/ (1+ (sqrt 5)) 2))
(rtos (/ (- (expt f n) (expt (1- f) n)) (sqrt 5)) 2 0)
)
  • 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

Like bác Tue_NV đầu năm vì đã tham gia. Tuy nhiên, như đã nói với Ket ở trên là công thức Binet chỉ đúng khi n không quá lớn. Vì vậy, đáp án này chưa đạt tiêu chí "đúng", mặc dầu rất "nhanh".

VD: với n=70 thì:

Đáp án theo Tue_NV là "308061521170130"

Đáp án đúng phải là 308061521170129"

Mời mọi người tiếp tụ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

Đúng là với giới hạn tính của CAD thì rất dễ sai số. Vậy tốt nhất quay trở lại cách cổ điển, vòng lặp :

(defun f(n / m s a b)(setq a 0 b 1.0)
   (setq m (getvar 'millisecs))
   (repeat n (setq s (+ a b) a b b s))
   (setq m (- (getvar 'millisecs) m))
   (princ (strcat "\nF(" (itoa n) ") : " (rtos s 2 2) "\n"(rtos m 2 2) " ms"))
(princ)   
 )
  • 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

Hoặc bỏ biến trung gian :

(defun f1(n / m a b)(setq a 0 b 1.0)
   (setq m (getvar 'millisecs))
   (repeat (1+ n) (setq b (+ a b) a (- b a)))
   (setq m (- (getvar 'millisecs) m))
   (princ (strcat "\nF(" (itoa n) ") : " (rtos a 2 2) "\n"(rtos m 2 2) " ms"))
(princ)   
 )
  • 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

 

Hoặc bỏ biến trung gian :

(defun f1(n / m a b)(setq a 0 b 1.0)
   (setq m (getvar 'millisecs))
   (repeat (1+ n) (setq b (+ a b) a (- b a)))
   (setq m (- (getvar 'millisecs) m))
   (princ (strcat "\nF(" (itoa n) ") : " (rtos a 2 2) "\n"(rtos m 2 2) " ms"))
(princ)   
 )

Hề hề hề,

Lisp này chỉ đúng với điều kiện số thỏ tháng đầu là 1 và số thỏ tháng thứ hai là 2. Trong trường hợp tổng quát số thỏ của tháng thứ nhất và tháng thứ hai nên để cho người dùng tự nhập vào mới có được đáp án đúng theo ý của bác DoanVanHa.bởi đề bài không cho trước các con số này. Bác DoanVanHa chỉ đưa ra một ví dụ về số thỏ tháng thứ nhất và số thỏ tháng thứ hai để người dùng hiểu cách tinh chứ đó không phải là các con số cố định.

Từ suy nghĩ này nên mình cải tạo mộtt chút lisp của bác Ketxu như sau:

 

(defun f1(n / m a b)

(setq a (getreal "\n Nhap so tho thang thu nhat: ")

         b (getreal "\n Nhap so tho thang thu hai: ")  )

(setq m (getvar 'millisecs))

(if (= n 1)

    (setq a a)

    (if (= n 2)

        (setq a b)

        (repeat (1- n) (setq b (+ a b) a (- b a)))

    )

)

(setq m (- (getvar 'millisecs) m))

(princ (strcat "\nF(" (itoa n) ") : " (rtos a 2 2) "\n"(rtos m 2 2) " ms"))

(princ)

)

  • 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

Chúc mừng năm mới Giáp Ngọ 2014 !

Nhân dịp năm mới Con Ngựa 2014, xin gởi các bạn lời chúc Tết, đồng thời gởi luôn câu đố Xuân về con… Thỏ, để nhâm nhi với mứt gừng:

Ngựa thì chạy nhanh hơn Thỏ (?), nhưng Thỏ thì đẻ nhanh hơn Ngựa! Tháng nào cũng thấy chúng đẻ. Đẻ nhanh đến nỗi, bắt đầu từ tháng 3 trở đi, cứ đếm Thỏ thì thấy bằng tổng số Thỏ đếm được của tháng trước và tháng kề trước (VD: đếm ở tháng thứ 6 thì bằng đếm ở tháng thứ 5 cộng với đếm ở thàng thứ 4: 13=8+5), như dãy sau:

1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , 610 , 987 , ...

Hãy lập hàm lisp tính kết quả của số Thỏ đếm được theo tháng n và cho biết thời gian chạy chương trình.

Ví dụ gọi hàm cho tháng thứ 8: (THANG 8) >> 34 ; với thời gian chạy 12 (millisecs).

Điều kiện: hàm phải chạy nhanh cỡ như Thỏ đẻ!

Ai lập được hàm có tốc độ tương đương hoặc nhanh hơn hàm của tác giả sẽ nhận được lì xì  nhiều « Like » lấy hên đầu năm.

File Vlx đối chứng của tác giả post sẵn ở đây, sau Tết sẽ công bố cách gọi hàm:

http://www.cadviet.com/upfiles/3/67029_tho_de_con.zip

Theo đề bài thì số thỏ tháng thứ n = số Fibonacci thứ n+1.

Vì post sau nên chương trình phải khác với các chương trình trên là tính chính xác với các số lớn.

 

Trong đó:

t1: thời gian tính.

t2: thời gian xuất kết quả

http://www.cadviet.com/upfiles/3/19626_tho.rar

 

Test ở đây: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibCalcX.html

Với n=9999 thời gian chạy bằng lisp lâu khoảng 3 lần

Tho(9999) : 33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

t1 = 21797 ms , t2 = 16 ms

 

fib(10000)=33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

2090 digits in 7.587 seconds

  • Vote tăng 4

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

Cám ơn các bạn đã tham gia. Đã like lấy hên đầu năm.

1). Phương án của Ket trùng với đáp án. Tốc độ nhanh hơn của ndtnv nhưng chỉ tính được đến n<=1475 (kết quả nằm trong tầm 10^308 -> 10^309). Cách gọi hàm mà tác giả đã post là (FUNC n).

2). Phương án của ndtnv tuy tốc độ chậm hơn 1 tí nhưng tính được với n>1475. Tác giả chưa hiểu code của lisp này ra sao?

Chúc năm mới nhiều niềm vui. Xin kết thúc câu đố ở đây.

  • 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

Câu đố vui dưới đây gồm 2 phần:

Phần 1:

Trước hết, bằng bản lĩnh về lisp của cá nhân, không thèm tải lisp về. Các bạn hãy dòm vào code và phán đoán xem nhận định nào dưới đây là đúng?

a). Hàm HA1 viết đúng cú pháp, hàm HA2 viết sai cú pháp.

b). Hàm HA2 viết đúng cú pháp, hàm HA1 viết sai cú pháp.

c). Cả 2 hàm HA1 và HA2 đều viết sai cú pháp.

a). Cả 2 hàm HA1 và HA2 đều viết đúng cú pháp.

Phần 2:

Bây giờ, tải lisp về, không edit nó, load lisp xem cái gì sẽ xãy ra? Giải thích lý do? Cách khắc phục?


(defun HA1 (a)
 (cond
  ((= a 1) "A")
  ((= a 2) "B")))
 
(defun HA2 (a)
 (cond
  ((= a 3) "C")
  ((= a 4) "D")))

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

Câu đố vui dưới đây gồm 2 phần:

Phần 1:

Trước hết, bằng bản lĩnh về lisp của cá nhân, không thèm tải lisp về. Các bạn hãy dòm vào code và phán đoán xem nhận định nào dưới đây là đúng?

a). Hàm HA1 viết đúng cú pháp, hàm HA2 viết sai cú pháp.

B). Hàm HA2 viết đúng cú pháp, hàm HA1 viết sai cú pháp.

c). Cả 2 hàm HA1 và HA2 đều viết sai cú pháp.

a). Cả 2 hàm HA1 và HA2 đều viết đúng cú pháp.

Phần 2:

Bây giờ, tải lisp về, không edit nó, load lisp xem cái gì sẽ xãy ra? Giải thích lý do? Cách khắc phục?


(defun HA1 (a)
 (cond
  ((= a 1) "A")
  ((= a 2) "B")))
 
(defun HA2 (a)
 (cond
  ((= a 3) "C")
  ((= a 4) "D")))

Ý bác muốn nói lỗi CodeBox ???

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

Trước khi xem Germany và Brasil đá bán kết, mời các bạn cùng thư giản với câu đố vui sau:

Trong mặt phẳng cho 4 điểm bất kỳ p1, p2, p3, p4.

Hãy thiết lập hàm kiểm tra xem 4 điểm đó có tạo thành 1 hình chữ nhật hay không? Hàm trả về T nếu nó tạo thành HCN, nil nếu không.

Đ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

Trước khi xem Germany và Brasil đá bán kết, mời các bạn cùng thư giản với câu đố vui sau:

Trong mặt phẳng cho 4 điểm bất kỳ p1, p2, p3, p4.

Hãy thiết lập hàm kiểm tra xem 4 điểm đó có tạo thành 1 hình chữ nhật hay không? Hàm trả về T nếu nó tạo thành HCN, nil nếu không.

Điều kiện: càng ít cặp () càng có giá trị.

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

Nếu cho 1 polyline 4 điểm rồi kiểm tra đã là khó rồi, mà bây giờ chỉ có 4 điểm thì làm sao biết đường nối 2 điểm nào là cạnh, đường nào là đường chéo đây? chắc gì p1-p2 đã là cạnh hay là đừơng chéo?  Tổ hợp của 4 cũng khá lớn đó. Bác Ha chơi khó quá.

  • 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

Nếu cho 1 polyline 4 điểm rồi kiểm tra đã là khó rồi, mà bây giờ chỉ có 4 điểm thì làm sao biết đường nối 2 điểm nào là cạnh, đường nào là đường chéo đây? chắc gì p1-p2 đã là cạnh hay là đừơng chéo?  Tổ hợp của 4 cũng khá lớn đó. Bác Ha chơi khó quá.

Còn Ket thì bảo là "khoai".

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

Khoai thật sự, vì ket đã đọc 6 trang topic rectangle-p hồi lâu lâu r. Vì mở rộng ra cho một polygon nữa ^^

@Tot77 : code bác Bình nguyên lý là khoảng cách từ 1 đỉnh bất kỳ đến 1 đỉnh bất kỳ bằng khoảng cách 2 đỉnh còn lại, bất luận nó là của đường chéo hay cạnh bên

  • 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

Cho là 1 bảng đấu có 4 đội bóng thi đấu vòng tròn, thì phải có tất cả  6 trận đấu, coi như 6 cặp, nếu so sánh 6 cặp đó bằng nhau thì nó là hình vuông rồi. Mà biết đâu trong 6 cặp đó bạn so sánh nhầm cạnh với đường chéo thì sao?

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

Bác Hà chắc ko biết ở phía bắc "khoai" tương đương với khó nhai đại loại nó thế.

  • 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

Cho là 1 bảng đấu có 4 đội bóng thi đấu vòng tròn, thì phải có tất cả  6 trận đấu, coi như 6 cặp, nếu so sánh 6 cặp đó bằng nhau thì nó là hình vuông rồi. Mà biết đâu trong 6 cặp đó bạn so sánh nhầm cạnh với đường chéo thì sao?

 

Code của bác Bình trả về đúng là hình chữ nhật, đương nhiên đúng cho hình vuông vì hình vuông là TH đặc biệt của hình chữ nhật

Trong code không có so sánh 2 cạnh kề của hình chữ nhật, nên bác yên tâm đó là Hình chữ nhật ^_^

(2 cạnh kề nhau có chung nhau 1 đỉnh)

Nếu so sánh nhầm cạnh với đường chéo thì không thể có trong code của bác Bình Vì cạnh với đường chéo có chung nhau 1 đỉnh

KL: Code của bác Bình mình thấy ok

  • 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

Vì đang bận nên làm tạm

(mapcar 'set (list 'l1 'l2 'l3 'l4 'l5 'l6)
                (vl-sort  (mapcar 'distance (list p1 p1 p1 p2 p2 p3) (list p2 p3 p4 p3 p4 p4)) '<))
(and (= l1 l2) (= l3 l4) (= l5 l6) (> l1 0))


 

PS:

đã thêm 2 đk để loại trừ trường hợp 4 điểm thẳng hàng nhưng chưa xét sai số do phép toán trên kiểu double như ở bài #340

Câu đố không nói 4 điểm theo thứ tự p1, p2, p3, p4 tạo thành HCN.

Nếu phải theo thứ tự thì thuật toán sẽ khác.

1. Vector p1p2 = p4p3 và góc p1p2p3 có cos = 0

2. 3 điểm : giao p1p3 và p2p4, trung điểm p1p3, p2p4 trùng nhau

PS2:

Xem lại thì thấy 4 đk là đủ

  • 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

×