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ị


[

Topic dạo này đìu hiu quá. Đốt nóng bằng 1 câu đố vui xem sao:

Tôi có 1 list gồm các string. Mỗi string chứa các nhóm ký tự cách nhau bởi 1 dấu chấm (.), ví dụ:

("12.a.3" "1a2.b.47.666" "xy.312.45")

Hãy lập hàm tạo list từ list đã có, thỏa mãn: mỗi phần tử đều bị cắt đuôi từ dấu chấm cuối cùng trở về sau, ví dụ tạo thành:

("12.a" "1a2.b.47" "xy.312")

Điều kiện: sử dụng càng ít cặp dấu ngoặc () càng tốt.

Được 5 cặp ( )  :lol: 
 
(mapcar '(lambda(x)  (substr x 1 (vl-string-position 46 x 1 9999999999999999))  ) lst)
  • 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ó 5 cặp () chớ mấy..  :lol: 

Phương án của bác ít cặp () hơn thì Tue_NV đành chờ kết quả của PA của bác vậy   :lol:

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âng, nhiều () quá!

 

Cũng đã 2 ngày trôi qua, mời bác DVH đưa ra đáp á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

Topic dạo này im ắng quá! Khơi dậy bằng 1 câu đố vui.

Viết 1 lisp thỏa mãn y/c cầu sau:

Nhập vào 1 thì trả về "AA".

Nhập vào 2 thì trả về "BB".

Nhập vào 3 thì trả về "CC".

...

Nhập vào 9 thì trả về "JJ".

(có tất cả 9 tùy chọn).

Điều kiện: số cặp dấu () càng ít càng hay.
P/S: điều kiện nhận like: số cặp () phải < 2 lần số cặp () của tác giả.

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 9 về I thì ket còn luận ra, khó quá ^^

Ket giỡn hay Ket đùa đây? 9 về 1 khác 1 1 về 9? Xem lại câu đố có sửa tí + thêm đ/k nhận like.

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

Topic dạo này im ắng quá! Khơi dậy bằng 1 câu đố vui.

Viết 1 lisp thỏa mãn y/c cầu sau:

Nhập vào 1 thì trả về "AA".

Nhập vào 2 thì trả về "BB".

Nhập vào 3 thì trả về "CC".

...

Nhập vào 9 thì trả về "JJ".

(có tất cả 9 tùy chọn).

Điều kiện: số cặp dấu () càng ít càng hay.

P/S: điều kiện nhận like: số cặp () phải < 2 lần số cặp () của tác giả.

 

Sài củ chuối này cũng được  :D

 

 
(cadr(member (getint "\nNhap so :") '(1 "AA" 2 "BB" 3 "CC" 4 "DD" 5 "EE" 6 "FF" 7 "GG" 8 "HH" 9 "II")))
  • 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

 

Đấy, ai cũng 9 về II kìa bác ơi ^^ Mà nth tính từ 0 mà bác HH ơi

1: AA ...9:II đúng rồi. Cái ni là người ra đề bị nhầm thôi

Vì nth tính từ 0 cho nên list của mình chêm vào ký tự đầu tiên là "" rồi mới "AA" ...

Cũng nhờ ăn gian như vậy mới hơn ketxu được 1 cặp ngoặc đấy. 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

Cái đề bác DVH ra có 9 tuỳ chọn thôi thì ít lắm.

Tue_NV ra lại đề này

Viết 1 lisp thỏa mãn y/c cầu sau:

Nhập vào 12 thì trả về "AB".

Nhập vào 23 thì trả về "BC".

Nhập vào 34 thì trả về "CD"

....

Nhập vào 89 thì trả về "HI"

......

Vị trí có thể đảo lộn, xáo trộn trong đó.

Ví dụ :

- Nhập vào 13 thì trả về "AC".

- Nhập vào 42 thì trả về "DB".

- Nhập vào 92 thì trả về "IB".

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

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ắn như không thể ngắn hơn:

(vl-string-translate "123456789" "ABCDEFGHI" (getstring "\nNhap so: "))

(vl-string-translate "123456789" "ABCDEFGHI" (getstring "\nNhap so: "))
 
(vl-string-translate "123456789123456789" "abcdefghiABCDEFGHI" 
(getstring "\nNhap so: "))
  • 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

Sai rồi ĐVH ơi!

Lisp nhập 1 chỉ cho kết quả "A"

Còn đề thì phải cho "AA"

 

Bác DVH trả lời đúng rồi bạn. Đã vote cho bác DVH

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

Sai rồi ĐVH ơi!

Lisp nhập 1 chỉ cho kết quả "A"

Còn đề thì phải cho "AA"

Tôi trả lời câu đố của bác Tue_NV, còn đáp án của tôi thì chưa đưa lên. Sau khi đưa lên mới vote nếu đạt y/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

Đáp án bài #308. Đã thank 2 người có lời giải. Có nhầm lẫn chỗ FF thiếu và JJ thừa.

(initget "1 2 3 4 5 6 7 8 9 _AA BB CC DD EE FF GG HH II")

(getkword "\nChon 1 so [1/2/3/4/5/6/7/8/9]: "))

 (initget "1 2 3 4 5 6 7 8 9 _AA BB CC DD EE FF GG HH II") (getkword "\nChon 1 so [1/2/3/4/5/6/7/8/9]: "))
  • 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

Cách đây vài tuần, trên Discovery có chiếu 1 chương trình về 1 đứa bé 12 tuổi tìm thứ trong tuần cho 1 ngày bất kỳ trong thế kỷ 20. Kết quả là đứa bé chỉ đáp sai 1 câu. Mục đích chương trình là giới thiệu về khả năng nghe âm thanh tần số cao của trẻ em mà người lớn không có. Tuy nhiên, khi làm chương trình này,  không rõ Discovery có nghĩ tới việc 1 đứa bé tính nhẩm nhanh có thể cho ra kết quả chính xác hơn hay không?
Vì vậy tôi nghĩ đến 1 câu đố về lisp như sau:
Tìm thứ theo ngày, tháng năm bất kỳ, từ ngày 15 / 10 / 1582 (vì quy tắc năm nhuận của lịch Gregory chỉ đúng từ lúc này trở đi)

(defun C:thu ( / d m y)
    (setq d (getint "\nNhap ngay: ") m (getint "Nhap thang: ") y (getint "Nhap nam: "))
    (strcat "Ngay " (itoa d) " thang " (itoa m)  " nam " (itoa y) " la ngay "
         (nth (thu ...) '("chu nhat" "thu hai" "thu ba" "thu tu" "thu nam" "thu sau" "thu bay")))
)
(defun thu (d m y) ...)

Để đơn giản, xem như user nhập d m y hợp lệ
Yêu cầu: chỉ dùng +, - , * , / và rem trong hàm và gọi hàm "thu"

Không dùng biến phụ, setq, lệnh rẽ nhánh hoặc convert như if, cond, fix ...

2 vote cho lời giải đúng đầu tiên, 1 cho những lời giải sau nếu ngắn hơn các lời giải trướ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

 

Dùng “công thức Gregory”  trong link này là ra ngay thôi.

http://thegioimoi.vn/Home/ArticleDetail/vn/11/264/ban-sinh-vao-thu-may.tgm

 

Mục đích của câu đố này là vận dụng các hàm cho số nguyên thay cho các lệnh if, cond hoặc dùng list.

Tôi tách ra hàm con để dễ nhìn chứ viết trực tiếp trong hàm chính thì code sẽ ngắn hơn. 

Công thức trong link trên phù hợp khi dùng calculator.

Công thức sau phù hợp cho tính nhẩm: #3 trong link

http://diendan.congdongcviet.com/showthread.php?t=14155

Nếu ai có trí nhớ tốt thì theo Tomohiko Sakamoto trong

http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week

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

..........

(defun thu (d m y) ...)

Để đơn giản, xem như user nhập d m y hợp lệ

Yêu cầu: chỉ dùng +, - , * , / và rem trong hàm và gọi hàm "thu"

2 vote cho lời giải đúng đầu tiên, 1 cho những lời giải sau nếu ngắn hơn các lời giải trước.

 

(defun thu (d m y)
(if (<= m 2) (setq m (+ m 12) y (1- y)))
(if (<= m 2) (setq dt1 (atoi (substr (rtos (* (1+ m) 2.6)) 1 1)))
(setq dt1 (atoi (substr (rtos (* (1+ m) 2.6)) 1 2))))
(if (< (atoi (substr (rtos y) 1 2)) 20) (setq dt2 (atoi (substr (rtos (* (atoi (substr (rtos y) 1 2)) 5.25)) 1 2)))
(setq dt2 (atoi (substr (rtos (* (atoi (substr (rtos y) 1 2)) 5.25)) 1 3))))
(if (< (atoi (substr (rtos y) 3 2)) 80) (setq dt3 (atoi (substr (rtos (* (atoi (substr (rtos y) 3 2)) 1.25)) 1 2)))
(setq dt3 (atoi (substr (rtos (* (atoi (substr (rtos y) 3 2)) 1.25)) 1 3))))
(rem (+ (1- d) dt1 dt2 dt3) 7))

Hoặc:

(defun thu1 (d m y) (if (< m 3) (setq m (+ m 12) y (1- y))) (rem (- (+ (* m 2) (/ (* (1+ m) 3) 5) y (/ y 4) (/ y 400) 1) (/ y 100)) 7))

 

Chỉ đúng khi y nằm trong khoảng từ 15/10/1582 trở đi.

P/S: Vì giới hạn chỉ dùng các hàm + - * / và rem nên viết dài và "rào cản" có vẻ lỏng lẽo!

       Nếu không dùng hàm IF, mong chờ mọi người có biện pháp thay thế để thực hiện điều kiện này: (if (< m 3) (setq m (+ m 12) y (1- y))) ??!

       Mong mọi người vui nhé!

  • 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

×