Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Chuyển đổi tổng hợp list


  • Please log in to reply
13 replies to this topic

#1 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 10:57 AM

Xin nhờ các bạn viết giúp giúp lisp chuyển đổi list như sau

Cho list L1 và một số nguyên N1

Ví dụ:

(setq l1

‘(

    ("1" "1")

    ("2" "2")

    ("3" "3")

    ("4" "4")

    ("5" "5")

    ("6" "6")

    ("7" "7")

    ("8" "8")

    ("9" "9")

    ("10" "10")

    ("11" "11")

    ("12" "12")

    ("13" "13")

    ("14" "14")

    ("15" "15")

    ("16" "16")

    ("17" "17")

    ("18" "18")

    ("19" "19")

    ("20" "20")

))

(setq N 10)

 

Mình muốn lisp chuyển để có kết quả như sau:

 

(

   ("10" "55")

   ("20" "20")

)

 

Giải thích

- Cho N tăng dần với các hệ số 1, 2,3..i. Dừng khi N*i< max(các phần tử thứ nhất trong danh sách) ở ví dụ i=2 ta được:

 

- Phần tử đầu ("10" "55")

+ “10” : Là N*1 = 10*1=10

+ “55”: Là tổng các giá trị thứ 2 có chỉ sổ thứ nhất <=10;  (55=1+2+3+4+5+6+7+8+9+10)

-  Phần tử 2 ("20" "155")

+ “20” : Là N*2 = 10*2=20

+ “155”: Là tổng các giá trị thứ 2 có chỉ sổ thứ nhất <=20;  (155=11+12+13+14+15+16+17+18+19+20)

 

Cảm ơn các bạn giúp đỡ!


  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 March 2014 - 01:35 PM

Không dùng List L1, sử dụng bằng cách tính toán để chuyển được không bạn?


  • 0

#3 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 01:48 PM

Cảm ơn bạn đã quan tâm! Phần chuyển đổi là một phần của lisp mình định viết lên phải viết bằng lisp!


  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 March 2014 - 01:57 PM

Code đây bạn :

(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)

Thử :

(fff 1)

(fff 2)

(fff 3)

.....

(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)
(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)

  • 1

#5 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 02:41 PM

Cảm ơn bạn.

Nhờ bạn chỉnh lại giùm là số liệu đầu vào cho một list bất kỳ (L1) và một số N

ví dụ

(setq L1 ‘(

    ("1" "2.2")

    ("2" "3.3")

    ("3" "11")

    ("4" "22")

    ("5" "2")

    ("6" "7")

    ("7" "9")

    ("8" "2")

    ("9" "2.2")

    ("10" "11")

    ("12" "15")

))

và số N=5

 

Lisp thực hiện

(fff L1 N)

 

Được kết quả

'(

("5" "40.5")

("10" "31.2" )

("15" "15")

)

 

Phần tử 1 ("5" "40.5")

+) 5 là i=1 => n*i=5

+) 40.5 =2.2+3.3+11+22+2 (cộng các phẩn tử thứ 2 có phần tử đầu <=5)

 

Phần tử 2 ("10" "31.2" )

+) 10 là i=2 => n*i=10

+) 31.2 =7+9+2+2.2+11  (cộng các phẩn tử thứ 2 có phần tử đầu 5< và <=10)

 

Phần tử 3 ("15" "15")

+) 15 là i=3 => n*i=15

+) 15 =15 (cộng các phẩn tử thứ 2 có phần tử đầu 10< và <=15)

 

Xin lỗi và phần ví dụ đầu mình lấy ngẫu nhiên.


  • 0

#6 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 13 March 2014 - 05:57 PM

Bạn thử cái này xem.

http://www.cadviet.c...168_tmp1_17.lsp


  • 1

#7 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 07:04 PM

Cảm ơn ban Tot77

 

Lisp chạy tốt.

 

Nhờ bạn kiểm tra thêm một số điều kiện sau:

 

- Trường hợp 1:

cho (setq L1 '(("10" "2.2")  ("2" "3.3")))

Gọi hàm (vao l1 2)

=>Kết quả phải trả là: (("2" "2.2") ("4" "0") ("6" "0") ("8" "0") ("10" "2.2"))

 

- Trường hợp 2

Gọi (vao l1 1)

Cũng tương tự

 

Xin nhờ bạn bổ sung thêm nữa

- Chỉ số đầu của phần tử đầu tiên của kết quả như sau:

Ví dụ

  (setq L1 '( ("2" "3")  ("1.5" "2") ("4" "3") )) và n=2

Gọi hàm (vao l1 2)

Ta được (("2" "5") ("4" 3"))

 

Nhưng nếu

  (setq L1 '( ("6" "3")  ("7.5" "2") ("8" "3") )) và n=2

Ta được (("6" "3) ("8" 5"))

 

Tức là giá trị thứ nhất của phần tử đầu tiên là min ( 6 7.5 8 ) và là bội số của n (bằng 6)

, giá trị tiếp theo bằng giá trị trước cộng n*1 (bằng 6+2*1=8)...

 

 

 

 

(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)

  • 0

#8 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 13 March 2014 - 08:07 PM

Vây thì là cái này.

http://www.cadviet.c...168_tmp1_18.lsp


  • 1

#9 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 08:23 PM

Hoàn hảo! Hoàn hảo và rất nhanh! Xin chân thành cảm ơn!

Mình cứ lo diễn đạt không đạt sợ các bác không hiểu rõ nhưng kết quả hoàn hảo.

Mình sẽ kiểm tra các trường hợp nhưng cơ bản là rất tốt! Xin chân thành cảm ơn!

 

Mình đã test thử

 

(setq L1 '(

    ("2000" "13.04")

    ("2020" "0")

    ("2040" "0")

    ("2053.53" "6.18")

    ("2054.87" "8.49")

    ("2060" "18.44")

    ("2080" "84.6")

    ("2100" "94.65")

    ("2120" "44.59")

    ("2140" "37.1")

    ("2158.22" "74.36")

    ("2188.22" "99.14")

    ("2200" "101.56")

    ("2214.08" "105.03")

    ("2214.33" "62.59")

    ("2220" "65.08")

    ("2240" "81.49")

    ("2256.33" "79")

    ("2260" "74.27")

    ("2280" "55.78")

    ("2290.63" "38.4")

    ("2300" "33.95")

    ("2320" "28.97")

    ("2324.83" "31.97")

    ("2326.66" "34.45")

    ("2328.28" "36.29")

    ("2341.98" "72.47")

    ("2350.46" "154.06")

    ("2360" "209.08")

    ("2367.31" "213.07")

    ("2367.56" "363.71")

    ("2380" "246.21")

    ("2396.83" "137.69")

    ("2426.83" "120.43")

    ("2440" "156.94")

    ("2460" "277.61")

    ("2480" "342.13")

    ("2500" "397.07")

    ("2520" "403.51")

    ("2540" "434.98")

    ("2560" "413.54")

    ("2570.17" "333.85")

    ("2580" "208.77")

    ("2588.44" "133.38")

    ("2618.44" "5.38")

    ("2620" "3.01")

    ("2640" "7.52")

    ("2647.69" "13.8")

    ("2647.94" "2.23")

    ("2660" "2.25")

    ("2684.49" "47.37")

    ("2689.17" "59.8")

    ("2690.27" "62.99")

    ("2700" "107.24")

    ("2720.45" "139.16")

    ("2720.7" "234.94")

    ("2740" "254.46")

    ("2749.95" "148.6")

    ("2775.83" "17.05")

    ("2779.95" "36.57")

    ("2800" "252.63")

    ("2804" "320.96")

    ("2813.77" "361.81")

    ("2820" "302.33")

    ("2840" "94.56")

    ("2860" "23.53")

    ("2872.45" "179.8")

    ("2885.02" "404.33")

    ("2900" "473.66")

    ("2920" "461.43")

    ("2940" "468.95")

    ("2955.13" "444.92")

    ("2985.12" "467.78")

    ("3000" "432.53")

)

)

 

Và kết quả tuyệt vời

 

(("2000" "13.04")
  ("2100" "212.36")
  ("2200" "356.75")
  ("2300" "595.59")
  ("2400" "1527.97")
  ("2500" "1294.18")
  ("2600" "1928.03")
  ("2700" "311.59")
  ("2800" "1083.41")
  ("2900" "2160.98")
  ("3000" "2275.61")
)
 

(("2000" "13.04")

  ("2100" "212.36")

  ("2200" "356.75")

  ("2300" "595.59")

  ("2400" "1527.97")

  ("2500" "1294.18")

  ("2600" "1928.03")

  ("2700" "311.59")

  ("2800" "1083.41")

  ("2900" "2160.98")

  ("3000" "2275.61")

)

 

P/s Bác Tot77 có thể bật mí bí quyết học lisp của bác không! Vì code của bác nhìn thấy rất pro...

(setq L1 '(
    ("2000" "13.04")
    ("2020" "0")
    ("2040" "0")
    ("2053.53" "6.18")
    ("2054.87" "8.49")
    ("2060" "18.44")
    ("2080" "84.6")
    ("2100" "94.65")
    ("2120" "44.59")
    ("2140" "37.1")
    ("2158.22" "74.36")
    ("2188.22" "99.14")
    ("2200" "101.56")
    ("2214.08" "105.03")
    ("2214.33" "62.59")
    ("2220" "65.08")
    ("2240" "81.49")
    ("2256.33" "79")
    ("2260" "74.27")
    ("2280" "55.78")
    ("2290.63" "38.4")
    ("2300" "33.95")
    ("2320" "28.97")
    ("2324.83" "31.97")
    ("2326.66" "34.45")
    ("2328.28" "36.29")
    ("2341.98" "72.47")
    ("2350.46" "154.06")
    ("2360" "209.08")
    ("2367.31" "213.07")
    ("2367.56" "363.71")
    ("2380" "246.21")
    ("2396.83" "137.69")
    ("2426.83" "120.43")
    ("2440" "156.94")
    ("2460" "277.61")
    ("2480" "342.13")
    ("2500" "397.07")
    ("2520" "403.51")
    ("2540" "434.98")
    ("2560" "413.54")
    ("2570.17" "333.85")
    ("2580" "208.77")
    ("2588.44" "133.38")
    ("2618.44" "5.38")
    ("2620" "3.01")
    ("2640" "7.52")
    ("2647.69" "13.8")
    ("2647.94" "2.23")
    ("2660" "2.25")
    ("2684.49" "47.37")
    ("2689.17" "59.8")
    ("2690.27" "62.99")
    ("2700" "107.24")
    ("2720.45" "139.16")
    ("2720.7" "234.94")
    ("2740" "254.46")
    ("2749.95" "148.6")
    ("2775.83" "17.05")
    ("2779.95" "36.57")
    ("2800" "252.63")
    ("2804" "320.96")
    ("2813.77" "361.81")
    ("2820" "302.33")
    ("2840" "94.56")
    ("2860" "23.53")
    ("2872.45" "179.8")
    ("2885.02" "404.33")
    ("2900" "473.66")
    ("2920" "461.43")
    ("2940" "468.95")
    ("2955.13" "444.92")
    ("2985.12" "467.78")
    ("3000" "432.53")
)
)

  • 0

#10 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 13 March 2014 - 08:43 PM

Cũng chẳng có gì gọi là bí quyết cả, học cái gì cũng cần có sự đam mê thì mới khá được.

Mình cũng học hỏi ở người khác, thấy cái gì hay mình tìm hiểu và bắt chước, cộng thêm cái tư duy của mình.

Tôi cũng học hỏi được nhiều từ CadViet đấy chứ.

Nhiều khi viết cho người khác cũng làm mình phải động não và cũng đồng thời giúp cho công việc của mình.


  • 1

#11 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 March 2014 - 10:37 PM

Phiền bạn thêm một lần nữa (so sorry vì không đưa ra ngay từ đầu).

Vẫn phương án như trên nhưng trong trường hợp có 3 phần tử

(setq L1 ‘(

    ("1" "2.2" "1")

    ("2" "3.3" "3")

    ("3" "11" "2")

    ("4" "22" "1")

    ("5" "2" "2")

    ("6" "7" "1")

    ("7" "9" "2")

    ("8" "2" "4")

    ("9" "2.2" "5")

    ("10" "11" "1")

    ("12" "15" "1")

))

Nhờ các bạn giúp!


  • 0

#12 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 14 March 2014 - 01:08 AM

Mình sửa cho trường hợp list có 3 phần tử như sau không biết có ổn không? Nhờ bạn check dùm.

 

http://www.cadviet.c...168_tmp1_18.lsp

 


  • 0

#13 aliosa

aliosa

    biết vẽ polygon

  • Members
  • PipPip
  • 73 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 14 March 2014 - 12:03 PM

- Đối với list có ba phần tử thì phần tử thứ 2 và 3 cũng cộng như phần đối với có 2 phần tử đã làm bạn à. Mình xin phép sửa lại một chút lisp bạn viết như trên. Kết quả chạy ra cũng tốt. Ban kiểm tra giúp mình xem có cần rút gọn hay chỉnh sửa gì không nhé!


  • 0

#14 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 March 2014 - 12:06 PM

như vậy là ok rồi đó.


  • 1